LoginSignup
9
11

More than 5 years have passed since last update.

[メモ] タイマー割り込みでLチカ (STM32L1-TIM2使用)

Last updated at Posted at 2016-06-21

概要

環境

  • STM32L152C-DISCOVERY (STM32L152RCT6)
  • STM32CubeMX (v4.15.1)
  • Firmware Package for Family STM32L1 (v1.5.0)
  • MDK-ARM Lite v5.18

手順

  1. ↑の関連記事(その1~2くらい)で、ツールと環境準備
  2. STM32CubeMXを開いて
    1. New Project
    2. [Board Selector] =>Discovery | STM32L152C-DISCO | STM32L152RCTxを選んで[OK]
  3. [Pinout]

    1. RCC => High Speed Clock(HSE) : Bypass Clock Source
    2. PC13-WKUP2(IDD_CNT_ENとでてる)をクリックして、Reset State
    3. TIM2 => Clock Source : Internal Clock STM32_Timer_L-Chika3_.png
  4. [Configuration] => [Control] =>[TIM2]をクリック

    1. [Parameter Settings]
      1. Counter Settings
        • Prescaler : 999 (= 1000倍 (n+1倍))
        • Counter Period: 16000
          => TIM2に供給されるクロックを(1000)で割った周期で、16000カウントしたら割り込みかかる。
          => 32MHz ÷ 1000 ÷ 16000 => 2Hz => 500msec毎に割り込み STM32_Timer_L-Chika4_2.png
    2. [NVIC Setting]
      • TIM2 global interrupt: [v] Enabled チェックを入れる
        STM32_Timer_L-Chika5.png
  5. Project => Generate Code (Ctrl+Shit+G)
    こんなかんじ
    STM32_Timer_L-Chika6.png

  6. [Open project]
    STM32_Timer_L-Chika7.png

  7. MDK-ARMが開くので、main.cに↓コードを書く。
    あとは、ビルドして[F7]、フラッシュに焼いて[F8]、デバッグCtrl+[F5]、実行[F5]すると、
    STM32_Timer_L-Chika8.png
    こんなのが出てくるが、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)で、割り込みが発生するとおきる。

9
11
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11