[APM32E0] APM32E030的USART驱动(查询)

[复制链接]
399|8
口天土立口 发表于 2025-9-6 16:49 | 显示全部楼层 |阅读模式
, pi, gp, APM32F035,
本帖最后由 口天土立口 于 2025-9-7 18:33 编辑

3980368bbf4eccb750.png

APM32E030支持USART外设最高速度可达6Mbit/s.

USART驱动代码如下:
  1. /* 串口 */
  2. #define UART_INS        (USART1)
  3. /* 接收数据大小 */
  4. #define UART_RX_LEN     (512)
  5. /* 接收缓存 */
  6. uint8_t rx_buf[UART_RX_LEN];
  7. /* 接收长度 */
  8. uint16_t rx_len;
  9. /* 接收完成 */
  10. uint16_t rx_complete;
  1. /*
  2. * @brief       初始化
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void bsp_uart_init(void)
  10. {
  11.     GPIO_Config_T gpioConfig;
  12.     USART_Config_T configStruct;
  13.    
  14.     /* GPIO */
  15.     RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOB);
  16.     GPIO_ConfigStructInit(&gpioConfig);
  17.     gpioConfig.pin     = GPIO_PIN_6 | GPIO_PIN_7;
  18.     gpioConfig.mode    = GPIO_MODE_AF;
  19.     gpioConfig.outtype = GPIO_OUT_TYPE_PP;
  20.     gpioConfig.speed   = GPIO_SPEED_50MHz;
  21.     gpioConfig.pupd    = GPIO_PUPD_NO;
  22.     GPIO_Config(GPIOB, &gpioConfig);
  23.    
  24.     /* TX */
  25.     GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_6, GPIO_AF_PIN0);
  26.     /* RX */
  27.     GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_7, GPIO_AF_PIN0);
  28.    
  29.     /* USART */
  30.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART1);
  31.     USART_Reset(UART_INS);
  32.     USART_ConfigStructInit(&configStruct);
  33.     configStruct.baudRate = 115200;
  34.     configStruct.wordLength = USART_WORD_LEN_8B;
  35.     configStruct.stopBits = USART_STOP_BIT_1;
  36.     configStruct.parity = USART_PARITY_NONE ;
  37.     configStruct.mode = USART_MODE_TX_RX;
  38.     configStruct.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
  39.     USART_Config(UART_INS, &configStruct);   
  40.     USART_Enable(UART_INS);
  41. }
  1. /*
  2. * @brief       发送数据
  3. *
  4. * @param       buf: 数据缓存
  5. *              buf_len: 缓存大小
  6. *
  7. * @retval      None
  8. *
  9. */
  10. void bsp_uart_send(uint8_t *buf, uint16_t buf_len)
  11. {
  12.     uint16_t i = 0;
  13.    
  14.     while (i < buf_len) {
  15.         while (USART_ReadStatusFlag(UART_INS, USART_FLAG_TXBE) == RESET);
  16.         USART_TxData(UART_INS, buf[i++]);
  17.     }
  18.     while (USART_ReadStatusFlag(UART_INS, USART_FLAG_TXC) == RESET);
  19. }
  1. /*
  2. * @brief       接收数据
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void bsp_uart_recv(void)
  10. {
  11.     /* 接收非空 */
  12.     if (USART_ReadStatusFlag(UART_INS, USART_FLAG_RXBNE) != RESET) {
  13.         rx_buf[rx_len++] = USART_RxData(UART_INS);
  14.     }
  15.     /* 接收空闲则表示一帧报文结束 */
  16.     if (USART_ReadStatusFlag(UART_INS, USART_FLAG_IDLEF) != RESET) {
  17.         rx_complete = 1;
  18.         USART_ClearStatusFlag(UART_INS, USART_FLAG_IDLEF);
  19.     }
  20. }
  1. /*
  2. * @brief       接收完成
  3. *
  4. * @param       None
  5. *
  6. * @retval      0: 未完成; 1: 完成
  7. *
  8. */
  9. uint8_t bsp_is_rx_complete(void)
  10. {
  11.     uint8_t ret = rx_complete;
  12.    
  13.     rx_complete = 0;
  14.     return ret;
  15. }
  1. /*
  2. * @brief       获取接收长度
  3. *
  4. * @param       None
  5. *
  6. * @retval      接收数据长度
  7. *
  8. */
  9. uint16_t bsp_get_rx_len(void)
  10. {
  11.     uint16_t ret = rx_len;
  12.    
  13.     rx_len = 0;
  14.     return ret;
  15. }
  1. /*
  2. * @brief       获取接收缓存
  3. *
  4. * @param       None
  5. *
  6. * @retval      接收缓存
  7. *
  8. */
  9. uint8_t *bsp_get_rx_buf(void)
  10. {
  11.     return rx_buf;
  12. }


测速代码如下:
  1. // 应用初始化
  2. void app_init(void)
  3. {
  4.     bsp_uart_init();
  5. }

  6. // 应用任务
  7. void app_task(void)
  8. {
  9.     /* 接收数据 */
  10.     bsp_uart_recv();
  11.     /* 接收完成再发出来 */
  12.     if (bsp_is_rx_complete() != 0) {
  13.         bsp_uart_send(bsp_get_rx_buf(), bsp_get_rx_len());
  14.     }
  15. }


详细代码,请查看附件!
Poll.zip (2.07 MB, 下载次数: 0)



霜之闪耀 发表于 2025-9-7 19:09 | 显示全部楼层
查询方式是最高性能的一种接收方式
黎明热忱 发表于 2025-9-7 23:37 | 显示全部楼层
查询方式也能触发空闲帧状态位,也是判断帧尾的好办法
wangwu1976@ 发表于 2025-9-8 08:12 | 显示全部楼层
继续学习
寂静小夜曲 发表于 2025-9-8 19:39 | 显示全部楼层
查询方式现在很少使用了吧
 楼主| 口天土立口 发表于 2025-9-8 19:40 | 显示全部楼层
寂静小夜曲 发表于 2025-9-8 19:39
查询方式现在很少使用了吧

各取所需,简单应用就不需要太复杂的代码,简单快捷
空灵回声 发表于 2025-9-9 15:53 | 显示全部楼层
发送查询方式还是比较常见的。
接收查询方式估计用得就少了
星辰伴梦 发表于 2025-9-23 19:01 | 显示全部楼层
代码中使用了查询方式来处理USART数据的发送和接收,这种方式简单但效率较低,如果数据量大或者实时性要求高,可能需要考虑使用中断方式。
 楼主| 口天土立口 发表于 2025-9-23 21:46 | 显示全部楼层
星辰伴梦 发表于 2025-9-23 19:01
代码中使用了查询方式来处理USART数据的发送和接收,这种方式简单但效率较低,如果数据量大或者实时性要求 ...

更建议DMA方式
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

45

帖子

0

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