USART引脚配置[color=rgba(0, 0, 0, 0.9)]:将USART的TX(发送)和RX(接收)引脚设置为复用功能模式。
gpio_init_type gpio_init_struct;
// 使能GPIO时钟(例如USART1使用PA9/PA10)
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);
// 配置TX引脚为复用推挽输出
gpio_init_struct.gpio_pins = GPIO_PINS_9;
gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;
gpio_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init_struct.gpio_mode = GPIO_MODE_MUX;
gpio_init(GPIOA, &gpio_init_struct);
// 配置RX引脚为浮空输入
gpio_init_struct.gpio_pins = GPIO_PINS_10;
gpio_init_struct.gpio_mode = GPIO_MODE_INPUT;
gpio_init(GPIOA, &gpio_init_struct);
初始化USART[color=rgba(0, 0, 0, 0.9)]配置USART的基本参数(波特率、数据位、停止位等),并启用DMA发送/接收功能: usart_init_type usart_init_struct;
// 使能USART时钟
crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);
// 配置USART参数
usart_init_struct.baud_rate = 115200;
usart_init_struct.word_length = USART_WORD_LENGTH_8B;
usart_init_struct.stop_bits = USART_STOP_BITS_1;
usart_init_struct.parity = USART_PARITY_NONE;
usart_init_struct.mode = USART_MODE_TXRX;
usart_init(USART1, &usart_init_struct);
// 使能USART
usart_enable(USART1, TRUE);
DMA发送配置(内存到USART)
dma_init_type dma_init_struct;
// 使能DMA时钟
crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
// 配置DMA通道(根据数据手册选择对应USART的DMA通道,例如USART1_TX用DMA1_CH4)
dma_reset(DMA1_CHANNEL4);
dma_default_para_init(&dma_init_struct);
dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL;
dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
dma_init_struct.memory_inc_enable = TRUE; // 内存地址自增
dma_init_struct.peripheral_inc_enable = FALSE;
dma_init_struct.loop_mode_enable = FALSE; // 非循环模式
dma_init_struct.peripheral_address = (uint32_t)&USART1->dt; // USART数据寄存器地址
dma_init(DMA1_CHANNEL4, &dma_init_struct);
// 使能USART的DMA发送请求
usart_dma_transmitter_enable(USART1, TRUE);
DMA接收配置(USART到内存)// 配置DMA通道(例如USART1_RX用DMA1_CH5)
dma_reset(DMA1_CHANNEL5);
dma_default_para_init(&dma_init_struct);
dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
dma_init_struct.memory_inc_enable = TRUE;
dma_init_struct.loop_mode_enable = TRUE; // 循环模式(持续接收)
dma_init_struct.peripheral_address = (uint32_t)&USART1->dt;
dma_init(DMA1_CHANNEL5, &dma_init_struct);
// 使能USART的DMA接收请求
usart_dma_receiver_enable(USART1, TRUE);
启动DMA传输发送数据// 设置内存地址和传输数据量
dma_memory_address_config(DMA1_CHANNEL4, (uint32_t)tx_buffer);
dma_transfer_number_config(DMA1_CHANNEL4, tx_buffer_size);
// 启动DMA传输
dma_channel_enable(DMA1_CHANNEL4, TRUE);
接收数据
// 设置接收缓冲区
dma_memory_address_config(DMA1_CHANNEL5, (uint32_t)rx_buffer);
dma_transfer_number_config(DMA1_CHANNEL5, rx_buffer_size);
// 启动DMA接收(循环模式)
dma_channel_enable(DMA1_CHANNEL5, TRUE);
|