Timer(定时器)

定时器介绍

  是一个内设计时装置,到时间就会触发中断,
  STC8内设有5个16位定时器,timer0~timer4,当定时器数到65536(2^16)时触发中断
  timer0有4种工作模式:模式0(16位自动重装载模式),模式1(16位不可重装载模式),模式2(8位自动重装模式),模式3(不可屏蔽中断的16位自动重装载模式)
  timer1有3种工作模式:模式0(16位自动重装载模式),模式1(16位不可重装载模式),模式2(8位自动重装模式),timer1在模式 3时无效,停止计数。
  timer2的工作模式固定为16位自动重装载模式。timer2可以当定时器使用,也可以当串口的波特率发生器和可编程时钟输出。
  timer3、timer4与timer2一样,它们的工作模式固定为16位自动重装载模式。timer3、timer4 可以当定时器使用,也可以当串口的波特率发生器和可编程时钟输出。

时钟周期

 时钟周期是系统时钟一个完整的周期所需的时间。它的倒数就是时钟频率,即每秒钟发生的时钟周期数。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//进中断时已经清除标志
{
    
}

 

posted @   剑客温华  阅读(174)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示