查看: 2706|回复: 5

NXPS08P MTIM基本定时器及其中断

[复制链接]
  • TA的每日心情
    无聊
    2021-12-29 19:06
  • 签到天数: 47 天

    连续签到: 1 天

    [LV.5]常住居民I

    49

    主题

    188

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    1392
    最后登录
    2025-3-4
    发表于 2019-8-18 22:38:58 | 显示全部楼层 |阅读模式
    本帖最后由 day_day 于 2019-8-21 11:56 编辑

    (一)关于MTIM
    MTIM是该单片机的基本定时器,承载比较简单的定时功能。而FTM(FlexTimer)则为高级定时器。该8位单片机有两个MTIM定时器,MTIM0和MTIM1.
    每个定时器只有四个寄存,

    MTIM Status and Control Register (MTIM0_SC)
    MTIM Clock Configuration Register (MTIM0_CLK)
    MTIM Counter Register (MTIM0_CNT)
    MTIM Modulo Register (MTIM0_MOD)

    SC:状态控制
    CLK:时钟分频控制
    CNT:计数器
    MOD:模值寄存器(相当于重装载寄存器的概念)



    (二)配置
    1、时钟源设置:

    CLK寄存器5-4位:
    These two read/write bits select one of four different clock sources as the input to the MTIM prescaler.
    Changing the clock source while the counter is active does not clear the counter. The count continues with
    the new clock source. Reset clears CLKS to 000b.
    00 Encoding 0. Bus clock (BUSCLK).
    01 Encoding 1. Fixed-frequency clock (XCLK).
    10 Encoding 2. External source (TCLK pin), falling edge.
    11 Encoding 3. External source (TCLK pin), rising edge.

    这里选择bus clock。


    2、分频系数设置
    CLK寄存器低四位:
    0000 Encoding 0. MTIM clock source.
    0001 Encoding 1. MTIM clock source/2.
    0010 Encoding 2. MTIM clock source/4.
    0011 Encoding 3. MTIM clock source/8.
    0100 Encoding 4. MTIM clock source/16.
    0101 Encoding 5. MTIM clock source/32.
    0110 Encoding 6. MTIM clock source/64.
    0111 Encoding 7. MTIM clock source/128.
    1000 Encoding 8. MTIM clock source/256.
    Others Default to MTIM clock source/256.



    这里选择256分频



    3、模值寄存器
    相当于重装载寄存器的概念,8位寄存器,最大255,这里设为125。
    频率为8M/256/125,约为250,即4ms重装载一次。


    4、设置控制寄存器SC
    SC寄存器有4个可设置位:
    TOF:溢出标志位,跟MOD寄存器对比,溢出重载时置位,读取时自动清除。
    TOIE:中断允许寄存器,置位则允许中断产生

    TRST:清除计数器CNT
    TSTP:置位时,计数器停止(复位默认值为1,就是停止的)


    设置:
    MTIM0_SC_TRST = 1;                  // 清除计数器
    MTIM0_SC_TOIE = 1;                  // 允许中断
    MTIM0_SC_TSTP = 0;                  // 计数器开启


    1. void MTIM0_Init( void )
    2. {
    3.     MTIM0_CLK_CLKS = 0x00;            //clock source: bus clock
    4.     MTIM0_CLK_PS = 0x8;                 // clock prescale: 256
    5.     MTIM0_MOD        = 124;                    //modulo value: 100
    6.     MTIM0_SC_TRST = 1;                    // RST count
    7.     MTIM0_SC_TOIE = 1;                  // enable TOF interrupt
    8.     MTIM0_SC_TSTP = 1;                  // stop count
    9. }
    复制代码


    (三)中断

    中断服务函数:
    1. interrupt VectorNumber_Vmtim0 void  Mtim0_ISR(void)
    2. {
    3.         if(MTIM0_SC_TOF)  // clear the flag
    4.         {
    5.                 MTIM0_SC_TOF = 0;               
    6.         }

    7.         mtim0_count++;
    8. }
    复制代码

    按照数据手册,读取一次MTIM0_SC_TOF应该就会清除(Clear TOF by reading the MTIM_SC register),这里还要手动清除一次值得斟酌。


    (四)实验(出现错误,已解决,见楼下)
    在中断中令之中断250次,翻转一次LED1。

    我采用了不停中断的策略写了个中断函数:
    1. interrupt VectorNumber_Vmtim0 void  Mtim0_ISR(void)
    2. {
    3.         if(MTIM0_SC_TOF)  // clear the flag
    4.         {
    5.                 MTIM0_SC_TOF = 0;               
    6.         }

    7.         mtim0_count++;
    8.         if (mtim0_count > 250)
    9.         {
    10.                 LED1_Toggle();
    11.                 mtim0_count = 0;
    12.         }
    13. }
    复制代码

    下载进去之后,芯片就死掉了,再也无法仿真或做其他事情
    我猜测应该是由于不停地中断导致DBG中断无法触发,应该要擦除里面的程序。


    顺带一提,这个中断最好有次数限制,我后来写了个函数是通过KBI中断触发,然后翻转十次的。
    首先初始化的时候MTIM0_SC_TSTP = 1;
    然后通过KBI中断触发;
    最后中断服务的时候:

    1. interrupt VectorNumber_Vmtim0 void  Mtim0_ISR(void)
    2. {
    3.         static int i=0;
    4.         
    5.         if(MTIM0_SC_TOF)  // clear the flag
    6.         {
    7.                 MTIM0_SC_TOF = 0;               
    8.         }

    9.         mtim0_count++;
    10.         if (mtim0_count > 250)
    11.         {
    12.                 LED1_Toggle();
    13.                 mtim0_count = 0;
    14.                 i++;
    15.                 if(i>10)
    16.                 {
    17.                         i=0;
    18.                         MTIM0_SC_TSTP = 1;
    19.                 }
    20.         }
    21. }
    复制代码






    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2021-12-29 19:06
  • 签到天数: 47 天

    连续签到: 1 天

    [LV.5]常住居民I

    49

    主题

    188

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    1392
    最后登录
    2025-3-4
     楼主| 发表于 2019-8-18 22:41:07 | 显示全部楼层
    难受啊,本来还想雄心壮志搞点其他事情的,这下玩不了了,找了原理图也没找到有类似ARM的那种boot引脚的跳针,断开之后可以让内部程序无法上电运行的那种,真的无法补救了orz
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 09:29
  • 签到天数: 1775 天

    连续签到: 4 天

    [LV.Master]伴坛终老

    54

    主题

    4371

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    9167
    最后登录
    2025-7-17
    发表于 2019-8-19 09:05:58 | 显示全部楼层
    芯片死机,是个什么样的情况?你点下载程序或者仿真的时候弹出什么对话框吗
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 15:09
  • 签到天数: 1475 天

    连续签到: 8 天

    [LV.10]以坛为家III

    152

    主题

    3139

    帖子

    31

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    8631
    最后登录
    2025-7-17
    发表于 2019-8-20 13:55:27 | 显示全部楼层
    无法下载程序了?
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2021-12-29 19:06
  • 签到天数: 47 天

    连续签到: 1 天

    [LV.5]常住居民I

    49

    主题

    188

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    1392
    最后登录
    2025-3-4
     楼主| 发表于 2019-8-20 20:45:27 | 显示全部楼层
    morphlings2014 发表于 2019-8-19 09:05
    芯片死机,是个什么样的情况?你点下载程序或者仿真的时候弹出什么对话框吗 ...

    就是显示芯片没有应答,下面一张配图是一个脉冲电平的信号,之前遇到这个问题只需要复位一下即可。载了这个程序之后无论如何复位都无效。并且有三个本该初始化时候启用了PORT_PTGOE_PTGOE0寄存器、并拉低的灯显示出一种微亮的样子(看起来像是某种悬空状态)
    看了下可能时钟出问题了
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2021-12-29 19:06
  • 签到天数: 47 天

    连续签到: 1 天

    [LV.5]常住居民I

    49

    主题

    188

    帖子

    21

    金牌会员

    Rank: 6Rank: 6

    积分
    1392
    最后登录
    2025-3-4
     楼主| 发表于 2019-8-21 11:54:04 | 显示全部楼层
    解决了,废了一番功夫
    (一)芯片无应答如何下载程序?
    在出现无应答对话框(即那个高低电平脉冲图时),断开J9跳冒,然后在重新接上的一瞬间点击OK按钮,可以多试几遍。
    (二)关于上述芯片死掉的情况
    与中断程序或其他寄存器配置无关,只是因为没有关闭关门狗:
    1. wdog_disable();
    复制代码

    或者在加入板级驱动文件后,使用:
    1. Sys_Init();
    复制代码


    区别只是前者采用默认的时钟,即外部8M,后者在关闭定时器后进行了倍频,16M时钟





    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-18 05:06 , Processed in 0.089415 second(s), 23 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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