文档库 最新最全的文档下载
当前位置:文档库 › STM32简记之NVIC和外部中断

STM32简记之NVIC和外部中断

STM32简记之NVIC和外部中断
STM32简记之NVIC和外部中断

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)用于清除中断标志。

相关文档