Hobby Lab 趣味のモノ作り実験のサイトです。
Software 開発環境 STM32 STM32Cube開発環境_note1
--------- menu ---------
1 SSTM32CubeIDEの文法
1.1 HALを使用する場合
1.2 直接レジスターを操作する
1.3 違いによる処理速度の比較

--------- 関係 ---------

■ソフトウェア

開発環境 IDE ●STM32
 STM32CubeIDEでプログラム
 HALと直接レジスター操作の速度

●CH32
 MounRiver Studioでプログラム

●Arduino
1.概要と導入
2.各ボード毎の設定
 Uno 設定
 Mega2560設定
 DUE_CH340設定
 ESP_WROOM02設定
 ESP12F_D1mini設定
 ESP32設定
 CH32V203の設定
3.ライブラリー
 OneWire使い方
4.その他
 日本語リファレンス
 WiFi Macアドレスを調査


■部品

プロセッサ関係部品関係リスト

●プロセッサ
1.動作比較
 STM32F動作比較
 CH32V203&STM32F 動作比較
 arduino動作比較

2.raspberrypi関係
 RaspberryPiハード

3.STM32関係
 -STM32 IDE
 STM32CubeIDEでプログラム
 HALと直接レジスター操作の速度

4.CH32関係
 -CH32V203K8T6
 V203K8T6開始
 -CH32V203C8T6
 V203C8T6開始
 -CH32 IDE
 Arduinoでプログラム
 MounRiver Studioでプログラム
 -CH32共通
 CH32V203データシート
 CH32V203K8T6取説について
  MBA メモリとバス方式
  PWR 電力制御
  RCC リセット・拡張・クロック
  BKP バックアップレジスタ
  CRC 巡回冗長検査
  RTC リアルタイムクロック
  GPIO GPIOと代替機能
  DMA ダイレクトメモリアクセス制御
  ADTM 高度な制御タイマー
  GPTM 汎用タイマー
  BCTM 基本タイマー
  USART 同期非同期通信

5.arduino関係

6.ESP12関係
 (a)ESP-8266D1mini注意

●その他
 RS485ドライバー
 CP2102 BRIDGE
 WCH-LinkEエミュレーター

1 SSTM32CubeIDEの文法

大げさに文法と記載しましたが、ここではSTM32CubeIDEでレジスターにアクセスする際のプログラム表現方法は、主に以下の2つの方法で、異なります。

1.1 HALを使用する場合

STM32CubeIDEでプロジェクトを作成すると、自動的に生成される「Hardware Abstraction Layer (HAL)」または「Low-Layer (LL)」ライブラリを使ってレジスターにアクセスするのが一般的です。
この場合、直接レジスター名を記述する必要はありません。
コード例(HALライブラリ):
// GPIOAのピン5をHighにする(点灯)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
// GPIOAのピン5をLowにする(消灯)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

■その他
URL
https://happytech.jp/wordpress/2019/04/06/stm32cubemx-low-layer-api-usage-1/
で STM32CubeMXのLow-Layer API利用法 (1)が記載されていれる
https://happytech.jp/wordpress/tag/stm32cubemx/page/3/
で STM32CubeMXのLow-Layer API利用法 (3)が記載されていれる

1.2 直接レジスターを操作する場合

より低レベルな制御を行いたい場合は、C言語の構造体とポインターを利用して、直接レジスターにアクセスします。
この場合、レジスターの正確な名前とビット位置を知っている必要があります。
コード例(直接レジスター操作):
// GPIOAの出力データレジスター(ODR)のビット5をセットする
GPIOA->ODR |= (1 << 5);
// GPIOAの出力データレジスター(ODR)のビット5をクリアする
GPIOA->ODR &= ~(1 << 5);
この方法では、GPIOAはGPIO Aポートのベースアドレスを指すポインターで、ODRはその構造体のメンバーとして定義されています。
レジスターを直接操作する際は、該当ペリフェラルのクロックを有効にする必要があります。
直接レジスターを操作するプログラムは、HAL/LLライブラリを使用するプログラムよりも移植性が低くなる場合があります。
プロジェクトの用途やプログラミングの習熟度に応じて、どちらの方法を選択するか検討してください。

1.3 処理速度の比較

IDEで記載したプログラム
ボード:NUCLEO-F446RE
出力 Port : PA1
OUTPUT level : Low
GPIO mode : Output Push Pull
GPIO Pull-up/down : Pull-up
Maximum output speed : Very Hight
Clock Configuration : HCLK=180MHz

プログラムは下記のmain.Cの青字部分を追加した。
int main(void)
 {
 HAL_Init();
 SystemClock_Config();
 MX_GPIO_Init();
 MX_USART2_UART_Init();
 while (1)
  {
  GPIOA->BSRR =0b00000000000000000000000000000010; //① PA1 ON
  GPIOA->BSRR =0b00000000000000100000000000000000; //② PA1 OFF
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); //③ PA1 ON
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); //④ PA1 OFF
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); //⑤ PA1 ON
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); //⑥ PA1 OFF
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); //⑦ PA1 ON
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); //⑧ PA1 OFF
  GPIOA->ODR |= (1 << 1); //⑨ PA1 ON
  GPIOA->ODR &= ~(1 << 1); //⑩ PA1 OFF
  GPIOA->ODR |= (1 << 1); //⑪ PA1 ON
  GPIOA->ODR &= ~(1 << 1); //⑫ PA1 OFF
  GPIOA->ODR |= (1 << 1); //⑬ PA1 ON
  GPIOA->ODR &= ~(1 << 1); //⑭ PA1 OFF
  GPIOA->ODR = 2; //⑮ PA1 ON
  GPIOA->ODR = 0; //⑯ PA1 OFF
  GPIOA->ODR = 0b0000000000000010; //⑰ PA1 ON
  GPIOA->ODR = 0b0000000000000000; //⑱ PA1 OFF
  GPIOA->BSRR =0b00000000000000000000000000000010; //⑲ PA1 ON
  GPIOA->BSRR =0b00000000000000100000000000000000; //⑳ PA1 OFF
  HAL_Delay(1);//1ms待つ

  }
 }
PA1の電圧波形

プログラムNo
時間(ns)33143231198231198231995555555555333333333333
処理クロック6264236423642181010101010666666
■注意:表の値について
1.時間(ns)は実際測定した時間ではなく、処理クロックが整数となるように実測値に近い値になっている。
2.1クロック時間の計算方法は HCLK = 180MHz = 1周期(サイクル) = 1クロック から
  1×109/(180×106)≒ 5.5(ns)としている。

■判ったこと
1.HALより直接レジスターを操作したほうが早く処理が出来る。
2.⑨〜⑭はシフトしているので⑮〜⑳と比べ4サイクルも違っている

■不明な点は
1.③の部分がなぜ早くなったか:通常198nsが143nsで55ns(10サイクル)早くなっている
2.⑨の部分がなぜ遅くなったか:通常55nsが99nsで44ns(8サイクル)遅くなっている
3.最速で動作させている⑮〜⑳で33ns=6サイクルも必要なのか?
4.⑩、⑫、⑭は⑨、⑪、⑬に反転が有るが処理速度に変化が無いのはなぜか?
今後も調べて行きたい。





































更新日 2025/09/27 10:18  Administrator Takeshi Hirabayashi