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


注意以上文字中的"處于自動(dòng)弱振模式時(shí),系統(tǒng)在上電復(fù)位后的前7.5s 內(nèi)
處于強(qiáng)振模式,然后自動(dòng)切換到弱振模式以降低功耗。",這就是為什么開(kāi)機(jī)一段時(shí)間后點(diǎn)亮頻率會(huì)降低的原因了,這段過(guò)渡時(shí)間剛好在7.5S左右。
結(jié)合插圖可以看出,*P_SystemClock必須預(yù)先設(shè)置好,使CPU始終處于強(qiáng)振狀態(tài),才能確保芯片按照預(yù)期效果正常工作。
下面給出源程序
//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 ,強(qiáng)振狀態(tài),睡眠狀態(tài)下晶振仍然工作
*P_IOA_Data = 0x0000; //設(shè)置IOA0 ~I(xiàn)OA15 端口為帶下拉的低電平輸入
*P_IOA_Dir = 0xffff; //工作方向?yàn)檩敵?br />
*P_IOA_Attrib = 0xffff; //同相輸出,即給1出1,給0出0
*P_IOB_Data= 0xffff; //設(shè)置IOB0~IOB15 端口為帶數(shù)據(jù)緩存的高電平輸出
*P_IOB_Dir = 0xffff; //工作方向?yàn)檩敵?br />
*P_IOB_Attrib = 0xffff; //同相輸出
while(1)
{
for(i=0;i<8;i++)
{
*P_IOB_Data = 0x0001<<i; //IOB 端口輸出高電平,點(diǎn)亮發(fā)光二極管,并保持一段時(shí)間
delaynms(1000);
}
}
}
|
|