stm32f427串口3DMA接收 代码
时间: 2023-12-06 16:04:16 浏览: 51
以下是基于STM32F427的USART+DMA轮询接收程序,直接存储器访问 (DMA) 的串口3DMA接收代码:
```c
#include "stm32f4xx.h"
#include "usart.h"
#include "dma.h"
#define USART_RX_DMA_STREAM DMA1_Stream1
#define USART_RX_DMA_CHANNEL DMA_Channel_4
#define USART_RX_DMA_IRQ DMA1_Stream1_IRQn
#define USART_RX_DMA_FLAG_TC DMA_FLAG_TCIF1
#define USART_RX_DMA_FLAG_HT DMA_FLAG_HTIF1
#define USART_RX_DMA_FLAG_FE DMA_FLAG_FEIF1
#define USART_RX_DMA_FLAG_TE DMA_FLAG_TEIF1
#define USART_RX_DMA_FLAG_DME DMA_FLAG_DMEIF1
#define USART_RX_DMA_BUF_SIZE 1024
uint8_t usart_rx_dma_buf[USART_RX_DMA_BUF_SIZE];
void USART3_DMA_Init(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
DMA_DeInit(USART_RX_DMA_STREAM);
DMA_InitStructure.DMA_Channel = USART_RX_DMA_CHANNEL;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART3->DR;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)usart_rx_dma_buf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = USART_RX_DMA_BUF_SIZE;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(USART_RX_DMA_STREAM, &DMA_InitStructure);
DMA_Cmd(USART_RX_DMA_STREAM, ENABLE);
USART_DMACmd(USART3, USART_DMAReq_Rx, ENABLE);
}
void USART3_DMA_IRQHandler(void)
{
if (DMA_GetFlagStatus(USART_RX_DMA_STREAM, USART_RX_DMA_FLAG_TC) != RESET)
{
DMA_ClearFlag(USART_RX_DMA_STREAM, USART_RX_DMA_FLAG_TC);
}
if (DMA_GetFlagStatus(USART_RX_DMA_STREAM, USART_RX_DMA_FLAG_HT) != RESET)
{
DMA_ClearFlag(USART_RX_DMA_STREAM, USART_RX_DMA_FLAG_HT);
}
if (DMA_GetFlagStatus(USART_RX_DMA_STREAM, USART_RX_DMA_FLAG_FE) != RESET)
{
DMA_ClearFlag(USART_RX_DMA_STREAM, USART_RX_DMA_FLAG_FE);
}
if (DMA_GetFlagStatus(USART_RX_DMA_STREAM, USART_RX_DMA_FLAG_TE) != RESET)
{
DMA_ClearFlag(USART_RX_DMA_STREAM, USART_RX_DMA_FLAG_TE);
}
if (DMA_GetFlagStatus(USART_RX_DMA_STREAM, USART_RX_DMA_FLAG_DME) != RESET)
{
DMA_ClearFlag(USART_RX_DMA_STREAM, USART_RX_DMA_FLAG_DME);
}
}
int main(void)
{
USART3_Configuration();
USART3_DMA_Init();
while (1)
{
// do something
}
}
```