图1
图2
图3
图4
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
如图,这是用CCS5.5跑的starterware里面的DEMO例程裸机程序。原程序运行正常。
图1是我修改后的程序,将下面的Timer4Config();移到上面来,移到CacheEnable(CACHE_ALL);的后面。
图2是Timer4Config原来的地方。
图3是Timer4Config里面的内容。
图4是原程序的MMU配置函数。
那么问题来了,当跑到图1箭头指向的这个位置的时候就跑飞了。准确的说是运行完前面的MMU和CACHE之后,在运行Timer4Config就出现了问题。如果将MMU和CACHE注释掉,程序可以正常运行。
请教这是何故?
pengda qiu:
求解答
Jian Zhou:
回复 pengda qiu:
应该是驱动层有些东西还没有初始化完成,在timer配置之前还要有相关的clock使能的
pengda qiu:
回复 Jian Zhou:
在我CACHE和MMU使能以后,TIMER1的时钟无法使能0x44E004C4的IDLEST一直返回0x03(Module is disabled and cannot be accessed)
重新上电:
1.将程序下载进去,GOTO MAIN后,在CCS的DEBUG里面直接将0x44E004C4=2后,IDLEST变成0
2.将TIMER4也=2以后,IDLEST变成0
3.运行程序,mmu和cache使能后,按下复位按键,重新将程序下载进去,GOTO MAIN后,TIMER1=2,使能后,IDLEST仍然是0x03
4.TIMER4=2后,IDLEST=0x00
问题,
1.为何使能MMU和CACHE后,TIMER1无法使能时钟。
2.为何按下复位按键后,mmu和cache仍然会影响着TIMER1,必须要重新上电以后TIMER1的时钟才能被使能。而TIMER4却在任何情况下都没有问题。
pengda qiu:
回复 Jian Zhou:
貌似找到问题了,可能是时钟源选择的问题,就是0x44e00528里面,默认是0x04,如果是0x04就不可以,如果是0x01就可以
请问,0x04和0x01都是32k,这两个的区别是什么呢?
Steven Liu1:
回复 pengda qiu:
TRM手册的8.1.6.13 Timer Clock Structure节对此有明确的描述:
The CLK_32KHZ clock is an accurate 32.768-kHz clock derived from the PER PLL and can also be selected for the WDT1. 简单来说更精确
The DMTIMER0 can only be clocked from the internal RC oscillator (CLK_RC32K). 不如上面的精确,但是在低功耗的时候由于32KHZ关了,必须用这个。