昨天在学习CH582M定时器PWM模式下重复发送占空比PWM波的时候,出现了一个错误。代码逻辑看着没有问题,但就是无法正确产生PWM波形。
在DMA处理方式下,单片机会自动从指定的数组中,按照指定的范围逐个获取数据,并设置给定时器的FIFO寄存器,定时器按照这个占空比数据产生 RB_TMR_PWM_REPEAT 指定的次数。其指令形式:
TMR1_DMACfg(ENABLE, (uint16_t)(uint32_t)&PwmBuf[0], (uint16_t)(uint32_t)&PwmBuf[2], Mode_LOOP);参数中的第二个和第三个,指定提取范围。第三个参数对应的成员,不包括获取范围之内。上面的代码,就是指定数组的0、1号元素。PwmBuf就是占空比系数数组,形如:
uint32_t PwmBuf[PWM_BUF_SIZE] = {1000, 5000, 500, 6000, 100};
注意,这里必须声明为 uint32_t 类型。我昨天在失败的程序中声明为 uint16_t 类型了。
原因如下:
对CH582M单片机,在处理过程中使用“FIFO 寄存器(R32_TMRx_FIFO)”接收占空比系数,如果 PwmBuf 声明为 uint16_t 的话,那么在自动传递过程中,由于 uint16_t 只占两个字节,而 FIFO 寄存器(R32_TMRx_FIFO) 是四字节的寄存器 ,DMA传送数据的时候,是按照4字节从内存中获取数据的,所以就对不上号了。作为验证,可以通过下面的代码来检查FIFO寄存器中的数据,是不是你想要预定的:
// 读取TMR2的FIFO寄存器并打印 uint32_t fifo_value = R32_TMR2_FIFO; PRINT("TMR2 FIFO Value: %d\n", fifo_value);
通过这次的错误,让自己在处理DMA传送数据的时候,要注意 传送源 和 传送目标 的数据类型是否一致的问题了。
我要赚赏金
