您的位置:首页 > 其它

STM32--systick延时

2014-03-20 00:23 176 查看

systick是一个内核中的滴答器:



滴答时间间隔:

一般采用AHB时钟的8分频[SysTick->CTRL第2位清零],即一般是72/8=9M,即1s滴答9M次

滴答总量:RELOAD寄存器

读取RELOAD寄存器作为每次滴答的初值,每滴答一次减1(实时数值存到CURRENT寄存器),减到0时(可触发中断),重新读取重新滴答。RELOAD寄存器24位,9M滴答间隔情况下,单次循环最长时间大概1.8s

中断:    

标志位:   SysTick->CTRL寄存器里的第16位为COUNTFLAG,当滴答到0时该位为1。如果读取该位,该位将自动清零

使能中断:  SysTick->CTRL寄存器的第1位写1则开启中断。即使没有开启中断,COUNTFLAG也会工作

 库函数操作:

                    #include"misc.h"

初始化:

  SysTick_Config(x);(可重复调用,时间重新开始)

设置一次完整循环的滴答次数为x

把时钟源设置为内部时钟(一般情况下是要用外部时钟即AHB时钟的8分频的,需进一步操作)

打开中断

设置中断优先级

开始计时

  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//采用AHB时钟的8分频(一般设置),在SysTick_Config之后执行,以免操作被覆盖


CURRENT寄存器:

读它:返回当前倒计数的值

写它(任意值):清零  


延迟函数示例:

//不断查询COUNTFLAG
void sysDelays(u32 x)
{
u32 i;
SysTick_Config(9000000);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
for(i=0;i<x;i++)
{
while(!((SysTick->CTRL)&(1<<16)));
}
SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭滴答
return ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: