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初始化
到此完美实现系统滴答精确实现无限微秒、毫秒、秒,最后感谢大家阅读,如果需要其他相关资料请联系我