中级会员
 
- 积分
- 211
- 金钱
- 211
- 注册时间
- 2014-2-20
- 在线时间
- 56 小时
|
1金钱
大家好,我在使用stm32f030的高级定时器TIM1做spwm,使用DMA来将内存的数组数据传给CCP1,在配置完成PWM后time有工作(初始pwm有输出),但是DMA好像没有工作(占空比没有发生改变),下面是部分代码,
第一步:配置端口
1、使能A、B端口时钟
2、配置RA7:pwm1L; RA8:pwm1H; RA9:pwm2H; RB0 WM2L端口到外设功能,全部是外设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
|