2017年8月8日 星期二

stm32f4 使用計時器計時 1ms

stm32f4 使用計時器計時 1ms

可以使用官方範例程式內的 Examples\TIM\TIM_TimeBase 修改
預設是 delay 1s 修改一下參數 Period 除以 1000 即是 1ms
初始化計時器
void timers_init()
{
    uint32_t time_c = 10000;
    uwPrescalerValue = (uint32_t)((SystemCoreClock / 2) / 10000) - 1;
    TimHandle.Instance = TIMx;
    TimHandle.Init.Period = 10000/1000 - 1 ;
    TimHandle.Init.Prescaler         = uwPrescalerValue;
    TimHandle.Init.ClockDivision     = 0;
    TimHandle.Init.CounterMode       = TIM_COUNTERMODE_UP;
    TimHandle.Init.RepetitionCounter = 0;

    if(HAL_TIM_Base_Init(&TimHandle) != HAL_OK)
    {
        Error_Handler();
    }

    if(HAL_TIM_Base_Start_IT(&TimHandle) != HAL_OK)
    {
        Error_Handler();
    }
}
這裡這樣設置就可以了,再來它會自動每 1ms 呼叫 HAL_TIM_PeriodElapsedCallback() 這個函式,這個函式這樣寫
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    static int timer1 = 0;
    static int timer2 = 0;
    ++timer1;
    ++timer2;

    if(timer1 == 1000) {
        BSP_LED_Toggle(LED1);
        timer1 = 0;
    }

    if(timer2 == 500) {
        BSP_LED_Toggle(LED2);
        timer2 = 0;
    }
}
即可用不同頻率閃爍LED了,我不確定中斷程序會不會等這個函式執行完畢;建議用一個全域變數當flag,讓計時器激活他,然後由主函式內的 while 統一控管來處理,不然可能會卡住導致延遲。

沒有留言:

張貼留言