OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2626|回复: 5

TIM更新产生DMA请求内存到内存传递有大大的疑惑

[复制链接]

4

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-5-1
在线时间
4 小时
发表于 2019-8-4 16:43:13 | 显示全部楼层 |阅读模式
1金钱
我本来想用TIM3做一个溢出产生DMA使一个数组中的数据传送到另一个数组的实验,时钟的配置如下:

void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值  计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

TIM_ITConfig(  //使能或者失能指定的TIM中断
  TIM3, //TIM3
  TIM_IT_Update ,
  ENABLE  //使能
  );
  TIM3->DIER|=1<<0;                   //允许更新中断
  TIM3->DIER|=1<<8;                   //允许更新DMA请求(UDE置位)
TIM3->CR2|=1<<3;                 //把CR2的CCDS置位
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
        
}


DMA配置如下:
void MYDMA_Config(DMA_Channel_TypeDef* DMA_CHx,u32 cpar,u32 cmar,u16 cndtr)
{
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //使能DMA传输

    DMA_DeInit(DMA_CHx);   //将DMA的通道1寄存器重设为缺省值
DMA1_MEM_LEN=cndtr;
DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //数据传输方向,从内存读取发送到外设
DMA_InitStructure.DMA_BufferSize = cndtr;  //DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Enable;  //外设地址寄存器递增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;  //数据宽度为8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //数据宽度为8位
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //工作在正常缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMA通道 x拥有中优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_Enable;  //DMA通道x设置为内存到内存传输
DMA_Init(DMA_CHx, &DMA_InitStructure);  //根据DMA_InitStruct中指定的参数初始化DMA的通道USART1_Tx_DMA_Channel所标识的寄存器
   
}

让我疑惑的是就算没有初始化时钟在硬件仿真的时候只要使能DMA数组1的数马上就传递到数组2了,这和我的理解相背了。就算初始化了时钟在硬件仿真的时候也没有0.5s传递一次,而是早早地传递完了,是我对时钟DMA有什么误会吗?求大佬赐教!





TIM截图20190804163754.jpg

最佳答案

查看完整内容[请看2#楼]

DMA你使能了他就传递了啊,你要实现 一个溢出产生DMA使一个数组中的数据传送到另一个数组的实验 ,你就开定时器中断,溢出中断一产生你就开启一次DMA不就好了嘛
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-7-17
在线时间
27 小时
发表于 2019-8-4 16:43:14 | 显示全部楼层
DMA你使能了他就传递了啊,你要实现   一个溢出产生DMA使一个数组中的数据传送到另一个数组的实验   ,你就开定时器中断,溢出中断一产生你就开启一次DMA不就好了嘛
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2019-8-5 01:48:13 | 显示全部楼层
帮顶
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-8-5 09:11:15 | 显示全部楼层
内存到内存 使能就开启 不能控制
回复

使用道具 举报

4

主题

6

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-5-1
在线时间
4 小时
 楼主| 发表于 2019-8-5 10:46:31 | 显示全部楼层
a173873606 发表于 2019-8-5 09:18
DMA你使能了他就传递了啊,你要实现   一个溢出产生DMA使一个数组中的数据传送到另一个数组的实验   ,你就 ...

也就是说只有外设和内存之间的DMA需要外设那边产生请求了才能让DMA传输,内存到内存就不需要请求了是吧?
回复

使用道具 举报

0

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2019-7-17
在线时间
27 小时
发表于 2019-8-5 11:13:25 | 显示全部楼层
ZHANGYUNFEI1254 发表于 2019-8-5 10:46
也就是说只有外设和内存之间的DMA需要外设那边产生请求了才能让DMA传输,内存到内存就不需要请求了是吧? ...

一样需要请求的呀,你不发请求信号单片机怎么知道你要使用DMA
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-1 02:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表