从现在开始
定时一个精确时间t,以执行某个动作?
如果是这样,只能用硬件定时器来实现, *** 作系统里用在延时的计时都是根据自己的节拍为参考的,你可以用tick
count来获取两次时刻的节拍数差来获取时间,但是这样的话到达某一时间并不能促使你的动作发生,需要你自己不停去检测。
SysTick 就是一个定时器而已,只是它放在了NVIC(嵌套中断控制器)中,主要的目的是为了给 *** 作系统提供一个硬件上的中断(号称滴答中断)。
滴答中断: *** 作系统进行运转的时候,也会有“心跳”。
它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。
这个心跳,可以通过定时器来周期性触发,而这个定时器就是systick。很明显,这个“心跳”是不允许任何人来随意地访问和修改的。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。
{
SysTick_Current=0; //当前值为0
SysTick_Reload=72000; //重装载寄存器,系统时钟72M,中断一次1mS(1ms=0001s=1/72M72000)
TimingDelay =nTime; // 读取延时时间
SysTick_CSR=0x07; // 使能SysTick计数器
while(TimingDelay!= 0); // 判断延时是否结束
SysTick_CSR=0x06;// 关闭SysTick计数器
}
void Delay_Nus(uint32_t nTime) //us级的延时函数
{ SysTick_Current=0;
SysTick_Reload=72; //重装载寄存器,系统时钟20M中断一次1mS
TimingDelay=nTime;
SysTick_CSR=0x07; // 使能SysTick计数器
while(TimingDelay!= 0); // 判断延时是否结束
SysTick_CSR=0x06;// 关闭SysTick计数器 }
首先假设两个IO是PA0 PA1,信号是低电平有效。PA0和PA1都设为中断方式,下降沿触发。
主函数启动的时候,启动内部定时器。
在中断中分别记录定时器当时的数值到两个不同的全局变量。全局变量要用volatile定义更好。
在主程序中,判断这两个变量的差值,就是时间差,但要注意,定时器可能溢出,所以注意减方向。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)