串口1+dma中断 接收和发送
本实验中的串口1+dma中断是基于串口1的IDLE空闲中断实现的
额外说一句IDLE中断和RXNE中断有什么区别呢
假设上位机给MCU的USART1发送8Byte
1.IDLE:只进入一次中断->最后一个Byte的最后一个bit发送完毕之后,mcu开始计时,假设3ms(这个时间怎么计算,最后讲解)内没有收到任何数据->进入IDLE中断
2.RXNE:进入8次中断,收到每一个Byte后的停止位->进入中断
言归正传
针对STM32F429的USART1的RX dma & TX dma功能。
第一步,初始化DMA->为什么要先初始化DMA,后面会讲到
//下面的定义句柄不要忘记
DMA_HandleTypeDef UART1RxDMA_Handler; //定义句柄
u8 USART1_DMATX_FLAG=0;
void U1_RX_DMA_Config(void )
{
__HAL_RCC_DMA2_CLK_ENABLE();//DMA2时钟使能
__HAL_LINKDMA(&UART1_Handler, hdmarx, UART1RxDMA_Handler);//将rx和dma连接
//Rx DMA配置
UART1RxDMA_Handler.Instance = DMA2_Stream5;
UART1RxDMA_Handler.Init.Channel = DMA_CHANNEL_4;
UART1RxDMA_Handler.Init.Direction = DMA_PERIPH_TO_MEMORY;
UART1RxDMA_Handler.Init.PeriphInc = DMA_PINC_DISABLE;
UART1RxDMA_Handler.Init.MemInc = DMA_MINC_ENABLE;
UART1RxDMA_Handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
UART1RxDMA_Handler.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
UART1RxDMA_Handler.Init.Mode = DMA_CIRCULAR;
UART1RxDMA_Handler.Init.Priority = DMA_PRIORITY_LOW;
UART1RxDMA_Handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
HAL_DMA_DeInit(&UART1RxDMA_Handler);
HAL_DMA_Init(&UART1RxDMA_Handler);
__HAL_DMA_ENABLE_IT(&UART1RxDMA_Handler, DMA_IT_TC); //开启DMA传输完成中断
HAL_NVIC_SetPriority(DMA2_Stream5_IRQn, 3, 1);
HAL_NVIC_EnableIRQ(DMA2_Stream5_IRQn);
}
//DMA接收中断处理
void DMA2_Stream5_IRQHandler(void)
{
if(__HAL_DMA_GET_FLAG(&UART1RxDMA_Handler, DMA_FLAG_TCIF1_5)) //DMA2_Steam2传输完成
{
__HAL_DMA_CLEAR_FLAG(&UART1RxDMA_Handler,