health 发表于 2024-10-4 20:10:09

有8051U关于PWMA-DMA的详细说明吗?

数据手册好像没有明示。

神农鼎 发表于 2024-10-4 20:31:00



PWM-DMA 驱动 WS2812彩灯@Ai8051U,最多1365个灯同时, 32K SRAM - BLDC/144MHz-PWM-硬件移相/45路PWM+3路CCP/7组不同周期的PWM/DAC 国芯技术交流网站 - AI32位8051交流社区 (stcaimcu.com)

health 发表于 2024-10-4 23:22:45

本帖最后由 health 于 2024-10-4 23:36 编辑

PWM-DMA 驱动 WS2812彩灯@Ai8051U,最多1365个灯同时, 32K SRAM - BLDC/144MHz-PWM-硬件移相/45路PWM+3路CCP/7组不同周期的PWM/DAC
正是看了这个例子才有本帖疑问。
void PWMAT_DMA_TRIG(u8 xdata *TxBuf, u16 num)
{
      u16      i;

    PWMA_DBA   = 0x0D;      //DMA传输目标起始地址(offset代码), 0x0d对应的就是PWM1_CCR1H, 请参考“基地址DBA与实际占空比寄存器对应关系表.jpg”
    PWMA_DBL   = 0x00;      //DMA传输通道数为1通道(n+1)                DBL=DMA burst length = N+1
    PWMA_DER   = 0x01;      //DMA传输数据触发条件为更新请求,即每个PWM周期开始后就触发DMA发送一次
    PWMA_DMACR = 0x14;      //Bit4(DSKIP)=1:跳过保留字节, Bit3(DDIR)=0:传输方向XRAM到PWMA,BIt2(DMAEN)=1:允许PWMA_DMA, dsize{1:0]=1:每个通道发送字节数为2字节。

      i = (u16)TxBuf;      //取首地址
      DMA_PWMAT_TXAH = (u8)(i >> 8);                //发送地址寄存器高字节
      DMA_PWMAT_TXAL = (u8)i;                              //发送地址寄存器低字节
      DMA_PWMAT_AMTH = (u8)((num-1)/256);      //设置传输总字节数 = n+1
      DMA_PWMAT_AMT= (u8)((num-1)%256);      //设置传输总字节数 = n+1
//      DMA_PWMA_ITVH= (u8)(2460/256);      //增加的间隔时间,N+1个系统时钟
//      DMA_PWMA_ITVL= (u8)(2460%256);
      DMA_PWMAT_STA= 0x00;
      DMA_PWMAT_CFG= DMA_PWMATIE | DMA_PWMATIP | DMA_PWMATPTY;
      DMA_PWMAT_CR   = DMA_ENPWMAT | PWMAT_TRIG;
      B_PWMAT_DMA_busy = 1;      //标志PWMAT-DMA忙,PWMAT DMA中断中清除此标志,使用PWMAT DMA前要确认此标志为0
}
《基地址DBA与实际占空比寄存器对应关系表.jpg》在哪里可以得到?
为什么要写PWM1_CCR1H,不应该是PWM1_CCR1L吗?

PWMA_DMACR = 0x14; //保留字节是啥,size又是啥?
DMA_PWMA_ITV间隔时间有什么作用?

王昱顺 发表于 2024-10-5 06:17:35

health 发表于 2024-10-4 23:22
PWM-DMA 驱动 WS2812彩灯@Ai8051U,最多1365个灯同时, 32K SRAM - BLDC/144MHz-PWM-硬件移相/45路PWM+3路CC ...

dma_pwma_itv是用来给dma过程中,每次改变pwm寄存器后的间隔时间,用来手动控制插入独立可调的延时,方便速度的适配。

health 发表于 2024-10-5 13:51:12

王昱顺 发表于 2024-10-5 06:17
dma_pwma_itv是用来给dma过程中,每次改变pwm寄存器后的间隔时间,用来手动控制插入独立可调的延时,方便 ...

触发事件后等待这个间隔时间才写入寄存区?
或者,写入一次寄存器后,在间隔时间内忽略触发事件,过了间隔期,有事件触发则立即写寄存器。

王昱顺 发表于 2024-10-5 15:36:16

health 发表于 2024-10-5 13:51
触发事件后等待这个间隔时间才写入寄存区?
或者,写入一次寄存器后,在间隔时间内忽略触发事件,过了间 ...

这个就不清楚了,等技术手册详细补充吧。
不过大概是用来插入固定的间隔时间的

梁工 发表于 2024-10-9 10:24:26

health 发表于 2024-10-5 13:51
触发事件后等待这个间隔时间才写入寄存区?
或者,写入一次寄存器后,在间隔时间内忽略触发事件,过了间 ...

这个是内部电路操作的,测试不出来。一般PWMA-DMA都用更新事件触发,间隔时间写0。

health 发表于 2024-10-9 12:17:08

地址可以发一下吗?
两个通道,16位,应该怎么写?

health 发表于 2024-10-15 14:12:22

写个测试程序穷举,得到结果如下:
基地址DBA与实际占空比寄存器对应关系
0x0D       PWM1_CCR1H和PWM1_CCR1L
0x0E       PWM1_CCR2H和PWM1_CCR2L
0x0F       PWM1_CCR3H和PWM1_CCR3L
0x10       PWM1_CCR4H和PWM1_CCR4L

PWMA_DBL为写入通道数-1
为0时写一个通道,为1时写两个通道。。。

dsize为每个通道写入字节数-1
为0时写PWM1_CCRxL,为1时写2个字节,先写PWM1_CCR1H后写PWM1_CCR1L。

例如要DMA写通道1和通道2的16位占空比,则
PWMA_DBA   = 0x0D;
PWMA_DBL   = 0x01;
PWMA_DER   = 0x01;
PWMA_DMACR = 0x15;

缓冲区数据按照【CCR1H, CCR1L, CCR2H, CCR2L, CCR1H, CCR1L,,,,,,,,,,,,】排列。


梁工 发表于 2024-10-16 21:44:27


寄存器详细介绍:

页: [1] 2
查看完整版本: 有8051U关于PWMA-DMA的详细说明吗?