请选择 进入手机版 | 继续访问电脑版

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

STM32F4的USART串口HAL库调用接收中断问题

[复制链接]
jye777 提问时间:2019-8-16 17:08 /
初始化USART中调用HAL_USART_Receive_IT(&USART1_Handle, rxBufIT, 1)开启接收中断,然后程序一运行到这个函数后,就会在串口助手接收到个0xFF。后面进入这个函数发现有一句:
/* Send dummy byte in order to generate the clock for the slave to send data */
husart->Instance->DR = (DUMMY_DATA & (uint16_t)0x01FFU); //#define DUMMY_DATA  0xFFFFU
是的,这个0xFF果然是HAL库发出来的。
如果调用HAL_USART_Receive_IT(&USART1_Handle, rxBufIT, 10),那么中断中也会通过USART_Receive_IT()同样发出10个0xFF。
然后在HAL_USART_RxCpltCallback()中会接收到0x7F(不知从何而来),调用HAL_USART_Transmit()发送,函数返回HAL_OK,但是串口助手收不到任何数据。
请问HAL库中为什么要专门发0XFF?是BUG吗?又不走同步模式,产生时钟干什么?
1.jpg
收藏 评论4 发布时间:2019-8-16 17:08

举报

4个回答
jye777 回答时间:2019-8-16 17:16:13
串口初始化
  1. int usart1_init(uint32_t baudRate)
  2. {
  3.         HAL_StatusTypeDef status = HAL_OK;
  4.        
  5.         USART1_Handle.Instance = USART1;
  6.         USART1_Handle.Init.BaudRate = baudRate; //115200
  7.         USART1_Handle.Init.WordLength = USART_WORDLENGTH_8B;
  8.         USART1_Handle.Init.StopBits = USART_STOPBITS_1;
  9.         USART1_Handle.Init.Parity = USART_PARITY_NONE;
  10.         USART1_Handle.Init.Mode = USART_MODE_TX_RX;
  11.        
  12.         if(HAL_USART_Init(&USART1_Handle) != HAL_OK) {
  13.                 return -1;
  14.         }

  15.         /* enable interrupt: RXNEIE/PEIE/EIE, every byte recv will enter USART1_IRQHandler */
  16.         if((status = HAL_USART_Receive_IT(&USART1_Handle, rxBufIT, 1)) != HAL_OK) {
  17.                 return -2;
  18.         }

  19.         return 0;
  20. }
复制代码


中断
  1. void USART1_IRQHandler(void)
  2. {
  3.         HAL_USART_IRQHandler(&USART1_Handle);
  4. }
复制代码


接收回调
  1. void HAL_USART_RxCpltCallback(USART_HandleTypeDef *husart)
  2. {
  3.         HAL_StatusTypeDef status = HAL_OK;
  4.         HAL_USART_StateTypeDef statusUsart = HAL_USART_STATE_RESET;
  5.        
  6.         if(husart->Instance == USART1) {
  7.                 if((status = HAL_USART_Transmit(husart, rxBufIT, 1, 2000)) != HAL_OK) {
  8.                         return;
  9.                 }
  10.                 /* wait for USART1 ready and enable RXNEIE again */
  11.                 //while((statusUsart = HAL_USART_GetState(&USART1_Handle)) != HAL_USART_STATE_READY); //如果有这句,statusUsart时钟为发送忙
  12.                 while((status = HAL_USART_Receive_IT(&USART1_Handle, rxBufIT, 1)) != HAL_OK);  //始终返回HAL_BUSY,卡死
  13.         }
  14. }
复制代码
Dandjinh 回答时间:2019-8-16 21:18:21
USART是同步串口,所以要发点数据触发时钟,我猜你想用的是UART

评分

参与人数 1ST金币 +1 收起 理由
jye777 + 1

查看全部评分

jye777 回答时间:2019-8-17 10:12:32
Dandjinh 发表于 2019-8-16 21:18
USART是同步串口,所以要发点数据触发时钟,我猜你想用的是UART

哦,虽然外设用的USART,但好像是要调用HAL_UART的APIs进行异步通讯,而不是HAL_USART的APIs,我以为USART不涉及到同步时钟过程就会和UART一样。
感谢提供思路,下周试试。
jye777 回答时间:2019-8-20 17:20:06
问题原因:用法错误。

我是想USART1当普通调试口用,结果用的HAL_USART相关的APIs,其实应该用HAL_UART的APIs。看了下USART和UART内部HAL库的实现,确实USART内部会多发个时钟同步信号(FF)。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版