今天嘗試點亮led,發現點亮一點時間后周期會變長,搗鼓了半天,終于找出問題所在,下面一段文字摘自資料原文:
此外,32768Hz RTC 振蕩器有兩種工作方式:強振模式和自動弱振模式。處于強振模式時,
RTC 振蕩器始終運行在高耗能的狀態下。處于自動弱振模式時,系統在上電復位后的前7.5s 內
處于強振模式,然后自動切換到弱振模式以降低功耗。CPU 被喚醒后默認的時鐘頻率為Fosc/8,
用戶可以根據需要調整該值。CPU 被喚醒后經過32 個時鐘周期的緩沖時間后再進行其它的操作,
這樣可以避免在系統被喚醒后造成ROM讀取錯誤。


注意以上文字中的"處于自動弱振模式時,系統在上電復位后的前7.5s 內
處于強振模式,然后自動切換到弱振模式以降低功耗。",這就是為什么開機一段時間后點亮頻率會降低的原因了,這段過渡時間剛好在7.5S左右。
結合插圖可以看出,*P_SystemClock必須預先設置好,使CPU始終處于強振狀態,才能確保芯片按照預期效果正常工作。
下面給出源程序
//main.c
#include"SPCE061A.h"
#defineuchar unsigned char
void delay1ms()
{
unsigned char i;
for(i = 0; i <70; i++)
*P_Watchdog_Clear = 0x0001; //清看門狗
}
void delaynms(unsigned int n)
{
unsigned char i;
for(i=0;i<n;i++)
delay1ms();
}
void main()
{
//add your code here
unsigned int i;
*P_SystemClock=0x000b; //fosc=24768khz,CPUClok=fosc/8 ,強振狀態,睡眠狀態下晶振仍然工作
*P_IOA_Data = 0x0000; //設置IOA0 ~IOA15 端口為帶下拉的低電平輸入
*P_IOA_Dir = 0xffff; //工作方向為輸出
*P_IOA_Attrib = 0xffff; //同相輸出,即給1出1,給0出0
*P_IOB_Data= 0xffff; //設置IOB0~IOB15 端口為帶數據緩存的高電平輸出
*P_IOB_Dir = 0xffff; //工作方向為輸出
*P_IOB_Attrib = 0xffff; //同相輸出
while(1)
{
for(i=0;i<8;i++)
{
*P_IOB_Data = 0x0001<<i; //IOB 端口輸出高電平,點亮發光二極管,并保持一段時間
delaynms(1000);
}
}
}
|