单片机原理(从51到stm32)

学习资料来自 ——B站金善愚老师

定时器计数器(单片机外设)

T0由两个八位的SFR构成 ,TH0和TL0

T1由两个八位的SFR构成 ,TH1和TL1

基本概念:1)什么是时钟周期?什么是机器周期?什么是脉冲?一个脉冲用一个周期吗?一个脉冲等于一个下降沿(上升沿)吗?脉冲是怎么通过振荡器产生的?

1.结构(定时计数器实质就是一个计数器不断+1)

首先TR0/TR1来打开计数器,M0&M1来设置4种工作方式

当作定时器使用时,有脉冲来的时候(1/115200)TMOD 寄存器来选择定时/计数功能(C/T位),控制TH0和TH1组成的寄存器(16位)加一,加满溢出,使TCON寄存器中的TF0标志位置1,通过中断/查询方式通知时间变化了。

(D0到D3是中断的寄存器)

当作计数器使用时,由T0引脚来产生脉冲,对这个脉冲加一,后面处理一样的。

but,CPU处理电平采样时,前一个机器周期采样时时为高电平,下一个为低电平,才能认为是来了一个脉冲,对频率是有要求的,不符合的频率脉冲采集不到(这个时候就有了分频,倍频一说),外部脉冲怎么才能给与相同的振动频率。进行计数时, 一个12M晶频的单片机,机器周期是(1/12)*12,两个就是(1/12)*12*2,那么一个计数周期就是1/((1/12)*12*2),即0.5MHz。电平的保持时间至少是一个完整的机器周期时,才能完成采样。

!!!定时计数器和CPU是并行工作的哦~

如果定时器不够用,可以通过软件开发方式扩充哦~

2.工作原理

定时计数器实质就是一个计数器不断+1,定时指的是对内部的机器周期计数,计数是对外部的时钟脉冲进行计数。

特殊功能寄存器每过一个脉冲加一(那么脉冲来自哪里呢?)挤满溢出,标志位置1,通过查询/中断来处理溢出事件。

定时计数器的工作方式:

M0=0,M1=0,C/T=0,GATE=0;13位计时器

M0=0,M1=1,C/T=0,GATE=0;8位自动重装

M0=1,M1=0,C/T=0,GATE=0;16位计时器

M0=1,M1=1,C/T=0,GATE=0;将T0计时器拆分为两个8位计时器(一般不用)

当GATE=1,只有INT0和TR0引脚为一时,才能打开计时器。此时我们可以利用这个功能测量脉宽。

实践:代码实现

1.设置TMOD确定工作方式 定时 /工作方式1/GATE=0

2.定时器初始值计算

3.打开定时器

为什么要定出始值?

51:T{start}=2^{n}-t_{need}/T_{mech}

T{start}要分为高低八位

stm32:

\

看ARM的cortex M3和M4权威指南

#ifndef _MY_DELAY_H
#define _MY_DELAY_H
#include "sys.h"
void My_Delay_us(u16 us);
void My_Delay_ms(u16 ms);
void My_Delay_s(u16 s);
#endif
#include "My_delay.h"
//1s 7200000000->1us 72
void My_Delay_us(u16 us)
{
	SysTick -> CTRL = 0; 
	SysTick->LOAD =72*us; 
	SysTick->VAL = 0; 
	SysTick->CTRL = 5;
	while((SysTick->CTRL&0x00010000)==0);
	SysTick->CTRL = 0;

//	SysTick->LOAD=AHB_INPUT*uS;      //重装计数初值(当主频是72MHz,72次为1微秒)
//	SysTick->VAL=0x00;        //清空定时器的计数器
//	SysTick->CTRL=0x00000005;//时钟源HCLK,打开定时器
//	while(!(SysTick->CTRL&0x00010000)); //等待计数到0
//	SysTick->CTRL=0x00000004;//关闭定时器

}
void My_Delay_ms(u16 ms)
{
while(ms--!=0)
{My_Delay_us(1000);}
}
void My_Delay_s(u16 s)
{
while(s--!=0)
{My_Delay_ms(1000);}
}

定时器的应用——基本定时功能  

这么多计时器怎么知道怎么用呢?——看帮助文档

根据时钟源,可以分为

内部时钟

外部时钟模式1

外部时钟模式2

内部触发输入(ITRx0)--主从模式

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值