4、【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_CTRLSystick 控制及状态寄存器
SYS_LOADSystick 重装在数值寄存器
SYS_VALSystick 当前数值寄存器
SYS_CALIBSystick 校准数值寄存器

SYS_CTRL 控制寄存器
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 重载寄存器
STK_LOAD重载寄存器
SysTick是一个递减的定时器,当定时器递减至0时,重载寄存器中的值就会被重装载,继续开始递减。STK_LOAD 重载寄存器是个24位的寄存器,最大计数值为 0xFFFFFF。

STK_VAL 当前值寄存器
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库编程,都建议采用查询的方式来达到精确延时的实现。

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Geek@Yang

码字不易,来点鼓励~~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值