实际测量不符 发表于 2021-11-30 12:28

HC32F460外设中断用法

华大HC32F460的外设中断和STM32相比也是非常的个性!!!
先来看看HC32F460的启动文件startup.s,如下图所示:

实际测量不符 发表于 2021-11-30 12:29

从这个文件可以看出来,它定义的中断向量表里,对中断名有只一个编号,没有写明具体是哪个外设的中断。

这就非常有意思,因为HC32F460的外设中断的中断号是可以“任意”编程的,不过这个“任意”也并不是全部128个中断都可以随便选择,也有一定的小规则,查看手册INTC章节,有如下所示的表格:

比如GPIO中断,只能选择0-37或者128。

实际测量不符 发表于 2021-11-30 12:30

下面就来看看怎么把外设中断和中断号关联起来:
这里以UART1外设为例。
首先还是看手册的中断请求表,找到UART1,如下图,UART这个外设有5个中断事件。

实际测量不符 发表于 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

stc_irq_regi_conf_t irq_cfg;
irq_cfg.enIRQn      = Int081_IRQn;
irq_cfg.enIntSrc    = INT_USART1_RI;
irq_cfg.pfnCallback = uart1_rx_handler;
enIrqResign(Int081_IRQn);
enIrqRegistration(&irq_cfg);
NVIC_EnableIRQ(Int081_IRQn);

实际测量不符 发表于 2021-11-30 12:39

如果这个注册中断的时候可以给中断函数加上一个参数的话,实用性会大大提高,但是目前并不能,而一个中断事件绑定一个中断函数,又太占用ROM空间了,且很麻烦。

七毛钱 发表于 2021-12-1 17:12

好**,收藏

koala889 发表于 2021-12-28 10:48

对我来说,这个有点深奥,不过写的挺好
页: [1]
查看完整版本: HC32F460外设中断用法