织梦做网站详细教程,为什么要网站备案,群晖做自己的电影网站,网站管理系统软件1、问题陈述 今天在测试小车程序的时候使用了如下代码#xff0c;发现延时并没有达到期望的4s#xff0c;而是仅仅延时了0.4s左右#xff0c;本来以为少加了个0#xff0c;最后在我多次测试下来#xff0c;发现在延时大约超过2s的时候就会失效。 while(1){Set_Pwm(6000,60…1、问题陈述 今天在测试小车程序的时候使用了如下代码发现延时并没有达到期望的4s而是仅仅延时了0.4s左右本来以为少加了个0最后在我多次测试下来发现在延时大约超过2s的时候就会失效。 while(1){Set_Pwm(6000,6000);printf(%d\t,Read_Encoder(2));printf(%d,Read_Encoder(3));printf(\r\n);delay_ms(4000);Set_Pwm(-5000,-5000);printf(%d\t,Read_Encoder(2));printf(%d,Read_Encoder(3));printf(\r\n);delay_ms(4000);}  
2、问题解决 再我重新翻阅了一下不完全手册后终于发现了问题出在了SysTick- VAL这个寄存器上 我们先看初始化函数:: 
void delay_init()
{
#if SYSTEM_SUPPORT_OS  							//如果需要支持OS.u32 reload;
#endifSysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);	//选择外部时钟  HCLK/8fac_usSystemCoreClock/8000000;				//为系统时钟的1/8  
#if SYSTEM_SUPPORT_OS  							//如果需要支持OS.reloadSystemCoreClock/8000000;				//每秒钟的计数次数 单位为M  reload*1000000/delay_ostickspersec;		//根据delay_ostickspersec设定溢出时间//reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右	fac_ms1000/delay_ostickspersec;			//代表OS可以延时的最少单位	   SysTick-CTRL|SysTick_CTRL_TICKINT_Msk;   	//开启SYSTICK中断SysTick-LOADreload; 						//每1/delay_ostickspersec秒中断一次	SysTick-CTRL|SysTick_CTRL_ENABLE_Msk;   	//开启SYSTICK    #elsefac_ms(u16)fac_us*1000;					//非OS下,代表每个ms需要的systick时钟数   
#endif
}	 我们主要看fac_us和fac_ms 他们分别表示延时1us、1ms需要多少个SysTick 时钟周期。通过跳转可知SystemCoreClock为72MhzSystemCoreClock/8 代表经过1s需要多少个时钟周期再除以1000000则表示经过1us需要多少个时钟周期。通过计算可知fac_us9fac_ms9000。 我们再看us的延时函数 
void delay_us(u32 nus)
{		u32 temp;	    	 SysTick-LOADnus*fac_us; 					//时间加载	  		 SysTick-VAL0x00;        					//清空计数器SysTick-CTRL|SysTick_CTRL_ENABLE_Msk ;	//开始倒数	  do{tempSysTick-CTRL;}while((temp0x01)!(temp(116)));		//等待时间到达   SysTick-CTRL~SysTick_CTRL_ENABLE_Msk;	//关闭计数器SysTick-VAL 0X00;      					 //清空计数器	 
} SysTick是MDK自定义的一个寄存器。SysTick-CTRL主要是开关计数器SysTick- LOAD类似于重装载寄存器在倒数到0后进行重装载SysTick- VAL是计数器进行倒数。 这个函数先计算出需要倒数的时间nus*fac_us存到LOAD中然后清空当前寄存器 VAL 的内容再开启倒数功能。等到倒数结束最后关闭 SysTick清空 VAL 的值。 但是但是重点的来了LOADVAL是个24位寄存器。也就是最大值为2^2416777216.也就是说需要倒数的时间nus*fac_us必须小于2^24则nus2^24/91864135.1111111.换算成ms大概就是1800秒。 所以开头我延时4000ms的效果其实就是4000-1800*2400ms约0.4s左右。