由PC3端口输出图像可以看出,SysTick定时器的定时时间为1s,相应的,PC3端口电平每1s翻转一次,对应的硬件实验现象就是PC3引脚所控制的灯的状态每1s翻转一次。
1. main.c
#include \#include \#include \// /*
* t : 定时时间
* Ticks : 多少个时钟周期产生一次中断 * f : 时钟频率 72000000
* t = Ticks * 1/f = (72000000/100000) * (1/72000000) = 10us */
FlagStatus SysTick_GetFlagStatus(u8 SysTick_FLAG);
extern __IO u32 TimingDelay;
int main(void) { }
2.bsp_SysTick.c #include \
//static __IO u32 TimingDelay; __IO u32 TimingDelay; /**
* @brief 启动系统滴答定时器 SysTick * @param 无 * @retval 无
/* LED 端口初始化 */ LED_GPIO_Config();
/* 配置SysTick 为1ms中断一次 */ SysTick_Init(); for(;;) { }
LED1_TOGGLE; //定时时间到,LED1发生翻转 Delay_us(10000);
*/
void SysTick_Init(void) {
/* SystemFrequency / 1000 1ms中断一次 * SystemFrequency / 100000
10us中断一次
* SystemFrequency / 1000000 1us中断一次 */
// ST3.0.0库版本
// if (SysTick_Config(SystemFrequency / 100000))
if (SysTick_Config(SystemCoreClock / 1000)) // ST3.5.0库版本 { }
// 关闭滴答定时器 /* Capture error */ while (1);
//SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
//SysTick中断关断的使能关断,故关闭滴答定时器的函数也可关断。 }
//通过查询SysTick控制与状态寄存器 的COUNTFLAG位,实现定时 void Delay_us(__IO u32 nTime) {
TimingDelay = nTime;
//nTime定义10us循环的次数,想要实现1s的定时,则nTime=100000
// 使能滴答定时器
//SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
//大循环,nTime控制循环次数
while(TimingDelay != 0)
/*小循环,定时器每次计数10us,计数时间到达后,SysTick->CTRL寄存器中的,16位标志位置1,否则为0。SysTick_CTRL_COUNTFLAG_Msk是1左移16位后的数,则其第16位为1,其他位为0。SysTick->CTRL 与 SysTick_CTRL_COUNTFLAG_Msk进行与操作,只有当SysTick->CTRL的第16位也为1时,if条件句成立,即定时器技术时间到,则TimingDelay减一,再进入下一次循环。*/
if(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) {TimingDelay--;
SysTick->CTRL &= ~(SysTick_CTRL_COUNTFLAG_Msk);
} }
void TimingDelay_Decrement(void) { }
if (TimingDelay != 0x00) { }
TimingDelay--;