[方案相关] HC32F460外设中断用法

[复制链接]
2550|11
 楼主| 实际测量不符 发表于 2021-11-30 12:28 | 显示全部楼层 |阅读模式
华大HC32F460的外设中断和STM32相比也是非常的个性!!!
先来看看HC32F460的启动文件startup.s,如下图所示:
356561a5a86d0eb4a.png
 楼主| 实际测量不符 发表于 2021-11-30 12:29 | 显示全部楼层
从这个文件可以看出来,它定义的中断向量表里,对中断名有只一个编号,没有写明具体是哪个外设的中断。

这就非常有意思,因为HC32F460的外设中断的中断号是可以“任意”编程的,不过这个“任意”也并不是全部128个中断都可以随便选择,也有一定的小规则,查看手册INTC章节,有如下所示的表格:
8281561a5a8b0da69a.png
比如GPIO中断,只能选择0-37或者128。
 楼主| 实际测量不符 发表于 2021-11-30 12:30 | 显示全部楼层
下面就来看看怎么把外设中断和中断号关联起来:
这里以UART1外设为例。
首先还是看手册的中断请求表,找到UART1,如下图,UART这个外设有5个中断事件。
3064161a5a8e8c87ec.png

评论

我们知道,常规的MCU外设如STM32一样,通常是一个UART外设的所有中断请求都是共用同一个中断号,然后在该中断服务程序里面判断外设的标志位,得到中断源,并做出在相应和处理。  发表于 2021-11-30 12:31
 楼主| 实际测量不符 发表于 2021-11-30 12:31 | 显示全部楼层
但是HC32F460就完全不一样了,UART外设里的每个中断标志位,都是独立请求中断,必须单独给分配中断号,这样一来,一个UART就可以有5个中断服务程序了,编程其实更麻烦了。

比如上面的USART1_REI表示串口接收错误,可以分配0-31/80-85/136这些中断号,如果要给它分配的中断号是80,那么需要往寄存器INT_SEL80里写入278,其中278就是USART1_REI的中断事件序号。当UART1发生接收错误时,就会触发278号中断事件,该事件绑定了80号中断请求,就会执行IRQ080_Handler中断函数,我们在这个函数里面去处理对应的数据就可以了。
 楼主| 实际测量不符 发表于 2021-11-30 12:36 | 显示全部楼层
再比如USART1_RI表示接收到数据中断,我们给它分配中断号81,那么就要往INT_SEL81写入279,然后在IRQ081_Handler中断函数里面去处理接收数据。
 楼主| 实际测量不符 发表于 2021-11-30 12:37 | 显示全部楼层
上面是HC32F460的中断配置寄存器用法,华大提供了一个驱动库,
里面有一个hc32f460_interrupts.c文件,实现了中断管理,但是很坑,占用ROM空间巨大!
这个库提供了enIrqRegistration函数,用来绑定中断事件,以及中断处理函数。
但要注意,调用它之前最好先调用enIrqResign函数,用来删除中断绑定关系,否则注册中断有可能会失败!
 楼主| 实际测量不符 发表于 2021-11-30 12:38 | 显示全部楼层
下面的代码,演示注册UART1的接收中断为81号中断,并指定中断处理函数为uart1_rx_handler
 楼主| 实际测量不符 发表于 2021-11-30 12:39 | 显示全部楼层
  1. stc_irq_regi_conf_t irq_cfg;
  2. irq_cfg.enIRQn      = Int081_IRQn;
  3. irq_cfg.enIntSrc    = INT_USART1_RI;
  4. irq_cfg.pfnCallback = uart1_rx_handler;
  5. enIrqResign(Int081_IRQn);
  6. enIrqRegistration(&irq_cfg);
  7. NVIC_EnableIRQ(Int081_IRQn);
 楼主| 实际测量不符 发表于 2021-11-30 12:39 | 显示全部楼层
如果这个注册中断的时候可以给中断函数加上一个参数的话,实用性会大大提高,但是目前并不能,而一个中断事件绑定一个中断函数,又太占用ROM空间了,且很麻烦。
七毛钱 发表于 2021-12-1 17:12 来自手机 | 显示全部楼层
好**,收藏
koala889 发表于 2021-12-28 10:48 | 显示全部楼层
对我来说,这个有点深奥,不过写的挺好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

607

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部