目录
1 SysTick简介
2?SysTick功能框图
3?SysTick寄存器 ?
1 CTRL控制及状态寄存器
?2 LOAD重装载数值寄存器?
?3 VAL当前数值寄存器?
4??SysTick定时时间计算
5 Sys Tick寄存器结构体
6??Sys Tick库函数
7 延时函数程序编写?
?8 运行状况
1 SysTick简介
? ? ? ? SysTick是STM32系统内部的定时器,计数器为24位,并且只能够递减,存在于内核中,嵌套在NVIC中,所有的Cortex-M内核的单片机都具有这个定时器。?
2?SysTick功能框图
? ? ? ??
? ? ? ? 计数器在时钟的驱动下,从reload初值开始往下递减计数到0,产生中断和置位COUNTFLAG标志。然后又从reload值开始重新递减计数,循环下去。
3?SysTick寄存器 ?
1 CTRL控制及状态寄存器
?2 LOAD重装载数值寄存器?
?3 VAL当前数值寄存器?
4??SysTick定时时间计算
?t:一个计数循环的时间,跟RELOAD和CLK有关
?CLK:有72M或者9M,由CTRL寄存器配置
?RELOAD:24位,用户自己来配置
?t = RELOAD * (1 / CLK)
?所以当CLK设置为72M时
RELOAD = 72 --------->>>>>>>>t = 1us
RELOAD = 72000 --------->>>>>>>>t = 1ms
5 Sys Tick寄存器结构体
6??Sys Tick库函数
7 延时函数程序编写?
延时函数
#include "bsp_systick.h"
void Systick_Delay_us(uint32_t us)
{
uint32_t i = 0;
SysTick_Config(72); //RELOAD重装载值72>>>>>>>>1us
for(i = 0;i < us;i++)
{
while(!((SysTick->CTRL) & (1<<16)));
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
void Systick_Delay_ms(uint32_t ms)
{
uint32_t i = 0;
SysTick_Config(72000); //RELOAD重装载值72>>>>>>>>1ms
for(i = 0;i < ms;i++)
{
while(!((SysTick->CTRL) & (1<<16)));
}
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
主函数
#include "stm32f10x.h" //相当于51的 #include<reg52.h>
#include "bsp_led.h"
#include "bsp_systick.h"
void Delay(uint32_t count)
{
for(;count != 0;count--);
}
int main(void)
{
//在这里系统的函数已经被配置成72M
LED_GPIO_Config();
while(1)
{
LED_G(ON);LED_R(OFF);LED_B(OFF);
Systick_Delay_ms(1000);
LED_G(OFF);LED_R(OFF);LED_B(OFF);
Systick_Delay_ms(1000);
LED_R(ON);LED_G(OFF);LED_B(OFF);
Systick_Delay_ms(1000);
LED_G(OFF);LED_R(OFF);LED_B(OFF);
Systick_Delay_ms(1000);
LED_B(ON);LED_G(OFF);LED_R(OFF);
Systick_Delay_ms(1000);
LED_G(OFF);LED_R(OFF);LED_B(OFF);
Systick_Delay_ms(1000);
}
}
?8 运行状况
|