博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32学习笔记(三)——外部中断的使用
阅读量:5803 次
发布时间:2019-06-18

本文共 3421 字,大约阅读时间需要 11 分钟。

 

开发板芯片:STM32F407ZGT6

硬件连接:PE3-KEY1

一、STM32F4的中断介绍

STM32F4的每个IO都可以作为外部中断输入,很强大的功能吧!以前学习的51只有两个外部中断。

STM32F4的中断控制器支持22个外部中断/事件请求:

EXTI线0~15:对应外部IO口的输入中断。即GPIOx.0—EXTI0,GPIOx.a—EXTIa如下图所示

EXTI线16:连接到PVD输出。

EXTI线17:连接到RTC闹钟事件。

EXTI线18:连接到USB OTG FS唤醒事件。

EXTI线19:连接到以太网唤醒事件。

EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件。

EXTI线21:连接到RTC入侵和时间戳事件。EXTI线22:连接到RTC唤醒事件。

对于每个中断线0我们可以设置相应的触发方式(上升沿触发,下降沿触发,边沿触发)以及使能。

中断服务函数又是如何分配的呢?

其中中断线0-4有单独的中断向量,即单独的中断服务函数。

EXTI0_IRQHandler

EXTI1_IRQHandler

EXTI2_IRQHandler

EXTI3_IRQHandler

EXTI4_IRQHandler

中断线5-9共用一个中断服务函数

EXTI9_5_IRQHandler

中断线10-15共同一个中断服务函数

EXTI15_10_IRQHandler

二、中断优先级的管理

嵌套向量中断控制器NVIC (Nested vectored interrupt controller)

中断优先级分组的是在SCB->AIRCR寄存器中设置的,具体设置情况如下:

选择不同的分组可以设置不同的优先级等级,例如选择分组2,分配结果为2位抢占,2位响应,既然是两位,所以优先级可以设置为0-3,要注意的是,设置好分组之后不要再改变分组,随意改变分组会导致中断管理混乱。

 

关于抢占优先级和响应优先级的说明

    • 高优先级的抢占优先级可以打断正在进行的低抢占优先级中断的。
    • 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
    • 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
    • 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;

例如:

这里要注意的是,抢占优先级设置的越小,则优先级越高,0最高

则这三个优先级的顺序为:中断7>中断3>中断6。 

三、程序设计

1.初始化PF3中断,即EXTI3中断的过程:

1.1.使能GPIO时钟,注意:模式设置为输入

GPIO_InitTypeDef  GPIO_InitStructure;    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);   //使能GPIOA,GPIOE时钟    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;		//普通输入模式    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;		//上拉    GPIO_Init(GPIOE, &GPIO_InitStructure);

1.2.使能SYSCFG时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);		//使能SYSCFG时钟,必须的

1.3.设置GPIO和中断线的映射关系

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);	//PF3,中断线映射,line3-Pin3

1.4.中断初始化,包括设置触发方式,指定中断线,使能中断,设置中断模式等

EXTI_InitTypeDef EXTI_InitStructure;		//中断方式初始化    EXTI_InitStructure.EXTI_Line = EXTI_Line3;				//指定中断线3    EXTI_InitStructure.EXTI_LineCmd = ENABLE;					//使能中断线    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;		//中断模式    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;	//下降沿触发方式,必须的,上升沿不灵敏    EXTI_Init(&EXTI_InitStructure);

1.5.中断分组和优先级设置

NVIC_InitTypeDef NVIC_InitStructure;		//优先级初始化    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);		//设置中断分组为2:2,优先级范围0-3    NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;				//指定中断线3    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				//通道使能    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;		//抢占优先级0,可以设置0-3    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;			//响应优先级0,可以设置0-3    NVIC_Init(&NVIC_InitStructure);

 2.中断服务函数

中断初始化完毕后,就可以编写相应的中断服务函数了,我们使用的是中断线3,所以对应的中断服务函数名称为void EXTI3_IRQHandler(void),注意在执行完后要将标志位清零,

void EXTI3_IRQHandler(void)			//中断线3服务函数,发生中断时,自动执行{    delay_ms(10);	//消抖,很有必要,增加识别的准确度    if(KEY1 == 0)			//用EXTI_GetITStatus(EXTI_Line3)!=RESET来判断不是很灵敏,快速按时不准确        LED0 = !LED0;    EXTI_ClearITPendingBit(EXTI_Line3);  //清除LINE3上的中断标志位,以备下一次使用}

根据手册可以通过EXTI_GetITStatus(EXTI_Line3)来判断中断标志位的状态,实际运行时发现这种方式并不是很有效,可能是我的用法不对吧!

这个中断服务函数还是很简单的,就是按下按键时,将LED的状态反转

 3.主函数

主函数的执行部分可以不写,这里写了 LED 的闪烁用来指示程序的运行

int main(void){    delay_init(168);    LED_Init();    IT_Init();		//中断初始化    LED0_OFF;    LED1_OFF;    while(1)    {        LED1_ON;        delay_ms(500);			//LED1闪烁提醒程序运行状态        LED1_OFF;        delay_ms(500);    }}

 

总结:

从以上过程可以看出STM32F4的外部中断的配置和使用方法还是很简单清晰的。虽然比51要复杂一些,但是毕竟功能那么强大,复杂一些也是可以理解的。

参考资料:

STM32F4xx中文参考手册

STM32F4开发指南-库函数版本_V1.1

 

以上是我学习过程的一些个人理解,有不对或不准确的地方,欢迎各位大神指正。

 

2017年4月17日22:01:43

欢迎大家关注

微信扫码关注我的公众号

不定期更新个人学习笔记和技术总结,欢迎大家互相学习交流!

 

转载地址:http://jyrfx.baihongyu.com/

你可能感兴趣的文章
vrpie在Visio Studio 中无法调试的问题
查看>>
第六课:数据库的基本工具
查看>>
关于二叉树重构的思索
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
skynet实践(8)-接入websocket
查看>>
系统版本判断
查看>>
关于Css选择器优先级
查看>>
My97DatePicker 日历插件
查看>>
0603 学术诚信与职业道德
查看>>
小点心家族第3位成员——楼层定位效果
查看>>
Knockout.Js官网学习(enable绑定、disable绑定)
查看>>
hive基本操作与应用
查看>>
excel快捷键设置
查看>>
poj3692
查看>>
python之信号量【Semaphore】
查看>>
html5纲要,细谈HTML 5新增的元素
查看>>
Android应用集成支付宝接口的简化
查看>>
[分享]Ubuntu12.04安装基础教程(图文)
查看>>
[Vim] 搜索模式(正则表达式)
查看>>
#HTTP协议学习# (二)基本认证
查看>>