STM32F767ZI中DMA配置的PWM在高速下工作异常
STM32F767ZI 4MHz PWM输出异常问题
我已将STM32F767ZI的RCC配置为48MHz(尝试更高频率时会报错,但CubeMX中相同配置无此问题)。
rcc.cr.modify(|_, w| w.hsebyp().set_bit()); rcc.cr.modify(|_, w| w.hseon().on()); while rcc.cr.read().hserdy().is_not_ready() {} println!("{:b}", rcc.cr.read().bits()); println!("Hse ready"); rcc.pllcfgr.modify(|_, w| w.pllsrc().hse()); rcc.pllcfgr.modify(unsafe {|_, w| w.pllm().bits(4)}); rcc.pllcfgr.modify(unsafe {|_, w| w.plln().bits(96)}); rcc.pllcfgr.modify(|_, w| w.pllp().div4()); rcc.cr.modify(|_, w| w.pllon().on()); while rcc.cr.read().pllrdy().is_not_ready() {} println!("Pll ready"); rcc.cfgr.modify(|_, w| w.sw().pll()); while !rcc.cfgr.read().sws().is_pll() {} println!("pll selectected");
2MHz PWM运行正常情况
- 定时器配置:
tim.arr.write(|w| w.bits(23)); - DMA缓冲区:
let dma_buf = [8, 12, 12, 16, 0, 0, 0, 0]; - 输出状态:脉冲波形符合预期
4MHz PWM输出异常情况
- 定时器配置:
tim.arr.write(|w| w.bits(11)); - DMA缓冲区:
let dma_buf = [4, 6, 6, 8, 0, 0, 0, 0]; - 异常现象:实际输出对应缓冲区为
[4, 6, 6, 6, 6, 8, 0, 0, 0, 0],第二个值6被重复输出多次
定时器及DMA配置代码
unsafe { tim.arr.write(|w| w.bits(11)); // frequency tim.ccr1().write(|w| w.bits(0));// duty cycle } // clear enable to zero just to be sure tim.ccmr1_output().modify(|_, w| w.oc1ce().clear_bit()); //enable preload tim.ccmr1_output().modify(|_, w| w.oc1pe().enabled()); // set pwm mode 1 tim.ccmr1_output().modify(|_, w| w.oc1m().pwm_mode1()); // enable output tim.ccer.write(|w| w.cc1e().set_bit()); // enable auto-reload tim.cr1.modify(|_, w| w.arpe().set_bit()); tim.dier.modify(|_, w| w.ude().set_bit()); tim.dier.modify(|_, w| w.cc1de().set_bit()); tim.dier.modify(|_, w| w.tde().set_bit()); // enable update generation - needed at first start tim.egr.write(|w| w.ug().set_bit()); tim.egr.write(|w| w.ug().set_bit()); // start pwm tim.cr1.modify(|_, w| w.cen().set_bit()); unsafe { let ccr1_addr = tim.ccr1() as *const _ as u32; let dma_buf = [4, 6, 6, 8, 0, 0, 0, 0]; dma1.st[4].m0ar.write(|w| w.m0a().bits(dma_buf.as_ptr() as u32)); dma1.st[4].ndtr.write(|w| w.ndt().bits(dma_buf.len() as u16)); dma1.st[4].par.write(|w| w.pa().bits(ccr1_addr)); dma1.st[4].cr.reset(); dma1.st[4].cr.modify(|_, w| w .chsel().bits(5) .mburst().single() .pburst().single() .pl().high() .msize().bits32() .psize().bits32() .minc().set_bit() .pinc().clear_bit() .circ().enabled() .dir().memory_to_peripheral() .teie().set_bit() .htie().set_bit() .tcie().set_bit() .en().enabled() ); }
内容的提问来源于stack exchange,提问作者Raul Alimbekov
相关产品推荐
相关产品推荐

