口天土立口 发表于 2025-9-6 16:49

APM32E030的USART驱动(查询)

本帖最后由 口天土立口 于 2025-9-7 18:33 编辑



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

USART驱动代码如下:
/* 串口 */
#define UART_INS      (USART1)
/* 接收数据大小 */
#define UART_RX_LEN   (512)
/* 接收缓存 */
uint8_t rx_buf;
/* 接收长度 */
uint16_t rx_len;
/* 接收完成 */
uint16_t rx_complete;/*
* @brief       初始化
*
* @param       None
*
* @retval      None
*
*/
void bsp_uart_init(void)
{
    GPIO_Config_T gpioConfig;
    USART_Config_T configStruct;
   
    /* GPIO */
    RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOB);
    GPIO_ConfigStructInit(&gpioConfig);
    gpioConfig.pin   = GPIO_PIN_6 | GPIO_PIN_7;
    gpioConfig.mode    = GPIO_MODE_AF;
    gpioConfig.outtype = GPIO_OUT_TYPE_PP;
    gpioConfig.speed   = GPIO_SPEED_50MHz;
    gpioConfig.pupd    = GPIO_PUPD_NO;
    GPIO_Config(GPIOB, &gpioConfig);
   
    /* TX */
    GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_6, GPIO_AF_PIN0);
    /* RX */
    GPIO_ConfigPinAF(GPIOB, GPIO_PIN_SOURCE_7, GPIO_AF_PIN0);
   
    /* USART */
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART1);
    USART_Reset(UART_INS);
    USART_ConfigStructInit(&configStruct);
    configStruct.baudRate = 115200;
    configStruct.wordLength = USART_WORD_LEN_8B;
    configStruct.stopBits = USART_STOP_BIT_1;
    configStruct.parity = USART_PARITY_NONE ;
    configStruct.mode = USART_MODE_TX_RX;
    configStruct.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
    USART_Config(UART_INS, &configStruct);   
    USART_Enable(UART_INS);
}/*
* @brief       发送数据
*
* @param       buf: 数据缓存
*            buf_len: 缓存大小
*
* @retval      None
*
*/
void bsp_uart_send(uint8_t *buf, uint16_t buf_len)
{
    uint16_t i = 0;
   
    while (i < buf_len) {
      while (USART_ReadStatusFlag(UART_INS, USART_FLAG_TXBE) == RESET);
      USART_TxData(UART_INS, buf);
    }
    while (USART_ReadStatusFlag(UART_INS, USART_FLAG_TXC) == RESET);
}/*
* @brief       接收数据
*
* @param       None
*
* @retval      None
*
*/
void bsp_uart_recv(void)
{
    /* 接收非空 */
    if (USART_ReadStatusFlag(UART_INS, USART_FLAG_RXBNE) != RESET) {
      rx_buf = USART_RxData(UART_INS);
    }
    /* 接收空闲则表示一帧报文结束 */
    if (USART_ReadStatusFlag(UART_INS, USART_FLAG_IDLEF) != RESET) {
      rx_complete = 1;
      USART_ClearStatusFlag(UART_INS, USART_FLAG_IDLEF);
    }
}/*
* @brief       接收完成
*
* @param       None
*
* @retval      0: 未完成; 1: 完成
*
*/
uint8_t bsp_is_rx_complete(void)
{
    uint8_t ret = rx_complete;
   
    rx_complete = 0;
    return ret;
}/*
* @brief       获取接收长度
*
* @param       None
*
* @retval      接收数据长度
*
*/
uint16_t bsp_get_rx_len(void)
{
    uint16_t ret = rx_len;
   
    rx_len = 0;
    return ret;
}/*
* @brief       获取接收缓存
*
* @param       None
*
* @retval      接收缓存
*
*/
uint8_t *bsp_get_rx_buf(void)
{
    return rx_buf;
}

测速代码如下:
// 应用初始化
void app_init(void)
{
    bsp_uart_init();
}

// 应用任务
void app_task(void)
{
    /* 接收数据 */
    bsp_uart_recv();
    /* 接收完成再发出来 */
    if (bsp_is_rx_complete() != 0) {
      bsp_uart_send(bsp_get_rx_buf(), bsp_get_rx_len());
    }
}

详细代码,请查看附件!




霜之闪耀 发表于 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方式
页: [1]
查看完整版本: APM32E030的USART驱动(查询)