4、【STM32F0系列学习】之—Systick定时器

    技术2022-07-11  105

    【STM32F0系列学习】之—SysTick定时器

    1、SysTick定时器简介2、SysTick寄存器介绍3、SysTick定时实验3.1、【标准库】编程的配置3.1.1、基于查询方式的配置3.1.1、基于中断方式的配置 3.2、【HAL库】编程的配置3.2.1、基于查询方式的配置3.2.2、基于中断方式的配置

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

    Processed: 0.011, SQL: 9