今天尝试点亮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);
}
}
}
|