STM32F429 串口1实现DMA接收功能

串口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, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值