[AT32M412] 【AT-START-M412测评】+串口通讯及应用

[复制链接]
 楼主| jinglixixi 发表于 2025-6-7 19:23 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2025-6-7 19:42 编辑

#申请原创#
通过串口可实现调试信息的输出及串口设备间的数据传送,以进行调试信息输出为例,它是串口1,在无需添加外围器件的情况下,就可利用板载的资源来实现调试信息输出。
对串口1的配置函数为:
  1. void uart_print_init(uint32_t baudrate)
  2. {
  3. gpio_init_type gpio_init_struct;
  4. crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);
  5. crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);
  6. gpio_default_para_init(&gpio_init_struct);
  7. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  8. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  9. gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  10. gpio_init_struct.gpio_pins = PRINT_UART_TX_PIN;
  11. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  12. gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct);
  13. gpio_pin_mux_config(PRINT_UART_TX_GPIO, PRINT_UART_TX_PIN_SOURCE, PRINT_UART_TX_PIN_MUX_NUM);
  14. usart_init(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);
  15. usart_transmitter_enable(PRINT_UART, TRUE);
  16. usart_enable(PRINT_UART, TRUE);
  17. }

为实现printf输出,所需映射的处理为:
  1. PUTCHAR_PROTOTYPE
  2. {
  3. while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
  4. usart_data_transmit(PRINT_UART, (uint16_t)ch);
  5. while(usart_flag_get(PRINT_UART, USART_TDC_FLAG) == RESET);
  6. return ch;
  7. }

进行功能测试的主程序为:
  1. int main(void)
  2. {
  3. system_clock_config();
  4. at32_board_init();
  5. uart_print_init(9600);
  6. printf("usart1 printf test ! \r\n");
  7. while(1);
  8. }

此外,还可用使用函数usart_data_transmit()来输出字节数据,如:
usart_data_transmit(USART1,0X32);
f2f1c221a31da9ddc571cdd98112ab90
图1 发送字节数据

除了单向地输出信息,还需要双向的数据传送,以串口2为例,其配置函数为:
  1. void usart_configuration(void)
  2. {
  3. gpio_init_type gpio_init_struct;
  4. crm_periph_clock_enable(CRM_USART2_PERIPH_CLOCK, TRUE);
  5. crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
  6. gpio_default_para_init(&gpio_init_struct);
  7. gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  8. gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
  9. gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
  10. gpio_init_struct.gpio_pins = GPIO_PINS_2 | GPIO_PINS_3;
  11. gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
  12. gpio_init(GPIOA, &gpio_init_struct);
  13. gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE2, GPIO_MUX_7);
  14. gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE3, GPIO_MUX_7);
  15. usart_init(USART2,9600, USART_DATA_8BITS, USART_STOP_1_BIT);
  16. usart_parity_selection_config(USART2, USART_PARITY_NONE);
  17. usart_transmitter_enable(USART2, TRUE);
  18. usart_receiver_enable(USART2, TRUE);
  19. usart_enable(USART2, TRUE);
  20. }

此时,要进行串口通讯,需借助USB转TTL通讯模块或相应的串口外设。
以控制超声波测距模块处理为例,其主程序为:
  1. int main(void)
  2. {
  3. int l;
  4. system_clock_config();
  5. at32_board_init();
  6. usart_configuration();
  7. uart_print_init(9600);
  8. printf("usart1 printf test ! \r\n");
  9. usart_data_transmit(USART2, 0X55);
  10. usart2_rx_counter=0;
  11. while(usart2_rx_counter < 4)
  12. {
  13. while(usart_flag_get(USART2, USART_RDBF_FLAG) == RESET);
  14. usart1_rx_buffer[usart2_rx_counter++] = usart_data_receive(USART2);
  15. }
  16. usart1_rx_counter=0;
  17. usart2_tx_counter=0;
  18. while(usart1_rx_counter <4)
  19. {
  20. while(usart_flag_get(USART2, USART_TDBE_FLAG) == RESET);
  21. usart_data_transmit(USART2, usart1_rx_buffer[usart2_tx_counter++]);
  22. usart1_rx_counter++;
  23. }
  24. l=usart1_rx_buffer[1]*256+usart1_rx_buffer[2];
  25. printf("L=:%d \r\n",l);
  26. while(1);
  27. }

经程序的编译和下载,其测试结果如图2所示。
3521f0020b818ab07caf2dcb6f50e722
图2  测试结果



yangxiaor520 发表于 2025-6-7 19:56 来自手机 | 显示全部楼层
可以移植第三方shell库,更好用。
 楼主| jinglixixi 发表于 2025-6-7 21:35 | 显示全部楼层
yangxiaor520 发表于 2025-6-7 19:56
可以移植第三方shell库,更好用。

有时间试一试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2933

帖子

39

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