STM32
直播中

张杰

7年用户 1270经验值
私信 关注
[问答]

为什么系统滴答定时器的延时函数会定时不准确呢

为什么系统滴答定时器的延时函数会定时不准确呢?

怎样去编写STM32系统滴答定时器的延时函数呢?

回帖(1)

王坤

2021-11-24 14:48:50
  在使用定时器的时候发现定时精度不仅不准确,而且相差很大。在使用系统滴答定时器的延时函数时,也发现定时不准确的问题。延时函数如下:
  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。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分