STM32中断
Disp_Buffer[2] ++;
if(Disp_Buffer[2] <= 24)
Disp_Buffer[3] = 0;
Disp_Buffer[4]++;
}
}
}
}
STM32定时器中断的实现方法
STM32------中断
Cortex内核具有强大的异常响应系统,它把能够
打断当前代码执行流程的事件分为异常
(exception)和中断(interrupt),并把它们用一个
表管理起来,编号为0~15的称为内核异常,而
16以上的则称为外部中断(外,相对内核而言),
这个表就称为中断向量表。开始响应一个中断后,
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
Disp_Buffer[0] ++;
if(Disp_Buffer[0] <= 60)
{
Disp_Buffer[1] = 0;
响应优先级
抢占优先级
抢占: 当一个异常发生时,硬件会自动比较
该异常的优先级是否比当前的异常优先级
更高。如果发现来了更高优先级的异常,
处理器就会中断当前的程序,服务新来的
异常。抢占打断其他中断的属性,即因为
具有这个属性,会出现嵌套中断(在执行
中断服务函数A的过程中被中断B打断,先
执行完中断服务B再继续执行中断服务A)
响应优先级分别为0~7。
第2组:2位用来配置抢占优先级,2位用来配置
响应优先级。即2^2=4种抢占优先级,2^2=4
种响应优先级。
第3组:高3位用来配置抢占优先级,最低1
位用来配置响应优先级。即有8种抢占优先
级,2个子优先级。
第4组:所有4位用来配置响应优先级。即
16种中断向量具有都不相同的响应优先级。
其属性编号越小,优先级别越高。
响应优先级
响应属性则应用在抢占属性相同的情况下,
如果两个中断同时到达,则先处理响应优
先级高的中断,再处理响应优先级低的中
断
其属性编号越小,优先级别越高
若内核正在执行C的中断服务函数,则它能
被抢占优先级更高的中断A打断,由于B和C
的抢占优先级相同,所以C不能被B打断。
堆栈。
中断/异常的响应
取向量
当数据总线(系统总线)操作入栈时,指令总线(I‐Code总
线)从向量表中找出正确的异常向量,对应的服务程序入口地
址,然后在服务程序的入口处预取指。入栈与取指这两个工作
能同时进行。
更新寄存器
SP:在入栈中会把堆栈指针(PSP或MSP)更新到新的
位置。在执行服务例程后,
以自行设置的。
中断/异常的响应
入栈
把8个寄存器的值压入栈,自动保存现场的必要部分:依次把xPSR,
PC, LR, R12以及R3‐R0由硬件自动压入适当的堆栈中:如果当响应
异常时,当前的代码正在使用PSP,则压入PSP,即使用线程堆栈;
否则压入MSP,使用主堆栈。一旦进入了服务例程,就将一直使用主
但如果B和C中断是同时到达的,内核就会
首先响应响应优先级别更高的B中断。
抢占优先级和响应优先级的数量由一个4位的
数字来决定。
第0组:所有4位用来配置抢占优先级,即NVIC
配置的2^4 =16种中断向量都是只有抢占属性,
没有响应属性。
第1组:最高1位用来配置抢占优先级,低3位用
来配置响应优先级。抢占优先级(0级,1级),
CM3 会自动定位一张向量表,并且根据中断号
从表中找出ISR 的入口地址,跳转过去执行。
而STM32对这个表重新进行了编排,把编号从-3
至6的中断向量定义为系统异常,编号为负 的内
核异常不能被设置优先级,如复位(Reset)、不
可屏蔽中断 (NMI)、硬错误(Hardfault)。从编号
7开始的为外部中断,这些中断的优先级都是可
将由MSP负责对堆栈的访问。
PSR:IPSR位段(地处PSR的最低部分)会被更新为新
响应的异常编号。
PC:在向量取出完毕后,PC将指向服务例程的入口地址
异常返回
当异常服务例程执行完毕后,需要很正式地做一个“异常返回”
动作序列,从而恢复先
前的系统状态,才能使被中断的程序得以继续执行。
NVIC 的功能
中断向量
NVIC_IRQChannelCmd
使能/禁止
NVIC_IRQChannelPreemptionPriority
抢占优先级
NVIC_IRQChannelSubPriority
响应优先级
第四步 NVIC_Init(&NVIC_InitStructure);
STM32的中断服务函数
3、动态优先级调整支持
软件可以在运行时期更改中断的优先级。
4、缩短中断延迟
为了缩短中断延迟,引入了好几个新特性。包括自动的
现场保护和恢复,以及其它的措施,用于缩短中断嵌套时
的ISR 间延迟。
5、中断可屏蔽
通过设置BASEPRI寄存器可以屏蔽优先级低于某个阈值
的中断/异常,也可通过设置PRIMASK 和FAULTMASK
STM32中断的配置方法
第一步 定义一个中断配置结构体变量
NVIC_InitTypeDef NVIC_InitStructure;
第二步 建立中断优先级配置组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup
_1);
第三步 对结构体变量初始化
NVIC_IRQChannel
stm32f10x_it.c文件用来存放中断服务函数。
1)TIMx时钟使能。
2)设置TIMx_ARR和TIMx_PSC的值。
3)设置TIMx_DIER允许更新中断。
4)允许TIMx工作。
5)TIMx中断分组设置。
6)编写中断服务函数。
STM32的中断服务函数
void TIM2_IRQHandler(void)
STM32的中断多,需要一个强大而方便的中断控制器
NVIC (Nested Vectored Interrupt Controller),NVIC
是属于Cortex内核的器件。
1、可嵌套中断支持
可嵌套中断支持的作用范围很广,覆盖了所有的外部中断
和绝大多数系统异常。这些异常都可以被赋予不同的优先
级。当优先级被存储在xPSR 的专用字段中。当一个异
常发生时,硬件会自动比较该异常的优先级是否比当前的
异常优先级更高。如果发现来了更高优先级的异常,处理
器就会中断当前的程序,而服务新来的异常——即立即抢
占。
2、向量中断支持
当开始响应一个中断后,CM3 会自动定位一张向量表,
并且根据中断号从表中找出ISR 的入口地址,然后跳转过
去执行。中断延迟时间大为缩短。
寄存器屏蔽全体。
STM32中断配置
配置STM32的中断需要理解2个内容,配
置4个变量。
两个内容:抢占优先级,响应优先级
4个变量:
NVIC_IRQChannel 中断向量
NVIC_IRQChannelCmd 使能/禁止
NVIC_IRQChannelPreemptionPriority
抢占优先级
NVIC_IRQChannelSubPriority