寄存器实现
systic.h
#ifndef __SYSTICK_H
#define __SYSTICK_H
#include "stm32f10x.h"
#include "led.h"
void Systick_Init(void);
#endif
systic.c
#include "systick.h"
void Systick_Init(void)
{
// 1. 设置重装载值,每1ms产生一次中断
SysTick->LOAD = 71999;
// 2. 配置时钟源,AHB = 72MHz
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE;
// 3. 使能中断
SysTick->CTRL |= SysTick_CTRL_TICKINT;
// 4. 开启定时器
SysTick->CTRL |= SysTick_CTRL_ENABLE;
}
// 定义一个变量,用于计数(单位ms)
uint16_t count = 0;
// 中断服务程序
void SysTick_Handler(void)
{
count ++;
// 如果已经达到了1000ms,就翻转LED1
if (count == 1000)
{
LED_Toggle(LED1);
count = 0; // 清零count
}
}
main.c
#include "usart.h"
#include "led.h"
#include "systick.h"
int main(void)
{
// 初始化
USART_Init();
LED_Init();
Systick_Init();
while(1)
{
}
}
HAL库实现
CubeMX配置
SYS,RCC,Clock Configuration都照常设置
PA0设置GPIO_output
GPIO设置

NVIC中断优先级不用更改
stm32f1xx_it.c
/**
* @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
if (uwTick % 1000 == 0)
{
HAL_GPIO_TogglePin(GPIOA, LED1_Pin);
}
/* USER CODE END SysTick_IRQn 1 */
}这里的uwTickFreq设置为1,uwTick是一个全局变量,代表单片机开始运行时运行的时间的时间
因此上面可以直接使用这个全局变量进行代码的编写
由于这是一个全局变量,因此不能随意将此位置0
所以只是做了整除然后判断
/** * @brief This function is called to increment a global variable "uwTick" * used as application time base. * @note In the default implementation, this variable is incremented each 1ms * in SysTick ISR. * @note This function is declared as __weak to be overwritten in case of other * implementations in user file. * @retval None */ __weak void HAL_IncTick(void) { uwTick += uwTickFreq; }