请用c语言写STM32 串口空闲中断+DMA接收程序
时间: 2023-05-31 08:04:55 浏览: 164
以下是一个简单的STM32串口空闲中断DMA接收程序的示例:
```
#include "stm32f4xx.h"
// 定义DMA缓冲区大小
#define BUFFER_SIZE 256
// 定义DMA接收缓冲区
uint8_t dma_buffer[BUFFER_SIZE];
int main(void) {
// 初始化串口
USART_InitTypeDef usart_init_struct;
usart_init_struct.USART_BaudRate = 115200;
usart_init_struct.USART_WordLength = USART_WordLength_8b;
usart_init_struct.USART_StopBits = USART_StopBits_1;
usart_init_struct.USART_Parity = USART_Parity_No;
usart_init_struct.USART_Mode = USART_Mode_Rx;
USART_Init(USART1, &usart_init_struct);
USART_Cmd(USART1, ENABLE);
// 初始化DMA
DMA_InitTypeDef dma_init_struct;
dma_init_struct.DMA_Channel = DMA_Channel_4;
dma_init_struct.DMA_PeripheralBaseAddr = (uint32_t)&(USART1->DR);
dma_init_struct.DMA_Memory0BaseAddr = (uint32_t)dma_buffer;
dma_init_struct.DMA_DIR = DMA_DIR_PeripheralToMemory;
dma_init_struct.DMA_BufferSize = BUFFER_SIZE;
dma_init_struct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
dma_init_struct.DMA_MemoryInc = DMA_MemoryInc_Enable;
dma_init_struct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
dma_init_struct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
dma_init_struct.DMA_Mode = DMA_Mode_Circular;
dma_init_struct.DMA_Priority = DMA_Priority_High;
dma_init_struct.DMA_FIFOMode = DMA_FIFOMode_Disable;
dma_init_struct.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
dma_init_struct.DMA_MemoryBurst = DMA_MemoryBurst_Single;
dma_init_struct.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_Init(DMA2_Stream2, &dma_init_struct);
// 启动DMA传输
DMA_Cmd(DMA2_Stream2, ENABLE);
// 配置串口空闲中断
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
// 启动串口
USART_Cmd(USART1, ENABLE);
while (1) {
// 空闲中断触发后处理接收到的数据
if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) {
USART_ClearITPendingBit(USART1, USART_IT_IDLE);
uint16_t length = BUFFER_SIZE - DMA_GetCurrDataCounter(DMA2_Stream2);
// 处理接收到的数据
// ...
// 重新启动DMA传输
DMA_Cmd(DMA2_Stream2, ENABLE);
}
}
}
// 串口中断处理函数
void USART1_IRQHandler(void) {
if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) {
// 清除中断标志
USART_ClearITPendingBit(USART1, USART_IT_IDLE);
}
}
```
该程序使用了DMA来接收串口数据,并使用了空闲中断来触发数据处理。在空闲中断处理函数中,首先需要获取接收到的数据的长度,然后进行数据处理。处理完毕后,再重新启动DMA传输。注意,在空闲中断处理函数中,需要清除中断标志。
阅读全文