void delay_init() { #if SYSTEM_SUPPORT_OS ??? ??? ??? ??? ??? ??? ??? ?//如果需要支持OS. ?? ?u32 reload; #endif ?? ?SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);?? ?//选择外部时钟 ?HCLK/8 ?? ?fac_us=SystemCoreClock/8000000;?? ??? ??? ??? ?//为系统时钟的1/8 ? #if SYSTEM_SUPPORT_OS ??? ??? ??? ??? ??? ??? ??? ?//如果需要支持OS. ?? ?reload=SystemCoreClock/8000000;?? ??? ??? ??? ?//每秒钟的计数次数 单位为K?? ? ?? ?? ?reload*=1000000/delay_ostickspersec;?? ??? ?//根据delay_ostickspersec设定溢出时间 ?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?//reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右?? ? ?? ?fac_ms=1000/delay_ostickspersec;?? ??? ??? ?//代表OS可以延时的最少单位?? ? ??
?? ?SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; ? ?? ?//开启SYSTICK中断 ?? ?SysTick->LOAD=reload; ?? ??? ??? ??? ??? ??? ?//每1/delay_ostickspersec秒中断一次?? ? ?? ?SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; ? ?? ?//开启SYSTICK ? ?
#else ?? ?fac_ms=(u16)fac_us*1000;?? ??? ??? ??? ??? ?//非OS下,代表每个ms需要的systick时钟数 ?? #endif }?
最开始没有理解为什么fac_us代表了1us内技术次数,这时找到?SystemCoreClock/8000000代表了时钟频率就发现了,例如??SystemCoreClock/8000000的值为72MHZ,那么时钟每次的时间就为1/72 us,那么1us时钟就走过了72次,fac_us也就代表了每走1us,时钟计数72次,同时fac_ms即os最小延时单位是由QS系统自带的函数决定的
|