本帖最后由 jinglixixi 于 2025-6-7 19:42 编辑
#申请原创#
通过串口可实现调试信息的输出及串口设备间的数据传送,以进行调试信息输出为例,它是串口1,在无需添加外围器件的情况下,就可利用板载的资源来实现调试信息输出。
对串口1的配置函数为:
- void uart_print_init(uint32_t baudrate)
- {
- gpio_init_type gpio_init_struct;
- crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);
- crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);
- gpio_default_para_init(&gpio_init_struct);
- gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
- gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
- gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
- gpio_init_struct.gpio_pins = PRINT_UART_TX_PIN;
- gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
- gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct);
- gpio_pin_mux_config(PRINT_UART_TX_GPIO, PRINT_UART_TX_PIN_SOURCE, PRINT_UART_TX_PIN_MUX_NUM);
- usart_init(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);
- usart_transmitter_enable(PRINT_UART, TRUE);
- usart_enable(PRINT_UART, TRUE);
- }
为实现printf输出,所需映射的处理为:
- PUTCHAR_PROTOTYPE
- {
- while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET);
- usart_data_transmit(PRINT_UART, (uint16_t)ch);
- while(usart_flag_get(PRINT_UART, USART_TDC_FLAG) == RESET);
- return ch;
- }
进行功能测试的主程序为:
- int main(void)
- {
- system_clock_config();
- at32_board_init();
- uart_print_init(9600);
- printf("usart1 printf test ! \r\n");
- while(1);
- }
此外,还可用使用函数usart_data_transmit()来输出字节数据,如:
usart_data_transmit(USART1,0X32);
图1 发送字节数据
除了单向地输出信息,还需要双向的数据传送,以串口2为例,其配置函数为:
- void usart_configuration(void)
- {
- gpio_init_type gpio_init_struct;
- crm_periph_clock_enable(CRM_USART2_PERIPH_CLOCK, TRUE);
- crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
- gpio_default_para_init(&gpio_init_struct);
- gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
- gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
- gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
- gpio_init_struct.gpio_pins = GPIO_PINS_2 | GPIO_PINS_3;
- gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
- gpio_init(GPIOA, &gpio_init_struct);
- gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE2, GPIO_MUX_7);
- gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE3, GPIO_MUX_7);
- usart_init(USART2,9600, USART_DATA_8BITS, USART_STOP_1_BIT);
- usart_parity_selection_config(USART2, USART_PARITY_NONE);
- usart_transmitter_enable(USART2, TRUE);
- usart_receiver_enable(USART2, TRUE);
- usart_enable(USART2, TRUE);
- }
此时,要进行串口通讯,需借助USB转TTL通讯模块或相应的串口外设。
以控制超声波测距模块处理为例,其主程序为:
- int main(void)
- {
- int l;
- system_clock_config();
- at32_board_init();
- usart_configuration();
- uart_print_init(9600);
- printf("usart1 printf test ! \r\n");
- usart_data_transmit(USART2, 0X55);
- usart2_rx_counter=0;
- while(usart2_rx_counter < 4)
- {
- while(usart_flag_get(USART2, USART_RDBF_FLAG) == RESET);
- usart1_rx_buffer[usart2_rx_counter++] = usart_data_receive(USART2);
- }
- usart1_rx_counter=0;
- usart2_tx_counter=0;
- while(usart1_rx_counter <4)
- {
- while(usart_flag_get(USART2, USART_TDBE_FLAG) == RESET);
- usart_data_transmit(USART2, usart1_rx_buffer[usart2_tx_counter++]);
- usart1_rx_counter++;
- }
- l=usart1_rx_buffer[1]*256+usart1_rx_buffer[2];
- printf("L=:%d \r\n",l);
- while(1);
- }
经程序的编译和下载,其测试结果如图2所示。
图2 测试结果
|