SysTick系统定时器
1. 使用系统定时器实现流水灯效果。
2. 代码:
main.c
#include "stm32f10x.h"
#include "bsp_led.h"
#include "bsp_systick.h"
int main(void)
{
LED_GPIO_Config();
while(1)
{
//方法1
/*绿灯*/
GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); /*开灯*/
SysTick_Delay_ms(500);
GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); //关灯
SysTick_Delay_ms(500);
// //方法2
// LED_G(OFF); //关灯
// SysTick_Delay_ms(500);
// LED_G(ON); /*开灯*/
// SysTick_Delay_ms(500);
}
}
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++)
{
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++)
{
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*/
bsp_led.c
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(LED_G_GPIO_CLK,ENABLE);
GPIO_InitStruct.GPIO_Pin = LED_G_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStruct);
}
bsp_led.h
#ifndef __bsp_led_h #define __bsp_led_h #include "stm32f10x.h" //方法1 #define LED_G_GPIO_PIN GPIO_Pin_0 #define LED_G_GPIO_PORT GPIOB #define LED_G_GPIO_CLK RCC_APB2Periph_GPIOB //方法2 #define ON 1 #define OFF 0 #define LED_G(a) if(a) GPIO_SetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); \ else GPIO_ResetBits(LED_G_GPIO_PORT,LED_G_GPIO_PIN); void LED_GPIO_Config(void); #endif /*__bsp_led_h*/
3. 参考资料
- SysTick—系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。
- 因为 SysTick 是属于 CM3 内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。
- 编程要点
- 设置重装载寄存器的值
- 清除当前数值寄存器的值
- 配置控制与状态寄存器
- 原理图
-
4. 总结

浙公网安备 33010602011771号