找回密码
 立即注册
查看: 263|回复: 4

定时器(定时器0)——可定时任意时间的初始化函数

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:390
  • 最近打卡:2025-06-15 09:15:34
已绑定手机

31

主题

117

回帖

1886

积分

荣誉版主

Rbowlystar

积分
1886
发表于 2025-4-22 19:52:55 | 显示全部楼层 |阅读模式

定时器0是16位定时器,40MHz下最大约能定时19ms,若配合8位预分频器,可组成24位定时器,最大约定时5s。

主要寄存器/控制位

TM0PS(8位预分频器):不使用时,设置为0即可。

T0_CT(定时器/计数器选择位):0为定时器,1位计数器。

T0x12(定时器速度控制位):0为12分频模式(分频后可以定时更长),1为不分频模式。

TH0|TL0(定时器计数值):两个8位寄存器共同组成16位寄存器。

TMOD[b0-b1](定时器/计数器模式选择位):

0为16位自动重装载模式,即16位计数值溢出时,硬件自动为定时器赋予计数值,并重新开始计数(常用)

1为16位不自动重装载模式,当计数值溢出时,若不进行软件赋予计数值,将从0开始计数

2为8位自动重装载模式,只使用TL0一个8位寄存器,进行计数工作

3为不可屏蔽中断的16位自动重装载模式,与模式0相同,全场最高中断优先级,且不可屏蔽,常用于操作系统的系统节拍定时器

重装载值计算(16位)

手册中介绍的定时器周期T与16位重装载值的关系公式如下:

T = {{65536 - [TH0,TL0]} \over {SYSclk/(TM0PS + 1)}} \times T0x12

对我们而言,系统时钟SYSclk为已知变量,TM0PS和T0x12为预设置变量。

因此,可以通过等式变换得到:

65536 - [TH0,TL0] = {T \over {T0x12}} \times {{SYSclk} \over {(TM0PS + 1)}}

最终能够得到一个预期时间为自变量(秒),16位重装载值为因变量的公式:

[TH0,TL0] = 65536 - ({{SYSclk \times T} \over {T0x12 \times (TM0PS + 1)}})

定时器初始化函数

综合以上所有条件,写出一个定时器0的初始化函数就不难了

image.png

对于中断函数,这里作时基定时器:

1倍时基B_1T,每次溢出时置1;

10倍时基B_10T,溢出10次时置1;

以此类推.........

image.png

定时器应用

// 这里使用16位重装载模式,12T分频,定时1ms
Timer0_Init(TIM_16BitAutoReload, TIM_CLOCK_12T, 1, TIM_ms); // 1ms定时

// 主循环中每秒+1,并使用数码管显示个位数,串口打印数值
if (B_1000T)
{
    B_1000T = 0;
    d++;
    SMG_Show_Num(SEG3, d % 10, 0);
    printf("count=%d\r\n", d);
}

串口打印:1秒误差大约在10ms左右,1分钟误差大约在100ms左右

[23:16:56.396]接收←欢迎使用AI8051U开发板【火烛】!
[23:16:57.296]接收←count=1
[23:16:58.287]接收←count=2
[23:16:59.293]接收←count=3
[23:17:00.284]接收←count=4
[23:17:01.289]接收←count=5
[23:17:02.280]接收←count=6
[23:17:03.285]接收←count=7
[23:17:04.276]接收←count=8
[23:17:05.281]接收←count=9
[23:17:06.271]接收←count=10
[23:17:07.277]接收←count=11
[23:17:08.267]接收←count=12
[23:17:09.272]接收←count=13
[23:17:10.278]接收←count=14
[23:17:11.268]接收←count=15
[23:17:12.273]接收←count=16
[23:17:13.263]接收←count=17
[23:17:14.268]接收←count=18
[23:17:15.260]接收←count=19
[23:17:16.265]接收←count=20
[23:17:17.256]接收←count=21
[23:17:18.261]接收←count=22
[23:17:19.251]接收←count=23
[23:17:20.256]接收←count=24
[23:17:21.247]接收←count=25
[23:17:22.252]接收←count=26
[23:17:23.243]接收←count=27
[23:17:24.249]接收←count=28
[23:17:25.240]接收←count=29
[23:17:26.245]接收←count=30
[23:17:27.235]接收←count=31
[23:17:28.240]接收←count=32
[23:17:29.231]接收←count=33
[23:17:30.236]接收←count=34
[23:17:31.227]接收←count=35
[23:17:32.232]接收←count=36
[23:17:33.222]接收←count=37
[23:17:34.228]接收←count=38
[23:17:35.233]接收←count=39
[23:17:36.224]接收←count=40
[23:17:37.229]接收←count=41
[23:17:38.219]接收←count=42
[23:17:39.225]接收←count=43
[23:17:40.215]接收←count=44
[23:17:41.220]接收←count=45
[23:17:42.211]接收←count=46
[23:17:43.216]接收←count=47
[23:17:44.207]接收←count=48
[23:17:45.212]接收←count=49
[23:17:46.202]接收←count=50
[23:17:47.208]接收←count=51
[23:17:48.198]接收←count=52
[23:17:49.204]接收←count=53
[23:17:50.194]接收←count=54
[23:17:51.200]接收←count=55
[23:17:52.205]接收←count=56
[23:17:53.196]接收←count=57
[23:17:54.200]接收←count=58
[23:17:55.190]接收←count=59
[23:17:56.196]接收←count=60
[23:17:57.187]接收←count=61
[23:17:58.193]接收←count=62
[23:17:59.183]接收←count=63
[23:18:00.189]接收←count=64
[23:18:01.180]接收←count=65
[23:18:02.185]接收←count=66
[23:18:03.176]接收←count=67
[23:18:04.181]接收←count=68
[23:18:05.171]接收←count=69
[23:18:06.177]接收←count=70

数码管演示

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:390
  • 最近打卡:2025-06-15 09:15:34
已绑定手机

31

主题

117

回帖

1886

积分

荣誉版主

Rbowlystar

积分
1886
发表于 2025-4-27 23:08:43 | 显示全部楼层
3-Timer.zip (360.16 KB, 下载次数: 6)
回复 支持 反对

使用道具 举报 送花

3

主题

713

回帖

137

积分

等待验证会员

积分
137
发表于 2025-4-22 19:53:00 | 显示全部楼层
在嵌入式系统中,定时器的配置与使用是实现精确时间控制的关键。针对您提到的定时器0的初始化函数及其相关寄存器配置,以下将详细解析其工作原理及初始化步骤。

1. 定时器0的基本特性
定时器0是一个16位定时器,在40MHz的系统时钟(SYSclk)下,其最大定时时间约为19ms。若结合8位预分频器(TM0PS),可扩展为24位定时器,最大定时时间可达5s。这种灵活性使其适用于多种应用场景,如延时控制、PWM生成、事件计数等。

2. 主要寄存器及控制位
2.1 TM0PS(8位预分频器)
TM0PS用于对系统时钟进行分频,以延长定时器的定时范围。若不使用预分频器,可将其设置为0。

2.2 T0CT(定时器/计数器选择位)
0:定时器模式,定时器根据系统时钟计数。
1:计数器模式,定时器根据外部信号计数。

2.3 T0x12(定时器速度控制位)
0:12分频模式,系统时钟经过12分频后作为定时器时钟源,适用于需要较长定时时间的场景。
1:不分频模式,系统时钟直接作为定时器时钟源,适用于高精度定时。

2.4 TH0|TL0(定时器计数值)
TH0和TL0是两个8位寄存器,共同组成16位计数值。定时器从该值开始计数,直至溢出。

2.5 TMOD[b0-b1](定时器/计数器模式选择位)
0:16位自动重装载模式,计数值溢出时,硬件自动重装载初始值并重新计数。
1:16位不自动重装载模式,计数值溢出时,需软件手动重装载。
2:8位自动重装载模式,仅使用TL0进行计数,适用于较短定时。
3:不可屏蔽中断的16位自动重装载模式,与模式0类似,但具有最高中断优先级且不可屏蔽,常用于操作系统的系统节拍定时器。

3. 重装载值计算
定时器周期T与16位重装载值的关系公式如下:
\[ T = \frac{65536 - [TH0,TL0]}{SYSclk/(TM0PS + 1)} \times T0x12 \]
其中,SYSclk为系统时钟频率,TM0PS为预分频器值,T0x12为分频模式。

通过等式变换,可得到重装载值的计算公式:
\[ [TH0,TL0] = 65536 - \left( \frac{SYSclk \times T}{T0x12 \times (TM0PS + 1)} \right) \]
该公式可用于根据预期定时时间T计算TH0和TL0的初始值。

4. 初始化函数设计
以下是一个基于上述原理的定时器0初始化函数示例:
  1. c
  2. void Timer0Init(uint32t SYSclk, uint8t TM0PS, uint8t T0x12, float T) {
  3.     // 计算重装载值
  4.     uint16t reloadvalue = 65536 - (uint16t)((SYSclk  T) / (T0x12  (TM0PS + 1)));
  5.     // 设置预分频器
  6.     TM0PS = TM0PS; // 设置预分频器值
  7.     // 设置定时器模式
  8.     TMOD &= 0xFC; // 清除TMOD的低两位
  9.     TMOD |= 0x00; // 设置为16位自动重装载模式
  10.     // 设置定时器速度控制位
  11.     T0x12 = T0x12; // 设置分频模式
  12.     // 设置定时器计数值
  13.     TH0 = (uint8t)(reloadvalue >> 8); // 设置TH0
  14.     TL0 = (uint8t)(reloadvalue & 0xFF); // 设置TL0
  15.     // 启动定时器
  16.     TR0 = 1; // 启动定时器0
  17. }
复制代码

5. 使用示例
假设系统时钟为40MHz,预分频器为0,不分频模式,需要定时1ms,则初始化函数调用如下:
  1. c
  2. Timer0Init(40000000, 0, 1, 0.001);
复制代码

6. 总结
通过合理配置定时器0的寄存器,结合预分频器和分频模式,可以实现从微秒到秒级的精确定时。上述初始化函数提供了灵活的配置方式,可根据具体需求调整参数,满足不同应用场景的定时需求。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:68
  • 最近打卡:2025-06-17 08:26:33
已绑定手机

17

主题

472

回帖

1345

积分

金牌会员

积分
1345
发表于 2025-4-28 11:44:42 | 显示全部楼层
        if( UsbOutBuffer[0] == 'h' && UsbOutBuffer[1] == 'e' && UsbOutBuffer[2] == 'l' && UsbOutBuffer[3] == 'l' && UsbOutBuffer[4] == 'o' && UsbOutBuffer[5] == '\r' && UsbOutBuffer[6] == '\n' )
这里memcmp不好吗

点评

很不错,当然可以滴,写法有很多种。  详情 回复 发表于 2025-4-28 18:01
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:390
  • 最近打卡:2025-06-15 09:15:34
已绑定手机

31

主题

117

回帖

1886

积分

荣誉版主

Rbowlystar

积分
1886
发表于 2025-4-28 18:01:11 | 显示全部楼层
Ayb_*** 发表于 2025-4-28 11:44
if( UsbOutBuffer[0] == 'h' && UsbOutBuffer[1] == 'e' && UsbOutBuffer[2] == 'l' && UsbOutBuff ...

很不错,当然可以滴,写法有很多种。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 09:54 , Processed in 0.155345 second(s), 84 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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