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

请教,hal库的串口空闲中断怎么写?另,串口中断函数看...

[复制链接]
any012 提问时间:2018-11-22 09:43 /
悬赏12ST金币已解决
  1. void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
  2. {
  3.    uint32_t isrflags   = READ_REG(huart->Instance->SR);
  4.    uint32_t cr1its     = READ_REG(huart->Instance->CR1);
  5.    uint32_t cr3its     = READ_REG(huart->Instance->CR3);
  6.    uint32_t errorflags = 0x00U;
  7.    uint32_t dmarequest = 0x00U;

  8.   /* If no error occurs 没有校验错误、帧错误、过载错误、噪声错误*/
  9.   errorflags = (isrflags & (uint32_t)(USART_SR_PE | USART_SR_FE | USART_SR_ORE | USART_SR_NE));
  10.   if(errorflags == RESET)
  11.   {
  12.     /* UART in mode Receiver 如果接收非空标志置位,调用接收中断函数-------------------------------------------------*/
  13.     if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
  14.     {
  15.       UART_Receive_IT(huart);
  16.       return;
  17.     }
  18.   }

  19.   /* If some errors occur 如果有错误,且CR3错误中断使能或CR1的非空中断或校验错误中断使能,不明白这里为什么加上非空中断*/
  20.   if((errorflags != RESET) && (((cr3its & USART_CR3_EIE) != RESET) || ((cr1its & (USART_CR1_RXNEIE | USART_CR1_PEIE)) != RESET)))
  21.   {
  22.     /* UART parity error interrupt occurred校验错误 ----------------------------------*/
  23.     if(((isrflags & USART_SR_PE) != RESET) && ((cr1its & USART_CR1_PEIE) != RESET))
  24.     {
  25.       huart->ErrorCode |= HAL_UART_ERROR_PE;
  26.     }

  27.     /* UART noise error interrupt occurred 噪声错误-----------------------------------*/
  28.     if(((isrflags & USART_SR_NE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
  29.     {
  30.       huart->ErrorCode |= HAL_UART_ERROR_NE;
  31.     }

  32.     /* UART frame error interrupt occurred 帧错误-----------------------------------*/
  33.     if(((isrflags & USART_SR_FE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
  34.     {
  35.       huart->ErrorCode |= HAL_UART_ERROR_FE;
  36.     }

  37.     /* UART Over-Run interrupt occurred 过载错误--------------------------------------*/
  38.     if(((isrflags & USART_SR_ORE) != RESET) && ((cr3its & USART_CR3_EIE) != RESET))
  39.     {
  40.       huart->ErrorCode |= HAL_UART_ERROR_ORE;
  41.     }

  42.     /* Call UART Error Call back function if need be 调用错误处理回调函数--------------------------*/
  43.     if(huart->ErrorCode != HAL_UART_ERROR_NONE)
  44.     {
  45.       /* UART in mode Receiver 这里不是和函数一开始那句重了吗?!-----------------------------------------------*/
  46.       if(((isrflags & USART_SR_RXNE) != RESET) && ((cr1its & USART_CR1_RXNEIE) != RESET))
  47.       {
  48.         UART_Receive_IT(huart);
  49.       }

  50.      ...
  51. }
复制代码

这个中断函数,先是判断串口SR寄存器有没有错误,没有错误的话,调用串口中断接收函数UART_Receive_IT(huart);
后面在SR寄存器有错误标识的情况下,进行了一堆判断,结果还是调用UART_Receive_IT(huart)这个函数?
第52行和第14行不是重了吗?

没有错误的情况下,如果处于接收状态,且接收非空标志被置位了,调用中断接收函数;
如果有错误,判断错误类型,如果处于接收状态,且接收非空标志被置位了,调用中断接收函数?

最佳答案

查看完整内容

直接在it文件里在HAL库的中断处理之前加上空闲中断的处理
收藏 评论7 发布时间:2018-11-22 09:43

举报

7个回答
斜阳 回答时间:2018-11-22 09:43:56
直接在it文件里在HAL库的中断处理之前加上空闲中断的处理

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

any012 回答时间:2018-11-22 10:29:31
之后行吗?
废鱼 回答时间:2018-11-22 10:36:38
我理解的是,上面满足后就跳出了,如果上面不满足,会走下面的代码,处理UART_Receive_IT用的是同样的标志位,是不同的处理过程。

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

any012 回答时间:2018-11-22 11:23:04
谢谢。
斜阳 回答时间:2018-11-23 11:19:05

建议放前边,自己的代码把空闲中断处理完就可以退出中断服务函数了,不需要再走HAL库的处理过程
李康1202 回答时间:2019-10-21 11:22:49
官方给的串口中断程序
李康1202 回答时间:2019-10-21 11:24:19
串口空闲中断

串口空闲中断.pdf

下载

426.76 KB, 下载次数: 70, 下载积分: ST金币 -1

空闲中断

评分

参与人数 1ST金币 +10 收起 理由
any012 + 10 很给力!

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版