完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
N76E003的PWM是一个计数器和一个专门寄存器(举例叫“N")比较输出的,而且还有一个专门的寄存器(举例叫“M”)用来保存我们写入的数据,当一个计数周期结束后,会把M的数据LOAD到N中,然后重新开始计数比较输出PWM信号。在把M读取到N内的过程中,LOAD标志位读取到的是1(正在执行载入动作),当数据载入完成后,再读取LOAD标志位就是0了。这个没有问题。
现在我的问题是:我要把音频数据读出然后从PWM脚输出,我现在PWM的输出周期是62.5us,我的中断是20us(用的定时器0的模式2),然后我就在中断里面去写读取FLASH中的音频数据然后输出。我在中断中的程序是: if(!LOAD){ PWM3L = AudioDataBuf; set_LOAD; //载入周期和占空比 //读取FLASH数据程序 //......... //最后读取的数据放到AudioDataBuf变量中 } 意思就是当没有执行LOAD的时候,把AudioDataBuf中的数据放到PWM3L的BUF中(只用低8bit,所以PWM3H一直是0),然后下面读取FLASH的数据,但是我测试了读取数据就花10多us时间,等下次再次进入20us中断的时候,我检测到LOAD还是没有动作(因为前一次的数据输出要62.5us,我一次中断才20us,还远远没有到PWM需要重新加载的时候),那么会重新把前面读到的AudioDataBuf再次放到PWM3L中,感觉会冲掉很多数据,如果我PWM的周期是62.5us,我中断是20us,感觉读取3个数据才有一个是有效的,其他都被覆盖掉了。 我想问一下,有什么标志位,或者方法,可以让我知道前一次的PWM还没有完成LOAD工作。 |
|
相关推荐
1个回答
|
|
您可以尝试以下方法解决PWM LOAD问题:
1. 通过中断计数器等待PWM完成载入动作。在您的中断处理程序中,您可以通过计数器来等待LOAD标志位变为0,表示载入完成,然后再进行下一次数据读取和输出,以避免LOAD信息丢失或覆盖。 2. 调整PWM周期和中断间隔以匹配您的数据读取和输出要求。如果PWM周期和中断间隔之间的时间差过大,可能会在数据输出时造成延迟或冲突。您可以尝试调整它们的时间间隔,以便使它们更好地匹配。 3. 使用DMA和缓存以提高效率。如果您需要频繁读取和输出音频数据,您可以尝试使用DMA和缓存来提高效率并减少对CPU的负载。这将使您能够更轻松地控制数据输出,并减少可能出现的延迟或冲突。 希望以上建议可以帮助您解决PWM LOAD问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
3124 浏览 9 评论
2820 浏览 16 评论
3333 浏览 1 评论
8704 浏览 16 评论
3922 浏览 18 评论
9541浏览 3评论
875浏览 3评论
445浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
448浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2172浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-16 08:29 , Processed in 1.074671 second(s), Total 48, Slave 39 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号