STM32F SysTick定时器

  SysTick定时器:系统滴答定时器是一个非常基本倒计时定时器,用于在每隔一定的时间产生一个中断,即使是系统在睡眠模式下也能工作。
 它使得 OS 在各 CM3 器件之间的移植中不必修改系统定时器的代码,移植工作一下子容易多了,不用考虑最基本的时钟不一致的问题。

总结一下:SysTick_Handler()函数每1ms运行一次,运行时就调用TimingDelay_Decrement()函数,而这个函数又令变量TimingDelay减1

看相关配置 systick_config.c文件如下:
#include “stm32f4xx.h”
static __IO uint32_t TimingDelay;

void led_init(void)//LED初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable the GPIO_LED Clock /
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
/
Configure the GPIO_LED pin */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8; //led IO 口
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //模式:输出
// GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 ,硬件自带上拉电阻,故此处不需要软件上拉,若不屏蔽则 led 灯很暗
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M 翻转
GPIO_Init(GPIOE, &GPIO_InitStructure);
}

void TimingDelay_Decrement(void) //记得将此函数加入 stm32f4xx_it.c 文件中(第 143 行) ,并申明外部函数
{
if (TimingDelay != 0x00)
{
TimingDelay–;
}
}

void Delay(__IO uint32_t nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}

另外, 在 stm32f4xx_it.c 文件中, 需打开中断, 操作如下:
将stm32f4xx_it.c函数打开,并在 stm32f4xx_it.c 的前面申明 extern void TimingDelay_Decrement(void);
void SysTick_Handler(void)//Sys Tick滴答定时器中断函数
{
TimingDelay_Decrement(); // 本行程序原本是屏蔽了的,切记要打开
}

下面还有另外一个问题, Systick 究竟多长时间产生一次中断。
看 main.c 中的代码:
if (SysTick_Config(SystemCoreClock / 1000))
{
/* Capture error */
while (1);
}
我们可以猜测, 那个 1000 就是关键。 让我们把 1000 改成 100,重新编译再运行,结果是灯闪烁的速度慢了 10 倍,也就是Systick 变成了 10ms 中断一次。这样,我们就学会了怎么样来改变这个 Systick 。可是,总觉得这还有点不够,为什么会是这样呢?让我们把鼠标移到 SystemCoreClock 上去按下
F12 吧。这次跑到了 system_stm32f0xx.c 文件中去了, 这就是 User 组中的第 3 个文件。查看一下,原来符号: SystemCoreClock是一个变量,
它的值是 48000000, 也就是 48M , 这好像是个挺熟悉的数值,是什么呢?打开 STM32F051 芯片介绍的资料,原来在这儿, 48M 是该芯片运行的最高频率。
那么我们可以猜测:
( 1)在这个例子中,我们把芯片运行到了它的最高频率,即 48M
( 2) 48M 除 1000 就是 48 000,应该是将这个 48000 这个数放到了某个寄存器中,然后根据这个数来分频。也就是时钟
脉冲的频率是 48M , 然后每隔 48000 出来一个 Systick, 这样,这个 Systick 就是 1ms/次了。
讲到这里,似乎把 Systick 理解了,但其实还有更多的疑问,为什么这个芯片是运行在 48M ?既然是最高, 那肯定还有其他的值,如何设置?
好奇是人进步的阶梯,不过要是一直纠缠下去, 这一篇就没法结束了。

你可能感兴趣的:(STM32单片机)