Geehy极海半导体

当前位置:主页 > 服务支持 > 常见问题 > Geehy极海半导体 >

极海APM32E030的USART外设:支持6Mbps高速通信

作者: admin 时间:2025-10-31 来源:未知
摘要:在工业控制、智能家电、电机驱动等应用场景中,微控制器与外部设备之间的通信速率直接影响系统响应速度与整体性能。 极海 半导体APM32E030系列MCU,其内置的USART(通用同步异步收发...

  在工业控制、智能家电、电机驱动等应用场景中,微控制器与外部设备之间的通信速率直接影响系统响应速度与整体性能。极海半导体APM32E030系列MCU,其内置的USART(通用同步异步收发传输器)外设支持最高每秒6兆比特(6Mbps)的通信速率,这一特性为高实时性要求的应用提供了可靠的硬件基础。
 
  6Mbps的传输速度,意味着APM32E030能够在单位时间内处理更多数据,特别适合以下场景:
  工业传感器与执行器:在产线控制与数据采集中实现快速信号交互,提升系统响应实时性;
  智能家电控制:支持与变频模块、显示驱动或另一MCU之间进行高效数据交换;
  电机驱动系统:在多电机协同或参数实时调试过程中,确保控制指令快速、准确送达。
  除了高传输速率,APM32E030的USART模块在设计与实际应用中还表现出以下特点:
 
  高稳定性与抗干扰能力
  即使在复杂电磁环境下运行,其USART接口仍能保持稳定通信,有效降低误码率,保障数据传输的可靠性。
 
  低功耗运行
  芯片在高速通信时仍能维持较低的功耗,有助于满足电池供电或对能效要求严格的设备需求。
 
  易于集成与开发
  该USART外设与常见通信协议兼容,工程师可以便捷地将其接入现有系统,缩短产品开发周期。
        极海APM32E030 USART驱动代码如下:

/* 串口 */
#define UART_INS        (USART1)
/* 接收数据大小 */
#define UART_RX_LEN     (512)
/* 接收缓存 */
uint8_t rx_buf[UART_RX_LEN];
/* 接收长度 */
uint16_t rx_len;
/* 接收完成 */
uint16_t rx_complete;
 
/* 发送索引 */
uint16_t tx_index;
/* 发送长度 */
uint16_t tx_len;
/* 发送缓存 */
uint8_t *tx_buf;

/*
 * @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_DisableInterrupt(UART_INS, USART_INT_TXBEIE);
    /* 使能接收非空中断 */
    USART_EnableInterrupt(UART_INS, USART_INT_RXBNEIE);
    /* 使能空闲中断 */
    USART_EnableInterrupt(UART_INS, USART_INT_IDLEIE);    
    /* 使能中断 */
    NVIC_SetPriority(USART1_IRQn, 0);
    NVIC_EnableIRQ(USART1_IRQn);    
    /* 使能串口 */
    USART_Enable(UART_INS);
}

/*
 * @brief       串口中断
 *
 * @param       None
 *
 * @retval      None
 *
 */
void USART1_IRQHandler(void)
{
    /* 发送为空 */
    if (USART_ReadIntFlag(UART_INS, USART_INT_FLAG_TXBE) != RESET) {
        if (tx_index < tx_len) {
            /* 发数据 */
            USART_TxData(UART_INS, tx_buf[tx_index++]);
        } else {
            /* 关闭发送 */
            USART_DisableInterrupt(UART_INS, USART_INT_TXBEIE);
        }
    }
    /* 接收非空 */
    if (USART_ReadIntFlag(UART_INS, USART_INT_FLAG_RXBNE) != RESET) {
        rx_buf[rx_len++] = USART_RxData(UART_INS);
    }
    /* 空闲 */
    if (USART_ReadIntFlag(UART_INS, USART_INT_FLAG_IDLE) != RESET) {
        USART_ClearIntFlag(UART_INS, USART_INT_FLAG_IDLE);
        rx_complete = 1;
    }
}

/*
 * @brief       发送数据
 *
 * @param       buf: 数据缓存
 *              buf_len: 缓存大小
 *
 * @retval      None
 *
 */
void bsp_uart_send(uint8_t *buf, uint16_t buf_len)
{    
    if ((buf != NULL) && (buf_len > 0)) {
        tx_buf = buf;
        tx_index = 0;
        tx_len = buf_len;
        /* 开启发送为空中断 */
        USART_EnableInterrupt(UART_INS, USART_INT_TXBEIE);
    }
}

/*
 * @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;
}
 
测试代码如下:
// 应用初始化
void app_init(void)
{
    bsp_uart_init();
}
 
// 应用任务
void app_task(void)
{
    /* 接收完成再发出来 */
    if (bsp_is_rx_complete() != 0) {
        bsp_uart_send(bsp_get_rx_buf(), bsp_get_rx_len());
    }
}
 
  综上所述,极海APM32E030的USART外设不仅提供了6Mbps这一出色的硬件传输速度,更在稳定性、功耗和易用性方面做了充分优化。它使得开发者在面对需要高速、可靠串行通信的应用时,多了一个性能扎实、极具性价比的国产MCU选择。

[向上]