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工作。
上图中62.5us就是PWM的周期,12us是中断中读取音频数据的执行时间,20us是中断间隔时间。感觉数据1和数据2都会被舍弃,只有数据3读取出来了正好碰上PWM刷新,需要重新LOAD数据。
我不知道要如何处理这个问题,请高人指点一二。
|