概要
- タイマー割り込みによるLチカ
- タイマスタート:
HAL_TIM_Base_Start_IT(&htim2);
- タイマハンドラ関数:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
- タイマスタート:
- パワーセービングもしてみる。(SleepMode)
- 関連記事
- STM32L152C-DISCOVERY + STM32CubeMX + MDK-ARM Lite で、Lチカをやってみた (その1~ツールの準備)
- STM32L152C-DISCOVERY + STM32CubeMX + MDK-ARM Lite で、Lチカをやってみた (その2 ~コード生成からデバッガ設定)
-
STM32L152C-DISCOVERY + STM32CubeMX + MDK-ARM Lite で、Lチカをやってみた (その3~Lチカコード実行)
=> ポーリングによるLチカ(HAL_Delay) -
STM32L152C-DISCOVERY + STM32CubeMX + MDK-ARM Lite で、Lチカをやってみた (その4~FreeRTOS)
=>FreeRTOSによるLチカ(osDelay)
環境
- STM32L152C-DISCOVERY (STM32L152RCT6)
- STM32CubeMX (v4.15.1)
- Firmware Package for Family STM32L1 (v1.5.0)
- MDK-ARM Lite v5.18
手順
-
↑の関連記事(その1~2くらい)で、ツールと環境準備
-
STM32CubeMXを開いて
- New Project
- [Board Selector] =>
Discovery | STM32L152C-DISCO | STM32L152RCTx
を選んで[OK]
-
[Pinout]
-
[Configuration] => [Control] =>[TIM2]をクリック
-
MDK-ARMが開くので、
main.c
に↓コードを書く。
あとは、ビルドして[F7]、フラッシュに焼いて[F8]、デバッグCtrl+[F5]、実行[F5]すると、
こんなのが出てくるが、LEDはちかちかしてる。STMが眠りにはいったとき、デバッガが切れる。
Application/user/main.c
/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static int ledOn = 0;
if (htim == &htim2)
{
#define LED_GPIO_PORT GPIOB
#define LED_GREEN_GPIO_PIN GPIO_PIN_7
#define LED_BLUE_GPIO_PIN GPIO_PIN_6
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_GREEN_GPIO_PIN, (ledOn==0) ? GPIO_PIN_RESET : GPIO_PIN_SET);
ledOn = 1 - ledOn;
}
}
/* USER CODE END 0 */
int main(void)
{
....
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim2);
HAL_SuspendTick();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);
}
/* USER CODE END 3 */
}
...
かんたんな説明
-
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
- タイマ割り込みで、ここに飛んでくる。
- タイマのハンドルhtimで、TIM2で飛んできたかチェック
- 呼ばれるたびにLEDをトグルさせるコード。
-
HAL_TIM_Base_Start_IT(&htim2);
- タイマースタート
-
HAL_SuspendTick();
-
SysTickをとめる。1msec毎にSysTickの割り込みがかかってるらしいのだが、今回、SleepModeに落とすため、SysTickを切る。でないと、こいつで起こされてしまう。(みたいなことがコメントに書いてあった)
stm32l1xx_hal_pwr.c
-
/**
- @brief Enters Sleep mode.
- @note In Sleep mode, all I/O pins keep the same state as in Run mode.
- @param Regulator: Specifies the regulator state in SLEEP mode.
-
This parameter can be one of the following values:
-
@arg PWR_MAINREGULATOR_ON: SLEEP mode with regulator ON
-
@arg PWR_LOWPOWERREGULATOR_ON: SLEEP mode with low power regulator ON
- @param SLEEPEntry: Specifies if SLEEP mode is entered with WFI or WFE instruction.
-
When WFI entry is used, tick interrupt have to be disabled if not desired as
-
the interrupt wake up source.
-
This parameter can be one of the following values:
-
@arg PWR_SLEEPENTRY_WFI: enter SLEEP mode with WFI instruction
-
@arg PWR_SLEEPENTRY_WFE: enter SLEEP mode with WFE instruction
-
@retval None
*/
void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry)
...
- `HAL_PWR_EnterSLEEPMode(PWR_LOWPOWERREGULATOR_ON, PWR_SLEEPENTRY_WFI);`
- => SleepModeに入る。WFI(Wait For Interrupt)で、割り込みが発生するとおきる。
<font ></font>