[AT32L021] 【AT-START-L021 测评】串口通信测试

[复制链接]
 楼主| 无垠的广袤 发表于 2024-12-2 00:31 | 显示全部楼层 |阅读模式
#申请原创#

【AT-START-L021 测评】串口通信测试 1. 计时器
功能实现:串口打印计时器
每隔一秒串口输出数字依次加 1,从 0 开始,依次输出 0,1,2,...,n
代码
主函数代码如下
  1. int main(void)
  2. {
  3.   system_clock_config();
  4.   at32_board_init();
  5.   uart_print_init(115200);

  6.   /* output a message on hyperterminal using printf function */
  7.   printf("usart printf example: retarget the c library printf function to the usart\r\n");

  8.   while(1)
  9.   {
  10.     printf("usart printf counter: %u\r\n",time_cnt++);
  11.     delay_sec(1);
  12.   }
  13. }





效果

UART_Printf.gif

2. 串口应答
测试示例程序 modbus_character_match ,将USART的发送引脚 A9 与接收引脚 A10 用杜邦线连接,打开串口监视器,发送字符串,可以看到串口会回应相同的字符。
代码
主函数代码

  1. int main(void)
  2. {
  3.   system_clock_config();
  4.   at32_board_init();

  5.   usart_configuration();

  6.   print_info();
  7.   usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE);
  8.   
  9.   while(1)
  10.   {
  11.     if(rx_complete_flag == 1)
  12.     {
  13.       usart_interrupt_enable(USART1, USART_RDBF_INT, FALSE);
  14.       rx_complete_flag = 0;
  15.       at32_led_on(LED2);
  16.       print_echo();
  17.       at32_led_off(LED2);
  18.       usart_interrupt_enable(USART1, USART_RDBF_INT, TRUE);
  19.     }
  20.   }
  21. }


测试前需要将 发送 和 接收 端口连接,发送字符串,接收端接收到相同字符串。

效果

UART2UART.gif

3. 半双工通信

半双工通信(half-duplex)
半双工通信允许信号在两个方向上传输,但某一时刻只允许信号在一个信道上单向传输。
典型应用:对讲机
由于对讲机传送及接收使用相同的频率,不允许同时进行。因此一方讲完后,需加上结束语OVER,另一方才开始讲话。

代码

主函数代码

  1. int main(void)
  2. {
  3.   system_clock_config();
  4.   at32_board_init();
  5.   usart_configuration();

  6.   /* usart2 transmit and usart1 receive */
  7.   data_count = USART2_TX_BUFFER_SIZE;
  8.   while(data_count)
  9.   {
  10.     while(usart_flag_get(USART2, USART_TDBE_FLAG) == RESET);
  11.     usart_data_transmit(USART2, usart2_tx_buffer[USART2_TX_BUFFER_SIZE-data_count]);
  12.     while(usart_flag_get(USART1, USART_RDBF_FLAG) == RESET);
  13.     usart1_rx_buffer[USART2_TX_BUFFER_SIZE-data_count] = usart_data_receive(USART1);
  14.     data_count--;
  15.   }

  16.   /* usart1 transmit and usart2 receive */
  17.   data_count = USART1_TX_BUFFER_SIZE;
  18.   while(data_count)
  19.   {
  20.     while(usart_flag_get(USART1, USART_TDBE_FLAG) == RESET);
  21.     usart_data_transmit(USART1, usart1_tx_buffer[USART1_TX_BUFFER_SIZE-data_count]);
  22.     while(usart_flag_get(USART2, USART_RDBF_FLAG) == RESET);
  23.     usart2_rx_buffer[USART1_TX_BUFFER_SIZE-data_count] = usart_data_receive(USART2);
  24.     data_count--;
  25.   }

  26.   while(1)
  27.   {
  28.     /* compare data buffer */
  29.     if(buffer_compare(usart2_tx_buffer, usart1_rx_buffer, USART2_TX_BUFFER_SIZE) && \
  30.        buffer_compare(usart1_tx_buffer, usart2_rx_buffer, USART1_TX_BUFFER_SIZE))
  31.     {
  32.       at32_led_toggle(LED2);
  33.       at32_led_toggle(LED3);
  34.       at32_led_toggle(LED4);
  35.       delay_ms(200);
  36.     }
  37.   }
  38. }


连接 USART2 的发送端 PA2 和 USART1 的接收端 PB6 ,当接收到相同内容时,板载的 3 个 LED 闪烁。

效果


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

本版积分规则

27

主题

67

帖子

0

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

27

主题

67

帖子

0

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