STC32G单片机的开发(2)定时器延时函数的编写

 前言

STC单片机没有像STM32那样一个准确的SysTick(滴答定时器)来进行延时,使用循环延时第一不太准确,第二对于有点强迫症的我有点难受

//软件延时
void Delay1ms(void)	//@35MHz
{
	unsigned long edata i;

	_nop_();
	_nop_();
	_nop_();
	i = 8748UL;
	while (i) i--;
}

哈哈但是一看吧STC32有5个定时器,索性消耗去一个定时器资源进行延时函数的编写。

时钟源选择

首先让我们先对时钟进行分析,我使用的开发板没板载外部晶振,因此默认使用内部高速IRC最为时钟源,对于外设定时器的时钟源路线为如图,这里我们将IRC设置为为35MHz来作为我们的定时器时钟源,我们在ISP烧录软件可以自行修改

在这个地方对IRC频率进行修改

定时器寄存器配置

接着,我们介绍一下一下定时器要来延时函数的一些寄存器配置

首先我们先看一下我们要进行延时对于定时器的配置路线,这里我们采用的定时器为Timer0

这里要用到几个寄存器:

(1)TMOD用于配置定时器模式,注意它是不能一个位一个位拿出来赋值的,M1和M0决定了定时器的模式这里我们采用Timer0并且16不重载可以将T0M1和T0M0设置为0和1

 

(2)TL0和TH0是我们装计数器的重载值的,重载16位数一个寄存器各用8位(TH0高八位,TL0低八位),我们的定时器默认都是向上计数的,最大16位即最大值65535,那我们计数的起点就是重载值,比如重载值是55535那计到65535就是10000个数

(3)TCON里的每一位不像TMOD,我们就可以单独给每一位赋值了,这里我们延时函数用到了TF0和TR0来,TF0是计数完成的标志位,但计数器自动计到65535时自动置1,后面要是开启硬件可以自动清0,否则我们要软件手动清0,TR0是启动定时器的作用。

(4)选择我们是否分频率,选择这个我们可以延时更久的时间,但没什么必要,我们这边不选了

所以T0x12这以为要置1哈

计算延时时间

这边根据我们的配置我们选择的配置

我们计一个数的时间就是1s/(35*10^6)

所以我们要计算出TH0和TL0的值

假设定时一毫秒

[TH0:TL0]=65535-35MHz*1ms=30535

TH0=30535/256

TL0=30535%256

然后定时器的时间计算公式为

代码

#include "Delay.h"
void Delay_Init(void)
{
	TMOD&=0xF0;//清空Timer0的模式配置,但不影响Timer1的模式配置
	TMOD|=0x01;//给Timer0模式设置为16位不可重装
	AUXR|=0x80;//不分频
	TH0=0x77;//高位重装值
	TL0=0x48;//低位重装值
}

void Delay_us(uint16_t xus)
{
	TR0=1;
	while(xus--)
	{
		TF0=0;
		while(!TF0);
		TH0=0xFF;
		TL0=0xDD;
	}
	TR0=0;
}

void Delay_ms(uint16_t xms)
{
	TR0=1;//启动定时器
	while(xms--)
	{
		TF0=0;//清空标志位
		while(!TF0);//等待标志位
		TH0=0x77;//手动重装
		TL0=0x48;
	}
	TR0=0;//关闭1定时器
}

总结

这边和89C52不同的地方需要配置一下AUXR寄存器,开始我出现延时卡死没注意到这个问题,还有位开启中断,因此我们每次TF0计数标记位置1后,我们记得一定要清0。

有错误的地方也请大家指证哈^o^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值