打印
[STM32F1]

定时器TIM3更新DMA传送

[复制链接]
2183|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
boshao|  楼主 | 2014-10-14 09:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定时器TIM3每500MS产生一次更新,触发DMA进行一次存储器到存储器的传送
1、DMA通道3设置成存储器到存储器传送,开启DMA,但没有设置DMA_CCR寄存器中的MEM2MEM位
2、TIM3设置
void tim3_init(u16 arr,u16 psc)
{
NVIC_Init(TIM3_IRQn,1,3);                        //定时器3中断初始化,抢占为1,子优先级为3
NVIC_En(TIM3_IRQn);                              //使能定时器3的中断
RCC->APB1ENR|=1<<1;                         //开TIM3的时钟
TIM3->ARR=arr;                                      //设置自动重载寄存器的值
TIM3->PSC=psc;                                     //设置预分频器的值
TIM3->DIER|=1<<0;                              //允许更新中断
TIM3->DIER|=1<<8;                              //允许更新DMA请求(UDE置位)
//主要问题是下面这一句,用软件仿真时,如果把下面这一句注释掉了,定时器TIM3每次更新都不产生一次DMA的存储器到存储器的传送,但如果不注释的话,定时器每次更新都能产生一次DMA的传送。问题是DIER寄存器的UDE位和CR2的CCDS有什么关系呢?我见其它人的用库函数编写这样的程序时只用了一句“TIM_DMACmd(TIM7, TIM_DMA_Update, ENABLE);”(这个库函数里面也只是设置了UDE位,都没有设置CCDS位的)。
// TIM3->CR2|=1<<0;                           //CR2的CCDS置位

TIM3->CR1|=1<<0;                              //使能TIM3
}
请大家帮忙解决下这个问题(红色字的),PS:如果把DMA_CCR的MEM2MEM位置位的话,可以立刻传送完的
沙发
airwill| | 2014-10-14 10:11 | 只看该作者
由于手册没有给出事件的信号图流程,我的理解:
UDE 只是允许 Update 信号连接到 UpdateDMA 信号上;
CCxDE 也将 CCx 信号连接到 CCxDMA 信号上;
到底这两个 DMA 信号,谁起作用,CCDS 来控制。

使用特权

评论回复
板凳
boshao|  楼主 | 2014-10-14 11:16 | 只看该作者
楼主的理解看上去好像是对,但是其它人用库函数编写时,不用设置CCDS哪一位的,直接设置UDE就可以了TIM_DMACmd(TIM7, TIM_DMA_Update, ENABLE);”
没有权限发链接,截他一部分代码吧
void Timer_Configuration(void)
{
TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;

/* TIM7 Peripheral Configuration --------------------------------------------*/
   /* Time Base configuration */  
/* 目标:定时1秒
     计算:1000(ms)/65535(CNT)≈0.0153ms/CNT
     24M时钟,分频: 15.3(us)/(1/(24(M)))≈368 */

  TIM_DeInit(TIM7);
   /* 368/24≈15.33us/CNT */
   TIM_TimeBaseStructure.TIM_Prescaler = 0;
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   /* 1000(ms)/0.01533(ms)≈65232CNT */
   TIM_TimeBaseStructure.TIM_Period = 65232;  //ARR的值
   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //采样分频
   

  TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure);
   
   //定时器使用内部时钟即CK_INT,AHB为24M,APB1为24M,CK_INT为24M.
   //时钟分频系数368,所以定时器时钟为65.2KHz
   TIM_PrescalerConfig(TIM7,368,TIM_PSCReloadMode_Immediate);
   TIM_ARRPreloadConfig(TIM7, ENABLE);//使能ARR预装载缓冲器
   
   /* DMA/中断使能寄存器(TIMx_DIER)  
      UDE:更新DMA请求使能 (Update DMA request enable) */
   TIM_DMACmd(TIM7, TIM_DMA_Update, ENABLE);
   
   /* TIM enable counter */
   TIM_Cmd(TIM7, ENABLE);
}  
(STM32 USART+DMA+TIMER 定时器1秒触发一次DMA用串口发送一个字符)
他也是用UpdateDME的,但只是设置了UDE,没有设置CCDS

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

29

帖子

0

粉丝