USART引脚配置:将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配置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);
|