2、实现串口的初始化以及DMA收发功能—这里以USART2为例
//usart_dma.c文件
#include "usart_dma.h"
//<<<<<<<<<<<<<<<<宏定义<<<<<<<<<<<<<<<<
#define USART_TX_RX_BUFF_LEN 256//DMA缓存数据大小
#define USART_DMA_IDLE 0//DMA状态空闲
#define USART_DMA_BUSY 1//DMA状态忙
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//<<<<<<<<<<<<<<<<结构定义<<<<<<<<<<<<<<<<
#pragma pack(1)
typedef struct
{
uint8_t dma_tx_buf[USART_TX_RX_BUFF_LEN];//缓存DMA要发送的数据
uint8_t dma_rx_buf[USART_TX_RX_BUFF_LEN];//缓存DMA接收到的数据
uint8_t dma_tx_state;//DMA发送状态
uint8_t dma_rx_state;//DMA接收状态
}USART_DataInfo;
#pragma pack()
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
USART_DataInfo g_usart_DataInfo;
/*
串口初始化,使用DMA模式
*/
void gd32_usart_dma_init(void)
{
usart_deinit(USART2);
usart_disable(USART2);
rcu_periph_clock_enable(RCU_GPIOB);
rcu_periph_clock_enable(RCU_USART2);
/* connect port to USARTx_Tx */
gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
/* connect port to USARTx_Rx */
gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
nvic_irq_enable(USART2_IRQn,1,0);
usart_interrupt_enable(USART2,USART_INT_IDLE); //空闲中断
//usart_interrupt_enable(USART2,USART_INT_RBNE);//接收中断
usart_baudrate_set(USART2,38400);//波特率设置
usart_parity_config(USART2,USART_PM_NONE);//校验位设置
usart_word_length_set(USART2,USART_WL_8BIT);//数据位设置
usart_stop_bit_set(USART2,USART_STB_1BIT);//停止位设置
usart_hardware_flow_rts_config(USART2, USART_RTS_DISABLE);//
usart_hardware_flow_cts_config(USART2, USART_CTS_DISABLE);//硬件流控设置
usart_data_first_config(USART2,USART_MSBF_LSB);//发送模式--LSB
usart_transmit_config(USART2,USART_TRANSMIT_ENABLE);//发送使能
usart_receive_config(USART2,USART_RECEIVE_ENABLE);//接收使能
usart_enable(USART2);//使能串口
gd32_usart_dma_tx_init();//DMA发送初始化
gd32_usart_dma_rx_init();//DMA接收初始化
}
|