stm32-系统定时器

SysTick—系统定时有 4 个寄存器,简要介绍如下。在使用 SysTick 产生定时的时候,只需要配置 前三个寄存器,最后一个校准寄存器不需要使用。

stm32-系统定时器_第1张图片

1.系统定时器功能框图:

stm32-系统定时器_第2张图片

stm32-系统定时器_第3张图片

24位的递减计数器,在系统定时器的时钟驱动下,每来一个时钟,递减计数器就减1,当减到0时就会产生一个中断,重装载寄存器就会写入一个值,重新开始递减计数。

2.系统定时器唯一的固件库函数:System Tick Configuration:

stm32-系统定时器_第4张图片

stm32-系统定时器_第5张图片

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;
		}
	}
}

你可能感兴趣的:(stm32,嵌入式硬件,单片机)