You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:32:18