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

             一.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的时钟作为中断的时钟是错误的做法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值