void delay_ms(u16 nms) { u32 temp; SysTick->LOAD=(u32)nms*fac_ms; //ʱ¼ä¼ÓÔØ(SysTick->LOADΪ24bit) SysTick->VAL =0x00; //Çå¿Õ¼ÆÊýÆ÷ SysTick->CTRL=0x01 ; //¿ªÊ¼µ¹Êý do { temp=SysTick->CTRL; }while((temp&0x01)&&!(temp&(1<<16))); //µÈ´ýʱ¼äµ½´ï SysTick->CTRL=0x00; //¹Ø±Õ¼ÆÊýÆ÷ SysTick->VAL =0X00; //Çå¿Õ¼ÆÊýÆ÷ }
时间: 2023-07-16 19:12:25 浏览: 143
这是一段延时函数的代码,它使用了芯片中的 SysTick 定时器,通过设置定时器的计数器和控制寄存器来实现延时操作。具体实现过程是:将要延时的毫秒数乘以一个系数(该系数是根据芯片时钟频率计算出来的),然后将计算结果写入 SysTick 的 LOAD 寄存器中,开启定时器,不断读取控制寄存器中的状态位,等待定时器计数完成,最后关闭定时器并清空计数器。
相关问题
//对72M条件下,nms<=1864 void delay_ms(u16 nms) { u32 temp; SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit) SysTick->VAL =0x00; //清空计数器 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器 SysTick->VAL =0X00; //清空计数器 } void Delay_ms(u16 nms) { u16 i; for(i=0;i<nms;i++) delay_ms(1); }
这段代码是一个延时函数的实现,用于延时指定的毫秒数。它使用了系统滴答定时器(SysTick)来实现延时功能。函数`delay_ms`接收一个参数`nms`,表示要延时的毫秒数。首先,将参数`nms`乘以一个变量`fac_ms`,然后将计算结果加载到SysTick的LOAD寄存器中,作为倒计时的值。然后,清空计数器的值和控制寄存器的值,开始倒计时。在倒计时过程中,程序会不断读取SysTick的控制寄存器的值,并判断倒计时是否完成。当倒计时完成时,关闭计数器,并将计数器的值清零。函数`Delay_ms`是对`delay_ms`函数的封装,用于延时指定的毫秒数。它通过循环调用`delay_ms`函数一次延时1毫秒的方式来实现延时功能。
#include "Delay.h" static u8 fac_us=0;//us static u16 fac_ms=0;//ms void Delay_Rough(int time) { int i,j; for(i=0;i<time;i++) for(j=0;j<time;j++) ; } void Delay_Init(u8 SYSCLK) { SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟,HCLK/8 fac_us=SYSCLK/8; fac_ms=(u16)fac_us*1000; } void delay_ms(u16 nms) { u32 temp; SysTick->LOAD=(u32)nms*fac_ms; //时间加载(SysTick->LOAD?24bit) 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) { 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; //清空计数器 }
这是一个基于STM32的延时函数库,包括了毫秒级和微秒级的延时函数。其中,Delay_Rough函数是一个粗略的延时函数,用于产生较长时间的延时,如数码管显示等。Delay_Init函数用于初始化延时函数库,包括设置SysTick的时钟源以及计算fac_us和fac_ms的值。delay_ms函数用于产生指定毫秒级的延时,delay_us函数用于产生指定微秒级的延时。这些函数的实现都是基于SysTick定时器来实现的,具有较高的精度和稳定性。
阅读全文