你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32F0 DMA收发UART数据

[复制链接]
STMCU小助手 发布时间:2021-11-24 14:42
直接存储器存取(DMA)用于在外围设备和内存以及内存到内存。数据可以通过DMA快速移动没有任何CPU操作。这使CPU资源对其他操作保持空闲。DMA控制器有5个通道,每个通道专门用于管理内存访问请求。来自一个或多个外围设备。它有一个仲裁器来处理DMA之间的优先级请求。

配置过程详解:

20190731174743448.jpg



首先调用RCC_AHBPeriphClockCmd()函数,进行DMA时钟的初始化。

20190731210758915.jpg


可以看到DMA在AHB时钟上。所以我们使用以下语句打开DMA1的时钟。

  1. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//使能DMA1时钟
复制代码

接着在DMA.c中编写如下两个函数。来设置DMA从UART1到内存和内存到UART的传输通道。
  1. /**************************************************************************************
  2. * FunctionName   : DMA_MemoryToPeripheral()
  3. * Description    : DMA传输(内存-->外设)
  4. * EntryParameter :  
  5. * ReturnValue    : None
  6. * Function       :
  7. **************************************************************************************/
  8. void DMA_MemoryToPeripheral(uint32_t MemoryAddr,uint32_t PeripheralAddr,uint16_t BufferSize)
  9. {
  10.         DMA_InitTypeDef DMA_InitStructure;
  11.         
  12.         DMA_DeInit(DMA1_Channel2);//复位DMA1_Channel2
  13.         
  14.         DMA_InitStructure.DMA_PeripheralBaseAddr=PeripheralAddr;//外设地址
  15.         DMA_InitStructure.DMA_MemoryBaseAddr=MemoryAddr;//内存地址
  16.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;//传输方向:内存到外设
  17.         DMA_InitStructure.DMA_BufferSize=BufferSize;//传输长度
  18.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设累增:NO
  19.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//外设累增:YES
  20.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
  21.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
  22.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//循环模式:NO
  23.         DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh;
  24.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//内存-内存:NO
  25.         DMA_Init(DMA1_Channel2,&DMA_InitStructure);
  26.         
  27.         DMA_Cmd(DMA1_Channel2,ENABLE);//使能DMA传输
  28.                
  29. }
复制代码
  1. /**************************************************************************************
  2. * FunctionName   : DMA_PeripheralToMemory()
  3. * Description    : DMA传输(内设-->内存)
  4. * EntryParameter :  
  5. * ReturnValue    : None
  6. * Function       :
  7. **************************************************************************************/
  8. void DMA_PeripheralToMemory(uint32_t PeripheralAddr,uint32_t MemoryAddr,uint16_t BufferSize)
  9. {
  10.         DMA_InitTypeDef DMA_InitStructure;//声明结构体
  11.         
  12.         DMA_DeInit(DMA1_Channel3);//复位DMA1_Channel3
  13.         
  14.         DMA_InitStructure.DMA_PeripheralBaseAddr=PeripheralAddr;//外设地址
  15.         DMA_InitStructure.DMA_MemoryBaseAddr=MemoryAddr;//内存地址
  16.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//传输方向:内存到外设
  17.         DMA_InitStructure.DMA_BufferSize=BufferSize;//传输长度
  18.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//外设累增:NO
  19.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//外设累增:YES
  20.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
  21.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
  22.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;//循环模式:NO
  23.         DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh;
  24.         DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//内存-内存:NO
  25.         DMA_Init(DMA1_Channel2,&DMA_InitStructure);
  26.         
  27.         DMA_Cmd(DMA1_Channel3,ENABLE);//使能DMA传输
  28.         
  29. }
复制代码

通过以上两个函数可以初始化两个通道,一个从内存到外设,一个从外设到内存。

当然在我们调用这两个通道的时候需要知道一些东西。

1.有关通道的信息:

2019073121253971.jpg


收藏 评论0 发布时间:2021-11-24 14:42

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版