STM32を使って作りたいのはGPSロガーに必要な技術的要素は以下の通り。
- デジタル出力
- 電源の制御
- LEDの点灯状態の制御
- デジタル入力
- タクトスイッチの押下状態の取得
- アナログ入力
- 電源電圧の監視
- SPI
- SDカードへのNMEAの書き込み
- マイコンの省電力制御
- EXTI割り込み
- タクトスイッチ押下により、省電力状態からの復帰
- USARTによる受信
- GPSからのNMEA情報の受信
1〜4までは前回までに動作確認が終わりました。
今回は、5, 6を試します。
回路図
これまで組み上げた回路を使用します。ただ、今回はタクトスイッチにコンデンサーを追加しました。チャタリングを抑止するためです。
今回はSDカード(SPI)やADCは使用しません。タクトスイッチとLED制御のためのGPIOのみ使用します。
STM32CubeMX
PB1を GPIO_Input から GPIO_EXTI1 に変更します。
Configuration タブに移動し、 System >> NVIC を選択します。
EXTI line 0 and line 1 interrupt にチェックを入れます。
ここまで設定したら、コードを生成します。
Eclipse
以下のようなコードを記述します。
/* USER CODE BEGIN 0 */ uint8_t gToggleSw = 1; /* USER CODE END 0 */ : while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); HAL_Delay(500); if (gToggleSw == 0) { // stop here HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // resume from here SystemClock_Config(); } } /* USER CODE END 3 */ : : /* USER CODE BEGIN 4 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { gToggleSw ^= 1; } /* USER CODE END 4 */
タクトスイッチを押下するごとに点滅と点滅の一時停止が交互に行われます。
試していて困ったのが、ST-Linkを接続していつものように動作確認をしていたところ、タクトスイッチを押下するとプログラムは一時停止。 Resume により再開してもすぐに停止し、 Program received signal SIGINT, Interrupt. が出力され、以降動作しなくなります。
Temporary breakpoint 2, main () at L0SampleExti/Src/main.c:69 69 { [Remote target] #1 stopped. main () at L0SampleExti/Src/main.c:69 69 { The target is not in the halted nor running stated, stepi/continue ignored. Program received signal SIGINT, Interrupt. main () at L0SampleExti/Src/main.c:69 69 {
STM32L053C8T6 に書き込んだ後、ST-Linkを接続せずに単体で起動すると期待通り動作します。追々調べることにしましょう。