在使用定时器的时候发现定时精度不仅不准确,而且相差很大。在使用系统滴答定时器的延时函数时,也发现定时不准确的问题。延时函数如下:
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; //为系统时钟的1/8
#ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了。
reload=SystemCoreClock/8000000; //每秒钟的计数次数 单位为K
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
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick-》LOAD=(u32)nms*fac_ms;//时间加载(SysTick-》LOAD为24bit)
SysTick-》VAL =0x00; //清空计数器
SysTick-》CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick-》CTRL;
}
while(temp&0x01&&!(temp&(1《《16)));//等待时间到达
SysTick-》CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick-》VAL =0X00; //清空计数器
}
经过尝试发现,STM32默认使用的是外部晶振8HZ,如果晶振变为12Mhz,需要更改库函数,步骤如下:
① 打开stm32f10x.h ,修改如下:
#if !defined HSE_VALUE
#ifdef STM32F10X_CL
#define HSE_VALUE ((uint32_t)25000000) /*!《 Value of the External oscillator in Hz */
#else
#define HSE_VALUE ((uint32_t)12000000) /*!《 Value of the External oscillator in Hz */ // modify by liujian 8000000
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */
② 打开system_stm32f10x.c, 修改如下:
/* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
RCC-》CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC-》CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6); // modify by liujian RCC_CFGR_PLLMULL9
#endif /* STM32F10X_CL */
③ option -》 target, 调整晶振频率为12M。
在使用定时器的时候发现定时精度不仅不准确,而且相差很大。在使用系统滴答定时器的延时函数时,也发现定时不准确的问题。延时函数如下:
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; //为系统时钟的1/8
#ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了。
reload=SystemCoreClock/8000000; //每秒钟的计数次数 单位为K
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
}
void delay_ms(u16 nms)
{
u32 temp;
SysTick-》LOAD=(u32)nms*fac_ms;//时间加载(SysTick-》LOAD为24bit)
SysTick-》VAL =0x00; //清空计数器
SysTick-》CTRL|=SysTick_CTRL_ENABLE_Msk ; //开始倒数
do
{
temp=SysTick-》CTRL;
}
while(temp&0x01&&!(temp&(1《《16)));//等待时间到达
SysTick-》CTRL&=~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick-》VAL =0X00; //清空计数器
}
经过尝试发现,STM32默认使用的是外部晶振8HZ,如果晶振变为12Mhz,需要更改库函数,步骤如下:
① 打开stm32f10x.h ,修改如下:
#if !defined HSE_VALUE
#ifdef STM32F10X_CL
#define HSE_VALUE ((uint32_t)25000000) /*!《 Value of the External oscillator in Hz */
#else
#define HSE_VALUE ((uint32_t)12000000) /*!《 Value of the External oscillator in Hz */ // modify by liujian 8000000
#endif /* STM32F10X_CL */
#endif /* HSE_VALUE */
② 打开system_stm32f10x.c, 修改如下:
/* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */
RCC-》CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE |
RCC_CFGR_PLLMULL));
RCC-》CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL6); // modify by liujian RCC_CFGR_PLLMULL9
#endif /* STM32F10X_CL */
③ option -》 target, 调整晶振频率为12M。
举报