问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

如何用dma控制usart发送数据

发布网友 发布时间:2022-04-30 05:28

我来回答

1个回答

热心网友 时间:2023-10-17 00:36

  配置DMA操作步骤如下:
  1、打开时钟。
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
  2、配置DMA数据结构
  有几点明确的:通过USART1发送数据,ST的F4参考手册里边可以找打USART1说对应的通道:DMA2-Channel4-Stream7。
  数据传递方向是Memory2Peripheral。即内存到外设。
  不使用FIFO,要传输的数据位于数组usart_tx_buf[20]中,USART1发送数据寄存器的地址是:USART1_BASE+0x04,内存和外设的字宽都是1Byte.
  单次传输,传输一次完毕需要手动重启。外设地址固定,内存地址自增。
  于是:

  DMA_DeInit(DMA2_Stream7);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
  
  DMA_StructInit(&DMA_InitStructure);

  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Channel = DMA_Channel_4;
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)usart_tx_buf;
  DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_BASE+0x04;
  DMA_InitStructure.DMA_BufferSize = BufSize;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  之后,使用DMA_Init初始化DMA。最后用DMA_Cmd使能DMA。
  以后每次发送数据都要用DMA_Cmd使能一次DMA。我没找到别的办法。。。。。
  住函数中调用:

  
  while(1)
  {
  while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
  USART_SendData(USART1,'b');
  while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
  USART_SendData(USART1,'a');
  delay_ms(1000);
  printf("argjiarjfgio\r\n");
  
  if(SET == DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7))
  {
  DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF7);
  //DMA_Cmd(DMA2_Stream7,DISABLE);
  for(i = 0;i<20;i++)
  usart_tx_buf[i] = i+51;
  DMA_Cmd(DMA2_Stream7,ENABLE);
  
  }
  }

  Technorati 标记: STM32F4,DMA,USART

热心网友 时间:2023-10-17 00:36

  配置DMA操作步骤如下:
  1、打开时钟。
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
  2、配置DMA数据结构
  有几点明确的:通过USART1发送数据,ST的F4参考手册里边可以找打USART1说对应的通道:DMA2-Channel4-Stream7。
  数据传递方向是Memory2Peripheral。即内存到外设。
  不使用FIFO,要传输的数据位于数组usart_tx_buf[20]中,USART1发送数据寄存器的地址是:USART1_BASE+0x04,内存和外设的字宽都是1Byte.
  单次传输,传输一次完毕需要手动重启。外设地址固定,内存地址自增。
  于是:

  DMA_DeInit(DMA2_Stream7);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
  
  DMA_StructInit(&DMA_InitStructure);

  DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  DMA_InitStructure.DMA_Channel = DMA_Channel_4;
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)usart_tx_buf;
  DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_BASE+0x04;
  DMA_InitStructure.DMA_BufferSize = BufSize;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

  之后,使用DMA_Init初始化DMA。最后用DMA_Cmd使能DMA。
  以后每次发送数据都要用DMA_Cmd使能一次DMA。我没找到别的办法。。。。。
  住函数中调用:

  
  while(1)
  {
  while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
  USART_SendData(USART1,'b');
  while(RESET == USART_GetFlagStatus(USART1,USART_FLAG_TXE));
  USART_SendData(USART1,'a');
  delay_ms(1000);
  printf("argjiarjfgio\r\n");
  
  if(SET == DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7))
  {
  DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF7);
  //DMA_Cmd(DMA2_Stream7,DISABLE);
  for(i = 0;i<20;i++)
  usart_tx_buf[i] = i+51;
  DMA_Cmd(DMA2_Stream7,ENABLE);
  
  }
  }

  Technorati 标记: STM32F4,DMA,USART
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
徐州质量好的铝粉颜料 陕西渭南市富平县有多少高中 富平县职教中心招收往届生吗 山东医科大学是985大学吗 高三必看:山东省【医学院校】最全解读! 山东大学齐鲁医学院是985或211 奥斯卡纽斐仕摄影怎么样 宁波婚纱十大影响力品牌 奥斯卡婚纱照怎么样 奥斯卡婚纱摄影简介 DMA寄存器怎样配置? dma初始化结构体的过程就是配置dma相关参数的过程 DMA控制器的DMA控制器的设置 如何在ubuntu上安装confluence 彩色印刷制PS版怎么成本最低? 彩色印刷有几个种类 什么是彩色印刷? 彩色印刷刻板是怎么回事? 彩色印刷的色版变化 我怀孕一个月了嘴唇起泡红肿上火该吃什么药 怀孕期间上火,该吃什么药? 孕期嘴角上火吃什么药好啊 孕妇上火吃什么清火的药比较好? 激光点痣痛还是药水点痣痛? 点痣有什么讲究 点痣和点痦子复杂吗?一般需要多久可以去掉?会不会留下疤痕? 激光点痣和药水点痣有什么区别?会留疤吗 如何点痣 女人到了中年的时候,要怎样经营好自己的人生? 做好眼前的事情,过好当下,经营好自己的生活 usart2的DMA实验求助 如何打开DMA模式 linux 应用层spi怎么使用dma DMA是怎么回事? stm32 dma串口发送和接收怎么配置 有关STM32定时器DMA设置中关于外设地址的问题求解答。 STM32 DMA问题 MM32F031 ADC-DMA如何初始化配置 如何在BIOS里设置&quot;打开DMA方式&quot;及&quot;允许内存快速自检&quot; STM32中,在配置DMA或者另外的模块时,有没有顺序的要求? 在stm32cubemx中该怎么配置dma模式 STM32 DMA 内存地址不会设。 如何在手机浏览器上设置自动更新 二阶可导什么意思?是不是f&quot;(x)=0? 给我几个手机可以免费下载小说的网站,TXT格式的 泡沫箱的难闻气味有毒吗 导数二阶可导函数 什么叫二阶可导函数 自己看了点导数的参考资料 有点不大懂 泡沫箱在压碎处理过程释放的一种刺鼻气味有毒吗? 好看的网络小说全本 用泡沫箱装苹果,吃时有股泡沫味,这样的苹果还能吃吗?这样苹果有毒还能吃吗?
  • 焦点

最新推荐

猜你喜欢

热门推荐