本帖最后由 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 测试结果
|