嵌入式STM32—第五天系统滴答精确实现无限微秒、毫秒、秒

1.软件及工程环境搭建

  • 就不介绍了,可以直接用现成的
    链接:https://pan.baidu.com/s/1GaSYpNm6yh-lZZmqRdXxvQ
    提取码:dy63
  • 相关资料文件
    链接:https://pan.baidu.com/s/1X4eUtVAlA7r2eRojVgQJ9Q
    提取码:9sgn

2.系统滴答精确实现无限微秒、毫秒、秒

  • SysTick概述
    就不说了,你们文档应该也有。
  • 系统滴答作用:
    1)用于实现精准的延时功能 微秒、毫秒、秒 。
    2)用于操作系统的时钟节拍功能。
  • 看一下SysTick的工作原理
    在这里插入图片描述
    总结:外部时钟源进入,向下计时,其实SysTick有影子寄存器的,那为什么非得弄个影子寄存器呢?大家想想啊。因为定时器里面有这样一句话:“计数器、自动装载寄存器和预分频器寄存器可以由软件读写,在计数器运行时仍可以读写”。说这么多还是为了缓冲作用,避免大的误差。
  • 看一下怎么样配置
    Cortex-M3 权威指南 (134页)
    在这里插入图片描述
    在看一下代码的:
    在这里插入图片描述
    SysTick没有大佬弄库文件出来,所以只能自己用寄存器配了,说这么多有用?快快上代码跑路。
  • 由于有需要全局变量,我就自己把初始化和功能一起放了
float time_us=0;//初始值
float time_ms=0;//初始值

/*******************************************************
*函数名:Systick_Init
*功  能:计时器初始化
*参  数:STCLK
*返  回:无
*备  注:STCLK时钟频率
********************************************************/
void Systick_Init(int STCLK)
{
		SysTick->CTRL &= ~(1<<2);//开启外部时钟源(STCLK) 
		time_us = STCLK/8.0; 	//设置1us延时的时钟节拍
		time_ms = time_us*1000;//设置1ms延时的时钟节拍		
}
/*******************************************************
*函数名:delay_us
*功  能:计时器1*us秒
*参  数:us
*返  回:无
*备  注:24位的最大值16777215(不能超过计时的最大值)即2的24次方(16777215)
					16777215/10.5 = 1597830(us) = 1597.830 (ms)
********************************************************/
void delay_Nus(int us)        
{
		SysTick->CTRL = 0;	//控制寄存器全部置0
		SysTick->LOAD = time_us*us;//设置延时us时间
		SysTick->VAL  =0;          //清除计数值和标志
		SysTick->CTRL|= 1<<0;      //SysTick定时器的使能位(向下计数)
		while(!(SysTick->CTRL & 1<<16));//等待SysTick已经数到了0
		SysTick->VAL  =0;  //清除计数值和标志
		SysTick->CTRL &=~(1<<0);  	// 关闭SysTick定时器的使能位(关闭计数器)
}
/*******************************************************
*函数名:delay_ms
*功  能:计时器1*ms秒
*参  数:ms
*返  回:无
*备  注:24位的最大值16777215(不能超过计时的最大值)即2的24次方-1(16777215)
					16777215/10.5 = 1597830(us) = 1597.830 (ms)
********************************************************/
void delay_ms(int ms)
{
		SysTick->CTRL = 0;	//控制寄存器全部置0
		SysTick->LOAD = time_ms*ms;//设置延时ms时间
		SysTick->VAL  =0;          //清除计数值和标志
		SysTick->CTRL|= 1<<0;      //SysTick定时器的使能位(向下计数)
		while(!(SysTick->CTRL & 1<<16));//等待SysTick已经数到了0
		SysTick->VAL  =0;  //清除计数值和标志
		SysTick->CTRL &=~(1<<0);  	// 关闭SysTick定时器的使能位(关闭计数器)
}
/*******************************************************
*函数名:delay_ms
*功  能:计时器1*ms秒
*参  数:ms
*返  回:无
*备  注:无限大豪秒
********************************************************/
void delay_Nms(int ms)
{
		int time_chu_ms = ms / 1000,time_ride_ms = ms % 1000;
		for(int i=0;i<time_chu_ms;i++)delay_ms(1000);
		if(time_ride_ms!=0)delay_ms(time_ride_ms);
}

/*******************************************************
*函数名:delay_Ns
*功  能:计时器1*s秒
*参  数:ms
*返  回:无
*备  注:无限大秒
********************************************************/
void delay_Ns(int s)
{
		for(int i=0;i<s;i++)delay_ms(1000);
}


如果看不懂寄存器配置的,多看看Cortex-M3 权威指南 (134页),看位移的。还有记得.h声明用的函数呀。

  • 主程序记得调用SysTick初始化
	Systick_Init();//SysTick初始化

到此完美实现系统滴答精确实现无限微秒、毫秒、秒,最后感谢大家阅读,如果需要其他相关资料请联系我

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值