打印
[应用相关]

STM32 CortexM3 中断 学习笔记!

[复制链接]
1102|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vigous1|  楼主 | 2015-2-27 21:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
异常:一切打断了程序运行的异常,可能是由于程序错误或者硬件错误导致程序中断或者跑飞都是异常。
中断:中断是CPU运行的正常行为,系统停止当前正在运行的程序而转向其他服务
            CM3中一共有240个中断,15个异常,其中异常编号为1~15,编号为0的没有异常。一般芯片中的中断数量也是有限的,STM32有84个中断其中,内核有16个,  
            外部中断68个,F103中只有60个。
中断通道:每个可中断的外设对应一个钟段通道,因此内核外部的中断通道共有68个,每个通道设置对应的优先级控制字,就可以关联到不同的中断优先级,产生中断嵌套。
            抢占优先级与响应(子)优先级:不同的抢占优先级之间可以发生嵌套,如果两个中断的抢占优先级相同而子优先级不同,它们之间不能发生嵌套。子优先级产生作用
            的时候是在:当抢占优先级相同而响应优先级不同时,如果两个各中断同时到来,系统将会首先响应响应优先级高的那个中断。在CM3中中断编号越小对应的优先级越
            高。

沙发
vigous1|  楼主 | 2015-2-27 21:03 | 只看该作者
优先级设置
    1. 设置中断优先级的分组,在“应用程序中断及复位控制寄存器(AIRCR)”中[10:8] PRIGROUP段设置分组特征,如下表:

可见尽管有68个通道但是系统中的抢占优先级只能设置最多16级。
   2.设置外设本身的寄存器,允许相应的中断,如允许 UIE(TIME2_DIER 的第[0]位)
   3.设置 TIME2 中断通道的抢先优先级和子优先级(IP[28] ,在 NVIC 寄存器组中)

这里用库函数对NVIC进行初始化,先定义NVIC_InitTypeDef类型的结构体,来传递参数,包括4个参数:[cpp] view plaincopyprint?


  • typedef struct  
  • {  
  •   uint8_t NVIC_IRQChannel;  
  •   uint8_t NVIC_IRQChannelPreemptionPriority;  
  •   uint8_t NVIC_IRQChannelSubPriority;  
  •   FunctionalState NVIC_IRQChannelCmd;  
  • }NVIC_InitTypeDef;  
  • <span style="font-family:Arial;BACKGROUND-COLOR: #ffffff"></span>  



分别要设置中断通道的选择,在使stm32f10x.h中有对应的中断通道宏定义,然后设置抢占优先级子优先级,在后使能中断。

使用特权

评论回复
板凳
vigous1|  楼主 | 2015-2-27 21:04 | 只看该作者
4.中断处理函数
       按照库函数工程模板一般将,中断服务函数写在stm32f10x_it.c中,但是也可以也在对应外设的初始化中只要最终包含到main.c中就行了。在中断向量表中,库函数文件已经定义了各个外部中断对应的服务函数的名字,不管写在哪里应该保证名字一样,这样编译的时候才能通过,在启动文件startup_stm32f10x_hd.s中就有对应的中断向量表可以查看服务函数应该写的名称。
       在服务函数中,如果中段以后硬件不会自动清除标志位,就应该软件清除标志位。否则永远退不出中断。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

88

主题

427

帖子

15

粉丝