【STM32F0系列学习】之—SysTick定时器
1、SysTick定时器简介
SysTick—系统定时器是属于 STM32 内核中的一个外设,内嵌在 NVIC 中。该定时器的时钟源可以是内部时钟,也可以是外部时钟。系统定时器是一个 24bit 的向下递减的计数器,SysTick设定初值并使能后,计数器每计数一次的时间为 1/SYSCLK, 即每经过 1 个时钟周期,计数值就减 1,一般我们设置系统时钟 SYSCLK 等于 48MHz。计数到 0 时,SysTick 计数器自动重装初值并继续计数,同时内部的 COUNTFLAG 标志会置位,触发中断(如果中断使能情况下),以此循环往复。
因为 SysTick 是属于 STM32 内核的外设,所有的STM32芯片都带有这个定时器,软件在不同STM32器件间很容易移植。SysTick定时器一般用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如UCOS中,分时复用,需要一个最小的时间戳,一般在STM32 + UCOS系统中,都采用SysTick做UCOS心跳时钟。
2、SysTick寄存器介绍
SysTick—系统定时器有4个寄存器,简要介绍如下。在使用 SysTick 产生定时的时候,只需要配置前三个寄存器,最后一个校准寄存器不需要使用。
寄存器名称 | 寄存器描述 |
---|---|
SYS_CTRL | Systick 控制及状态寄存器 |
SYS_LOAD | Systick 重装在数值寄存器 |
SYS_VAL | Systick 当前数值寄存器 |
SYS_CALIB | Systick 校准数值寄存器 |
SYS_CTRL 控制寄存器
第0位:ENABLE,SysTick 使能位 (0:关闭SysTick功能;1:开启SysTick功能)
第1位:TICKINT,SysTick 中断使能位(0:关闭SysTick中断;1:开启SysTick中断)
第2位:CLKSOURCE,SysTick时钟源选择(0:AHB/8;1:AHB时钟)
第16位:COUNTFLAG,SysTick计数比较标志,如果在上次读取本寄存器后,SysTick已经计数到了0,则该位为1。如果读取该位,该位将自动清零。
STK_LOAD 重载寄存器
SysTick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD 重载寄存器是个24位的寄存器,最大计数值为 0xFFFFFF。
STK_VAL 当前值寄存器
也是个24位的寄存器,读取时返回当前倒计数的值,写它则使之清零,同时还会清除在 SysTick 控制及状态寄存器中的 COUNTFLAG 标志。
3、SysTick定时实验
使用SysTick定时器做精确延时,通过调整延时时间来调节 LED1 闪烁时间。LED的相关定义和代码请参考上一篇文章,此处不在列出。
3.1、【标准库】编程的配置
3.1.1、基于查询方式的配置
/*----------------------------------------- led.h -----------------------------------------*/
/**
********************************* STM32F0xx ********************************
* @文件名 : led.h
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : LED驱动头文件
******************************************************************************/
/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _LED_H
#define _LED_H
/* 包含的头文件 --------------------------------------------------------------*/
#include "stm32f0xx.h"
/* 宏定义 --------------------------------------------------------------------*/
#define LED_PORT GPIOC //LED端口
#define LED_1_PIN GPIO_Pin_6 //LED1
#define LED_R_PIN GPIO_Pin_7 //LED_R
#define LED_G_PIN GPIO_Pin_8 //LED_G
#define LED_B_PIN GPIO_Pin_9 //LED_B
#define LED_1_ON GPIO_ResetBits(LED_PORT,LED_1_PIN) //点亮LED1
#define LED_1_OFF GPIO_SetBits(LED_PORT,LED_1_PIN) //熄灭LED1
#define LED_1_TOGGLE (LED_PORT->ODR ^= LED_1_PIN) //LED1取反
#define LED_R_ON GPIO_ResetBits(LED_PORT,LED_R_PIN) //点亮LED_R
#define LED_R_OFF GPIO_SetBits(LED_PORT,LED_R_PIN) //熄灭LED_R
#define LED_R_TOGGLE (LED_PORT->ODR ^= LED_R_PIN) //LED_R取反
#define LED_G_ON GPIO_ResetBits(LED_PORT,LED_G_PIN) //点亮LED_G
#define LED_G_OFF GPIO_SetBits(LED_PORT,LED_G_PIN) //熄灭LED_G
#define LED_G_TOGGLE (LED_PORT->ODR ^= LED_G_PIN) //LED_G取反
#define LED_B_ON GPIO_ResetBits(LED_PORT,LED_B_PIN) //点亮LED_B
#define LED_B_OFF GPIO_SetBits(LED_PORT,LED_B_PIN) //熄灭LED_B
#define LED_B_TOGGLE (LED_PORT->ODR ^= LED_B_PIN) //LED_B取反
/* 函数申明 ------------------------------------------------------------------*/
void LED_Configuration(void);
#endif /* _LED_H */
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- led.c -----------------------------------------*/
/**
******************************** STM32F0xx *********************************
* @文件名 : led.c
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : LED驱动源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2020-06-24 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "led.h"
/************************************************
函数名称 : LED_Configuration
功 能 : LED引脚配置
参 数 : 无
返 回 值 : 无
作 者 : JayYang
*************************************************/
void LED_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = LED_1_PIN; //LED1引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //高速输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推完输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(LED_PORT, &GPIO_InitStructure);
}
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- systick.h -----------------------------------------*/
/**
********************************* STM32F0xx ********************************
* @文件名 : systick.h
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年07月02日
* @摘要 : 系统定时器头文件
******************************************************************************/
/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _SYSTICK_H
#define _SYSTICK_H
/* 包含的头文件 --------------------------------------------------------------*/
#include "stm32f0xx.h"
#include "core_cm0.h"
/* 宏定义 --------------------------------------------------------------------*/
/* 变量定义 --------------------------------------------------------------------*/
/* 函数申明 ------------------------------------------------------------------*/
void Delay_us(__IO uint32_t nUS); //微秒延时函数
void Delay_ms(__IO uint32_t nMS); //毫秒延时函数
#endif /* _SYSTICK_H */
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- systick.c -----------------------------------------*/
/**
******************************** STM32F0xx *********************************
* @文件名 : systick.c
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年07月02日
* @摘要 : 系统定时器源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2020-07-02 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "systick.h"
/* 变量定义 --------------------------------------------------------------------*/
/************************************************
函数名称 : Delay_us
功 能 : 微秒延时函数
参 数 : nUS:延时的微秒数
48MHz时钟可取值为 1~349525us,
6MHz时钟可取值为 1~2796202us
返 回 值 : 无
作 者 : JayYang
*************************************************/
void Delay_us(__IO uint32_t nUS){
uint32_t temp;
SysTick->LOAD = SystemCoreClock/8000000 * nUS; //当SysTick嘀嗒定时器的时钟源采用HCLK时,设置延时的微妙数
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能嘀嗒定时器
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达
SysTick->CTRL &= ~SysTick_CTRL_COUNTFLAG_Msk; //计数比较标志清0
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL=0x00; //清空计数器
}
/************************************************
函数名称 : Delay_ms
功 能 : 毫秒延时函数
参 数 : nMS:延时的毫秒数,
48MHz时钟可取值为 1~300ms,
6MHz时钟可取值为 1~2000ms
返 回 值 : 无
作 者 : JayYang
*************************************************/
void Delay_ms(__IO uint32_t nMS){
uint32_t temp;
SysTick->LOAD = SystemCoreClock/8000 * nMS; //当SysTick嘀嗒定时器的时钟源采用HCLK时,设置延时的毫妙数
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能嘀嗒定时器
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达
SysTick->CTRL &= ~SysTick_CTRL_COUNTFLAG_Msk; //计数比较标志清0
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; //关闭计数器
SysTick->VAL=0x00; //清空计数器
}
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- bsp.h -----------------------------------------*/
/**
********************************* STM32F0xx ********************************
* @文件名 : bsp.h
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : BSP板级支持包头文件
******************************************************************************/
/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _BSP_H
#define _BSP_H
/* 包含的头文件 --------------------------------------------------------------*/
#include "stm32f0xx.h"
#include "led.h"
#include "systick.h"
/* 宏定义 --------------------------------------------------------------------*/
/* 函数申明 ------------------------------------------------------------------*/
void RCC_Configuration(void);
void BSP_Initializes(void);
#endif /* _BSP_H */
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- bsp.c -----------------------------------------*/
/**
******************************** STM32F0xx *********************************
* @文件名 : bsp.c
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : BSP板级支持包源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2020-06-24 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "bsp.h"
/************************************************
函数名称 : RCC_Configuration
功 能 : 时钟配置
参 数 : 无
返 回 值 : 无
作 者 : JayYang
*************************************************/
void RCC_Configuration(void)
{
/* 使能AHB时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);
}
/************************************************
函数名称 : BSP_Initializes
功 能 : 底层初始化
参 数 : 无
返 回 值 : 无
作 者 : JayYang
*************************************************/
void BSP_Initializes(void)
{
RCC_Configuration(); //时钟配置
LED_Configuration(); //LED配置
}
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- main.c -----------------------------------------*/
/**
******************************** STM32F0xx *********************************
* @文件名 : main.c
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : 主函数 - 工程模板
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2020-06-24 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "bsp.h"
/************************************************
函数名称 : main
功 能 : 主函数入口
参 数 : 无
返 回 值 : int
作 者 : JayYang
*************************************************/
int main(void)
{
BSP_Initializes();
while(1)
{
LED_1_TOGGLE;
// Delay_ms(500);
Delay_ms(1000);
}
}
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
3.1.1、基于中断方式的配置
/*----------------------------------------- led.h -----------------------------------------*/
/**
********************************* STM32F0xx ********************************
* @文件名 : led.h
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : LED驱动头文件
******************************************************************************/
/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _LED_H
#define _LED_H
/* 包含的头文件 --------------------------------------------------------------*/
#include "stm32f0xx.h"
/* 宏定义 --------------------------------------------------------------------*/
#define LED_PORT GPIOC //LED端口
#define LED_1_PIN GPIO_Pin_6 //LED1
#define LED_R_PIN GPIO_Pin_7 //LED_R
#define LED_G_PIN GPIO_Pin_8 //LED_G
#define LED_B_PIN GPIO_Pin_9 //LED_B
#define LED_1_ON GPIO_ResetBits(LED_PORT,LED_1_PIN) //点亮LED1
#define LED_1_OFF GPIO_SetBits(LED_PORT,LED_1_PIN) //熄灭LED1
#define LED_1_TOGGLE (LED_PORT->ODR ^= LED_1_PIN) //LED1取反
#define LED_R_ON GPIO_ResetBits(LED_PORT,LED_R_PIN) //点亮LED_R
#define LED_R_OFF GPIO_SetBits(LED_PORT,LED_R_PIN) //熄灭LED_R
#define LED_R_TOGGLE (LED_PORT->ODR ^= LED_R_PIN) //LED_R取反
#define LED_G_ON GPIO_ResetBits(LED_PORT,LED_G_PIN) //点亮LED_G
#define LED_G_OFF GPIO_SetBits(LED_PORT,LED_G_PIN) //熄灭LED_G
#define LED_G_TOGGLE (LED_PORT->ODR ^= LED_G_PIN) //LED_G取反
#define LED_B_ON GPIO_ResetBits(LED_PORT,LED_B_PIN) //点亮LED_B
#define LED_B_OFF GPIO_SetBits(LED_PORT,LED_B_PIN) //熄灭LED_B
#define LED_B_TOGGLE (LED_PORT->ODR ^= LED_B_PIN) //LED_B取反
/* 函数申明 ------------------------------------------------------------------*/
void LED_Configuration(void);
#endif /* _LED_H */
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- led.c -----------------------------------------*/
/**
******************************** STM32F0xx *********************************
* @文件名 : led.c
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : LED驱动源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2020-06-24 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "led.h"
/************************************************
函数名称 : LED_Configuration
功 能 : LED引脚配置
参 数 : 无
返 回 值 : 无
作 者 : JayYang
*************************************************/
void LED_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = LED_1_PIN; //LED1引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //高速输出
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推完输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(LED_PORT, &GPIO_InitStructure);
}
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- systick.h -----------------------------------------*/
/**
********************************* STM32F0xx ********************************
* @文件名 : systick.h
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年07月02日
* @摘要 : 系统定时器头文件
******************************************************************************/
/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _SYSTICK_H
#define _SYSTICK_H
/* 包含的头文件 --------------------------------------------------------------*/
#include "stm32f0xx.h"
#include "core_cm0.h"
/* 宏定义 --------------------------------------------------------------------*/
/* 变量定义 --------------------------------------------------------------------*/
extern uint32_t TimingDelay;
/* 函数申明 ------------------------------------------------------------------*/
void Delay_us(__IO uint32_t nUS); //微秒延时函数
void Delay_ms(__IO uint32_t nMS); //毫秒延时函数
#endif /* _SYSTICK_H */
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- systick.c -----------------------------------------*/
/**
******************************** STM32F0xx *********************************
* @文件名 : systick.c
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年07月02日
* @摘要 : 系统定时器源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2020-07-02 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "systick.h"
/* 变量定义 --------------------------------------------------------------------*/
uint32_t TimingDelay=0; //中断中的延时时间定义
/************************************************
函数名称 : Delay_us
功 能 : 微秒延时函数
参 数 : nUS:延时的微秒数
48MHz时钟可取值为 1~34952us,
6MHz时钟可取值为 1~279620us
返 回 值 : 无
作 者 : JayYang
*************************************************/
void Delay_us(__IO uint32_t nUS){
SysTick_Config(SystemCoreClock/100000); //当SysTick嘀嗒定时器的时钟源采用HCLK时,每10us 中断一次
TimingDelay = nUS;
while(TimingDelay != 0);
}
/************************************************
函数名称 : Delay_ms
功 能 : 毫秒延时函数
参 数 : nMS:延时的毫秒数,
48MHz时钟可取值为 1~300ms,
6MHz时钟可取值为 1~2000ms
返 回 值 : 无
作 者 : JayYang
*************************************************/
void Delay_ms(__IO uint32_t nMS){
SysTick_Config(SystemCoreClock/1000); //当SysTick嘀嗒定时器的时钟源采用HCLK时,每1ms 中断一次
TimingDelay = nMS;
while(TimingDelay != 0);
}
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- stm32f0xx_it.c -----------------------------------------*/
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
if(TimingDelay != 0){
TimingDelay--;
}
}
/*----------------------------------------- bsp.h -----------------------------------------*/
/**
********************************* STM32F0xx ********************************
* @文件名 : bsp.h
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : BSP板级支持包头文件
******************************************************************************/
/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _BSP_H
#define _BSP_H
/* 包含的头文件 --------------------------------------------------------------*/
#include "stm32f0xx.h"
#include "led.h"
#include "systick.h"
/* 宏定义 --------------------------------------------------------------------*/
/* 函数申明 ------------------------------------------------------------------*/
void RCC_Configuration(void);
void BSP_Initializes(void);
#endif /* _BSP_H */
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- bsp.c -----------------------------------------*/
/**
******************************** STM32F0xx *********************************
* @文件名 : bsp.c
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : BSP板级支持包源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2020-06-24 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "bsp.h"
/************************************************
函数名称 : RCC_Configuration
功 能 : 时钟配置
参 数 : 无
返 回 值 : 无
作 者 : JayYang
*************************************************/
void RCC_Configuration(void)
{
/* 使能AHB时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB |
RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOF, ENABLE);
}
/************************************************
函数名称 : BSP_Initializes
功 能 : 底层初始化
参 数 : 无
返 回 值 : 无
作 者 : JayYang
*************************************************/
void BSP_Initializes(void)
{
RCC_Configuration(); //时钟配置
LED_Configuration(); //LED配置
}
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- main.c -----------------------------------------*/
/**
******************************** STM32F0xx *********************************
* @文件名 : main.c
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : 主函数 - 工程模板
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2020-06-24 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "bsp.h"
/************************************************
函数名称 : main
功 能 : 主函数入口
参 数 : 无
返 回 值 : int
作 者 : JayYang
*************************************************/
int main(void)
{
BSP_Initializes();
while(1)
{
LED_1_TOGGLE;
Delay_ms(500);
// Delay_ms(1000);
}
}
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
3.2、【HAL库】编程的配置
步骤:
1、配置RCC时钟
2、配置SysTick
至此,要点配置以完成,至于LED1引脚的相关配置及项目生成的配置本篇不在叙述,请参考上一篇文章。无论是查询方式还是中断方式,CubeMX的配置是一样的,下面针对查询方式和中断方式在代码上的区别进行说明。
3、编写相关代码
3.2.1、基于查询方式的配置
/*----------------------------------------- led.h -----------------------------------------*/
/**
********************************* STM32F0xx ********************************
* @文件名 : led.h
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : LED驱动头文件
******************************************************************************/
/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _LED_H
#define _LED_H
/* 包含的头文件 --------------------------------------------------------------*/
#include "main.h"
#include "stm32f0xx_hal.h"
/* 宏定义 --------------------------------------------------------------------*/
#define LED_1_ON HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, GPIO_PIN_RESET) //点亮LED1
#define LED_1_OFF HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, GPIO_PIN_SET) //熄灭LED1
#define LED_1_TOGGLE HAL_GPIO_TogglePin(LED_1_GPIO_Port,LED_1_Pin) //LED1取反
#endif
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- led.c -----------------------------------------*/
/**
******************************** STM32F0xx *********************************
* @文件名 : led.c
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : LED驱动源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2020-06-24 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "bsp.h"
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- systick.h -----------------------------------------*/
/**
********************************* STM32F0xx ********************************
* @文件名 : systick.h
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年07月02日
* @摘要 : 系统定时器头文件
******************************************************************************/
/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _SYSTICK_H
#define _SYSTICK_H
/* 包含的头文件 --------------------------------------------------------------*/
#include "stm32f0xx.h"
#include "core_cm0.h"
/* 宏定义 --------------------------------------------------------------------*/
/* 变量定义 --------------------------------------------------------------------*/
/* 函数申明 ------------------------------------------------------------------*/
void Delay_us(__IO uint32_t nUS); //微秒延时函数
void Delay_ms(__IO uint32_t nMS); //毫秒延时函数
#endif /* _SYSTICK_H */
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- systick.c -----------------------------------------*/
/**
******************************** STM32F0xx *********************************
* @文件名 : systick.c
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年07月02日
* @摘要 : 系统定时器源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2020-07-02 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "bsp.h"
/* 变量定义 --------------------------------------------------------------------*/
/* 函数定义 --------------------------------------------------------------------*/
/************************************************
函数名称 : Delay_us
功 能 : 微秒延时函数
参 数 : nUS:延时的微秒数
48MHz时钟可取值为 1~349525us,
6MHz时钟可取值为 1~2796202us
返 回 值 : 无
作 者 : JayYang
*************************************************/
void Delay_us(__IO uint32_t nUS){
uint32_t temp;
SysTick->LOAD = 6 * nUS; //当SysTick嘀嗒定时器的时钟源采用HCLK时,设置延时的微妙数
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能嘀嗒定时器
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL=0x00; //清空计数器
}
/************************************************
函数名称 : Delay_ms
功 能 : 毫秒延时函数
参 数 : nMS:延时的毫秒数,
48MHz时钟可取值为 1~300ms,
6MHz时钟可取值为 1~2000ms
返 回 值 : 无
作 者 : JayYang
*************************************************/
void Delay_ms(__IO uint32_t nMS){
uint32_t temp;
SysTick->LOAD = 6000 * nMS; //当SysTick嘀嗒定时器的时钟源采用HCLK时,设置延时的毫妙数
SysTick->VAL=0x00; //清空计数器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //使能嘀嗒定时器
do
{
temp=SysTick->CTRL;//读取当前倒计数值
}while((temp&0x01)&&(!(temp&(1<<16)))); //等待时间到达
SysTick->CTRL=0x00; //关闭计数器
SysTick->VAL=0x00; //清空计数器
}
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- bsp.h -----------------------------------------*/
/**
********************************* STM32F0xx ********************************
* @文件名 : bsp.h
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : BSP板级支持包头文件
******************************************************************************/
/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _BSP_H
#define _BSP_H
/* 包含的头文件 --------------------------------------------------------------*/
#include "main.h"
#include "stm32f0xx_hal.h"
#include "gpio.h"
#include "led.h"
#include "systick.h"
/* 函数声明 --------------------------------------------------------------*/
void BSP_Initializes(void); //底层初始化
#endif
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- bsp.c -----------------------------------------*/
/**
******************************** STM32F0xx *********************************
* @文件名 : bsp.c
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : BSP板级支持包源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2020-06-24 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "bsp.h"
/************************************************
函数名称 : BSP_Initializes
功 能 : 底层初始化
参 数 : 无
返 回 值 : 无
作 者 : JayYang
*************************************************/
void BSP_Initializes(void)
{
Delay_ms(20);
}
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- main.c -----------------------------------------*/
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
BSP_Initializes();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
LED_1_TOGGLE;
// Delay_ms(500);
Delay_ms(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
3.2.2、基于中断方式的配置
说明:因为有CubeMX生成的项目中默认有一个HAL库的延时函数 HAL_Delay(),此函数是毫秒级延时函数,HAL_Delay(500);就代表延时500ms,而且是基于SysTick中断的方式实现的,所以直接使用就行,不需要再进行额外的配置。
/*----------------------------------------- led.h -----------------------------------------*/
/**
********************************* STM32F0xx ********************************
* @文件名 : led.h
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : LED驱动头文件
******************************************************************************/
/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _LED_H
#define _LED_H
/* 包含的头文件 --------------------------------------------------------------*/
#include "main.h"
#include "stm32f0xx_hal.h"
/* 宏定义 --------------------------------------------------------------------*/
#define LED_1_ON HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, GPIO_PIN_RESET) //点亮LED1
#define LED_1_OFF HAL_GPIO_WritePin(LED_1_GPIO_Port, LED_1_Pin, GPIO_PIN_SET) //熄灭LED1
#define LED_1_TOGGLE HAL_GPIO_TogglePin(LED_1_GPIO_Port,LED_1_Pin) //LED1取反
#endif
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- led.c -----------------------------------------*/
/**
******************************** STM32F0xx *********************************
* @文件名 : led.c
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : LED驱动源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2020-06-24 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "bsp.h"
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- bsp.h -----------------------------------------*/
/**
********************************* STM32F0xx ********************************
* @文件名 : bsp.h
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : BSP板级支持包头文件
******************************************************************************/
/* 定义防止递归包含 ----------------------------------------------------------*/
#ifndef _BSP_H
#define _BSP_H
/* 包含的头文件 --------------------------------------------------------------*/
#include "main.h"
#include "stm32f0xx_hal.h"
#include "gpio.h"
#include "led.h"
#include "systick.h"
/* 函数声明 --------------------------------------------------------------*/
void BSP_Initializes(void); //底层初始化
#endif
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- bsp.c -----------------------------------------*/
/**
******************************** STM32F0xx *********************************
* @文件名 : bsp.c
* @作者 : JayYang
* @库版本 : V1.5.0
* @文件版本 : V1.0.0
* @日期 : 2020年06月24日
* @摘要 : BSP板级支持包源文件
******************************************************************************/
/*----------------------------------------------------------------------------
更新日志:
2020-06-24 V1.0.0:初始版本
----------------------------------------------------------------------------*/
/* 包含的头文件 --------------------------------------------------------------*/
#include "bsp.h"
/************************************************
函数名称 : BSP_Initializes
功 能 : 底层初始化
参 数 : 无
返 回 值 : 无
作 者 : JayYang
*************************************************/
void BSP_Initializes(void)
{
}
/**** Copyright (C)2020 JayYang. All Rights Reserved **** END OF FILE ****/
/*----------------------------------------- main.c -----------------------------------------*/
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
BSP_Initializes();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
LED_1_TOGGLE;
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
总结,上面是关于 Contex 内核中的 SysTick 系统嘀嗒定时器的一些学习笔记及汇总,总的来说,常规情况下是不使用非中断的方式实现精确延时的,只使用系统嘀嗒定时器的计数功能来达到精确延时的目的,如果采用中断的方式,频繁进中断有时会影响系统,严重的会导致系统卡死。所以无论是采用标准库还是HAL库编程,都建议采用查询的方式来达到精确延时的实现。