在C5509A的那个项目中,当DSP通过I2C从MCU接收到SLEEP命令时,需要进入休眠状态。一旦进入休眠状态,DSP就停在IDLE语句之上, 不再往下运行,也无法再通过I2C获取命令了,因此硬件设计上,将DSP的INT0和MCU相连,由MCU通过对DSP产生INT0中断而唤醒DSP。 DSP被唤醒之后,继续运行IDLE下面的语句。休眠程序的具体步骤如下:
1.设置ICR的各个Bit为1,1表示此Bit所对应的模块将进入休眠状态。
2.设置IMR寄存器,禁止不相关的中断,只允许INT0中断。
3.执行IDLE汇编语句,使DSP进入休眠状态。当运行IDLE时,DSP将ICR中的设置复制到ISTR寄存器中,ISTR则实际控制各个模块是否休眠。
4.当产生INT0中断之后,ISTR中的CLKGENIS和CPUIS Bit将自动清零,也就说时钟模块和CPU模块将中止休眠,这样DSP就可以开始运行IDLE之后的语句了。注意,此时的别的模块仍然处于休眠状态。
5.清除ICR的各个Bit,并再次运行IDLE语句,这将把ISTR寄存器中的各位清零,使得DSP的各个模块都中止休眠。
6.重新配置DMA,McBSP等模块。
上述的步骤5尤其重要,一开始我以为当DSP收到INT0中断之后,将自动全部中止休眠,结果尝试多次都无法恢复休眠前的状态。仔细阅读了TMS320C55x DSP Peripherals Overview之后才把这个问题搞明白。
在5509A DSK上测试上述代码时还遇到一个小问题。DSK板子上有个WAKE UP的按钮,但是按下它之后会向DSP产生什么中断不得而知,经阅读文档 TMS320VC5509A DSK Technical Reference 2.1.7节之后才知道原来需要设置CPLD的寄存器(INT REG),奇怪的是DSK的源程序dsk5509.h中居然没有这个寄存器的定义,于是干脆自己直接写这个寄存器:*((Uint16 *)0x3F0007) = 0x0001; 设置为1表示采用INT0中断。
|