找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12364|回复: 1
收起左侧

stm32的精确延时利用系统滴答systick

[复制链接]
ID:59583 发表于 2014-3-23 00:35 | 显示全部楼层 |阅读模式
利用系统滴答定时器来实现精确延时,需要以下五步:
1、设置滴答定时器的时钟,通过设置其控制寄存器,选择外部时钟,即为系统时钟的八分之一,若系统时钟为72M,则滴答定时器时钟为9M。即定时一秒需要9M个时钟周期。
2、设置滴答定时器的重装载寄存器的数值,即需要延时的时钟周期数。如:若需要延时20微秒,则重装载值为20*9.若要延时20毫秒,则设置重装载值为20*9000.
3、清空滴答定时器当前值寄存器的值,使之为零,以便使能计数时能够从设定值开始倒数计时。
4、设置滴答定时器的控制寄存器,开始倒计数。
5、查询滴答定时器的状态位,定时时间到,关闭定时器,清空定时器当前值。

void delay_init(u8 SYSCLK)
{
   SysTick->CTRL&=0xfffffffb;//控制寄存器,选择外部时钟即系统时钟的八分之一(HCLK/8;72M/8=9M)
   fac_us=SYSCLK/8;    //定义全局变量,即延时一微秒所需的的时钟周期数(72/8=9,单位为微妙)
   fac_ms=(u16)fac_us*1000; //一毫秒所需的时钟周期数(9000)
}
void Delay_us(u32 nus)
{
  u32 temp;   
  SysTick->LOAD=nus*fac_us; //时间加载(即延时多少个时钟周期)  
  SysTick->VAL=0x00;        //清空计数器
  SysTick->CTRL=0x01 ;      //开始倒数
do
{
  temp=SysTick->CTRL;
}
  while(temp&0x01&&!(temp&(1<<16)));//等待时间到达  
  SysTick->CTRL=0x00;       //关闭计数器
  SysTick->VAL =0X00;       //清空计数器
}
或者
void Delay_us(u32 Nus)   
{   
SysTick->LOAD=Nus*9;          //时间加载    72M主频     
SysTick->CTRL|=0x01;             //开始倒数      
while(!(SysTick->CTRL&(1<<16))); //等待时间到达   
SysTick->CTRL=0X00000000;        //关闭计数器   
SysTick->VAL=0X00000000;         //清空计数器        
}
回复

使用道具 举报

ID:288629 发表于 2021-3-8 20:57 | 显示全部楼层
延时的精准度很重要!感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表