搜索
bottom↓
回复: 2

TIM的DMA传送是怎么配置的?

[复制链接]

出0入0汤圆

发表于 2016-12-23 13:29:49 | 显示全部楼层 |阅读模式
#define TIM1_CCR1_Address      0x40012C34
#define DMA_Channel_TIM1_CCR1  DMA1_Channel2
#define DMA_Channel_TIM1_CCR4  DMA1_Channel4

uint16_t    hBuff[4] = {50,600,600,50} ;
DMA的配置↓
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  
    /* DMA1 channel1 configuration ----------------------------------------------*/
  DMA_DeInit(DMA_Channel_TIM1_CCR1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)DMA_Channel_TIM1_CCR1;
  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)hBuff;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
  DMA_InitStructure.DMA_BufferSize = 4;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

  DMA_Init(DMA_Channel_TIM1_CCR1, &DMA_InitStructure);
  /* Enable DMA1 channel1 */
  DMA_Cmd(DMA_Channel_TIM1_CCR1, ENABLE);

TIM基本配置不粘在这了,关键地方的配置↓
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;            // 触发模式
TIM_OC1Init(TIM1, &TIM_OCInitStructure);         //使能通道1
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable); // 失能这个目的就是为了触发下一个波形

  TIM_DMAConfig(TIM1, TIM_DMABase_CCR1, TIM_DMABurstLength_4Bytes);
  
    // Enable DMA event
  TIM_GenerateEvent(TIM1,TIM_EventSource_Update);
  TIM_DMACmd(TIM1, TIM_DMA_CC1, ENABLE);

  TIM_DMACmd(TIM1, TIM_DMA_CC1,ENABLE);
  
  TIM_UpdateRequestConfig(TIM1,TIM_UpdateSource_Global);

-------------------------------我是分割线-----------------------------------------------

以上代码目的是为了实现  TIM-CNT 与CCRx 发送比较事件的时候 触发 DMA的传送更新CCRx的值 ,关键的地方就是这个,  (是比较事件触发DMA,不是更新事件触发DMA)    ←我的理想状态

实际情况是,没有DMA的传输。

-------------------------------我是分割线-----------------------------------------------

上面的目的用数字表示下。。  比如我设置的TIM->ARR是 1000 ,   TIM->CCR1  初始值是200 ,  当TIM-CNT 计数到200的时候,触发一次DMA传送,把我设定好的值送到TIM->CCR1,这样更新了TIM->CCR1,比如这个时候CCR1就变为400了,TIM->CNT不会被清零,它继续加,CNT加到400的时候,再一次触发了DMA

出0入0汤圆

 楼主| 发表于 2016-12-23 13:31:09 | 显示全部楼层
本帖最后由 imfly89 于 2016-12-23 13:59 编辑

(接上)   再一次触发了DMA的传送,继续更新了TIM->CCR1,就是这样不停的触发,传送。。。。  反正我现在的情况就是没有触发DMA,所以请大家来帮帮忙

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2016-12-23 15:53:34 | 显示全部楼层
墨迹了半天,一不小心发现了问题。
配置了一个中断,然后在中断里修改CCRx的值,才发现自己之前那个数组设置的数字大小不对,没有安排好顺序
现已修正
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 13:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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