首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Tim2内部中断处理程序实现STM32F1

使用Tim2内部中断处理程序实现STM32F1
EN

Stack Overflow用户
提问于 2020-02-18 18:59:07
回答 1查看 412关注 0票数 0

我是使用TIM2通用定时器闪烁发光二极管。

代码在main.c中的应用

代码语言:javascript
复制
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保持和停止闪烁在所有。

代码语言:javascript
复制
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以及更快的闪烁。

EN

回答 1

Stack Overflow用户

发布于 2020-02-18 19:22:12

HAL_GPIO_EXTI_Callback()在中断上下文中运行--在那里闪现指示器是不合适的,更少地包括延迟。在中断期间运行时没有其他代码,而且HAL_Delay()在任何情况下都可能不安全中断。

相反,在按钮处理程序中,设置一个计数器在计时器处理程序中递减,而在计时器处理程序中,根据倒计时是否为零设置重新加载。就像这样:

我没有包括HAL调用来做上面的TODO,因为我需要查找它们,但这是大纲。

代码语言:javascript
复制
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
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60287738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档