使用体系滴答守时器来完成准确延时,需求以下五步:
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; //清空计数器
}
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/257116.html