[APM32E0] APM32E030的串口查询方式发送与接收

[复制链接]
332|38
CloudKiss 发表于 2026-2-18 17:16 | 显示全部楼层 |阅读模式
对于小MCU来说,IAP更新多使用串口方式。要完成IAP功能,串口的发送与接收便不可少。考虑到IAP功能简单,唯一,也没有更高的性能要求。所以,暂就以简单的查询方式来实现串口的发送与接收。
串口的初始化代码与接收发送API的源代码如下:
  1. void uart_init(void)
  2. {
  3.   GPIO_Config_T gpioConfig;
  4.   USART_Config_T usartConfigStruct;
  5.   /* Enable GPIO clock */
  6.   RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
  7.   RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART1);

  8.   /* Connect PXx to USARTx_Tx */
  9.   GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_9, GPIO_AF_PIN1);
  10.   GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_10, GPIO_AF_PIN1);

  11.   /* Configure USART Tx as alternate function push-pull */
  12.   gpioConfig.mode = GPIO_MODE_AF;
  13.   gpioConfig.pin = GPIO_PIN_9;
  14.   gpioConfig.speed = GPIO_SPEED_50MHz;
  15.   gpioConfig.outtype = GPIO_OUT_TYPE_PP;
  16.   gpioConfig.pupd = GPIO_PUPD_PU;
  17.   GPIO_Config(GPIOA, &gpioConfig);

  18.   /* Configure USART Rx as input floating */
  19.   gpioConfig.pin = GPIO_PIN_10;
  20.   GPIO_Config(GPIOA, &gpioConfig);

  21.   /* TINY_USARTs configured as follow:
  22.   - BaudRate = 115200 baud
  23.   - Word Length = 8 Bits
  24.   - One Stop Bit
  25.   - No parity
  26.   - Hardware flow control disabled (RTS and CTS signals)
  27.   - Receive and transmit enabled
  28.   */

  29.   usartConfigStruct.baudRate = 9600;
  30.   usartConfigStruct.mode = USART_MODE_TX_RX;
  31.   usartConfigStruct.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
  32.   usartConfigStruct.parity = USART_PARITY_NONE;
  33.   usartConfigStruct.stopBits = USART_STOP_BIT_1;
  34.   usartConfigStruct.wordLength = USART_WORD_LEN_8B;
  35.   USART_Config(COM_USART[COM], &usartConfigStruct);

  36.   /* Enable USART */
  37.   USART_Enable(USART1);
  38. }

  39. void uart_sendblock(uint8_t dat)
  40. {
  41.   /* Wait until end of transmission */
  42.   while (USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == RESET)
  43.   {
  44.     ;
  45.   }
  46.   USART_TxData(USART1, dat);
  47. }

  48. uint8_t uart_receiveblock(void)
  49. {
  50.   uint8_t dat;
  51.   while (USART_ReadStatusFlag(USART1, USART_FLAG_RXBNE) == RESET)
  52.   {
  53.     ;
  54.   }
  55.   dat = USART_RxData(USART1);
  56.   return (ret);
  57. }
串口的接收与发送API还是比较简单的,我在测试IAP时,也发送在数据线一般长度下,串口的通讯质量非常高。坦白讲,根本就不需要CRC校验。所以,我在IAP的文件上传过程也放弃了Y-Modem协议。在生产环境下,并没有产生异常的情况。下一个帖子,我再分享一下IAP的简单流程。



阳光爆裂 发表于 2026-2-18 18:06 | 显示全部楼层
使用这种阻塞的方式会不会太影响效率了啊
心跳回响 发表于 2026-2-19 08:58 | 显示全部楼层
在单一功能上面,使用查询模式不仅简单,而且减少了中断的处理。纯纯的单线程
黎明热忱 发表于 2026-2-21 17:23 | 显示全部楼层
其实,确实可以把IAP设计得简单一些。
wengh2016 发表于 2026-3-3 20:07 | 显示全部楼层
核心在于正确判断状态标志位和处理数据移位寄存器。
lzbf 发表于 2026-3-3 21:35 | 显示全部楼层
避免长时间阻塞主程序              
vivilyly 发表于 2026-3-3 22:39 | 显示全部楼层
GPIO 模式要准,波特率误差要小。
黎明热忱 发表于 2026-3-4 12:47 | 显示全部楼层
简单点方便实现,查询方式的可靠度很高的。
kkzz 发表于 2026-3-4 15:16 | 显示全部楼层
定期检查错误标志并清除              
幻影书记 发表于 2026-3-4 18:42 | 显示全部楼层
我们在项目里面也会使用到查询模式的串口收发。
存在就合理嘛!
uptown 发表于 2026-3-4 20:21 | 显示全部楼层
查询发送的核心是轮询 TXE标志
earlmax 发表于 2026-3-5 18:20 | 显示全部楼层
在高频通信场景下,放弃查询接收,改用 中断接收。
juliestephen 发表于 2026-3-5 21:46 | 显示全部楼层
串口引脚需配置为复用功能              
uiint 发表于 2026-3-6 12:54 | 显示全部楼层
若连续接收多字节,需用环形缓冲区暂存数据,避免主循环处理慢导致 ORE 溢出。
xiaoyaodz 发表于 2026-3-6 15:22 | 显示全部楼层
接收数据时,必须及时读取数据寄存器,否则会导致数据覆盖
minzisc 发表于 2026-3-6 17:38 | 显示全部楼层
查询发送必须等 TC,查询接收必须快读 RXNE。
jonas222 发表于 2026-3-7 20:14 | 显示全部楼层
若对端未发送数据,RXNE ***不会置位,代码会卡死。必须加超时判断,超时后可退出接收循环,处理其他任务。
everyrobin 发表于 2026-3-7 22:30 | 显示全部楼层
TX引脚设为复用推挽输出,RX引脚启用内部上拉电阻,抑制噪声干扰
pl202 发表于 2026-3-8 08:53 | 显示全部楼层
查询方式的前提是硬件配置正确,否则标志位***不会置位,通信直接失败。
iyoum 发表于 2026-3-9 13:43 | 显示全部楼层
别只 “读数据”,要 “查错误 + 防溢出”
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

56

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0