共享一把我的代码吧(有点复杂,但是可以用): /******************************************************************************* * Function Name : SysTick_Config_MAX * Description : Configure a SysTick Base time to MAX timeout. * Input : None * Output : None * Return : None * Author : www.mcuisp.com void SysTick_Config_MAX(void) { /* Configure HCLK/8 clock as SysTick clock source */ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
/* SysTick Reload By Max Value */ SysTick_SetReload(0x00ffffff);
/* Disable the SysTick Interrupt, use for free count */ SysTick_ITConfig(DISABLE);
/* Enable the SysTick Counter */ SysTick_CounterCmd(SysTick_Counter_Enable); } //-- /******************************************************************************* * Function Name : DelayCyclesBySysTick * Description : delay N SysTicks. * Input : u32 ticks,the number of ticks desired to delay * Output : None * Return : None * Author : www.mcuisp.com *******************************************************************************/ void DelayCyclesBySysTick(u32 ticks) { u32 ui32,ui32a,systickprescale; if((SysTick->CTRL&SysTick_Counter_Enable)==0)return;//没开SysTic,返回避免死循环 systickprescale=SysTick->LOAD; if(systickprescale<250)return;//SysTick的Load值太小,误差很大,返回。 for(;ticks>=systickprescale;) { ticks=ticks-systickprescale-200; ui32=SysTick_GetCounter(); for(;;) { ui32a=SysTick_GetCounter(); if(ui32a>ui32) { ui32a=ui32+systickprescale-ui32a; } else { ui32a=ui32-ui32a; } if(ui32a>=(systickprescale-200))break; } } ui32=SysTick_GetCounter(); for(;;) { ui32a=SysTick_GetCounter(); if(ui32a>ui32) { ui32a=ui32+systickprescale-ui32a; } else { ui32a=ui32-ui32a; } if(ui32a>=ticks)break; } } //--
|