在线时间104 小时
UID3338547
注册时间2017-1-28
NXP金币14
TA的每日心情 | 无聊 2021-12-29 19:06 |
---|
签到天数: 47 天 连续签到: 1 天 [LV.5]常住居民I
金牌会员
 
- 积分
- 1392
- 最后登录
- 2025-3-4
|
本帖最后由 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; // 计数器开启
- void MTIM0_Init( void )
- {
- MTIM0_CLK_CLKS = 0x00; //clock source: bus clock
- MTIM0_CLK_PS = 0x8; // clock prescale: 256
- MTIM0_MOD = 124; //modulo value: 100
- MTIM0_SC_TRST = 1; // RST count
- MTIM0_SC_TOIE = 1; // enable TOF interrupt
- MTIM0_SC_TSTP = 1; // stop count
- }
复制代码
(三)中断
中断服务函数:
- interrupt VectorNumber_Vmtim0 void Mtim0_ISR(void)
- {
- if(MTIM0_SC_TOF) // clear the flag
- {
- MTIM0_SC_TOF = 0;
- }
- mtim0_count++;
- }
复制代码
按照数据手册,读取一次MTIM0_SC_TOF应该就会清除(Clear TOF by reading the MTIM_SC register),这里还要手动清除一次值得斟酌。
(四)实验(出现错误,已解决,见楼下)
在中断中令之中断250次,翻转一次LED1。
我采用了不停中断的策略写了个中断函数:
- interrupt VectorNumber_Vmtim0 void Mtim0_ISR(void)
- {
- if(MTIM0_SC_TOF) // clear the flag
- {
- MTIM0_SC_TOF = 0;
- }
- mtim0_count++;
- if (mtim0_count > 250)
- {
- LED1_Toggle();
- mtim0_count = 0;
- }
- }
复制代码
下载进去之后,芯片就死掉了,再也无法仿真或做其他事情。
我猜测应该是由于不停地中断导致DBG中断无法触发,应该要擦除里面的程序。
顺带一提,这个中断最好有次数限制,我后来写了个函数是通过KBI中断触发,然后翻转十次的。
首先初始化的时候MTIM0_SC_TSTP = 1;
然后通过KBI中断触发;
最后中断服务的时候:
- interrupt VectorNumber_Vmtim0 void Mtim0_ISR(void)
- {
- static int i=0;
-
- if(MTIM0_SC_TOF) // clear the flag
- {
- MTIM0_SC_TOF = 0;
- }
- mtim0_count++;
- if (mtim0_count > 250)
- {
- LED1_Toggle();
- mtim0_count = 0;
- i++;
- if(i>10)
- {
- i=0;
- MTIM0_SC_TSTP = 1;
- }
- }
- }
复制代码
。
|
|