stm32f4 使用計時器計時 1ms
可以使用官方範例程式內的 Examples\TIM\TIM_TimeBase 修改
預設是 delay 1s 修改一下參數 Period 除以 1000 即是 1ms
預設是 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 統一控管來處理,不然可能會卡住導致延遲。