之前试过了DMA的ADC,这次用DMA结合串口的收发。
初始化一些需要用到的参数
#define USART_MAX_BUFFER_SIZE 512
typedef struct usartRT {
uint8_t status;
uint16_t rxBufferSize;
uint16_t txBufferSize;
uint8_t txBuffer[USART_MAX_BUFFER_SIZE];
uint8_t rxBuffer[USART_MAX_BUFFER_SIZE];
}usartPacket_s;
typedef struct serialHandle {
USART_Type* USARTx;
DMA_Channel_Type* rxChannel;
DMA_Channel_Type* txChannel;
usartPacket_s packet;
usartPacket_s DMApacket;
}SerialHandle_s;
SerialHandle_s serialHandle[serialCount] = {
[serial1] = {
.USARTx = USART1,
.rxChannel = DMA1_Channel5,
.txChannel = DMA1_Channel4,
.packet.rxBufferSize = 0,
.DMApacket.rxBufferSize = 0,
},
}
初始化DMA
void USART_DMA_INIT(DMA_Channel_Type* DMAchannelx, uint32_t periphAddr, uint32_t bufferAddr, uint16_t bufferSize, uint32_t Direction)
{
DMA_InitType DMA_InitStructure;
DMA_Reset(DMAchannelx);
DMA_DefaultInitParaConfig(&DMA_InitStructure);
DMA_InitStructure.DMA_PeripheralBaseAddr = periphAddr;
DMA_InitStructure.DMA_MemoryBaseAddr = bufferAddr;
DMA_InitStructure.DMA_Direction = Direction;
DMA_InitStructure.DMA_BufferSize = bufferSize;
DMA_InitStructure.DMA_PeripheralInc = DMA_PERIPHERALINC_DISABLE;
DMA_InitStructure.DMA_MemoryInc = DMA_MEMORYINC_ENABLE;
DMA_InitStructure.DMA_PeripheralDataWidth = DMA_PERIPHERALDATAWIDTH_BYTE;
DMA_InitStructure.DMA_MemoryDataWidth = DMA_MEMORYDATAWIDTH_BYTE;
DMA_InitStructure.DMA_Mode = DMA_MODE_NORMAL;
DMA_InitStructure.DMA_Priority = DMA_PRIORITY_LOW;
DMA_InitStructure.DMA_MTOM = DMA_MEMTOMEM_DISABLE;
DMA_Init(DMAchannelx, &DMA_InitStructure);
}
设置DMA参数
void USART_DMA_SETUP(SerialHandle_s* serialx)
{
USART_DMA_INIT(serialx->txChannel, (uint32_t) & (serialx->USARTx->DT), (uint32_t)(serialx->DMApacket.txBuffer), USART_MAX_BUFFER_SIZE, UART_TX);
USART_DMA_INIT(serialx->rxChannel, (uint32_t) & (serialx->USARTx->DT), (uint32_t)(serialx->DMApacket.rxBuffer), USART_MAX_BUFFER_SIZE, UART_RX);
DMA_ChannelEnable(serialx->rxChannel, ENABLE);
USART_DMACmd(serialx->USARTx, USART_DMAReq_Rx, ENABLE);
USART_DMACmd(serialx->USARTx, USART_DMAReq_Tx, ENABLE);
}
初始化串口
void USART_ClkCmd(USART_Type* USARTx, FunctionalState NewState)
{
if (USARTx == USART1)
{
RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_USART1, NewState);
}
}
void USART_NVIC_Cmd(USART_Type* USARTx, FunctionalState NewState)
{
if (USARTx == USART1)
{
NVIC_Config(USART1_IRQn, 4, 1, NewState);
}
}
void Usart_Setup(SerialHandle_s* serialx, uint32_t baudrate, uint16_t Wordlength, uint16_t Stopbits, uint16_t Parity, uint16_t Mode, uint16_t HardwareFlowControl)
{
USART_Reset(serialx->USARTx);
USART_ClkCmd(serialx->USARTx, ENABLE);
USART_NVIC_Cmd(serialx->USARTx, ENABLE);
USART_InitType USARTx_InitStructure;
USARTx_InitStructure.USART_BaudRate = baudrate;
USARTx_InitStructure.USART_WordLength = Wordlength;
USARTx_InitStructure.USART_StopBits = Stopbits;
USARTx_InitStructure.USART_Parity = Parity;
USARTx_InitStructure.USART_Mode = Mode;