我是使用TIM2通用定时器闪烁发光二极管。
代码在main.c中的应用
HAL_TIM_Base_Start_IT(&htim2);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim->Instance==TIM2){
HAL_GPIO_TogglePin(GPIOB, LED_Pin);
}
}当单击按钮时,应调用EXTI中断,使led闪烁更快20次。然而,LED保持和停止闪烁在所有。
void EXTI0_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin == BT_Pin){
for(volatile int i=20; i>0; i--){
HAL_GPIO_TogglePin(GPIOB, LED_Pin);
HAL_Delay(100);
}
}
}请您告诉我如何调整中断ISR为EXTI,以便它将使用TIM2以及更快的闪烁。
发布于 2020-02-18 19:22:12
HAL_GPIO_EXTI_Callback()在中断上下文中运行--在那里闪现指示器是不合适的,更少地包括延迟。在中断期间运行时没有其他代码,而且HAL_Delay()在任何情况下都可能不安全中断。
相反,在按钮处理程序中,设置一个计数器在计时器处理程序中递减,而在计时器处理程序中,根据倒计时是否为零设置重新加载。就像这样:
我没有包括HAL调用来做上面的TODO,因为我需要查找它们,但这是大纲。
volatile unsigned fast_flash_count = 0 ;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM2)
{
HAL_GPIO_TogglePin(GPIOB, LED_Pin);
if( fast_flash_count > 0 )
{
fast_flash_count-- ;
// Set TIM2 reload to fast-flash period
TODO
}
else
{
// Set TIM2 reload to slow-flash period
TODO
}
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == BT_Pin)
{
fast_flash_count = 20 ;
// Set TIM2 counter to current reload value
// to force immediate interrupt
TODO
}
}https://stackoverflow.com/questions/60287738
复制相似问题