系统滴答定时器:属于内核的定时器,用于控制整个系统的运行节拍,STM32F429是180MHZ的,STM32F103最高是72MHZ。此处主要是编写控制时钟进行延时的程序。
工作流程:利用systick定时器为递减计数器,设定初值并使能它后,它会每1个系统时钟周期计数器减,计数到 0时,SysTick计数器自动重装初值并继续计数,同时触发中断。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。
-
SystemInit() 这个函数可以让主频运行到180M,可以把它作为systick的时钟源。
-
计数方式:24bit向下递减的计数器
-
系统频率:180MHZ
-
实现功能:延时
-
主要寄存器:
SysTick->CTRL, --控制和状态寄存器SysTick->LOAD, --重装载寄存器
SysTick->VAL, --当前值寄存器
SysTick->CALIB, --校准值寄存器
bsp_systick.c
#include "stm32f4xx.h"
void SysTick_Init(void);
void Delay_us(__IO u32 nTime);
static __IO u32 TimingDelay;
/*系统滴答定时器初始化 */
void SysTick_Init(void)
{
/* SystemFrequency / 1000 1ms中断一次
* SystemFrequency / 100000 10us中断一次
* SystemFrequency / 1000000 1us中断一次
*/
if (SysTick_Config(SystemCoreClock / 100000))
{
/* Capture error */
while (1);
}
}
//层级调用
// 180 000000 / 10 0000 =1800
//1800* 1/180 = 10us
//10us*10 0000 = 1000ms = 1s,即传入10 0000就是延时1S时间。
/**
* @brief us延时程序,10us为一个单位
* @param
* @arg nTime: Delay_us( 10 ) 则实现的延时为 10 * 10us = 100us
* @retval 无
*/
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
/**
* @brief 获取节拍程序 *
*函数名称:TimingDelay_Decrement
*功能描述:中断里调用此函数,即没发生一次中断,此函数被调用,此函数里的变量
TimingDelay 相当于减法计数器
* @attention 在 SysTick 中断函数 SysTick_Handler()调用
*/
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
在stm32f4xx_it.c系统中断函数调用TimingDelay_Decrement();
/* @brief This function handles SysTick Handler.*/
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
main.c,其他灯的初始化函数课参考之前的文章:
在实验设计部分的bsp_led.h
#include "stm32f4xx.h"
#include "bsp_led.h"
#include "bsp_systick.h"
/* @brief 主函数*/
int main(void)
{
/* LED 端口初始化 */
LED_GPIO_Config();
/*系统滴答定时器初始化*/
SysTick_Init();
/* 控制LED灯 */
while (1)
{
LED_RED;
Delay_us(100000);//1s延时
LED_GREEN;
Delay_us(100000);
LED_BLUE;
Delay_us(100000);
}
}