OpenEdv-开源电子网

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

STM32F0 DMA赋值pwm占空比

[复制链接]

4

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2014-2-20
在线时间
56 小时
发表于 2016-4-25 10:09:08 | 显示全部楼层 |阅读模式
1金钱
大家好,我在使用stm32f030的高级定时器TIM1做spwm,使用DMA来将内存的数组数据传给CCP1,在配置完成PWM后time有工作(初始pwm有输出),但是DMA好像没有工作(占空比没有发生改变),下面是部分代码,
第一步:配置端口
   1、使能A、B端口时钟
   2、配置RA7:pwm1L;  RA8:pwm1H;  RA9:pwm2H;  RB0WM2L端口到外设功能,全部是外设2
第二步:配置DMA
  void Lfx_TimeDmaInit()  {
        RCC->AHBENR |= RCC_AHBENR_DMA1EN;                                 //  使能时钟
        Afx_Delayus(100);                                                                //  加小延时
        DMA1_Channel2->CCR &= ~DMA_CCR_EN;                                 //  不使能第二通道传输       
        DMA1_Channel2->CPAR = (ulong)(&(TIM1->CCR1));                         //  外设地址
        DMA1_Channel2->CMAR = (ulong)SVPwmBuf ;                                //  内存的buf数组
        DMA1_Channel2->CNDTR = 127;                                                 //  传输数据个数
        DMA1_Channel2->CCR = 0X00000000;       
        DMA1_Channel2->CCR |= DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_0 \
| DMA_CCR_MINC   | DMA_CCR_DIR | DMA_CCR_TCIE;                     //| DMA_CCR_CIRC 内存和外设都是16位,内存递增,外设不增,循环模式,发送完成后中断,从内存读取数据

        DMA1_Channel3->CCR &= ~DMA_CCR_EN;                                 // 不使能第三通道传输       
        DMA1_Channel3->CPAR = (ulong)(&(TIM1->CCR2));                         // 外设地址
        DMA1_Channel3->CMAR = (ulong)SVPwmBuf;                                 // 内存的buf数组
        DMA1_Channel3->CNDTR = 127;                                                 // 传输数据个数
        DMA1_Channel3->CCR = 0X00000000;
        DMA1_Channel3->CCR |= DMA_CCR_MSIZE_0 | DMA_CCR_PSIZE_0 \
| DMA_CCR_MINC   | DMA_CCR_DIR | DMA_CCR_TCIE;                    // DMA_CCR_CIRC  内存和外设都是16位,内存递增,外设不增,循环模式,发送完成后中断,从内存读取数据


//        NVIC_SetPriority(DMA1_Channel2_3_IRQn,0);
//        NVIC_EnableIRQ(DMA1_Channel2_3_IRQn);
}
第三步:配置TIM
void Lfx_PwmInit()
{
        Lfx_TimeDmaInit();
        RCC->APB2ENR |=RCC_APB2ENR_TIM1EN;
        TIM1->CR1 |= TIM_CR1_ARPE;
        TIM1->DIER |= TIM_DIER_UDE;                //定时器到时触发dma
        TIM1->SC = 0;                                          //对时钟48M进行0分频,使得计数频率为48M  
        TIM1->ARR = PWM_PTPER;                         //周期 = 48000  / 40 = 1200
        TIM1->EGR |= 1;                                         //产生一次更新事件  
        TIM1->RCR = 4;                                 //4个周期更新一次占空比
        TIM1->CCR1 = PWM_PTPER>>1;                //设置第一通道占空比50%(正常值为零,在这里测试时赋值50%观察Time有无工作)  
        TIM1->CCR2 = PWM_PTPER>>1;                //设置第二通道占空比50%  

        TIM1->CCMR1 = 0x6060;                         //PWM模式1  ,预装载
        TIM1->CCER  =  0X0055;                         //使能比较输出  互补输出 正常通道低电平有效,互补通道低电平有效

        TIM1->CCMR1 |= 0x0808;                          //PWM模式1  ,预装载
        TIM1->CCMR1 |= TIM_CCMR1_OC1FE|TIM_CCMR1_OC2FE;        //使能快速方式
        TIM1->BDTR = TIM_BDTR_MOE|64;                 // 死区时间设定

        TIM1->SR = 0;
        TIM1->CR1 |= 1;                                         //开始计时  

        DMA1_Channel2->CCR |= DMA_CCR_EN; //开启DMA
        DMA1_Channel3->CCR |= DMA_CCR_EN;
}

大家帮帮忙,看看代码哪里有问题没有,搞了有一阵子了,就是pwm占比不发生改变


最佳答案

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

自己来回答吧,这个问题可以说是比较简单的,可能也是比较容易出错的地方,在DMA的通道映射表里面很容易误解UDT触发的是通道2和通道3,其实不然,而是通道5,所以改成通道5一切OK
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

19

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2014-2-20
在线时间
56 小时
 楼主| 发表于 2016-4-25 10:09:09 | 显示全部楼层
自己来回答吧,这个问题可以说是比较简单的,可能也是比较容易出错的地方,在DMA的通道映射表里面很容易误解UDT触发的是通道2和通道3,其实不然,而是通道5,所以改成通道5一切OK
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2013-8-28
在线时间
1 小时
发表于 2021-2-18 18:24:36 | 显示全部楼层
请问下,从哪个文档中可以查到使用的DMA通道情况?谢谢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 19:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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