打印
[信息]

STM32之CAN---中断管理浅析

[复制链接]
628|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elephant00|  楼主 | 2021-5-12 10:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1 前言

bxCAN占用4个专用的中断向量。通过设置CAN中断允许寄存器(CAN_IER),每个中断源都可以单独允许和禁用。

                                                                      图1

从图1可以看出,最右边共四个中断,中断是可以通过CAN_IER来屏蔽或允许的。

2 CAN中断允许寄存器 (CAN_IER)

地址偏移量: 0x14
复位值: 0x0000 0000

                                                                               图2


位31:18保留位,硬件强制为0
位17SLKIE: 睡眠中断允许
0: 当SLAKI位被置1时,没有中断产生;
1: 当SLAKI位被置1时,产生中断。
位16WKUIE: 睡眠唤醒中断允许
0: 当WKUI位被置1时,没有中断产生;
1: 当WKUI位被置1时,产生中断。
位15ERRIE: 错误中断允许
0: 当CAN_ESR寄存器有错误挂号时,没有中断产生;
1: 当CAN_ESR寄存器有错误挂号时,产生中断。
位14:12保留位,硬件强制为0。
位11LECIE: 上次错误号中断允许
0: 当检测到错误从而硬件对LEC[2:0]写入非0值时,不会对ERRI位置1;
1: 当检测到错误从而硬件对LEC[2:0]写入非0值时,对ERRI位置1。
位10BOFIE: 离线中断允许
0: 当BOFF位被置1时,不会对ERRI位置1;
1: 当BOFF位被置1时,对ERRI位置1。
位9EPVIE: Error Passive Interrupt Enable
0: 当EPVF位被置1时,不会对ERRI位置1;
1: 当EPVF位被置1时,对ERRI位置1。
位8EWGIE: 错误警告中断允许
0: 当EWGF位被置1时,不会对ERRI位置1;
1: 当EWGF位被置1时,对ERRI位置1。
位7保留位,硬件强制为0
位6FOVIE1: FIFO1溢出中断允许
0: 当FIFO1的FOVR位被置1时,没有中断产生;
1: 当FIFO1的FOVR位被置1时,产生中断。
位5FFIE1: FIFO1满中断允许
0: 当FIFO1的FULL位被置1时,没有中断产生;
1: 当FIFO1的FULL位被置1时,产生中断。
位4FMPIE1: FIFO1消息挂号中断允许
0: 当FIFO1的FMP[1:0]位被写入非0值时,没有中断产生;
1: 当FIFO1的FMP[1:0]位被写入非0值时,产生中断。
位3FOVIE0: FIFO0溢出中断允许
0: 当FIFO0的FOVR位被置1时,没有中断产生;
1: 当FIFO0的FOVR位被置1时,产生中断。
位2FFIE0: FIFO0满中断允许
0: 当FIFO0的FULL位被置1时,没有中断产生;
1: 当FIFO0的FULL位被置1时,产生中断。
位1FMPIE0: FIFO0消息挂号中断允许
0: 当FIFO0的FMP[1:0]位被写入非0值时,没有中断产生;
1: 当FIFO0的FMP[1:0]位被写入非0值时,产生中断。
位0TMEIE: 发送邮箱空中断允许
0: 当RQCPx位被置1时,没有中断产生;
1: 当RQCPx位被置1时,产生中断。
注: 请参考21.5节bxCAN中断。
通过上述寄存器,就可以配置允许或屏蔽哪些中断。3 固件库中如何用代码配置中断

在startup_STM32f2xx.s文件中可以看到下面四个中断:


[cpp] view plain copy


  • EXPORT  CAN1_TX_IRQHandler                [WEAK]                                                  
  • EXPORT  CAN1_RX0_IRQHandler               [WEAK]                                                
  • EXPORT  CAN1_RX1_IRQHandler               [WEAK]                                                  
  • EXPORT  CAN1_SCE_IRQHandler               [WEAK]   

以上为四个中断例程声明,对应着图1右边的四个中断输出。

如何配置中断?使用CAN_ITConfig函数开启或屏蔽中断,如下:


[cpp] view plain copy


  • CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);//打开FMP0中断  

如此,便可打开CAN接收中断了。
从图1可以看出,最右边中断有时有可能是最左边某一个中断引起的,因此,当引起最右边的某一中断时,如果最左边有多个对应的中断源的话,如果程序需要,还需进一步确定是由哪个中断源引起的,此时,需要调用CAN_GetiTStatus函数来做进一步确定。

使用特权

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

本版积分规则

970

主题

2980

帖子

7

粉丝