SysTick—系统定时有 4 个寄存器,简要介绍如下。在使用 SysTick 产生定时的时候,只需要配置 前三个寄存器,最后一个校准寄存器不需要使用。
1.系统定时器功能框图:
24位的递减计数器,在系统定时器的时钟驱动下,每来一个时钟,递减计数器就减1,当减到0时就会产生一个中断,重装载寄存器就会写入一个值,重新开始递减计数。
2.系统定时器唯一的固件库函数:System Tick Configuration:
uint32_t ticks传入的是重装载寄存器的值
SysTick_LOAD_RELOAD_Msk 是 2^24 的宏定义,计数器的最大值
3.代码
让SysTick产生1秒的定ED亮灭
编程要点:
1-初始化LED相关的GPIO
2-配置SysTick(STK_CTRL寄存器)
3-编写中断服务函数
4-main函数
systick.c:
#include "systick.h"
//@brief 启动系统滴答定时器 SysTick
//重装载寄存器的值为:180 000 000 / 1000 = 180 000;
//递减寄存器每减1,的时间为: 1 / 180 000 000;
//减1800 000次,需要的时间: 1800 1000 / 180 000 000 = 1ms;
//则:中断一次需要时间为: 1ms;
uint32_t m = 1000;
void SysTick_Init(void)
{
/* SystemFrequency / 1000 1ms中断一次
* SystemFrequency / 100000 10us中断一次
* SystemFrequency / 1000000 1us中断一次
*/
if (SysTick_Config(SystemCoreClock/1000)) //传入的数值最多为2^24
{
/* Capture error */
while (1);
}
}
systick.h:
#ifndef _SYSTICK_H
#define _SYSTICK_H
#include "stm32f4xx.h"
#include "core_cm4.h"
void SysTick_Init(void);
void Delay_1ms(uint32_t m);
extern uint32_t m ;
#endif
stm32xxit.c:
extern uint32_t m ;
void SysTick_Handler(void)
{
m--;
}
main.c:
#include "stm32f4xx.h" // Device header
#include "stm32f4xx_gpio.h"
#include "led_bsp.h"
#include "systick.h"
extern uint32_t m ;
int main(void)
{
SysTick_Init( );
GPIO_Led_Config();
while(1)
{
if(m == 0)
{
GPIO_ToggleBits(GPIOH,GPIO_Pin_11);
m = 1000;
}
}
}