stm32H743串口接收DMA方式
时间: 2023-10-16 18:05:50 浏览: 114
用串口DMA方式接收发送数据.zip_STM32 DMA发送_dma.crf_stm32 DMA 串口_stm32 DMA 串
5星 · 资源好评率100%
1. 配置串口接收DMA
首先要配置串口接收DMA,使得串口接收到的数据可以自动存储到内存中。具体配置方法如下:
1)开启DMA时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);
2)配置DMA
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_BufferSize = 100; //缓冲区大小为100个字节
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; //数据传输方向为外设到内存
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)buffer; //缓冲区基地址
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //传输数据大小为Byte
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //循环模式
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR; //外设地址为USART1->DR
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //传输数据大小为Byte
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不自增
DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; //优先级为最高
DMA_Init(DMA1_Stream5, &DMA_InitStructure); //配置USART1_RX_DMA
3)开启DMA
DMA_Cmd(DMA1_Stream5, ENABLE);
2. 配置串口中断
除了配置DMA外,还需要配置串口中断,以便当串口接收到数据后,能够及时地进行处理。具体配置方法如下:
1)开启串口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
2)配置串口
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200; //波特率为115200
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_InitStructure.USART_Parity = USART_Parity_No; //无校验位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位为1
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位为8位
USART_Init(USART1, &USART_InitStructure); //配置串口
3)开启串口
USART_Cmd(USART1, ENABLE);
4)配置串口中断
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口中断通道为USART1_IRQn
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级为0
NVIC_Init(&NVIC_InitStructure); //配置串口中断
5)开启串口接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
3. 编写中断服务函数
当串口接收到数据后,会触发串口接收中断,此时需要在中断服务函数中进行数据的处理。具体代码如下:
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清除中断标志位
DMA_Cmd(DMA1_Stream5, DISABLE); //关闭DMA
while (DMA_GetFlagStatus(DMA1_Stream5, DMA_FLAG_TCIF5) == RESET); //等待DMA完成
DMA_ClearFlag(DMA1_Stream5, DMA_FLAG_TCIF5); //清除DMA标志位
uint32_t length = 100 - DMA_GetCurrDataCounter(DMA1_Stream5); //获取接收到的数据长度
for (int i = 0; i < length; i++)
{
//对接收到的数据进行处理
}
DMA_SetCurrDataCounter(DMA1_Stream5, 100); //重新设置DMA当前数据传输量
DMA_Cmd(DMA1_Stream5, ENABLE); //开启DMA
}
}
以上就是STM32H743串口接收DMA方式的配置方法和中断服务函数的编写方法。需要注意的是,在中断服务函数中,需要关闭DMA,等待DMA传输完成后再进行数据处理,最后重新设置DMA的当前数据传输量并开启DMA。
阅读全文