一、嵌入式中断系统
(1)中断原理
首先要搞明白怎么实现的中断,CPU遇到紧急事件要处理,就跳转到紧急事件,再返回来继续处理
就时SP配合PC的一套操作了
1、进入中断
(a)处理器自动保存现场到栈里SP,PC,xPSR,R0-R3,LR,
(b)入栈结束以后,ISR开始执行(中断服务)
(c)中断会自动找到中断入口函数-》Vector里面声明的
2、退出中断
(a)现场恢复PC,SP
(b)出栈完成执行下一条
二、嵌套向量控制器NVIC
NVIC专门用于管理中断控制器(CPU并不知道谁传来的中断请求)
NVIC功能:
(1)中断管理
1、给中断使能/禁止
ISER--中断使能
ICER--中断禁止
2、设置挂起状态
ISPR--中断挂起
ICPR--中断挂起清除
3、设置脉冲/下降触发
(2)中断异常的向量化处理
Reset+SVCall+系统调用+Systick
当产生异常时,处理器把PC设置为中断向量(中断入口),每一个异常就是一个中断号,汇集起来就是中断向量表
其中位置系统内部是负数,外部异常时正数。
并且优先级值越小,优先级越高
(3)中断配置
1、中断分组
STM32可以将中断分为5组-》0-4,其中划分两种:抢占优先级和响应优先级
抢占优先级响应级别高于响应优先级。其中数值越小优先级越高
嵌套:
高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的;
抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断;
抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行;
如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
- 打断的情况只会与抢占优先级有关, 和响应优先级无关!
一般情况下,系统代码执行过程中,只设置一次中断优先级分组,比如分组2,设置好分组之后一般不会再改变分组。随意改变分组会导致中断管理混乱,程序出现意想不到的执行结果。
因此设置组优先级
void NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2)就是2:2的分配
2、中断优先级
NVIC_InitTypeDef结构体
NVIC_IRQChannel:定义初始化的是哪一个中断,这个可以在stm32f10x.h文件中查到每个中断对应的名字,如USART1_IRQn;
NVIC_IRQChannelPreemptionPriority:定义此中断的抢占优先级别;
NVIC_IRQChannelSubPriority:定义此中断的响应优先级别;
NVIC_IRQChannelCmd:该中断是否使能。
实例:
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;// 抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据上面指定的参数初始化NVIC寄存器
copy好累。。。原博主好棒快去康康↓
————————————————
版权声明:本文为CSDN博主「Yngz_Miao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38410730/article/details/79829983
三、外部中断配置寄存器
EXTIx哇终于到这里我心好累
这个图里不是有
外设吗,呐EXTI就是管理外设请求的 康康:EXTIx代表 PAx,PBx,PCx...的x号引脚,每一个x引脚智能有一个响应中断
用SYSCFG来配置对应SYSCFG功能可多了
只有低16位可用,对应的16个类型分组
一个寄存器可以配4类引脚所以一共有4个寄存器来配置对应的端口
四、中断的构架
我好累
五:中断的实验
1、按键启动流水灯
配置KEY
首先看KEY的原理图
你看吧,就是按下以后KEYx对应为0,现在看看KEYx对应的引脚
看清楚了对应的引脚号,
(1)重写中断入口函数
到startup.s里找到EXTI0。2.3.4对应的入口函数改名自己实现
具体怎么实现的key_irqHander最后再说
(2)GPIO的中断初始
GPIO配置
SYSCFG配置
EXIT
NVIC
(3)结合前面的LED初始
可以编写最后的按键中断函数