gookio 发表于 2019-8-23 17:36:02

关于SysTick和几个时钟的疑问(已解决)

各位大神好:
   由于我是硬件爱好者,完全靠自学,身边没有可以咨询的人,特来发贴请求解答疑问。

   其实就是关于SysTick的疑问:

    第一,先看我的RCC的Config设置, 用图来说明:

   
   就是就是用外部HSE. 用的是8MHz, 通过PLL的9倍频,让SYSCLK和HCLK达到了72MHz.

    第二,我来看大部分例程的 dalay_init的代码。(一般调用都是delay_init(72))

   void delay_init(u8 SYSCLK)
    {
      SysTick->CTRL&=0xfffffffb;      
      fac_us=SYSCLK/8;                  
      fac_ms=(u16)fac_us*1000;
   }

    关于这一句:SysTick->CTRL&=0xfffffffb;    这里就是设置使用外部时钟。 按照我的理解 SysTick使用外部时钟 应该是8MHz(HSE)啊。
    但在库里也有这样定义:
    #define SysTick_CLKSource_HCLK_Div8    ((uint32_t)0xFFFFFFFB)//将控制状态寄存器的第二位置0,即用外部时钟源
    #define SysTick_CLKSource_HCLK         ((uint32_t)0x00000004)//将控制状态寄存器的第二位置1,即用内核时钟    我也查了网上的,大部分也是 72MHz/8. 为9MHz.    这里一直没有搞明白,外部时钟源到底是指的什么? 还是说不用管外部时钟为多少MHz, 都是HCLK的8分频?   希望大家能帮我解惑。 感谢感谢。   不知道我把我的问题说明白了没有?

奏奏奏 发表于 2019-8-23 17:49:31

有现成的库直接用起来
你在main循环里写个LED闪烁,加个延时函数
然后修改这个延时函数的参数值就可以了

非要把底层东西搞透的话你就无法迈出第一步了

gookio 发表于 2019-8-23 17:57:22

奏奏奏 发表于 2019-8-23 17:49
有现成的库直接用起来
你在main循环里写个LED闪烁,加个延时函数
然后修改这个延时函数的参数值就可以了


这和底层没有关系吧? 只是把概念搞清楚。 只是要搞清楚到底应该是依据那个值而已?

发表于 2019-8-24 09:18:15

楼主,首先要看时钟树,systick用主频时钟,从图上看用72Mhz,外部时钟指的时晶振。如果要明白具体systick的频率算法,这个要在用户手册中查找使用方法。

现在已经过去 发表于 2019-8-24 17:03:52

你的外部时钟源为8M,PLL9倍频,外部时钟就是72M,AHB 时钟 8 分频作为SysTick时钟源

五哥1 发表于 2019-8-25 02:07:44

这个涉及很多基础概念,要对着手册一点一点地看和理解。

edmundlee 发表于 2019-8-25 07:25:50

之所以楼主有这样的误解,是因为SysTick它跟一般计时器不一样, 它不是ST加上去的外设, 它是ARM核内的计时器, 所以它说的外部时钟是指核外的时钟, 就是指CPU的系统时钟。

gookio 发表于 2019-8-28 10:52:03

感谢各位的答疑。 已经完全明白了。 其实是我的粗心。 在时钟树里有。 只是我没有看到。太粗心了。
页: [1]
查看完整版本: 关于SysTick和几个时钟的疑问(已解决)