STM32 SysTick秒用

发布者:cannon928最新更新时间:2022-08-10 来源: csdn关键字:STM32  SysTick  微秒延时 手机看文章 扫描二维码
随时随地手机看文章

这里针对的是无操作系统的情况下的使用。之前一直想利用systick既实现记录系统运行时间又能够精确实现微秒延时的功能,如果将SysTick的定时器的定时中断时间设置为1us,这在有些情况下会导致死机的问题。这样的话就无法利用systick来实现us延时函数了。

利用SysTick实现1ms定时中断,us延时函数可以利用SysTick的寄存器来运算得到精确的延时函数,具体实现如下:


头文件:


#ifndef __SYSTICK_H

#define __SYSTICK_H


#ifdef __cplusplus

 extern "C" {

#endif

   

/* Includes ------------------------------------------------------------------*/  

#include "stm32f10x.h"  

  

#define millis getCurrentMillis

#define micros getCurrentMicros

#define delay delay_ms

   

void systick_init(void);  

void systick_reset(void);

uint32_t getCurrentMillis(void);

uint32_t getCurrentMicros(void);

void delay_ms(uint32_t ms); 

void delay_us(uint32_t us); 

  

#ifdef __cplusplus

 }

#endif


#endif /*__SYSTICK_H */


源文件:


/* Includes ------------------------------------------------------------------*/

#include "bsp_systick.h"


__IO uint32_t _ms_tick = 0;


/**

  * @brief  initialize systick

  * @param  None

  * @retval None

  */

void systick_init(void) 

{

  _ms_tick = 0;  

  

  /* SystemCoreClock / 1000     1ms中断一次 */

if(SysTick_Config(SystemCoreClock / 1000))

  {

    /*capture error*/

    while(1);

  }

}


/**

  * @brief  获取系统当前的ms计数值

  * @param  None

  * @retval 系统当前时间ms

  */

uint32_t getCurrentMillis(void)

{

  return _ms_tick;

}


/**

  * @brief  获取系统当前的us计数值

  * @param  delay time

  * @retval 系统当前时间us

  */

uint32_t getCurrentMicros(void)

{

  /* Ensure COUNTFLAG is reset by reading SysTick control and status register */

  //LL_SYSTICK_IsActiveCounterFlag();

  uint32_t m = getCurrentMillis(); 

  const uint32_t tms = SysTick->LOAD + 1;

  __IO uint32_t u = tms - SysTick->VAL;

  if ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk)) {

    m = getCurrentMillis(); 

    u = tms - SysTick->VAL;

  }

  return (m * 1000 + (u * 1000) / tms);

}


/**

  * @brief  复位系统计数

  * @param  None

  * @retval None

  */

void systick_reset(void) 

{

  _ms_tick = 0;

}


/**

  * @brief  delay (ms)

  * @param  delay time

  * @retval None

  */

void delay_ms(uint32_t ms) 

uint32_t target;

target = millis() + ms;

while(millis() < target);


/**

  * @brief  delay (us)

  * @param  delay us time

  * @retval None

  * @attention 延时的us数不应特别大,否则会导致nbTicks在计算时会溢出。

  */

void delay_us(uint32_t us)

{

  __IO uint32_t currentTicks = SysTick->VAL;

  /* Number of ticks per millisecond */

  const uint32_t tickPerMs = SysTick->LOAD + 1;

  /* Number of ticks to count */

   uint32_t nbTicks = ((us - ((us > 0) ? 1 : 0)) * tickPerMs) / 1000;

  /* Number of elapsed ticks */

  uint32_t elapsedTicks = 0;

  __IO uint32_t oldTicks = currentTicks;

  do {

    currentTicks = SysTick->VAL;

    elapsedTicks += (oldTicks < currentTicks) ? tickPerMs + oldTicks - currentTicks :

                    oldTicks - currentTicks;

    oldTicks = currentTicks;

  } while (nbTicks > elapsedTicks);

}


/**

  * @brief  SYSTICK中断服务函数

  * @param  None

  * @retval None

  */

void SysTick_Handler(void)

{

  _ms_tick++;

}


关键字:STM32  SysTick  微秒延时 引用地址:STM32 SysTick秒用

上一篇:stm32 u8g2移植笔记
下一篇:基于STM32指纹识别模块(TFS-M64)的学习

推荐阅读最新更新时间:2024-11-05 06:05

STM32时钟配置,不同晶振时需要配置的程序
在“stm32f10x.h”这个头文件里: #define HSE_Value ((uint32_t)8000000) /! Value of the External oscillator in Hz/ 斜体内容默认是8000000,在你修改了外部晶振时,要和你的外部晶振数值相同,不如我的外部晶振时24M,我就把它改成24M,这样就可以了, 还有一处要更改是在“system_stm32f10x.c”里: static void SetSysClockTo72(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /! SYSCLK, HCLK, PCLK2 and PC
[单片机]
stm32 外扩SRAM使用问题
当把外扩SRAM内存拷贝到片上SRAM内存时使用内存拷贝函数memset()或者原子定义的mymemset()函数,编译器会提示空间不足。 原因是这两个函数一个是只能对片上SRAM操作,一个是只能对外扩SRAM操作,两者没有一个可以同时操作片上SRAM和外扩SRAM,所以编译器会提示内存空间不足。
[单片机]
STM32 Cubemax(九) ——利用输入捕获中断实现超声波测距
前言 因为要实现一下卡尔曼滤波,所以这次先写一下超声波,顺便重温一下输入捕获中断。 一、超声波模块原理 但凡在网上搜过超声波这个模块的,对这个图都不陌生,简单的说就是想得到超声波的数据,包含以下几个步骤。 1.发送大于10us的触发信号。 2.检测超声波发出信号时产生的高电平。 3.检测超声波接收到信号时产生的低电平 而我们就是通过后两步,即去检测处因为超声波产生的高电平的时间,从而来得到距离信息的。而输入捕获的作用就是用来去捕获高电平或者低电平的持续时间的 我们的编程就是根据上图来实现的。 二、Cubmax配置 1.配置定时器输入捕获 本实验板子为F407,分频系数选择84-1,则计数精度达到1us。10
[单片机]
<font color='red'>STM32</font> Cubemax(九) ——利用输入捕获中断实现超声波测距
高集成度编程工具软件STM32代码烧录编程实战
凡用过STM32的用户应该知道,当你完成程序调试后,想对STM32芯片进行程序代码烧录编程的话可以有多种方式。若通过调试接口【JTAG/SWD】来烧写程序,一般要使用STVP或STLinkUtility工具软件来完成;若通过UART接口来烧写程序,往往要下载个基于PC 端的flash烧录工具软件STM32 Flash loader demo配合;若通过USB接口来烧写程序,往往需下载DfuSe USB 固件升级工具软件来实现。如今ST推出了新的高集成度编程工具软件STM32CubeProgrammer,以后就不用这么麻烦了,因为它同时支持上述三类编程接口,而且还兼具其它功能。 一、STM32CubeProgrammer具备如下
[单片机]
高集成度编程工具软件<font color='red'>STM32</font>代码烧录编程实战
IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)
参考博客及文档有: 1,http://www.cnblogs.com/ele-eye/archive/2011/11/28/2266229.html 2,http://www.cnblogs.com/king-77024128/articles/2512997.html(CMSIS介绍) 3, http://wenku.baidu.com/link?url=2blE__GxI1lmJglihBi5xJQPolza-NMxcZqGThxwysiY80ZOe6hLl5k6mowbTN2j30WsPftFZsBe1pRt8WlCDIT7Ce5EIReo4uGCEyegh7S(IAR 新建 STM32工程) 4,
[单片机]
IAR EW6.30版本下建立<font color='red'>STM32</font>工程(芯片型号STM32F105VC)
STM32单片机的独立看门狗和窗口看门狗的特点及用法解析
1.看门狗介绍 看门狗这东西虽然简单,但我相信绝大多程序员没有足够重视它。使用看门狗保证系统正常地运行是非常有必要的。我们在设计产品时,代码以及硬件设计缺陷或是外界电磁干扰都有可能使系统死机,如果不能正常对其进行复位,系统的可靠性将大打折扣。看门狗分为软件看门狗和硬件看门狗两类,其原理都是使用一个独立定时器来计时,超出时间就会产生复位信号,主要区别看是否具有独立的硬件结构,如果有,就是硬件看门狗,如果是一个普通定时器实现的那么就是软件看门狗。STM32F407片内有两个看门狗:独立看门狗IWDG以及窗口看门狗WWDG,下面来讨论各自的特点和用法。 2.IWDG的特点以及使用 IWDG是一个独立看门狗,具有独立于系统的时钟,与片
[单片机]
STM32 + ESP8266 + MQTT协议连接OneNet
一、环境介绍 单片机 采用: STM32 F103C8T6 上网方式:采用 ESP8266 ,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。 开发软件: keil 5 硬件 连接功能:ESP8266接在STM32的串口3上。通过AT指令与ESP8266进行 通信 。 注意:本篇文章没有贴ESP8266的底层 编程 代码,如果不会ESP8266底层编程,请看这里: https://blog.csdn.net/xiaolong1126626497/ar ti cle/det ai ls/107379554 如果需要了解ESP8266+MQTT协议连接阿里云 物联网 服务器请看这里:https:/
[单片机]
<font color='red'>STM32</font> + ESP8266 + MQTT协议连接OneNet
STM32自定义printf实现多串口互用
STM32 串口使用频繁的朋友可能知道一个问题,库自带的 USART_SendData 函数一次只能发送 1 Byte 字符 如果我们要输出一个带格式、带参数的串口数据就只能通过 sprintf 打印到一个临时数组,然后再使用一个for循环调用USART_SendData一个字符一个字符的输出,过程非常麻烦! 姜斌是一个非常怕麻烦的人所以这种方法无疑让我发疯!后来在原子(OpenEDV)那里购买了开发板拿到了例程。里面重定向了printf函数作为串口输出函数,有了这个函数之后就能够很轻松的参数输出,但问题就在这里我们串口1 串口2 都要带参数输出怎么办? 本次实验:自定义printf函数 实验数据来源: 配置usart
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved