[活动专区] 【AT-START-F423测评】3.串口的使用

[复制链接]
1255|0
 楼主| yuyy1989 发表于 2023-10-24 20:17 | 显示全部楼层 |阅读模式
#申请原创# @21小跑堂  

串口在开发调试和设备通讯中会经常用到,开发板上引出了USART1连接到了ATLINK上,PA9可以通过跳线帽选择是作为串口的TX还是usb的VBUS,默认是作为串口TX
在AT32 Work Bench中开启USART1,在这里可以直接配置串口的各项参数
QQ截图20231024191237.png
开启串口中断
QQ截图20231024191422.png
需要注意的是生成的代码需要自己写上开启中断的代码

QQ截图20231024193649.png
简单写个收发测试
  1. #define UART_BUFFER_LEN 20
  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 starttx()
  8. {
  9.     uart_txlen += uart_rxlen;
  10.     uart_rxlen = 0;
  11.     usart_interrupt_enable(USART1, USART_TDBE_INT, TRUE);
  12. }

  13. void usart1_irq()
  14. {
  15.     if(usart_flag_get(USART1, USART_RDBF_FLAG) != RESET)
  16.     {
  17.         usart_flag_clear(USART1, USART_RDBF_FLAG);
  18.         uart_buffer[uart_rxindex++] = usart_data_receive(USART1);
  19.         if(uart_rxindex == UART_BUFFER_LEN)
  20.             uart_rxindex = 0;
  21.         uart_rxlen++;
  22.     }
  23.     if(usart_flag_get(USART1, USART_IDLEF_FLAG) != RESET || uart_rxlen == UART_BUFFER_LEN/2)
  24.     {
  25.         usart_flag_clear(USART1, USART_IDLEF_FLAG);
  26.         starttx();
  27.     }
  28.     if(usart_flag_get(USART1, USART_TDBE_FLAG) != RESET)
  29.     {
  30.         usart_flag_clear(USART1, USART_TDBE_FLAG);
  31.         if(uart_txlen > 0)
  32.         {
  33.             usart_data_transmit(USART1, uart_buffer[uart_txindex++]);
  34.             if(uart_txindex == UART_BUFFER_LEN)
  35.                 uart_txindex = 0;
  36.             uart_txlen--;
  37.         }
  38.         else
  39.         {
  40.             usart_interrupt_enable(USART1, USART_TDBE_INT, FALSE);
  41.         }
  42.     }
  43. }
  44. void USART1_IRQHandler(void)
  45. {
  46.   /* add user code begin USART1_IRQ 0 */
  47.     extern void usart1_irq();
  48.     usart1_irq();

  49.   /* add user code end USART1_IRQ 0 */
  50.   /* add user code begin USART1_IRQ 1 */

  51.   /* add user code end USART1_IRQ 1 */
  52. }
运行效果
QQ截图20231024193530.png
接下来重定向printf输出到串口,实现之后输出调试信息会很方便,在工程设置中勾选Use MicroLib
QQ截图20231024193845.png
在代码中添加
  1. int fputc(int ch, FILE *f)
  2. {
  3.     while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
  4.     usart_data_transmit(USART1,ch&0xFF);
  5.     return ch;
  6. }
简单测试,按下按键打印
  1. uint8_t num = 0;
  2. void userkey_int()
  3. {
  4.     if(gpio_input_data_bit_read(USER_BTN_GPIO_PORT, USER_BTN_PIN) != RESET)
  5.     {
  6.         printf("printf test %d",num);
  7.         num += 1;
  8.     }
  9. }
运行效果
QQ截图20231024195112.png
在固件包提供的at32f423_board中已经实现了printf重定向,如果使用这个文件就不用自己再实现了


您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

168

主题

826

帖子

10

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