1 串口配置
void usart_tx_configuration(void)//tx:A2rx:A3
{
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_init_struct.gpio_pull = GPIO_PULL_NONE;
gpio_init(GPIOA, &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_INPUT;
gpio_init_struct.gpio_pins = GPIO_PINS_3;
gpio_init_struct.gpio_pull = GPIO_PULL_UP;
gpio_init(GPIOA, &gpio_init_struct);
usart_init(usart_tx, 230400, USART_DATA_8BITS, USART_STOP_1_BIT);
usart_transmitter_enable(usart_tx, TRUE);
usart_receiver_enable(usart_tx, TRUE);
nvic_irq_enable(USART2_IRQn, 0,0);
usart_interrupt_enable(usart_tx,USART_IDLE_INT, TRUE);
usart_enable(usart_tx, TRUE);
usart_dma_transmitter_enable(usart_tx,TRUE);
}
2 DMA配置
void dma_usart_tx_config(void)
{
dma_init_type dma_init_struct;
crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
/* dma1 channel1 for usart2 tx configuration */
dma_reset(DMA1_CHANNEL1);
dma_default_para_init(&dma_init_struct);
dma_init_struct.buffer_size = usart_rx_rx.setcount;
dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL;
dma_init_struct.memory_base_addr = (uint32_t)usart_tx_tx.tx_buffer;
dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
dma_init_struct.memory_inc_enable = TRUE;
dma_init_struct.peripheral_base_addr = (uint32_t)&usart_tx->dt;
dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
dma_init_struct.peripheral_inc_enable = FALSE;
dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
dma_init_struct.loop_mode_enable = FALSE;
dma_init(DMA1_CHANNEL1, &dma_init_struct);
/* dma1 channel2 for usart2 rx configuration */
dma_reset(DMA1_CHANNEL2);
dma_default_para_init(&dma_init_struct);
dma_init_struct.buffer_size = usart_tx_rx.setcount;
dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
dma_init_struct.memory_base_addr = (uint32_t)usart_tx_rx.rx_buffer;
dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_BYTE;
dma_init_struct.memory_inc_enable = TRUE;
dma_init_struct.peripheral_base_addr = (uint32_t)&usart_tx->dt;
dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_BYTE;
dma_init_struct.peripheral_inc_enable = FALSE;
dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
dma_init_struct.loop_mode_enable = FALSE;
dma_init(DMA1_CHANNEL2, &dma_init_struct);
dma_flexible_config(DMA1, FLEX_CHANNEL1, DMA_FLEXIBLE_UART2_TX);
dma_flexible_config(DMA1, FLEX_CHANNEL2, DMA_FLEXIBLE_UART2_RX);
dma_channel_enable(DMA1_CHANNEL2, TRUE);
// dma_channel_enable(DMA1_CHANNEL1, TRUE);
}
3 串口中断函数
void USART2_IRQHandler(void)
{
if (usart_flag_get(usart_tx, USART_IDLEF_FLAG) != RESET)
{
usart_flag_clear(usart_tx, USART_IDLEF_FLAG);
dma_channel_enable(DMA1_CHANNEL2, FALSE);
usart_tx_rx.recv_end_flag = 1;
usart_tx_rx.rx_cout = BUFFER_SIZE-dma_data_number_get(DMA1_CHANNEL2);
dma_channel_enable(DMA1_CHANNEL2, TRUE);
}
}
4 DMA发送
void usart_dma_work(u8 *data,u16 len)
{
DMA1_CHANNEL1->dtcnt=len;
DMA1_CHANNEL1->maddr=(uint32_t)data;
usart_dma_transmitter_enable(usart_tx,TRUE);
dma_channel_enable(DMA1_CHANNEL1, TRUE);
while(dma_flag_get(DMA1_FDT1_FLAG)==RESET );
dma_flag_clear(DMA1_FDT1_FLAG);
dma_channel_enable(DMA1_CHANNEL1, FALSE);
usart_dma_transmitter_enable(usart_tx,FALSE);
}