[STM32F0]

关于SysTick的时钟配置

[复制链接]
2479|16
手机看帖
扫描二维码
随时随地手机跟帖
viseng|  楼主 | 2017-5-23 21:27 | 显示全部楼层 |阅读模式
看STM32F051的时钟树,systick的时钟源应该只一个就是HCLK的8分频,但在misc.h中却有
#define SysTick_CLKSource_HCLK_Div8    ((uint32_t)0xFFFFFFFB)
#define SysTick_CLKSource_HCLK         ((uint32_t)0x00000004)

试着用下面两个函数跑了一下
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
结果是一样的,这是为了其他型号准备的?还是...
viseng|  楼主 | 2017-5-23 21:45 | 显示全部楼层
下面是我的systick.c文件的代码
#include "Systick.h"

static __IO uint32_t TimingDelay;

void Delay_ms(__IO uint32_t nTime)
{
  TimingDelay = (nTime*1000);

  while(TimingDelay != 0);
}

void Delay_us(__IO uint32_t nTime)
{
  TimingDelay = nTime;

  while(TimingDelay != 0);
}

/**
  * @brief  Decrements the TimingDelay variable.
  * @param  None
  * @retval None
  */
void TimingDelay_Decrement(void)
{
  if (TimingDelay != 0x00)
  {
    TimingDelay--;
  }
}

void Systick_Init(void)
{
  if (SysTick_Config(SystemCoreClock / 1000000))                //1us
  {
    /* Capture error */
    while (1);
  }
}

使用特权

评论回复
viseng|  楼主 | 2017-5-23 21:47 | 显示全部楼层
然后在main中调用:       
                LED_Open();
                        Delay_us(500000);
                        LED_Close();
                        Delay_us(500000);
在it.c文件中
void SysTick_Handler(void)
{
        TimingDelay_Decrement();
}
结果灯不闪了

使用特权

评论回复
戈卫东| | 2017-5-23 21:47 | 显示全部楼层
默认是不分频的。

使用特权

评论回复
viseng|  楼主 | 2017-5-23 21:50 | 显示全部楼层
本帖最后由 viseng 于 2017-5-24 09:07 编辑

之前正常的时候是:
void Systick_Init(void)
{
  if (SysTick_Config(SystemCoreClock / 1000))                //1ms
  {
    /* Capture error */
    while (1);
  }
}

然后调用时用
               LED_Open();
                        Delay_ms(500);
                        LED_Close();
                        Delay_ms(500);

SystemCoreClock设的是    uint32_t SystemCoreClock    = 48000000;   这项没改过。
这样就正常,问题在哪呢?

使用特权

评论回复
feelhyq| | 2017-5-23 22:37 | 显示全部楼层
建议看看寄存器和数据手册

使用特权

评论回复
viseng|  楼主 | 2017-5-24 09:10 | 显示全部楼层
戈卫东 发表于 2017-5-23 21:47
默认是不分频的。

时钟树列出的只有HCLK/8选项,没有可选啊?

使用特权

评论回复
viseng|  楼主 | 2017-5-24 09:12 | 显示全部楼层
这里systick作为系统嘀嗒器,没有关掉,一直开着,只是在主函数需要延时时,置一下参数,然后由systick的中断去递减.

使用特权

评论回复
qq553605454| | 2017-5-24 09:54 | 显示全部楼层
F103也一样,分频没用,用库函数更改参数没效果,我怀疑启动代码里面的时钟配置里面有。

使用特权

评论回复
viseng|  楼主 | 2017-5-24 10:08 | 显示全部楼层
戈卫东 发表于 2017-5-23 21:47
默认是不分频的。

谢谢,datasheet中确认提到可以是HCLK或HCLK/8

使用特权

评论回复
mohanwei| | 2017-5-24 10:55 | 显示全部楼层
你可以关注一下“SystemCoreClock”这个玩意是哪来的……

使用特权

评论回复
viseng|  楼主 | 2017-5-24 11:33 | 显示全部楼层
问题找到了,主要是在SysTick_Config函数定义中,
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
  if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */

  SysTick->LOAD  = ticks - 1;                                  /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
  SysTick->VAL   = 0;                                          /* 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 (0);                                                  /* Function successful */
}

SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk 这句将SysTick时钟设置为HCLK了

使用特权

评论回复
viseng|  楼主 | 2017-5-24 11:34 | 显示全部楼层
现在还有一个问题就是  if (SysTick_Config(SystemCoreClock / 1000))                //1ms
改为  if (SysTick_Config(SystemCoreClock / 1000000))                //1us
灯常亮了,如果少个0,相当于SysTick中断间隔为10us,延时就OK啊,
算一下,如果是1us,就是48个系统时钟周期
如果是10us就是480个系统时钟周期,这是什么原因?

使用特权

评论回复
viseng|  楼主 | 2017-5-27 11:58 | 显示全部楼层
mohanwei 发表于 2017-5-24 10:55
你可以关注一下“SystemCoreClock”这个玩意是哪来的……

把system_stm32f0xx.c看了下,明白了,谢谢!

使用特权

评论回复
Bjorn| | 2017-5-30 09:27 | 显示全部楼层
好像默认不分频

使用特权

评论回复
changwan1| | 2017-5-30 13:36 | 显示全部楼层
viseng 发表于 2017-5-24 11:34
现在还有一个问题就是  if (SysTick_Config(SystemCoreClock / 1000))                //1ms
改为  if (Sys ...

应该是延时1us的时候时间太短,肉眼看起来是常亮的

使用特权

评论回复
viseng|  楼主 | 2017-5-31 09:13 | 显示全部楼层
changwan1 发表于 2017-5-30 13:36
应该是延时1us的时候时间太短,肉眼看起来是常亮的

只是Systick的重载周期设到1us,闪灯肯定不是1us了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

44

主题

410

帖子

1

粉丝