stm32运用systick定时器
主要代码如下:
systick.c:
#include "systick.h"
static __IO u32 TimingDelay;
// 获取节拍程序
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
}
// us延时程序
void Delay_us(__IO u32 nTime)
{
TimingDelay = nTime;
// 使能滴答定时器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
// 等待计时器减到 0
while (TimingDelay != 0);
// 关闭系统滴答定时器
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
// 初始化配置系统滴答定时器 SysTick
void SysTick_Init(void)
{
// 计算每次 SysTick 中断的时间间隔为 1 微秒
if (SysTick_Config(SystemCoreClock / 1000000))
{
// 如果配置失败,进入死循环
while (1);
}
// 关闭系统滴答定时器,等待需要延时时再开启定时器
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
systick.h:
#ifndef __SYSTICK_H__
#define __SYSTICK_H__
#include <stm32f10x.h>
// 初始化SysTick定时器
void SysTick_Init(void);
// 更新节拍计数器
void TimingDelay_Decrement(void);
// 微秒级延时函数
void Delay_us(__IO u32 nTime);
// 毫秒级延时函数
#define Delay_ms(x) Delay_us(1000 * x) // 单位ms
#endif
main.c:
#include "stm32f10x.h"
#include "LED.h"
#include "systick.h"
static uint16_t timecount;
int main(void)
{
LED_Init();
SysTick_Init();
// 清零时间计数
timecount = 0;
while (1)
{
// 延时10ms
Delay_ms(10);
// 每10ms计数值增加1
timecount++;
// 计数到10,延时时间为100ms
if (timecount == 50)
{
LED_Alternate();
// 清零时间计数
timecount = 0;
}
}
}
LED.c:
#include "stm32f10x.h"
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA, GPIO_Pin_8); // 默认关闭LED1
GPIO_SetBits(GPIOA, GPIO_Pin_11); // 默认关闭LED2
}
void LED1_On(void)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_8);
}
void LED1_Off(void)
{
GPIO_SetBits(GPIOA, GPIO_Pin_8);
}
void LED2_On(void)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_11);
}
void LED2_Off(void)
{
GPIO_SetBits(GPIOA, GPIO_Pin_11);
}
void LED_Alternate(void)
{
static int toggle = 0;
if (toggle == 0)
{
LED1_On();
LED2_Off();
}
else
{
LED1_Off();
LED2_On();
}
toggle = !toggle;
}
LED.h:
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
void LED1_On(void);
void LED1_Off(void);
void LED2_On(void);
void LED2_Off(void);
void LED_Alternate(void);
#endif
演示视频如下:
stm32systick定时器