初始化代码:- /*
- *串口1 DMA配置函数
- *IO:PA9/PA10
- *blound: 波特率
- *数据位 8,停止位 1,无校验
- *DMA1,通道4/5
- */
-
-
- void usart1_dma_init(u32 bound)
- {
- gpio_init_type gpio_init_struct;
- dma_init_type dma_init_struct;
-
-
- /*Enable the UART Clock*/
- crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE); //开启GPIOA的时钟
- crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE); //开启USART1的时钟
- crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE); //开启DMA1的时钟
-
- gpio_default_para_init(&gpio_init_struct);
- /* Configure the UART1 TX pin */
- 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_9; //PA9
- gpio_init_struct.gpio_pull = GPIO_PULL_NONE; //无上下拉
- gpio_init(GPIOA, &gpio_init_struct);
-
- /* Configure the UART1 RX pin */
- 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_10; //PA10
- gpio_init_struct.gpio_pull = GPIO_PULL_UP; //上拉
- gpio_init(GPIOA, &gpio_init_struct);
-
- dma_reset(DMA1_CHANNEL4);
- dma_default_para_init(&dma_init_struct);
- dma_init_struct.buffer_size = 0; //内存大小
- dma_init_struct.direction = DMA_DIR_MEMORY_TO_PERIPHERAL; //外设地址为目的地址
- dma_init_struct.memory_base_addr = (uint32_t)0; //内存地址
- 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)&USART1->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_CHANNEL4, &dma_init_struct);
-
- dma_reset(DMA1_CHANNEL5);
- dma_init_struct.peripheral_base_addr=(uint32_t)&USART1->dt; //外设地址
- dma_init_struct.memory_base_addr=(uint32_t)Muartnum[0].Uartrxbuf; //内存地址
- dma_init_struct.direction=DMA_DIR_PERIPHERAL_TO_MEMORY; //外设地址为源地址
- dma_init_struct.buffer_size=USART_REC_LEN;
- dma_init(DMA1_CHANNEL5, &dma_init_struct);
-
- usart_dma_receiver_enable(USART1,TRUE); //使能串口dma接收
- dma_channel_enable(DMA1_CHANNEL5, TRUE); //使能通道5
-
- nvic_irq_enable(USART1_IRQn, 0, 0); //使能串口1中断,优先级0,次优先级0
-
- /*Configure UART param*/
- usart_init(USART1, bound, USART_DATA_8BITS, USART_STOP_1_BIT); //波特率,8数据位,1停止位
- usart_hardware_flow_control_set(USART1,USART_HARDWARE_FLOW_NONE); //无硬件流操作
- usart_parity_selection_config(USART1,USART_PARITY_NONE); //无校验
- usart_transmitter_enable(USART1, TRUE); //使能发送
- usart_receiver_enable(USART1, TRUE); //使能接收
-
- usart_interrupt_enable(USART1, USART_IDLE_INT, TRUE); //使能串口空闲中断
- usart_enable(USART1, TRUE); //使能串口
-
- }
|