本帖最后由 caizhiwei 于 2015-1-21 10:34 编辑
原帖在【经验分享】STM32中实用的精确延时方法https://www.stmcu.org.cn/module/foru ... 8792&fromuid=182176
(出处: 意法半导体STM32/STM8技术社区)
在此表示感谢!
1.把寄存器操作改为位与,位或操作,更规范;
2.把毫秒延时改为直接延时,而不是用for循环,更精准。
3.增加初始化函数,修改时钟系数更方便;
楼主使用的是clk,我使用的是8分屏,其实效果都是一样的哦~~
- #include "delay.h"
- static u8 fac_us;//us延时倍乘数
- static u32 fac_ms;//ms延时倍乘数
- /*******************************************************************************
- * Function Name :Delay_Init
- * Description : SYSTICK的时钟固定为HCLK时钟的1/8
- * Input : SYSCLK:系统主频时钟(SYSCLK Mhz)
- * Return : None
- *******************************************************************************/
- void Delay_Init(u8 SYSCLK)
- {
- SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);// select HCLK/8 as systick clock source.
- fac_us=SYSCLK/8; //9
- fac_ms=(u32)fac_us*1000;
- }
- /*******************************************************************************
- * Function Name :delay_ms
- * Description : SysTick计数值最大为24位,最大值为16777215,如果fac_us=9000,
- 那么nms的最大值为1864(1864ms)
- * Input : nus,注意nms的范围 nms<=1864
- *******************************************************************************/
- void delay_ms(u16 nms)
- {
- SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
- SysTick->VAL = 0;
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ; //Enable Systick Function and start counting
- while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待计数到0
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭计数器
- }
- /*******************************************************************************
- * Function Name :delay_us
- * Description : SysTick计数值最大为24位,最大值为16777215,如果fac_us=72那么nus
- 的最大值为233016,如果fac_us=9那么nus的最大值为1864128(1864ms)
- * Input : nus
- * Return : None
- *******************************************************************************/
- void delay_us(u32 nus)
- {
- SysTick->LOAD=nus*fac_us; //时间加载
- SysTick->VAL = 0;
- SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk ; //Enable Systick Function and start counting
- while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); //等待计数到0
- SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭计数器
- }
复制代码
|
72M分频验证OK