原子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时钟数
//当使用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学习笔记——DMA控制器(向原子哥学习)
- STM32学习笔记——USART串口(向原子哥和火哥学习)
- STM32窗口看门狗_原子战舰WWDG例程学习笔记
- 正点原子STM32探索者学习笔记1
- STM32学习笔记——SPI串行通讯(向原子哥学习)
- UCOS_III(原子战舰STM32)学习笔记二
- STM32学习笔记——定时器中断(向原子哥学习)
- UCOS_III(原子战舰STM32)学习笔记一
- UCOS_III(原子战舰STM32)学习笔记三
- STM32学习笔记——新建工程模板步骤(向原子哥学习)
- STM32学习笔记——SystemInit()函数
- stm32学习笔记---串口(原子开发板)
- stm32学习笔记-UCOSIII任务管理
- 【CI学习笔记】引入jquery,以及文件夹结构的改变
- STM32学习笔记之时钟分析
- stm32 读写flash 学习笔记
- STM32 CortexM3 中断 学习笔记!
- 关于stm32的USB学习笔记之USB_HW.c
- STM32 使用DMA处理ADC 学习笔记!!
- STM32学习笔记——外部中断EXTI