[活动] 【APM32F411V Tiny Board测评】3.串口测试

[复制链接]
 楼主| yuyy1989 发表于 2024-5-8 20:43 | 显示全部楼层 |阅读模式
开发板引出了2路串口,默认接的是串口1
微信截图_20240508191608.png
查看使用的引脚
微信截图_20240508191535.png
配置串口,并开启中断
  1. void uart_init()
  2. {
  3.     USART_Config_T usartConfigStruct;
  4.     GPIO_Config_T GPIO_configStruct;
  5.     GPIO_ConfigStructInit(&GPIO_configStruct);
  6.    
  7.     RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
  8.     RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_USART1);
  9.    
  10.     GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_9, GPIO_AF_USART1);
  11.     GPIO_ConfigPinAF(GPIOA, GPIO_PIN_SOURCE_10, GPIO_AF_USART1);
  12.    
  13.     GPIO_configStruct.mode = GPIO_MODE_AF;
  14.     GPIO_configStruct.pin = GPIO_PIN_9 | GPIO_PIN_10;;
  15.     GPIO_configStruct.speed = GPIO_SPEED_50MHz;
  16.     GPIO_Config(GPIOA, &GPIO_configStruct);

  17.     usartConfigStruct.baudRate = 115200;
  18.     usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
  19.     usartConfigStruct.mode = USART_MODE_TX_RX;
  20.     usartConfigStruct.parity = USART_PARITY_NONE;
  21.     usartConfigStruct.stopBits = USART_STOP_BIT_1;
  22.     usartConfigStruct.wordLength = USART_WORD_LEN_8B;
  23.    
  24.     USART_Config(USART1, &usartConfigStruct);
  25.     USART_Enable(USART1);
  26.    
  27.     USART_EnableInterrupt(USART1, USART_INT_RXBNE);
  28.     USART_EnableInterrupt(USART1, USART_INT_IDLE);
  29.     USART_ClearStatusFlag(USART1, USART_FLAG_RXBNE);
  30.     NVIC_EnableIRQRequest(USART1_IRQn,0,0);
  31. }
在中断中处理串口数据的收发
  1. #define UART_BUFFER_LEN 30
  2. uint8_t uart_buffer[UART_BUFFER_LEN] = {0};
  3. uint8_t uart_rxindex = 0;
  4. uint8_t uart_rxlen = 0;
  5. uint8_t uart_txindex = 0;
  6. uint8_t uart_txlen = 0;

  7. void readrxtotxbuffer()
  8. {
  9.     uart_txlen += uart_rxlen;
  10.     uart_rxlen = 0;
  11.     USART_EnableInterrupt(USART1, USART_INT_TXBE);
  12. }

  13. void USART1_IRQHandler(void)
  14. {
  15.     if(USART_ReadStatusFlag(USART1, USART_FLAG_RXBNE) == SET){
  16.         uart_buffer[uart_rxindex++] = (uint8_t)USART_RxData(USART1);
  17.         if(uart_rxindex == UART_BUFFER_LEN)
  18.             uart_rxindex = 0;
  19.         uart_rxlen++;
  20.     }
  21.     if(USART_ReadStatusFlag(USART1, USART_FLAG_IDLE) == SET|| uart_rxlen == 10) {
  22.         USART_ClearStatusFlag(USART1, USART_FLAG_IDLE);
  23.         readrxtotxbuffer();
  24.     }
  25.     if(USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == SET){
  26.         if(uart_txlen > 0)
  27.         {
  28.             USART_TxData(USART1,uart_buffer[uart_txindex++]);
  29.             if(uart_txindex == UART_BUFFER_LEN)
  30.                 uart_txindex = 0;
  31.             uart_txlen--;
  32.         }
  33.         else
  34.         {
  35.             USART_DisableInterrupt(USART1, USART_INT_TXBE);
  36.         }
  37.     }
  38. }
运行效果
微信截图_20240508193253.png
接下来实现printf重定向到串口,方便打印调试信息
在工程设置中勾选这个

微信截图_20240508195704.png
代码中添加
  1. int fputc(int ch, FILE *f)
  2. {
  3.     USART_TxData(USART1, ch);
  4.     while (USART_ReadStatusFlag(USART1, USART_FLAG_TXBE) == RESET);
  5.     return ch;
  6. }
测试
  1. int main(void)
  2. {
  3.     uint8_t i = 0;
  4.     ConfigSysClock();
  5.     uart_init();
  6.     while (1)
  7.     {
  8.         i += 1;
  9.         printf("极海APM32F411串口Printf测试 by yuyy1989 当前数字是:%d\n",i);
  10.     }
  11. }
运行结果
微信截图_20240508195917.png
最后用CoreMark测试下性能,仅供参考
微信截图_20240508203430.png

chenqianqian 发表于 2024-5-8 20:50 来自手机 | 显示全部楼层
cormark跑分还不错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

161

主题

815

帖子

10

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