本帖最后由 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间隔时间有什么作用?
|