这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 使用DMA处理时,一定要注意数据类型匹配的问题

共1条 1/1 1 跳转至

使用DMA处理时,一定要注意数据类型匹配的问题

专家
2026-09-05 14:17:25     打赏

昨天在学习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传送数据的时候,要注意 传送源传送目标数据类型是否一致的问题了。










关键词: 懒猫的学习笔记     DMA     数据类型    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]