STM32 H750 串口空闲中断+DMA收发数据

本文详细介绍了在STM32H750VBT6芯片上针对高时钟频率优化的空闲中断与DMA配置方法,包括USART1的PA9/PA10引脚重置、DMA的设置、NVIC的配置以及自定义中断处理。通过实例演示了如何解决由于时钟过高导致的问题,并提供了关键代码段以供参考。
摘要由CSDN通过智能技术生成

之前文章写过有关空闲中断+DMA的使用方法,但是本实验使用的是STM32H750VBT6芯片,按照之前的方法配置会出现一下问题,可能原因是此芯片的时钟频率是480M过高影响的原因,所以写一篇针对此系类芯片的配置说明

  1. 使用CUBE配置串口,默认CUBE配置USART1使用的是PB14和PB15,要是修改成PA9和PA10要手动修改一下。
    在这里插入图片描述
  2. 配制DMA
    在这里插入图片描述
  3. 配置NVIC,
    在这里插入图片描述
  4. main.c 参数定义
extern DMA_HandleTypeDef hdma_usart1_rx;
extern DMA_HandleTypeDef hdma_usart1_tx;
extern UART_HandleTypeDef huart1;

uint8_t rx_len=0;  
uint8_t recv_flag=0;
uint8_t rx_buffer[RX_SIZE];
  1. main.h 参数定义
#define RX_SIZE 200

extern uint8_t rx_len; 
extern uint8_t recv_flag;
extern uint8_t rx_buffer[RX_SIZE];
  1. usart.c MX_USART1_UART_Init函数修改,在末尾添加以下函数
	 __HAL_UART_CLEAR_IT(&huart1, UART_CLEAR_IDLEF);
	__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);//开启IDLE中断
	while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)==RESET);
	HAL_UART_Receive_DMA(&huart1,rx_buffer,RX_SIZE);//开启DMA接收
  1. 在mian.c 自定义中断函数并添加到stm32h7xx.h USART1_IRQHandler函数里面
void UART1_IRQ(void)
{
	static uint16_t i = 0;
	if((__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE) != RESET))
	{ 
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);	     
		HAL_UART_DMAStop(&huart1); 
		rx_len =  RX_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx);
		recv_flag = 1;
	}
}
  1. 主函数,进入循环函数之前再将recv_flag变量清一下零,因为在程序上电时候会进入一次串口中断
  recv_flag=0;
  while (1)
  {
  		if(recv_flag ==1)			
		{	
			printf("接收到的数据长度为%d    ",rx_len);
			// HAL_UART_Transmit(&huart1,rx_buffer, rx_len, 200);// 正常发送
			HAL_UART_Transmit_DMA(&huart1,rx_buffer,rx_len);// DMA发送
			rx_len=0;
			recv_flag=0;
			HAL_UART_Receive_DMA(&huart1,rx_buffer,RX_SIZE);
		}
  }
  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值