时钟周期
时钟周期是系统时钟一个完整的周期所需的时间。它的倒数就是时钟频率,即每秒钟发生的时钟周期数。STC8H的时钟频率为24MHz, 1s / 24MHz,1000 000 000ns / 24 000 000 = 41.67ns机器周期
也叫做指令周期。指令周期是一条指令的执行时间。现在的STC8H可以有两种配置,一个是1T,一个是12T 1T也就是处理一条指令的时间为1个时钟周期,为41.67ns,12T也就是处理一条指令的时间为12个时钟周期,为12 * 41.67ns原理
已知STC8单片机使用的是16位的定时器/计数器,计数范围是0-65535,当16位全部存1之后再计数1,就会触发中断 65535 * 41.67ns = 2.73ms,也就是从0开始到这个触发中断也就是2.73ms//配置定时器
void TIMER_Config(){
TIM_InitTypeDef init;
init.TIM_Mode = TIM_16BitAutoReload;
//工作模式,TIM_16BitAutoReload(自动重置为0),TIM_16Bit(手动重置),TIM_8BitAutoReload,TIM_16BitAutoReloadNoMask
init.TIM_ClkSource = TIM_CLOCK_1T;
//时钟源,TIM_CLOCK_1T(41.67us),TIM_CLOCK_12T(12 * 41.67us),TIM_CLOCK_Ext(外部时钟源)
init.TIM_ClkOut = ENABLE;
//可编程时钟输出,ENABLE,DISABLE(ENABLE触发中断时会在P35输出高低电平信号)
init.TIM_Value = 65536 - (MAIN_Fosc / 1000);
/*装载初值
16位定时器存放范围是0-65535,我们用的板子频率是24M,1s数24000000个数,1ms数24000个数
所以为了计时比较准确就让定时器数24000就触发中断,也就是每过1ms就触发中断
就是从65536 - 24000 数到65536就是1ms的时间,就触发一次中断
但不能直接写24000,因为不同的单片机的时钟主频是不同的,为了代码的可移植性
MAIN_Fosc是config文件中宏定义的时钟主频,(MAIN_Fosc / 1000)是根据不同时钟主频计算出的1ms所数的数
*/
init.TIM_Run = ENABLE;
//是否运行 ENABLE,DISABLE。
Timer_Inilize(Timer0,&init);
//调用初始化函数
NVIC_Timer0_Init(ENABLE,Priority_1);
/*
打开中断使能,配置中断优先级
配置优先级注意事项:
1、当使用同一个定时器时最好是把其他使用此定时器且想要实现的功能中断优先级抬高,不然每过1ms触发中断,可能会打断想实现的功能
2、当优先级相同时会根据次序来决定中断的高低
3、此时,就需要去查询手册的同级中断优先级中断查询次序表,次序在前优先中断
*/
}
//中断触发时,会执行定时器0的中断函数,也就是每到1毫秒就会触发下面的中断函数
//========================================================================
// 函数: Timer0_ISR_Handler
// 描述: Timer0中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-23
//========================================================================
/*
interrupt是中断函数的标志,表示这个函数是中断函数
TMR0_VECTOR是中断向量,每个中断源都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表;也有的机器把中断服务程序入口的跳转指令构成一张表,称为中断向量跳转表。
*/
void Timer0_ISR_Handler (void) interrupt TMR0_VECTOR//进中断时已经清除标志
{
}