实验目的:利用 SysTick 产生 1s 的时基,LED 以 1s 的频率闪烁。
编程要点
1、设置重装载寄存器的值
2、清除当前数值寄存器的值
3、配置控制与状态寄存器
过程
我们创建了两个文件:bsp_SysTick.c 和 bsp_ SysTick.h 文件用来存放 SysTick 驱动程序及相关宏定义。
bsp_systick.c
#include “bsp_systick.h” void SysTick_Delay_us(uint32_t us) { uint32_t i; SysTick_Config(72); for(i=0; i<us; i++) { //读取SysTick的CTRL的第十六位,读取后自动置0,重复us次,每次1us while( !((SysTick->CTRL) & (1<<16)) ); } SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk; } void SysTick_Delay_ms(uint32_t ms) { uint32_t i; SysTick_Config(72000); for(i=0; i<ms; i++) { //读取SysTick的CTRL的第十六位,读取后自动置0,重复ms次,每次1ms
while( !((SysTick->CTRL) & (1<<16)) );
}
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
bsp_systick.h
#ifndef __BSP_SYSTICK_H #define __BSP_SYSTICK_H #include "stm32f10x.h" #include "core_cm3.h" void SysTick_Delay_us(uint32_t us); void SysTick_Delay_ms(uint32_t ms); #endif /* __BSP_SYSTICK_H */
main.c
#include "stm32f10x.h" // 相当于51单片机中的 #include <reg51.h> #include "bsp_led.h" void Delay( uint32_t count ) { for(; count!=0; count--); } int main(void) { // 来到这里的时候,系统的时钟已经被配置成72M。 LED_GPIO_Config(); while(1) { LED_G(OFF); SysTick_Delay_ms(500); LED_G(ON); SysTick_Delay_ms(500); } }