关于SYSTICK的问题

2019-07-20 12:32发布

本帖最后由 Mojo 于 2017-8-17 09:49 编辑

       我用原子哥的HAL库版本的教程自己新建了一个工程模板,然后复制了原子哥的“跑马灯试验的原代码到main函数里,同时复制了LED.c里面的代码,运行之后发现SYSTICK并未运行,卡在了delay_us的while循环里,因为tnow和told都为零(SYSTICK未运行)。 经过一番研究之后发现,我在delay.c的函数systick时钟那里加上HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000U)函数之后,SYSTICK就可以正常运行了,但是我在原子哥的”跑马灯试验“原代码里并未发现使用这段函数,并且HAL_Init();里面也已经包含了这段函数,我自己建的模板里的HAL_Init()同样包含了此段函数。
       想不明白为什么原子哥的原代码里没有这段函数也可以让SYSTICK工作,而我的模板和代码与原子哥的都是一样的我的就不能让SYSTICK工作。

在旺旺上找了技术支持,未果,望有知道为什么的朋友告知一下。十分感谢!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
22条回答
Mojo
1楼-- · 2019-07-20 15:24
       又对比了下,没什么区别,我在连着板子仿真的时候看了下,原子哥的原版工程在仿真的时候SysTick里面的VAL和CURRENT寄存器不是实时在变化的,只有停止再运行才会发现变化,但是不知道为什么SYSTICK控制下的delay函数依然准确的在计时,当然,单步运行也可以看见变化,但是全速运行的时候就看不到变化了,而我自己的工程在把CTRL|=0x01和LOAD=0x00FFFF(当然,别的值也可以)运行之后,SysTick里面的VAL和CURRENT寄存器在全速运行的时候也是一直在变化。
       很奇怪啊,但是不知道是哪里出了问题,希望原子哥能帮忙看下,我估计出现这种问题的人不止我一人。
操作系统
2楼-- · 2019-07-20 20:14
 精彩回答 2  元偷偷看……
Mojo
3楼-- · 2019-07-20 20:54
 精彩回答 2  元偷偷看……
taizonglai
4楼-- · 2019-07-21 00:12
main函数里面有没有调用函数delay_init()来初始化systick?
Mojo
5楼-- · 2019-07-21 02:46
 精彩回答 2  元偷偷看……
李小龙
6楼-- · 2019-07-21 04:02
本帖最后由 李小龙 于 2017-8-17 09:53 编辑

HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000U)这个函数你可以跳进去看看调用了SysTick_Config( )函数,这个函数内部初始化的是systick的相关寄存器。而原子哥的代码直接把SysTick_Config( )函数内部代码写出来了,没有调用SysTick_Config( )函数。所以你看见原子哥没用HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000U)为什么也可以了。知道了吧。[mw_shl_code=applescript,true]uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb)
{
   return SysTick_Config(TicksNumb);
}[/mw_shl_code]

[mw_shl_code=applescript,true]__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
  {
    return (1UL);                                                   /* Reload value impossible */
  }

  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
  return (0UL);                                                     /* Function successful */
}[/mw_shl_code]

下面是原子哥的systick初始化代码
[mw_shl_code=applescript,true]        SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;           //开启SYSTICK中断
        SysTick->LOAD=reload;                                                 //每1/delay_ostickspersec秒中断一次       
        SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;           //开启SYSTICK   
[/mw_shl_code]

一周热门 更多>