STM32CubeMX之DMA辅助串口数据接收

1.DMA辅助串口数据接收

1.1 DMA简介

  直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。

  两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。

  DMA控制器和Cortex™-M3核心共享系统数据总线,执行直接存储器数据传输。当CPU和DMA同时访问相同的目标(RAM或外设)时,DMA请求会暂停CPU访问系统总线达若干个周期,总线

仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。

1.2 DMA特性

  ● 12个独立的可配置的通道(请求):DMA1有7个通道,DMA2有5个通道。

  ● 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。

  ● 在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推) 。

  ● 独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。

  ● 支持循环的缓冲器管理。

  ● 每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。

  ● 存储器和存储器间的传输。

  ● 外设和存储器、存储器和外设之间的传输。

  ● 闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。

  ● 可编程的数据传输数目:最大为65535。

1.3 串口1接收与DMA1的通道接口

  从外设(TIMxx=1、2、3、4、ADC1、SPI1、SPI/I2S2、I2Cxx=1、2和USARTxx=1、2、3)产生的7个请求,通过逻辑或输入到DMA1控制器,这意味着同时只能有一个请求有效。参见下图的DMA1请求映像。

  外设的DMA请求,可以通过设置相应外设寄存器中的控制位,被独立地开启或关闭。

2.串口1接收使能DMA配置

2.1串口基本功能配置

  串口1配置:全双工异步通信、波特率为115200、8个数据位、1个停止位、无校验位

  打开STM32CbeMX软件,配置串口串口、开启串口中断

  优先级分组设置:2位抢占优先级2位副优先级

2.2 串口基本功能配置

  配置串口1接收DMA通道

3.代码配置

3.1 修改usart.c文件

  1.开启空闲帧中断

c 复制代码
  huart1.Instance->CR1|=1<<4;//开启串口空闲帧中断

  2.添加DMA处理代码

c 复制代码
    DMA1_Channel5->CPAR=(uint32_t )&USART1->DR;//外设地址
    DMA1_Channel5->CMAR=(uint32_t )usart1_rx_buff;//存储器地址
    DMA1_Channel5->CCR&=~(1<<0);//关闭通道传输
    DMA1_Channel5->CNDTR=1024;//设置传输数量
    DMA1_Channel5->CCR|=1<<0;//开启通道传输

3.2 修改stm32f1xx.it.c文件

  1.DMA数据接收处理:

c 复制代码
extern DMA_HandleTypeDef hdma_usart1_rx;
extern UART_HandleTypeDef huart1;
/* USER CODE BEGIN EV */
uint8_t usart1_rx_buff[1024];//串口1接收数据缓冲区
uint16_t usart1_cnt=0;//保存数组下班
uint8_t usart1_flag;//接收完成标志符
/*************************串口接收数据函数********************/
static void Usart1_Receive_Data(void)
{
	DMA1_Channel5->CCR&=~(1<<0);//关闭通道传输
	usart1_cnt=1024-DMA1_Channel5->CNDTR;//获取接收到是字符长度
	if(usart1_cnt>=1024)usart1_cnt=0;
	DMA1->IFCR|=1<<17;//清除标志位
	DMA1_Channel5->CNDTR=1024;//从新赋值
	DMA1_Channel5->CCR|=1<<0;//开启通道传输
	usart1_flag=1;
}
/* USER CODE END EV */

  2.串口中断服务函数

c 复制代码
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
  uint8_t c;
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
  if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))
  {
    c=huart1.Instance->DR;
     c=c;
    Usart1_Receive_Data();
    //huart1.Instance->DR=c;
  }
  /* USER CODE END USART1_IRQn 1 */
}

4.运行示例

c 复制代码
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  printf("初始化完成\r\n");
  
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
if(usart1_flag && usart1_cnt)
    {
      usart1_rx_buff[usart1_cnt]='\0';
      printf("usart1:%s,%d\r\n",usart1_rx_buff,usart1_cnt);
      //*20230223141731,15

      usart1_flag=0;
    }
  }
  /* USER CODE END 3 */
}

5.工程示例

相关推荐
✎ ﹏梦醒͜ღ҉繁华落℘2 天前
单片机基础知识---stm32单片机的优先级
stm32·单片机·mongodb
u152109648492 天前
S.S.Audio PRO A2音频隔离器
嵌入式硬件·音视频·实时音视频·视频编解码·视频
zd8451015002 天前
RS485 总线详解
单片机·嵌入式硬件
半条-咸鱼2 天前
【STM32】I2C协议原理、HAL读写与OLED显示操作
嵌入式硬件·c·信息与通信
牛根生同志2 天前
SPI数据收发的时候 TXE与RXNE标志位置位的时机
stm32·spi·transfer
wohoo_wangzi2 天前
苏州晟雅泰电子:关于W25Q128JVSIQ这个芯片物料的参数,规格及应用领域
嵌入式硬件
goldenrolan2 天前
学习型红外控制系统稳定性挂测工装专项总结
软件测试·python·stm32·嵌入式·红外
✎ ﹏梦醒͜ღ҉繁华落℘2 天前
编程基础 --高内聚,低耦合
c语言·单片机
科芯创展2 天前
1A,1MHz,30VIN,XZ4115,降压恒流LED驱动芯片
单片机·嵌入式硬件
集芯微电科技有限公司2 天前
四通道2A输出集成功率电感降压模块专为紧凑型方案设计
人工智能·单片机·嵌入式硬件·生成对抗网络·计算机外设