ABOV单片机使用时往往需要进行内部时钟的切换,以适用于不同的操作情况。
在操作过程中一定要注意先打开要切换的时钟源,延时待时钟稳定后再切换为要切换的目标时钟源,延时等待稳定后再关闭切换前的时钟源。且在切换过程中要关闭中断,在关闭中断的情况下可以在中断服务中进行时钟切换操作。
以下是一个我写的时钟切换实际列子:单片机在平时使用32.768Khz的主时钟,由于程序内容复杂且庞大,所以在32.768KHZ的主频下运行按键扫描会导致按键速度反应过慢,所以在中断中每20ms进行按键操作扫描,当检测都按键时切换时钟进入8Mhz的主时钟,当没按键操作超过15S时则进入切换模式切换为32.768KHZ的低速时钟运行:代码如下请大家自行分析:
/***********************************************************************************
*函数名 : INT_Timer0
*函数功能描述 :定时器中断0中断服务程序
*调用函数:
*函数参数 :
*函数返回值 :
*作者 :佘坤龙
*函数创建日期 :2013-7-2
*函数修改日期 :
*修改人 :
*修改原因 :
*版本 : v1.0
*历史版本 :
**********************************************************************************/
void INT_Timer0() interrupt 13
{
//32.768KHz时为20ms //8MHZ时为20ms
unsigned int a=0;
cli();
first_kescan_ok_if=1;
ALL_T0_20ms_ok=1;
int_valve_contre();
//按键扫描特殊处理
if(KEY_AUTO)
{
}
else
{
sys_clock_in_8M_if=1; //标记进入高速
key_scan_auto_if=1;
hispeed_8M_out_10S_count=0;
set_modu_exti_time_count=0;
}
if(KEY_LEFT)
{
}
else
{
sys_clock_in_8M_if=1; //标记进入高速
key_scan_left_if=1;
hispeed_8M_out_10S_count=0;
set_modu_exti_time_count=0;
}
if(KEY_MANUAL)
{
}
else
{
sys_clock_in_8M_if=1; //标记进入高速
key_scan_manual_if=1;
hispeed_8M_out_10S_count=0;
set_modu_exti_time_count=0;
}
if(KEY_RIGHT)
{
}
else
{
sys_clock_in_8M_if=1; //标记进入高速
key_scan_right_if=1;
hispeed_8M_out_10S_count=0;
set_modu_exti_time_count=0;
}
if(KEY_OK)
{
}
else
{
sys_clock_in_8M_if=1; //标记进入高速
key_scan_ok_if=1;
hispeed_8M_out_10S_count=0;
set_modu_exti_time_count=0;
}
//设定模式下保持高速
if(sys_run_modu==SYS_RUN_SET_MODU)
{
sys_clock_in_8M_if=1; //标记进入高速
hispeed_8M_out_10S_count=0;
}
if(power_on_if) //是否允许时钟切换
{
//时钟切换处理
if(sys_clock_in_8M_if==1)
{
if(SCCR!=0X00)//如果没有切换为高速时钟则进入切换状态
{
OSCCR|=0X18;//内部时钟速率切换为8MHz
OSCCR&=0XFB; //开启内部时钟
while(a<500)
{
a++;
}
SCCR=0X00; //切换为内部8MHZ
a=0;
while(a<500)//等待时钟稳定
{
a++;
}
timr0_init_state=T0_8M_INIT; //初始化定时器为8M模式
}
if(SCCR==0x00)
{//高速4M系统时钟时候时,延时判断退出
hispeed_8M_out_10S_count++; //延时自增
if(hispeed_8M_out_10S_count>_8M_10S_TIME)
{
sys_clock_in_8M_if=0; //标记解除切换时钟
hispeed_8M_out_10S_count=0;
}
}
}
else
{
if(OSCCR!=0X1D)//检查是否切换为SUB OSC成功
{//如果不成功则开始切换
a=0;
SCCR|=0X03; //切换外部时钟为主时钟
while(a<10)
{
a++;
}
OSCCR|=0X04; //关闭内部震荡器
a=0;
while(a<1) //延时等待系统稳定
{
a++;
}
timr0_init_state=T0_32K_INIT; //初始化定时器为8M模式
}
}
}
else
{
sys_clock_in_8M_if=0;
}
sei();
}
以上属于个人经验总结,不吝赐教!谢谢!希望对我的客户应用ABOV有所帮助!
2014年8月14日
FAE:Mark.she
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
没搞清楚发帖的方法,就发错了位置
一周热门 更多>