[APM32E0] APM32E030的USART驱动(中断)

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

9346968bbf3070aef3.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;

  11. /* 发送索引 */
  12. uint16_t tx_index;
  13. /* 发送长度 */
  14. uint16_t tx_len;
  15. /* 发送缓存 */
  16. uint8_t *tx_buf;
  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.     /* 关闭发送为空中断 */
  41.     USART_DisableInterrupt(UART_INS, USART_INT_TXBEIE);
  42.     /* 使能接收非空中断 */
  43.     USART_EnableInterrupt(UART_INS, USART_INT_RXBNEIE);
  44.     /* 使能空闲中断 */
  45.     USART_EnableInterrupt(UART_INS, USART_INT_IDLEIE);   
  46.     /* 使能中断 */
  47.     NVIC_SetPriority(USART1_IRQn, 0);
  48.     NVIC_EnableIRQ(USART1_IRQn);   
  49.     /* 使能串口 */
  50.     USART_Enable(UART_INS);
  51. }
  1. /*
  2. * @brief       串口中断
  3. *
  4. * @param       None
  5. *
  6. * @retval      None
  7. *
  8. */
  9. void USART1_IRQHandler(void)
  10. {
  11.     /* 发送为空 */
  12.     if (USART_ReadIntFlag(UART_INS, USART_INT_FLAG_TXBE) != RESET) {
  13.         if (tx_index < tx_len) {
  14.             /* 发数据 */
  15.             USART_TxData(UART_INS, tx_buf[tx_index++]);
  16.         } else {
  17.             /* 关闭发送 */
  18.             USART_DisableInterrupt(UART_INS, USART_INT_TXBEIE);
  19.         }
  20.     }
  21.     /* 接收非空 */
  22.     if (USART_ReadIntFlag(UART_INS, USART_INT_FLAG_RXBNE) != RESET) {
  23.         rx_buf[rx_len++] = USART_RxData(UART_INS);
  24.     }
  25.     /* 空闲 */
  26.     if (USART_ReadIntFlag(UART_INS, USART_INT_FLAG_IDLE) != RESET) {
  27.         USART_ClearIntFlag(UART_INS, USART_INT_FLAG_IDLE);
  28.         rx_complete = 1;
  29.     }
  30. }
  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.     if ((buf != NULL) && (buf_len > 0)) {
  13.         tx_buf = buf;
  14.         tx_index = 0;
  15.         tx_len = buf_len;
  16.         /* 开启发送为空中断 */
  17.         USART_EnableInterrupt(UART_INS, USART_INT_TXBEIE);
  18.     }
  19. }
  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. void app_init(void)
  3. {
  4.     bsp_uart_init();
  5. }

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


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



阳光爆裂 发表于 2025-9-7 18:48 | 显示全部楼层
楼主您倒是测试一下 6Mbps的速率啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

19

主题

44

帖子

0

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