查看: 1127|回复: 0

【S08P闯关赛经验分享】(四)S08P-Lite MTIM定时器

[复制链接]
  • TA的每日心情
    擦汗
    2023-12-24 19:50
  • 签到天数: 56 天

    [LV.5]常住居民I

    7

    主题

    95

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    374
    最后登录
    2023-12-24
    发表于 2020-6-30 23:35:57 | 显示全部楼层 |阅读模式
    本帖最后由 xyzml 于 2020-6-30 23:39 编辑

    MTIM是8位定时器,有MTIM0、MTIM1两组,其中断优先级MTIM0>MTIM1
    每组定时器分别包括了3组寄存器SC、CLK、MOD、CNT:


    (1) SC 状态控制寄存器
    [7] TOF=0    溢出标志位。MTIM计数器CNT达到模寄存器MOD值时置1。
    [6] TOIE=0   溢出中断使能位,置1时使能。如果TOF = 1,先清除TOF,再设置TOIE。
    [5] TRST=0  为1时MTIM计数器重置,可写,读取该位时总是返回0
    [4] TSTP=0  计数始停寄存器,写1停止计数。
    [3:0] 保留



    (2)CLK 时钟控制寄存器
    [7:6] 保留
    [5:4] CLKS
    00:总线时钟(BUSCLK)。
    01:固定频率时钟(XCLK)。
    10:外源(TCLK引脚),下降沿。
    11:外源(TCLK引脚),上升边

    [3:0] PS 时钟脉冲源预定标器
    0000 Encoding 0. 时钟源
    0001 Encoding 1. 2分频
    0010 Encoding 2. 4分频.
    0011 Encoding 3. 8分频.
    0100 Encoding 4. 16分频.
    0101 Encoding 5. 32分频.
    0110 Encoding 6. 64分频.
    0111 Encoding 7. 128分频.
    1000 Encoding 8. 256分频.
    其他默认为
    256分频.


    (3) MOD 模寄存器        设置范围是0-255
    (4) CNT 计数器(只读)变化范围是0-MOD,通过与MOD比较让TOF产生中断信号


    MTIM寄存器较少,设置起来也相对方便:
    (1)配置寄存器 MTIMx_CLK,选择时钟源和分频系数;
    (2)配置寄存器 MTIMx_MOD,配置模值;
    (3)配置寄存器 MTIMx_SC,使能定时器;


    以下是根据官方例程,用定时器0配置一个1ms的定时中断
    (1)定时器0初始化


    1. void MTIM0_Init( void )
    2. {
    3.     //MTIM overflow interval: CLKS/PS/MOD = 16M/64/250=1kHz=1ms
    4.         MTIM0_CLK_CLKS = 0x00;           //时钟源: 总线时钟
    5.         MTIM0_CLK_PS   = 0x06;           //时钟分频: 64分频-->0110
    6.         MTIM0_MOD           = 249;            //定时器模: 250
    7.         MTIM0_SC_TRST  = 1;                                    //计数重置
    8.         MTIM0_SC_TOIE  = 1;              //使能定时器溢出中断
    9.         MTIM0_SC_TSTP  = 1;              //停止计数
    10. }
    复制代码
    注:外部晶振作为时钟源,总线时钟 为16M ,1ms就是16M时钟分64份再分250份
    (2)定时器0启停


    1. void MTIM0_Start(void)
    2. {
    3.     MTIM0_SC_TSTP   = 0;      //开启计数
    4. }

    5. void MTIM0_Stop(void)
    6. {
    7.     MTIM0_SC_TSTP   = 1;      //停止计数
    8. }
    复制代码
    (3)定时器0中断程序,设置每1s second+1

    1. uint16_t mtim0_count = 0;
    2. interrupt VectorNumber_Vmtim0 void  Mtim0_ISR(void)
    3. {
    4.     if(MTIM0_SC_TOF)  // 清除标志位
    5.     {
    6.         MTIM0_SC_TOF = 0;               
    7.     }

    8.     mtim0_count++;
    9.     if (mtim0_count > 1000)
    10.     {        
    11.         second++;
    12.         mtim0_count = 0;
    13.     }
    14.     if (second==60) second=0;

    15. }
    复制代码
    (4)反映在LED上,让LED每隔1s蹦跶一下
    1.             led_write(second);
    复制代码
    实际效果如下:
    0630TIM.gif
    参考资料:
    [1]MC9S08PT60芯片手册
    [2]MC9S08PT60数据手册
    [3]MC9S08PT60官方教程
    [4]官方例程S08P_LITE_SAMPLES
    [5]S08P_LITE说明书



    本人知识水平与能力有限,欢迎大家对存在的不足进行批评指正:










    哎...今天够累的,签到来了~
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-4-29 17:14 , Processed in 0.111373 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表