赞
踩
一.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的时钟作为中断的时钟是错误的做法。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。