stm32内核定时器的使用

news/2024/6/3 18:25:47 标签: stm32, 单片机, ide, 嵌入式硬件, mcu

文章目录

    • 1、内核定时器介绍
    • 2、使用内核定时器
    • 3、源码

之前的文章讲到过Systick定时器,其实DWT内核定时器也是很常见的,而且就是基本上arm内核的芯片都会有这个芯片,这就给我们进行移植提供了方便,关于Systick定时器的记录可以查看:Systick定时器使用以及一些问题记录

1、内核定时器介绍

在 Cortex-M 里面有一个外设叫 DWT(Data Watchpoint and Trace),是用于系统调试及跟踪, 它有一个 32 位的寄存器叫 CYCCNT,它是一个向上的计数器,记录的是内核时钟运行的个数,内核时钟跳动一次,该计数器就加 1。

从上面我们知道就是内核定时器和内核时钟有关,以 F103 系列为例,内核时钟是 72M,那精度就是 1/72M = 14ns,而程序的运行时间都是微秒级别的,所以 14ns 的精度是远远够的。最长能记录的时间为: 60s=2 的 32 次方/72000000(假设内核频率为 72M,内核跳一次的时间大概为 1/72M=14ns),而如果是 H7这种 400M 主频的芯片,那它的计时精度高达 2.5ns( 1/400000000 = 2.5)。当计数器溢出之后,会清 0 重新开始向上计数。

DWT定时器的时钟框图如下所示(图中红色框框出)

在这里插入图片描述

使用的寄存器说明:

  • 1、DEMCR 内核调试寄存器:该寄存器的24位可以决定是否使能内核定时器,写1使能
    在这里插入图片描述
  • 2、DWT_CYCCNT 使能 DWT_CYCCNT 寄存器之前,先清 0。 其基地址是 0xE0001004, 复位默认值是 0,为可读写类型。所以往 0xE0001004 这个地址写就将 DWT_CYCCNT 清 0 了
  • 3、CYCCNTENA 它是 DWT 控制寄存器的第一位,写 1 使能,则启用 CYCCNT 计数器,否则 CYCCNT计数器将不会工作。

2、使用内核定时器

首先定义下寄存器的地址:
在这里插入图片描述
下面就可以开始设置计数函数了:
在这里插入图片描述
适当修改增加ms还有s的计数函数:
在这里插入图片描述
之后就可以在主函数中进行调用了!
在这里插入图片描述

3、源码

DWT_time.c

/*
 * DWT_time.c
 *
 *  Created on: Mar 13, 2022
 *      Author: LX
 */


#include "DWT_time.h"


void vDWTDelayInit(void)
{
    DEM_CR |= DEM_CR_TRCENA;
    DWT_CYCCNT = 0;
    DWT_CR |= DWT_CR_CYCCNTENA;
}

void vDWTDelayUs(float fTime)
{
    volatile uint32_t uiTimeStop = 0u, uiTimeStart = 0;

    if(fTime < 0.1f)
        return;

    uiTimeStart = DWT_CYCCNT;
    uiTimeStop  = (uint32_t)((SystemCoreClock / 1000000u) * fTime) + uiTimeStart;

    if(uiTimeStop >= uiTimeStart)
        while((DWT_CYCCNT > uiTimeStart) && (DWT_CYCCNT < uiTimeStop));
    else
        while(!((DWT_CYCCNT > uiTimeStop) && (DWT_CYCCNT < uiTimeStart)));
}
void vDWTDelayMs(float fTime)
{
    volatile uint32_t uiTimeStop = 0u, uiTimeStart = 0;

    if(fTime < 0.01f)
        return;

    uiTimeStart = DWT_CYCCNT;
    uiTimeStop  = (uint32_t)((SystemCoreClock / 1000u) * fTime) + uiTimeStart;

    if(uiTimeStop >= uiTimeStart)
        while((DWT_CYCCNT > uiTimeStart) && (DWT_CYCCNT < uiTimeStop));
    else
        while(!((DWT_CYCCNT > uiTimeStop) && (DWT_CYCCNT < uiTimeStart)));
}
void vDWTDelayS(uint32_t uiTime)
{
    uint32_t i = 0u;

    if(uiTime < 1u)
        return;

    for(i = 0u; i < uiTime; ++i)
    {
        vDWTDelayMs(1000);
    }
}

DWT_time.h

/*
 * DWY_time.h
 *
 *  Created on: Mar 13, 2022
 *      Author: LX
 */

#ifndef DWT_TIME_H_
#define DWT_TIME_H_

#include "main.h"

#define  DWT_CR      *(__IO uint32_t *)0xE0001000
#define  DWT_CYCCNT  *(__IO uint32_t *)0xE0001004
#define  DEM_CR      *(__IO uint32_t *)0xE000EDFC


#define  DEM_CR_TRCENA                   (1 << 24)
#define  DWT_CR_CYCCNTENA                (1 <<  0)

void vDWTDelayInit(void);
void vDWTDelayS(uint32_t uiTime);
void vDWTDelayMs(float fTime);
void vDWTDelayUs(float fTime);

#endif /* DWT_TIME_H_ */


http://www.niftyadmin.cn/n/980156.html

相关文章

51Nod-1183 编辑距离

1183 编辑距离 基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 0 难度&#xff1a;基础题 收藏 关注 编辑距离&#xff0c;又称Levenshtein距离&#xff08;也叫做Edit Distance&#xff09;&#xff0c;是指两个字串之间&#xff0c;由一个转成另一个所…

stm32看门狗定时器记录

文章目录1、看门狗介绍2、独立看门狗3、窗口看门狗1、看门狗介绍 STM32 有两个看门狗&#xff0c;一个是独立看门狗另外一个是窗口看门狗。 独立看门狗简单来说就是一个 12 位的递减计数器&#xff0c;当计数器的值从某个值一直减到 0 的时候&#xff0c;系统就会产生一个复位信…

当别人加快脚步的时候,你更应该慢下来

为什么80%的码农都做不了架构师&#xff1f;>>> 三个小故事和一个小矮人 ###########故事一########### 每天早上转两辆公交车让我心疲力竭&#xff0c;并不是说坐车要坐多久&#xff0c;实际上真正在公交车上的时间最多也就是25分钟那里&#xff0c;加上等车&…

[置顶] java与js的split方法

最近在做项目时发现几个问题 1、java与js的split方法的结果&#xff1a; 使用java中的split()里面的参数为正则表达式&#xff0c;但是对“&#xff0c;”也支持。对|或者$均需使用\\进行转义。js不存在该问题。 2、java与js的split之后的数组长度: 定义一字符串12$3$23$323.5$…

关于Linux上修改open files数目

永久生效办法&#xff1a;centos6.x&#xff08;1&#xff09;、cd /etc/security/vi limits.d/90-nproc.conf 添加&#xff1a;* soft nproc 65535* hard nproc 65535* soft nofile 65535 * hard nofile 65535 &#x…

stm32上云实战篇

文章目录1、使用官方提供的库连接1、获取官方例程2、移植文件3、配置数据上传还有数据下发4、最终配置2、使用MQTT固件进行解析3、尝试连接腾讯云4、尝试连接阿里云1、使用官方提供的库连接 相信最开始用onenet的应该都是用的这个官方的库吧&#xff0c;特别熟悉的代码&#x…

51Nod-1264 线段相交

1264 线段相交 基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 0 难度&#xff1a;基础题 收藏 关注 给出平面上两条线段的两个端点&#xff0c;判断这两条线段是否相交&#xff08;有一个公共点或有部分重合认为相交&#xff09;。 如果相交&#xff0c…

The underlying provider failed on Open错误

基本也就是数据库打开失败&#xff0c;链接错误一系列的问题。转载于:https://www.cnblogs.com/Chasel-Chen/p/6689059.html