利用系统滴答定时器来实现精确延时,需要以下五步:
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; //清空计数器
- }
复制代码
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|