应广单片机PMS132B,使用ILRC实现秒级定时唤醒,校准时间,功耗控制在10μA左右
变量定义:
WORD g_wT16Ture1s_cnt,g_wT16Now1s_cnt;
宏:
ADJUST_IC MACRO
$ T16M ILRC,/4,bit15; //ILRC作为时钟源 4分频
g_wReload_t16 = 0;
stt16 g_wReload_t16; //将计数清0
.delay 15625*4 - 1; //根据自己的频率来延时1/64秒,这里是4M的频率,所以乘以4
LDT16 g_wT16Now1s_cnt; //取出重装载数据
$ T16M stop;
g_wT16Now1s_cnt <<= 6; //将重装载值扩大64倍得出1秒的重装载值大小,因为计算的是1/64秒
g_wT16Ture1s_cnt = (g_wT16Now1s_cnt + g_wT16Ture1s_cnt) >> 1; //取平均
ENDM
主函数插入 计算重装载值的大小
.ADJUST_IC SYSCLK=IHRC/4,IHRC=16Mhz, VDD=3.3V; //4Mhz的频率
$ T16M ILRC,/4,bit15;
g_wReload_t16 = 0;
stt16 g_wReload_t16;
.delay 1000000*4 - 1; //延时1秒
LDT16 g_wT16Ture1s_cnt; //取出首次计算的重装载值
省电模式函数,定时一秒唤醒,并重新计算重装载数值,取平均值
BYTE CLKMD_BK;
CLKMD_BK = CLKMD;
while(1){
$ CLKMD ILRC/1,En_IHRC,En_ILRC; //使用ILRC作为时钟源
CLKMD.En_IHRC = 0;
nop;
g_wReload_t16 = 32768 - (g_wT16Ture1s_cnt); //定时1秒,计算公式可查看应广文档
stt16 g_wReload_t16;
$ T16M ILRC,/4,bit15;
INTRQ.T16 = 0;
INTEN.T16 = 1;
stopexe;
//不需要每次都唤醒,自定义需求
CLKMD = CLKMD_BK;
ADJUST_IC; //醒后再次校准,取平均值
//省略代码:按键按下 或 时间到达预定退出循环,终止省电模式
......
}
$ T16M Stop;
$ CLKMD ILRC/1,En_IHRC,En_ILRC;
$ CLKMD IHRC/4,EN_IHRC,EN_ILRC; //切换频率
nop;
CLKMD = CLKMD_BK;