- 打卡等级:偶尔看看II
- 打卡总天数:21
- 最近打卡:2025-01-19 13:42:05
注册会员
- 积分
- 99
|
发表于 2024-7-16 00:04:54
|
显示全部楼层
本帖最后由 asys 于 2024-7-16 00:10 编辑
今天看了冲哥讲定时器
非常生动有趣的引入了 定时器的概念
图1
定时器是定时器和计数器的统称。
1)设置为定时器时,可实现硬件计时,或者使程序每隔一固定时间完成一项操作
2)设置为计数器时候能够对脉冲进行计数
3)替代长时间的delay,提高CPU的运行效率和处理速度,能及时的响应某个事件
这里可以看手册的介绍
STC32G 系列单片机内部设置了 5 个 24 位定时器/计数器(8 位预分频+16 位计数),5 个 16 位定时器
T0、T1、T2、T3 和 T4 都具有计数方式和定时方式两种工作方式
在特殊功能寄存器 TMOD 中相对应的控制位 C/T 来选择 T0 或 T1 为定时器还是计数器。
对定时器/计数器 T2,用特殊功能寄存器 AUXR中的控制位T2_C/T 来选择T2为定时器还是计数器
定时器/计数器的核 心部件是一个加法计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同
辅助寄存器auxr可以设置12分频或者不分频 如果分频的话 那来十二个时钟脉冲才是计数1 因为auxr只提供了12分频和1分频两个选项
通过框图(图3)
图3
我们可以看到cpu时钟先通过定时器的8 位预分频寄存器
图2
再通过auxr辅助寄存器进行分频 也就是 它通过了俩个分频
当 C/T=0 时,多路开关连接到系统时钟的分频输出
这个时候使用内部时钟的脉冲来计数
T1 工作在 1T 模式(AUXR.6/T1x12=1)
时的输出时钟频率 = (SYSclk)/(TM1PS+1)/(256-TH1)/2
T1 工作在 12T 模式(AUXR.6/T1x12=0)时的输出时钟频率 = (SYSclk)/(TM1PS+1)/12/(256-TH1)/2
通过手册我们可以看到当T1 工作在 12T 模式下时 其实是格外的又进行了12分频
这里可以对比一下arm定时器的结构框图 看图4
图4
arm和stc的区别就体现出来了 这里stc多了一个aurx 而arm的。内部时钟路径是
内部时钟源 到 psc预分频 到计数器 计数器的数与arr自动重载计数器比较
可以在超过时清零并向cpu发起中断请求
我们可以通过写入定时器 0 计数寄存器的来自己设定 计算公式参考
图6
图6
计数的多少
当定时器 1 在16 位自动重装载模式时,[TH1,TL1]的溢出不仅置位 TF1,
而且会自动 将[RL_TH1,RL_TL1]的内容重新装入[TH1,TL1]
图5
上面你已经学会了计数器的使用
现在我们来学习如何开启定时器
我们现在看图7
图7
为定时器的控制寄存器
TR1:定时器T1的运行控制位。 当GATE(TMOD.7)=1,TR1=1且INT1输入高电平时,才允许T1 计数。
TF0:T0溢出中断标志。 定时器溢出时置1 我们可以在中断服务函数里刚开始就把这个位置0
现在不加中断的一个完整的定时器设置是这样的
1设置定时器的时钟系统
2设置定时器模式
3设置定时初始值
4清除中断标志
5定时器开始计时
现在我们来学习如何向cpu发起中断请求
一条完整的中断线连接是怎么样的 还是来看手册 看到图3
在TF0之后中断信号走向了interrupt 那之后呢
看手册STC32G 中断及中断优先级结构图 (图8)
图8
我们可以看见定时器0的中断允许控制是ET0 同时我们还可以对中断的优先级进行配置 原理就拨动对开关来连接中断线
在最后我们开启EA总中断 到此为止整个中断线已经完全打通
对应操作为 ET0 = 1; EA=1;
最后处理中断函数部分
void 函数名称(void) interrupt 中断号
{
清中断标志;
}
函数名称可以随便写 但是中断号不行
中断号位于STC32G 系列中断向量地址及同级中断优先级中断查询次序表
图9
我们可以在这里看次序 这个就是中断号
注意中断号超过31的C语言中断服务程序不能直接用interrupt声明,
请参考“开发环境的建 立与ISP下载”章节中的“关于中断号大于31在Keil中编译出错的处理”小节的处理方 法
。汇编语言不受影响
到此定时器部分到此结束
我又跑回去看来一下stc32g的手册 才写出来的emmmm
|
|