有人使用STM32H7芯片做些事情,发现基于ST公司的HAL库开发UART1的DMA收发时可以轻松实现,而当使用ST的LL库组织代码时,却没法实现UART的DMA传输。 感觉上就是使用HAL库编写代码功能正常而基于LL库则不行。真是这样吗? 使用STM32CubeMx进行图形化配置,并生成基于HAL库的初始代码,要实现UART收发功能的DMA传输的话,除...
找到问题解决起来也很简单,改HAL的HAL_UART_Receive代码如下: 1.//这是我重写的UART接收函数,除了修复超时导致的丢数据问题以外,增加了 2.//超时后返回当前读取到的数据量,这样可以读不定长帧。目标接收20Byte, 3.//实际发送了10Byte,那么pSize为10,也就是实际接收到的数据量。
huart->ErrorCode = HAL_UART_ERROR_NONE; huart->RxState = HAL_UART_STATE_BUSY_RX; /* Set the UART DMA transfer complete callback */ huart->hdmarx->XferCpltCallback = UART_DMAReceiveCplt; //看这里2 /* Set the UART DMA Half transfer complete callback */ huart->hdmarx->XferHalf...
但是在于 HAL 中,还有一种比较常用的开启中断方法,不是直接使能中断,而是通过调用 HAL 库函数HAL_UART_Receive_IT: 一般的使用方式步骤: 对于本次需要说明的问题,就是使用了HAL_UART_Receive_IT函数导致的,下文我们会说明,这里列出了基本的使用步骤。 二、 收发同时串口卡死? 2.1 问题说明 最近测试部反馈,产品有...
今天晚上回家找了下网上的解决方案,都和我的情况不一样(HAL果然坑)。于是自己开始一点点调试HAL的UART读写代码,基本上认定问题出现在HAL_UART_Receive这个函数。 BUG大概就是每次进行读操作时会有个超时,这个超时的作用是如果UART在这个时间内没有收到期望的数据量那么函数就返回TIMEOUT。上面我的代码里设置的超时...
HAL_UART_RECEIVE只接收一次,然后总是超时怎么处理? 我目前正在为 universtiy 做一个项目,我对 stm32 还很陌生。我的板上有一个通过 UART 通信的传感器,如果它每秒转储一次数据。我的问题是第一个 HAL_UART_RECEIVE 按 yu1004402274 2022-12-06 07:18:50 STM32 HAL库串口收发是如何使用的? 的一种库,它...
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef*huart, uint8_t *pData, uint16_t Size, uint32_t Timeout); 阻塞式发送和接收在使用上都没有太大的差别,发送就等着发送完,HAL中阻塞式发送函数的第4个参数Timeout,可以设置一个超时时间,超时后没发完就不再阻塞。
HAL_UART_Receive(&huart1, &tmp, 1, HAL_MAX_DELAY); 会将接收到的一个字节的数据,缓存给tmp变量,然后将tmp变量赋值给不定长数据的接收数组,并将不定长数据的长度++。 if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET){
HAL_UART_Receive_IT() 常见的接收定长的方式是HAL_UART_Receive_IT(&UartHandle,(uint8_t*)RxBuff,BUFFSIZE); 这种方式对于接收的数据每次一定是定长的就没有问题,但是对于偶尔数据不定长,就会出现故障,比如,当接收数据小于BUFFSIZE,那么就不会进入中断回调函数HAL_UART_RxCpltCallback(UART_HandleTypeDef *hua...
看完上图应该明白为什么这么低的数据率会ORE了。找到问题解决起来也很简单,改HAL的HAL_UART_Receive代码如下: //这是我重写的UART接收函数,除了修复超时导致的丢数据问题以外,增加了 //超时后返回当前读取到的数据量,这样可以读不定长帧。目标接收20Byte, ...