在学习51单片机的时候,配置串口中断服务函数,只需要查看串口中断的中断号,然后在编写中断服务函数的时候,在函数名后面加上中断号。而在stm32中,中断的数量较多,对于中断的管理也会稍微复杂一点,而且中断服务函数名字不能自己随便乱取,已经有定义过,要通过查询找到你所使用的中断服务函数所需要用到的名字。

CM3内核可以支持256个中断,其中包含有16个内核中断和240个外部中断。但是stm32只用到了其中的84个中断(16个内核中断和68个可屏蔽中断)。

管理这么多的中断,stm32使用了几个寄存器来使他们有序的执行:

ISER[8]:(Interrupt Set-Enable Registers),中断使能寄存器组,有ISER[0]~ISER[7]8个32位寄存器组成,每一位控制一个中断,总共可控制256个中断,而使用stm32,只用到了ISER[0~2],ISER[0]的 bit0~31 分别对应中断 0~31;ISER[1]的 bit0~32 对应中断 32~63;ISER[2]的 bit0~3 对应中断 64~67。

ICER[8]:(Interrupt Clear-Enable Registers),中断除能寄存器组。与上一个寄存器相反,不做赘述。

ISPR[8]:(Interrupt Set-Pending Registers),中断挂起控制寄存器组。这个寄存器的作用是当有一个更高优先级的中断出现时,将低优先级正在执行的中断先挂起,让给高优先级的先。

ICPR[8]:(Interrupt Clear-Pending Registers),中断解挂控制寄存器组。当一个中断因为高优先级的中断而被挂起的时候,那么当高优先级执行完,这个中断应该被解挂才能继续执行。

IABR[8]:(Interrupt Active Bit Registers),中断激活标志位寄存器组。这是一个只读的寄存器,通过这个寄存器我们可以读出哪个中断在执行(对应的位为1则表示该中断正在执行)

IP[240]:(Interrupt Priority Registers),中断优先级控制的寄存器组。这个组由240个8bit的寄存器组成,stm32只用到了IP[67]~IP[0],分别对应中断 67~0。这个组主要是用来设置抢占优先级和响应优先级(这两个优先级是用来判断中断的优先级高低的,假如抢占优先级和响应优先级都相等,则哪个中断先发生,则哪个优先级高;如果不相等,就先判断抢占优先级,哪个抢占优先级高则哪个先,如果,连抢占优先级都相等,就判断响应优先级)。虽然寄存器有8个bit,但只用到4个bit

由上表,由寄存器AIRCR来设定所用到的4位bit中到底分配几个bit来表示抢占优先级,像上面那样,AIRCR为0时,4位bit全部用来表示响应优先级。

从上面的知识可以看出,在串口中断中,像中断的使能由串口的状态来决定,比如像接收完毕时产生中断,而挂起和解挂则由系统根据优先级来设置,那么我们需要做的就是去配置中断的中断分组(就是上面表格说到的内容),以及优先级,然后编写产生中断后要做的事(即中断服务函数)

//设置 NVIC 分组
//NVIC_Group:NVIC 分组 0~4 总共 5 组
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
{ u32 temp,temp1; temp1=(~NVIC_Group)&0x07;//取后三位temp1<<=8;temp=SCB->AIRCR; //读取先前的设置temp&=0X0000F8FF; //清空先前分组temp|=0X05FA0000; //写入钥匙temp|=temp1;SCB->AIRCR=temp; //设置分组
}

上面一段代码时配置分组的,在配置AIRCR时,需要先向AIRCR输入秘钥,为了保持AIRCR原先的值,先将AIRCR原先的值保留下来,然后向AIRCR输入秘钥,之后再把保留下来的值赋值回去。

//设置 NVIC
//NVIC_PreemptionPriority:抢占优先级
//NVIC_SubPriority :响应优先级
//NVIC_Channel :中断编号
//NVIC_Group :中断分组 0~4
//注意优先级不能超过设定的组的范围!否则会有意想不到的错误
//组划分:
//组 0:0 位抢占优先级,4 位响应优先级
//组 1:1 位抢占优先级,3 位响应优先级
//组 2:2 位抢占优先级,2 位响应优先级
//组 3:3 位抢占优先级,1 位响应优先级
//组 4:4 位抢占优先级,0 位响应优先级
//NVIC_SubPriority 和 NVIC_PreemptionPriority 的原则是,数值越小,越优先
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,
u8 NVIC_Group)
{ u32 temp;MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组temp=NVIC_PreemptionPriority<<(4-NVIC_Group); temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);temp&=0xf; //取低四位 NVIC->ISER[NVIC_Channel/32]|=(1<<NVIC_Channel%32);//使能中断位(要清除的话,相反操作就 OK) NVIC->IP[NVIC_Channel]|=temp<<4; //设置响应优先级和抢断优先级
}

上面一段代码则是用来设置优先级(抢占优先级和响应优先级)。上面的分组分好后,我们便知道IP寄存器中有4位bit用几位来表示抢占优先级,之后就该开始设置优先级的值了,比如我们分为组 1:1 位抢占优先级,3 位响应优先级,我们赋值1010,则表示抢占优先级为1,响应优先级为2.

到这里,中断就配置完了,接下来就要自己写中断服务函数了。

stm32之配置串口中断服务函数相关推荐

  1. 单片机编程小错记录1:漏写串口中断服务函数

    问题描述: 原本单独测试没问题的定时器程序,但在加上串口程序后出现了问题,发现定时器貌似没有在正常工作...... 问题发现: 程序如下: 该程序主要想实现的功能是: 1.串口在初始化时发送" ...

  2. c语言 串口中断服务函数,GCC-AVR 编写中断服务函数的注意事项

    //注意:本文使用的GCC-AVR版本为WinAVR20100110 中断不是C语言的一部分,中断的实现是由编译器实现的.所以,不同版本的编译器的中断的写法有很大的不同:即便同样是WinAVR,不同版 ...

  3. STM32 关于外部中断线、中断源和中断服务函数的问题

    STM32 关于外部中断线.中断源和中断服务函数的问题 中断线问题: 上图可以看出,PA0.PB0...PG0共用的EXTI0中断线,PA1.PB1...PG1共用的EXTI1中断线,也就是 编程里面 ...

  4. stm32 中断服务函数是如何进入的

    今天在看stm32的中断,一时间不理解stm32主函数是如何进入中断函数的,按C编程的理解,会有个特定的入口之类的,但是看demo过程中没有发现入口. 以串口中断服务函数void USART1_IRQ ...

  5. stm32f103——中断——UART中断服务函数

    在程序中,CPU对外界突发事件进行处理的方式又两种: 1>轮询系统:(在main中,使用while循环,进行循环判断外界事物是否发生)         while(1){            ...

  6. stm32外部中断问题(每次stm32进行系统复位按键控制NRST=0,程序立马进入中断服务函数)

    rf射频数据收发芯片的一个数据接收指示引脚连接stm32的一个gpio口,设置为中断口.当rf接收到数据的时候,数据接收指示引脚由高电平变为低电平,所以中断配置里面配置的是IPU,下降沿触发.系统复位 ...

  7. stm32中断服务函数

    在stm32中中断服务函数的命名是固定的,在stm32f4xx.it中编写 比如我写的uart中断服务函数 void DEBUG_USART_IRQHandler(void) {uint8_t ucT ...

  8. RTX5 | 消息队列04 - (实战技巧)串口中断回调函数ISR同步线程

    文章目录 一.前言 二.实验目的 三.API 3.2.osMessageQueueGet 四.代码 4.1.main.h 4.2.stm32f1xx.it.c 4.3.main.c 五.Event R ...

  9. 串行口中断服务函数的触发条件-------TI/RI 触发

    串行口中断服务函数和其他中断本质上是一样的,达到特定的条件,向CPU申请中断,进入中断服务函数: 我特意在郭天祥老师的书上找到了一句话:当数据被写入SBUF寄存器后,单片机自动开始从起始位发送数据,发 ...

最新文章

  1. [原创]CentOS下Mysql双机互为备份
  2. Promise - js异步控制神器
  3. 路由器发展编年史 完结篇
  4. 7 ArcMap能复制,不能粘贴
  5. [转]HTTPS网络流量解密方法探索系列(一)
  6. [蓝桥杯][2016年第七届真题]冰雹数(暴力打表找规律)
  7. php 生成excel空白,phpexcel库在localhost上运行良好,但在服务器中生成空白的excel文件...
  8. 理论基础 —— 栈 —— 链栈
  9. 安卓开发笔记(十):升级ListView为RecylerView的使用
  10. java实现中文语音朗读
  11. web项目开发上传功能
  12. 对InputStream,OutputStream,Reader,Writer的详解
  13. 深入学习Spring IOC和AOP 实例代码
  14. 交换机怎么和计算机连接网络打印机,怎么通过地址栏的方式连接网络打印机的方法?...
  15. 几个简单的小功能,能提高微信群活跃度?
  16. 数模2021暑期培训
  17. 华硕路由 ac ax_【路由器】华硕网络开启802.11ax电竞生态
  18. cad计算机快捷键设置,小U讲解完整版电脑CAD快捷键大全
  19. GBase8d产品admin目录下的文件及文件夹说明
  20. 每日一博 - 3D架构图 cloudcraft

热门文章

  1. kindle推送服务
  2. OV7670 的SCCB (I2C)波形记录
  3. 展会回顾|2021ELEXCON电子展,飞凌嵌入式展位强势吸睛
  4. 将WiFi模块的模式从ap模式修改为sta模式
  5. 数学建模——大数据时代下的中小微企业信贷决策(2020年国赛C题)
  6. 百度ocr 图片转文字
  7. 达人评测 i3-1315U、i5-1335U 和 i7-1355U选哪个 酷睿i31315U、i51335U 和 i71355U对比
  8. Object克隆的补充与总结
  9. kettle -- 简介
  10. 论文超详细精读|六千字:ST-GCN