STM32 串口中断DMA接收 nvic
时间: 2023-09-08 21:15:09 浏览: 182
STM32使用DMA加串口空闲中断接收数据
在STM32中使用DMA接收串口数据时,可以通过中断来处理接收到的数据。具体的步骤如下:
1.开启DMA传输和UART的接收中断。
2.在DMA传输完成后,会触发DMA传输完成中断,可以在中断处理函数中获取接收到的数据。
3.在UART接收中断中,将接收到的数据存放到缓冲区中。
4.在主函数中,可以通过判断缓冲区是否有数据来进行下一步操作。
下面是一个简单的示例代码:
```c
#include "stm32f10x.h"
#define BUFFER_SIZE 100
uint8_t buffer[BUFFER_SIZE];
uint8_t index = 0;
int main(void)
{
// 初始化串口和DMA
USART_InitTypeDef usart_init;
DMA_InitTypeDef dma_init;
// 设置USART参数
usart_init.USART_BaudRate = 9600;
usart_init.USART_WordLength = USART_WordLength_8b;
usart_init.USART_StopBits = USART_StopBits_1;
usart_init.USART_Parity = USART_Parity_No;
usart_init.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
usart_init.USART_Mode = USART_Mode_Rx;
USART_Init(USART1, &usart_init);
// 设置DMA参数
dma_init.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
dma_init.DMA_MemoryBaseAddr = (uint32_t)buffer;
dma_init.DMA_DIR = DMA_DIR_PeripheralSRC;
dma_init.DMA_BufferSize = BUFFER_SIZE;
dma_init.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
dma_init.DMA_MemoryInc = DMA_MemoryInc_Enable;
dma_init.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
dma_init.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
dma_init.DMA_Mode = DMA_Mode_Circular;
dma_init.DMA_Priority = DMA_Priority_High;
dma_init.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &dma_init);
// 开启DMA传输和UART接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
DMA_Cmd(DMA1_Channel5, ENABLE);
while(1)
{
if(index > 0)
{
// 处理接收到的数据
// ...
index = 0;
}
}
}
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
buffer[index++] = USART_ReceiveData(USART1);
}
}
void DMA1_Channel5_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TC5) != RESET)
{
DMA_ClearITPendingBit(DMA1_IT_TC5);
}
}
```
在上面的代码中,我们使用了USART1和DMA1_Channel5来完成串口数据的接收。在main函数中,我们通过判断缓冲区中是否有数据来进行下一步操作。在USART1_IRQHandler中,我们将接收到的数据存放到缓冲区中,并在DMA1_Channel5_IRQHandler中清除DMA传输完成中断标志位。
阅读全文