STM32F10x (4) –中断原理及使用固件库编程

  • Post author:
  • Post category:其他






一.NVIC和主要寄存器

在小中大型产品中,外设中断有60个,内核中端有10个。

NVIC(嵌套向量中断控制器)包括misc.h和core_cm3.h文件,是管理中断的。misc.h和core_cm3.h文件里有与内核相关的寄存器定义,stm32f10x.h文件有与外设相关的寄存器定义。在misc.h文件里找到NVIC类型定义,可以看到NVIC结构体包括中断使能寄存器,中断清除寄存器,中断使能悬起寄存器,中断清除悬起寄存器,中断有效位寄存器,中断优先级寄存器,软件触发中断寄存器。

最常使用的是中断优先级寄存器

(8位)




优先级定义:NVIC->IPRx使用高四位。在这高四位里,分为主优先级和子优先级。主和子优先级的分配由SCB->AIRCR来决定。


优先级分组(NVIC_Priority_Group):5组(0-4)分别使用0-4位表示主优先级,剩下位表示子优先级。


当主和子优先级相同时,比较硬件编号。在中断向量表中可以看到。


EXTI是外部中断,输入线有19根(互联型有20根),


对应有GPIO16根,PVD输出,RTC闹钟,USB唤醒,(以太网唤醒第20根);输入线的配置由外部中断配置寄存器AFIO_EXTICR控制



二.固件库编程


外设对应的中断使能,NVIC初始化(中断源,抢占优先级,子优先级,总的中断使能),中断服务函数(在启动文件里查找,不可以自己定义)


在EXTI初始化结构体中,有EXTILine,EXTIMode(中断或者事件模式),EXTITirgger(上下沿触发),Linecmd



三.实践:使用GPIO作为按键,使用中断方式,使LED亮灭


第一步:


初始化NVIC,用于处理中断。配置优先级分组,NVIC结构体成员写入值(中断源IRQchannel( EXTI1-4是不同的,EXTI5-9是同一个,EXTI10-15是同一个,在查表时要注意);设置抢占优先级,子优先级;使能总中断),调用NVIC的初始化函数。NVIC相关函数存放在misc.h文件;


第二步:


初始化GPIO。打开对应的总线时钟,GPIO结构体的各个成员写入值(选择引脚,设置为浮空输入,输入无速度),调用初始化函数。


第三步:


初始化EXTI。选择输入线,打开对应总线的时钟(RCCAPB2->AFIO),EXTI结构体成员写入值(默认引脚是低电平,按键按下是高电平)有上下电平触发,中断或事件,中断线,中断使能;调用初始化函数。


GPIO的PA0和PC13作为中断源,配置输入线的函数在GPIO.h文件里查找。


EXTI相关函数和结构体在启动文件和exti.h文件里。


第四步:


编写中断服务函数。编写中断服务函数需要在启动文件里


查找中断函数名称,不能随意定义


。然后


在it.c文件内编写


此中断服务函数EXTIx_IRQHandler()。使用EXTI_GetITStatus(EXTI_Linex)检测中断是否响应,然后执行中断到来时的程序。



四.总结:


1.第一步到第三步书写在新的.c文件里,用一个函数封装起来后,在main.c文件里调用,表示此中断配置在程序中执行。第四步是中断服务函数,一律书写在it.c文件里,表示该中断被触发之后执行的任务。


2.中断使能除了要打开EXTI_LineCmd之外,也要打开NVIC_IRQChannelCmd,


只有两个同时打开


,这个中断才会工作。


3.中断工作需要打开时钟,


EXTI挂载在APB2总线上,由外部中断配置寄存器AFIO管理。


如果是GPIO端口输入作为中断源,此时打开GPIO的时钟作为中断的时钟是错误的做法。



版权声明:本文为2301_76924398原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。