你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于 HAL 库 __HAL_UART_GET_IT_SOURCE() 的疑问

[复制链接]
PuppyDossy 提问时间:2021-8-17 14:55 / 未解决
最近在使用到 __HAL_UART_GET_IT_SOURCE() 产生了一个疑问
这个宏如用户手册写到可以看可以用来查看某 UART 中断有没有发生

但是在查看源码的时候发现,源码只做了读取CR寄存器的操作,如下
  1. #define __HAL_UART_GET_IT_SOURCE(__HANDLE__, __IT__) (((((__IT__) >> 28U) == UART_CR1_REG_INDEX)? (__HANDLE__)->Instance->CR1:(((((uint32_t)(__IT__)) >> 28U) == UART_CR2_REG_INDEX)? \
  2.                                                       (__HANDLE__)->Instance->CR2 : (__HANDLE__)->Instance->CR3)) & (((uint32_t)(__IT__)) & UART_IT_MASK))
复制代码
且CR寄存器这些位,如STM32f10x参考手册描述,只是用来使能某个中断源的,例如IDLEIE
所以我不解为什么这个宏__HAL_UART_GET_IT_SOURCE()如此描述,甚至正常运行。
希望懂的大佬解答一下,万分感谢。
收藏 评论1 发布时间:2021-8-17 14:55

举报

1个回答
胤幻1988 回答时间:2021-8-17 16:35:38
我估计你把 中断源和中断标志混淆了  中断源 表示设置中断的寄存器CR  中断标志 其实就是状态寄存器SR
这个宏的意义就是判断我们查询的中断标志,本身代表的中断有没有被设置
仔细看下,__IT_ 我们举个例子为#define UART_IT_TC                       ((uint32_t)(UART_CR1_REG_INDEX << 28U | USART_CR1_TCIE))  我们可以看到中断标志有2部分组成,一部分是当前所在CRx,一部分是真实的CRx 里面对应的某个中断配置位((((__IT__) >> 28U) == UART_CR1_REG_INDEX)? (__HANDLE__)->Instance->CR1((((uint32_t)(__IT__)) >> 28U) == UART_CR2_REG_INDEX)? \
                                                      (__HANDLE__)->Instance->CR2 : (__HANDLE__)->Instance->CR3)) 只是确定这个中断到底是属于CR1还是CR2还是CR3的,然后读取对应CR寄存器,然后这个值再&&(((uint32_t)(__IT__)) & UART_IT_MASK) 这一句就是判断CR里面到底有没有设置我们要判断的中断


还拿UART_IT_TC 举例  那么先判断出 (__HANDLE__)->Instance->CR1 某个串口读这个CR1寄存器 然后与 USART_CR1_TCIE 进行与 如果为0 则说明没有配置该中断  不为0 则配置了该中端
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版