有8051U关于PWMA-DMA的详细说明吗?
数据手册好像没有明示。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: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间隔时间有什么作用?
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寄存器后的间隔时间,用来手动控制插入独立可调的延时,方便速度的适配。 王昱顺 发表于 2024-10-5 06:17
dma_pwma_itv是用来给dma过程中,每次改变pwm寄存器后的间隔时间,用来手动控制插入独立可调的延时,方便 ...
触发事件后等待这个间隔时间才写入寄存区?
或者,写入一次寄存器后,在间隔时间内忽略触发事件,过了间隔期,有事件触发则立即写寄存器。 health 发表于 2024-10-5 13:51
触发事件后等待这个间隔时间才写入寄存区?
或者,写入一次寄存器后,在间隔时间内忽略触发事件,过了间 ...
这个就不清楚了,等技术手册详细补充吧。
不过大概是用来插入固定的间隔时间的 health 发表于 2024-10-5 13:51
触发事件后等待这个间隔时间才写入寄存区?
或者,写入一次寄存器后,在间隔时间内忽略触发事件,过了间 ...
这个是内部电路操作的,测试不出来。一般PWMA-DMA都用更新事件触发,间隔时间写0。 地址可以发一下吗?
两个通道,16位,应该怎么写? 写个测试程序穷举,得到结果如下:
基地址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,,,,,,,,,,,,】排列。
寄存器详细介绍:
页:
[1]
2