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

STM32 UART串口不定长接收IDLE,串口接收任意长度数据。

[复制链接]
289466080 发布时间:2019-5-30 09:49
  用STM32F030做串口通讯,发送端经常未知长度,后不能再次接收研究了好久,參考网上有DMA接收但是超过最大值也会出错需重置DMA。    UART DMA   https://www.stmcu.org.cn/module/forum/thread-620624-1-1.html   
因 STM32F030F4P6 FLASH 太小用DMA会多增加500字节。

1.在usart.c /* USER CODE BEGIN 1 */处增加代码方便后续cube配置不会被清除。
  1. /* USER CODE BEGIN 1 */
  2. void UsartReceive_IDLE(UART_HandleTypeDef *huart)
  3. {  
  4.   uint32_t isrflags   = READ_REG(huart->Instance->ISR);
  5.   uint32_t cr1its     = READ_REG(huart->Instance->CR1);

  6.   /* UART Idle interrupt occurred   --------------------------------------------*/
  7.   if (((isrflags & USART_ISR_IDLE) != RESET) && ((cr1its & USART_CR1_IDLEIE) != RESET))
  8.   {
  9.     __HAL_UART_CLEAR_IDLEFLAG(huart);
  10.     __HAL_UART_DISABLE_IT(huart, UART_IT_IDLE);
  11.     HAL_UART_RxIdleCallback(huart);
  12.     return;
  13.   }
  14. }
  15. /**
  16.   * @brief  Rx Idle callbacks.
  17.   * @param  huart: Pointer to a UART_HandleTypeDef structure that contains
  18.   *                the configuration information for the specified UART module.
  19.   * @retval None
  20.   */
  21. __weak void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
  22. {
  23.   /* Prevent unused argument(s) compilation warning */
  24.   UNUSED(huart);
  25.   /* NOTE: This function should not be modified, when the callback is needed,
  26.            the HAL_UART_RxIdleCallback can be implemented in the user file
  27.    */
  28. }
  29. /* USER CODE END 1 */
复制代码
2.在usart.h /* USER CODE BEGIN Prototypes */ 新增
  1. /* USER CODE BEGIN Prototypes */
  2. void UsartReceive_IDLE(UART_HandleTypeDef *huart);
  3. void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart);
  4. /* USER CODE END Prototypes */
复制代码
3.在stm32f0xx_it.c /* USER CODE BEGIN 0 */ 新增
  1. /* USER CODE BEGIN 0 */
  2. #include "usart.h"
  3. /* USER CODE END 0 */
复制代码
4.在stm32f0xx_it.c void USART1_IRQHandler(void) 新增
  1. void USART1_IRQHandler(void)
  2. {
  3.   /* USER CODE BEGIN USART1_IRQn 0 */
  4.   UsartReceive_IDLE(&huart1);    //新增
  5.   /* USER CODE END USART1_IRQn 0 */
  6.   HAL_UART_IRQHandler(&huart1);
  7.   /* USER CODE BEGIN USART1_IRQn 1 */

  8.   /* USER CODE END USART1_IRQn 1 */
  9. }
复制代码
5.1在main.c /* USER CODE BEGIN Includes */ 新增
  1. /* USER CODE BEGIN Includes */
  2. #include "string.h"
  3. /* USER CODE END Includes */
复制代码
5.2在main.c /* USER CODE BEGIN PV */ 新增
  1. /* USER CODE BEGIN PV */
  2. /* Private variables ---------------------------------------------------------*/
  3. #define RECEIVELEN 16
  4. u8  uart1_Rx_Temp;            //接收缓冲
  5. u8  uart1_RxBuff[RECEIVELEN]; //接收缓冲
  6. u16 uart1_Rx_Count;           //接收长度
  7. /* USER CODE END PV */
复制代码
5.3在main.c   /* USER CODE BEGIN 2 */ //新增
  1.   /* USER CODE BEGIN 2 */
  2.   HAL_UART_Receive_IT(&huart1, (uint8_t *)&uart1_Rx_Temp, 1);
  3.   /* USER CODE END 2 */
复制代码
5.4在main.c /* USER CODE BEGIN 4 */ 新增
  1. /* USER CODE BEGIN 4 */
  2. //UART1
  3. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  4. {
  5.   if (huart->Instance == USART1)
  6.   {
  7.     uart1_RxBuff[uart1_Rx_Count] = uart1_Rx_Temp;
  8.     HAL_UART_Receive_IT(huart, (uint8_t *)&uart1_Rx_Temp, 1);
  9.     if (++uart1_Rx_Count >= RECEIVELEN)
  10.     {
  11.       uart1_Rx_Count--;
  12.     }
  13.     __HAL_UART_CLEAR_IDLEFLAG(&huart1);
  14.     __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
  15.   }
  16. }
  17. void HAL_UART_RxIdleCallback(UART_HandleTypeDef *huart)
  18. {
  19.   if (huart->Instance == USART1)
  20.   {
  21.     __HAL_UART_CLEAR_IDLEFLAG(huart);
  22.     __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);

  23.     HAL_UART_Transmit(&huart1, (uint8_t *)&uart1_RxBuff, RECEIVELEN,0xFFFF);
  24.     memset(uart1_RxBuff,0x00,sizeof(uart1_RxBuff));                            //清空数组
  25.     uart1_Rx_Count = 0;
  26.   }
  27. }
  28. /* USER CODE END 4 */
复制代码


參考 https://www.stmcu.org.cn/module/forum/thread-620532-1-1.html?or5













收藏 2 评论0 发布时间:2019-5-30 09:49

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版