STM32简记之NVIC和外部中断
- 格式:docx
- 大小:16.08 KB
- 文档页数:3
STM32简记之NVIC和外部中断
Posted on 2013/06/20 by M
1
之前用stm32也就是用些内部资源或者耍耍前辈留下来的库,最近在写SPWM波的时候才知道自己对于中断这方面的欠缺,更暴漏了我学东西不打基础的恶习,所以打算重新整理下资料,原因有二:1、通过这种方式能加深记忆。2、方便以后查看。因为只追求自己看得懂所以总结的比较简洁,所以称之为简记。
步骤如下:
1、系统初始化,如系统时钟初始化,使之进入72MHZ主频;
程序启动时已调用SystemInit()函数将主频改为72MHZ。
2、 GPIO配置,务必注意打开GPIO时钟时,一定打开AFIO时钟。
在使用引脚的重映射功能和外部中断时需要使用AFIO时钟。
3、 EXTI配置,在这里配置需要选择哪个引脚作为中断引脚。
EXTI_InitTypeDef EXTI_InitStructure;
定义一个EXTI初始化结构体
EXTI_InitStructure.EXTI_Line = EXTI_Line1;
设置中断线:EXTIL_Line1为中断线1
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
模式:这里有两个模式,一个是中断模式,也就是事件,具体区别如下:
“事件:是表示检测有一某件触发事件发生了。中断:有某个事件发生并产生中断,并跳转到对应的中断处理程序中。事件可以触发中断,也可以不触发中断有可能被更优先的中断屏蔽,事件不会事件本质上就是一个触发信号,是用来触发特定的外设模块或核心本身(唤醒).事件只是一个触发信号(脉冲),而中断则是一个固定的电平信号”
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
设置触发中断方式:
EXTI_Trigger_Falling 设置输入线路下降沿为中断请求
EXTI_Trigger_Rising 设置输入线路上升沿为中断请求
EXTI_Trigger_Rising_Falling 设置输入线路上升沿和下降沿为中断请求
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
定义选择中断线的新状态
EXTI_Init(&EXTI_InitStructure);
根据EXTI_InitStructure中指定的参数初始化外设 EXTI 寄存器。
4、NVIC配置,这也是比单片机多出来的部分,我们必须把NVIC中对应的通道使能,并且设置优先级别。
NVIC(嵌套中断向量控制器),用于管理中断优先级。比如在英语四级考试期间,饭堂特殊情况,监考老师优先打饭(抢占优先级),但是监考老师与监考老师之间也要排队(响应优先级),也就是说监考老师可以直接来抢断学生打饭的位置,但是监考老师与监考老师之间必须排队,不能抢断。
STM32中指定优先级的寄存器为4位,其定义如下:
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级
可以通过void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)来设定。
例如:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1) //设置位第1组
配置外部中断1优先级:
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn ; //配置中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //改中断NVIC的新状态
NVIC_Init( &NVIC_InitStructure );//按照结构体内容定义该通道NVIC
5、编写中断函数。
在启动文件(startup_stm32f10x_hd.s)中找到中断函数名称,将其加在stm32f10x_it.c内,例如:
void EXTI2_IRQHandler(void)
{
delay_init();
delay_ms(580);
flag = !flag;
if ( flag )
{
GPIO_SetBits(GPIOE, GPIO_Pin_4);
}
else
{
GPIO_ResetBits(GPIOE, GPIO_Pin_4);
}
EXTI_ClearITPendingBit(EXTI_Line2);
}
最后一句EXTI_ClearITPendingBit(EXTI_Line2)用于清除中断标志。