[译]原子STM32学习笔记--system文件夹

作者在 2015-08-07 21:12:50 发布以下内容

//初始化延迟函数
//当使用ucos的时候,此函数会初始化ucos的时钟节拍
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void delay_init() 
{

#ifdef OS_CRITICAL_METHOD  //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
 u32 reload;
#endif
 SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟  HCLK/8
 fac_us=SystemCoreClock/8000000; //外部晶振为8M,然后倍频到72M,那么SyteTick为9M,也就是Systick计数器值
  //VAL每减一,就代表时间过了1/9us。所以 fac_us是算在SystemCoreClock时钟频率下延时1us需要多少哥SysTick时钟周期。
 #ifdef OS_CRITICAL_METHOD  //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
 reload=SystemCoreClock/8000000;  
 reload*=1000000/OS_TICKS_PER_SEC;//根据OS_TICKS_PER_SEC设定溢出时间
       //reload为24位寄存器,最大值:16777216,在72M下,约合1.86s左右 
 fac_ms=1000/OS_TICKS_PER_SEC;//代表ucos可以延时的最少单位   
 SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;    //开启SYSTICK中断
 SysTick->LOAD=reload;  //每1/OS_TICKS_PER_SEC秒中断一次 
 SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;    //开启SYSTICK   
#else
 fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数  
#endif
}

解释:

 fac_us=SystemCoreClock/8000000; //外部晶振为8M,然后倍频到72M,那么SyteTick为9M,也就是Systick计数器值
  //VAL每减一,就代表时间过了1/9us。所以 fac_us是算在SystemCoreClock时钟频率下延时1us需要多少个SysTick时钟周期。

 reload=SystemCoreClock/8000000;  
 reload=reload*1000000  为每秒需要多少个SysTick时钟周期。

如果带操作系统,例如操作系统要求操作系统节拍为5ms,则OS_TICKS_PER_SEC=200;

 reload=reload*1000000*(1 /OS_TICKS_PER_SEC)为5ms需要的SysTick时钟周期。为最后定时器重装值。

 带操作系统下,fac_ms=1000/OS_TICKS_PER_SEC;//例如操作系统要求操作系统节拍为5ms,则OS_TICKS_PER_SEC=200;1000/200=5,代表ucos可以延时的最少单位   

不带操作系统下, fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数  

stm32 | 阅读 4472 次
文章评论,共0条
游客请输入验证码
浏览12089次
最新评论