STM32————SysTick(滴答定时器)控制LED灯

SysTick—系统定时器有 4 个寄存器,
在使用 SysTick 产生定时的时候,只需要配置前三个寄存器,最后一个校准寄存器不需要用
寄存器名称 寄存器描述
CTRL SysTick 控制及状态寄存器
LOAD SysTick 重装载数值寄存器
VAL SysTick 当前数值寄存器
CALIB SysTick 校准数值寄存器
编程要点
1、设置重装载寄存器的值
2、清除当前数值寄存器的值
3、配置控制与状态寄存器
void SysTick_Init(void)
{
/* SystemFrequency / 1000 1ms 中断一次
SystemFrequency / 100000 10us 中断一次
SystemFrequency / 1000000 1us 中断一次
*/
SysTick_Config(SystemCoreClock / 100000)
SysTick 定时器的计数器是向下递减计数的,计数一次的时间
T DEC =1/CLK AHB ,
当重装载寄存器中的值 VALUE LOAD 减到 0 的时 候 ,产生中断,可知中断一 次的时间
T INT =VALUE LOAD * T DEC = VALUE LOAD /CLK AHB ,其中CLK AHB =72MHZ。 如果设置
VALUE LOAD 为 72,那中断一次的时间 T INT =72/72M=1us。不过 1us 的中断没啥意义,
整个程序的重心都花在进出中断上了,根本没有时间处理其他的任务。
SysTick_Config(SystemCoreClock / 100000))
SysTick_Config()的形我们配置为 SystemCoreClock / 100000=72M/100000=720,从
刚刚分析我们知道这个形参的值最终是写到重装载寄存器 LOAD 中的,从而可知我们现在
把 SysTick定时器中断一次的时间 T INT =720/72M=10us。

/代码如下/

#include “stm32f10x.h”
#include “stm32f10x_it.h”
extern uint32_t TimingDelay;//声明全局变量
/LED引脚及时钟初始化/
void LED_init()
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void TIME_init()
{
SysTick_Config(SystemCoreClock/100000);//配置时基为10us

}
void delay_us(uint32_t time)
{
TimingDelay = time;
while(TimingDelay !=0);
}
int main()
{
LED_init();
TIME_init();
while(1){
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
delay_us(100000);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
delay_us(100000);
}
return 0;
}
//注意配置一下systick时钟中断服务函数,在stm32f10x_it.c里
uint32_t TimingDelay = 0;
void SysTick_Handler(void)
{
if(TimingDelay >0)
{
TimingDelay --;
}
}

猜你喜欢

转载自blog.csdn.net/News53231323/article/details/113245056