这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STM32F103ZET6】17:分享在Rtos项目中断管理的使用经验

共3条 1/1 1 跳转至

【STM32F103ZET6】17:分享在Rtos项目中断管理的使用经验 23

高工
2025-12-03 07:46:57     打赏

一:中断介绍

简介:让CPU打断正常程序的运行,转而紧急处理的事件(程序),就叫中断。比如:外部中断,定时器中断,串口中断等等。

执行过程:

1 中断请求:外设产生中断请求(GPIO外部中断、定时器中断,串口中断等等)。

2 响应中断:CPU停止执行当前程序,转而去执行中断处理程序(ISR)。

3 退出中断:执行完毕,返回被打断的程序处,继续往下执行。

二:中断优先级的分组配置:

采用的的是:NVIC_PRIORITYGROUP_4的方式,即4bit用于抢占优先级,0bit用于子优先级。

具有的特点如下:

1:低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断里才允许调用FreeRTOS 的API函数;

2:中断优先级数值越小越优先,任务优先级数值越大越优先

17-1.png

可以看到,在本次项目中,可以设置5-15的不同优先级别。

三:实际测试中断管理;

目的:配置外部中断优先级为4,从而开启和关闭中断,可以看到LED灯任务是否运行。

3.1 程序代码中修改外部按键的优先级:

  HAL_NVIC_SetPriority(EXTI0_IRQn, 4, 0);
  HAL_NVIC_EnableIRQ(EXTI0_IRQn);

  HAL_NVIC_SetPriority(EXTI3_IRQn, 4, 0);
  HAL_NVIC_EnableIRQ(EXTI3_IRQn);

  HAL_NVIC_SetPriority(EXTI4_IRQn, 4, 0);
  HAL_NVIC_EnableIRQ(EXTI4_IRQn);

3.2 在外部中断中,开启或者关闭(5-15)优先级的中断:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
//  BaseType_t xYieldRequired;        
        switch( GPIO_Pin)
        {
                case  GPIO_PIN_0 : // key up
                        break ;                        
                case  GPIO_PIN_3 : // key1   
                                    portDISABLE_INTERRUPTS();
                        break ;                
                case  GPIO_PIN_4 : //key0            
                                    portENABLE_INTERRUPTS();
                        break ;                                        
                        default :
                        break ;                
        }
}

3.3 实验现象:

按下key1按键,可以看到LED灯任务不再运行。按下key0按键,LED灯任务正常运行。

视频演示如下所示:

17-3 00_00_00-00_00_30.gif





关键词: STM32F103ZET6     中断管理    

专家
2025-12-08 21:10:10     打赏
2楼

我觉得总段处理的最初目的,一定是为了及时响应最重要的任务。流程式的处理,容物耽误事儿。不过现在单片机所有用的中断太多了,真的在项目中大量使用,光是考虑优先级、嵌套、屏蔽等一堆事儿,想想就头疼。


专家
2025-12-11 15:47:29     打赏
3楼

楼上说的是,我想状态机很适合单片机应用,不知道见解对不对。


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]