1> 功能框图
2> 时序图
计数36;
2.1> UEV时序图
3> 实验_寄存器版
用Timer6定时,实现间隔1s, led状态翻转1次;
/* 核心代码 */
void timer6_init(void)
{
RCC->APB1ENR |= 1 << 4; // Enable TIM6 Clock;
TIM6->CNT = 0; // Clean Register;
TIM6->PSC = 8400-1; // CLK_INT = 84000000Hz; Prescaler value;
TIM6->ARR = 10000-1; // Auto Reload Register; 1s;
TIM6->CR1 = 0;
TIM6->CR1 |= 1 << 2;
TIM6->DIER |= 1 << 0; // Enable Update Interrupt;
HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 2, 0); // 借用下HAL库的^_^, 自己实现也可;
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
TIM6->CR1 |= 1 << 0; // Enable TIM6;
}
void TIM6_DAC_IRQHandler(void)
{
if(TIM6->SR & (0x1 << 0)) {
TIM6->SR &= ~(1 << 0); // Claean Update interrupt flag;
bsp_led_toggle();
}
}
84000000 / 8400Hz = 10000Hz; // 计数1s 需要数10000次个时钟
4> 实验_HAL库版
用Timer6定时,实现间隔1s, led状态翻转1次;
4.1> 初始化
void bsp_tim6_init(void);
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle);
TIM_HandleTypeDef htim6;
/* TIM6 init function */
void bsp_tim6_init(void)
{
TIM_MasterConfigTypeDef sMasterConfig = {0};
htim6.Instance = TIM6;
htim6.Init.Prescaler = 8400-1;
htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
htim6.Init.Period = 10000-1;
htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
{
Error_Handler();
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
{
Error_Handler();
}
}
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{
if(tim_baseHandle->Instance==TIM6)
{
/* TIM6 clock enable */
__HAL_RCC_TIM6_CLK_ENABLE();
/* TIM6 interrupt Init */
HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 2, 0);
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
}
}
4.2> 启动_中断方式
HAL_TIM_Base_Start_IT(&htim6);
4.3> 中断处理
void TIM6_DAC_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim6);
}
/**
* @brief Period elapsed callback in non-blocking mode
* @param htim TIM handle
* @retval None
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
bsp_led_toggle();
}
5> 总结总结
1》 HAL库对寄存器,操作进行了封装,需熟悉他的套路,自己的代码,先模仿,再优化;
2》 HAL库处理中断时,把中断标志位已清除,用户只需实现回调函数功能;