搜索
查看: 1745|回复: 4

[求助] STM32F4的USART串口HAL库调用接收中断问题

[复制链接]

该用户从未签到

2

主题

7

帖子

0

蝴蝶豆

初级会员

最后登录
2019-8-30
发表于 2019-8-16 17:08:09 | 显示全部楼层 |阅读模式
初始化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
回复

使用道具 举报

该用户从未签到

2

主题

7

帖子

0

蝴蝶豆

初级会员

最后登录
2019-8-30
 楼主| 发表于 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. }
复制代码
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

126

帖子

80

蝴蝶豆

金牌会员

最后登录
2021-4-6
发表于 2019-8-16 21:18:21 | 显示全部楼层
USART是同步串口,所以要发点数据触发时钟,我猜你想用的是UART

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

7

帖子

0

蝴蝶豆

初级会员

最后登录
2019-8-30
 楼主| 发表于 2019-8-17 10:12:32 | 显示全部楼层
Dandjinh 发表于 2019-8-16 21:18
USART是同步串口,所以要发点数据触发时钟,我猜你想用的是UART

哦,虽然外设用的USART,但好像是要调用HAL_UART的APIs进行异步通讯,而不是HAL_USART的APIs,我以为USART不涉及到同步时钟过程就会和UART一样。
感谢提供思路,下周试试。
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

7

帖子

0

蝴蝶豆

初级会员

最后登录
2019-8-30
 楼主| 发表于 2019-8-20 17:20:06 | 显示全部楼层
问题原因:用法错误。

我是想USART1当普通调试口用,结果用的HAL_USART相关的APIs,其实应该用HAL_UART的APIs。看了下USART和UART内部HAL库的实现,确实USART内部会多发个时钟同步信号(FF)。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-19 16:39 , Processed in 0.168336 second(s), 37 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表