您的位置:首页 > 其它

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

2014-05-08 09:33 501 查看
//初始化延迟函数

//当使用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时钟数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: