デバイスドライバによる回路の確認をこれから行っていきます。リストにして、一つづつクリアしていきます。
- STM32F446 STEP1 LED&スイッチ
- STM32F446 STEP2 UART通信&printf関数
- STM32F446 STEP3-1 ADC(シングル)
- STM32F446 STEP3-2 ADC(複数チャンネル)
- STM32F446 STEP3-3 ADC(DMA)
- STM32F446 STEP4 DAC
- STM32F446 STEP5 PWM
- STM32F446 STEP6 エンコーダ
- STM32F446 STEP7 SPI&ジャイロセンサ
- STM32F446 STEP8 定期割り込み処理
まずはSTEP1、Lチカとプッシュスイッチの動作確認を行います。前回、自作した汎用ボードでプログラムは確認しているのですが、しばらく時間が経っているので復習兼ねてやります。
まずは、回路図を見返します。
回路図
プッシュスイッチはプルアップしており、押してない場合はHighとなり、押すとLowになります。赤色LEDの方は、Lowを出力すると光らず、Highを出力すると点灯します。
それぞれのポートは、以下に繋がっています。他の機能毎に割り振った優先順位が高いポート以外の余ったところに接続しているため、連続せずに離れています。
ただし、回路図のラベル名と基板に印字したシルク(リファレンス番号)が対応していません。
まとめると、こんな感じ。ややこしいですね。
- ポートPD2 → ラベル名SW0 → シルクSW3
- ポートPB4 → ラベル名SW1 → シルクSW4
- ポートPB5 → ラベル名SW2 → シルクSW5
- ポートPC4 → ラベル名LED0 → シルクD1
- ポートPC5 → ラベル名LED1 → シルクD2
- ポートPB0 → ラベル名LED2 → シルクD3
- ポートPB1 → ラベル名LED3 → シルクD4
ユーザインターフェースとしては見えるシルク名とプログラムを対応させる方が混乱しないので、ポート名を定義するときはシルク名を採用します。
STM32Project作成
STM32のプロジェクトを新規作成します。
鉄鼠に使っているマイコンはSTM32F446RCなので、Part Numberに入力すると候補が出てくるので、それをクリックしてNextを押します。
プロジェクトネームをTesso_STEP1と入力してFinishボタンを押します。
これで作成完了。
CubeMX設定
ポートの設定やクロックを入力していきます。
外部クロックを使うので、RCC→HSEでCrystal/Ceramic Resonatorを選択。また、プッシュスイッチやLEDにつながっているポートをGPIO_InputやGPIO_Outputに設定して、User Labelも上記で決めたシルク名に変更します。
回路図を見返すと8MHzの外部クロック(共振子)を使っています。
Clock Configurationタブを押して、最大速度で動作できるよう設定します。LEDやボタンの操作でこれはやらなくてもいいですけど、復習兼ねて。
コードジェネレートします。
プログラム
STM32CubeIDEウィンドウの左側に表示されているProject Explorerの中に、Tesso_STEP1→Core→Src→main.cが作成されているので、ダブルクリックで開きます。
HAL関数でプログラムを記述して、
プログラム一部抜粋
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_TogglePin(D1_GPIO_Port, D1_Pin); HAL_Delay(100); if(HAL_GPIO_ReadPin(SW3_GPIO_Port, SW3_Pin)==0){ HAL_GPIO_TogglePin(D2_GPIO_Port, D2_Pin); } else if(HAL_GPIO_ReadPin(SW4_GPIO_Port, SW4_Pin)==0){ HAL_GPIO_TogglePin(D3_GPIO_Port, D3_Pin); } else if(HAL_GPIO_ReadPin(SW5_GPIO_Port, SW5_Pin)==0){ HAL_GPIO_TogglePin(D4_GPIO_Port, D4_Pin); } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */
実行します。
動作
問題なく動いています。
次は、STEP2 UARTとprintf関数を使った出力です。