起因

由于使用了CUBE,原子哥的延时就用不了,所以尝试其他延时函数:CUBE的HAL_Delay()和使用STM32的DWT(Data watchpoint trigger)

前言

为什么要学习这种延时的方法?

  1. HAL_Delay实用程序函数:它建立在SysTick计时器上,当我们跑操作系统,就一般会占用一个硬件定时器——SysTick(也可以把其他定时器当成时钟),这样一来又难免产生冲突。
  2. 以便为在阻塞和非阻塞模式下工作的驱动程序提供两个版本。阻塞函数将使用我们今天将要开发的延迟实用程序(DWT)。非阻塞功能将由 SysTick 计时器处理

1.系统图

2.DWT_Initialization() 函数

要实现延时的功能,总共涉及到三个寄存器:DEMCRDWT_CTRLDWT_CYCCNT,分别用于开启DWT功能、开启CYCCNT及获得系统时钟计数值。

uint32_t DWT_Delay_Init(void)
{/* 禁用 TRC */CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; // ~0x01000000;/* 启动 TRC */CoreDebug->DEMCR |=  CoreDebug_DEMCR_TRCENA_Msk; // 0x01000000;/* Disable clock cycle counter */DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; //~0x00000001;/* 启动  时钟周期计数器 */DWT->CTRL |=  DWT_CTRL_CYCCNTENA_Msk; //0x00000001;/* 重置时钟周期计数器值 */DWT->CYCCNT = 0;/* 3 NO OPERATION instructions 3空 */__ASM volatile ("NOP");__ASM volatile ("NOP");__ASM volatile ("NOP");/* 检查时钟周期计数器是否已启动*/if(DWT->CYCCNT){return 0; /*clock cycle counter started*/}else{return 1; /*clock cycle counter not started*/}
}

3.DEMCR寄存器

DEMCR寄存器为使能寄存器

    /* Disable TRC */CoreDebug->DEMCR &= ~CoreDebug_DEMCR_TRCENA_Msk; // ~0x01000000;/* Enable TRC */CoreDebug->DEMCR |=  CoreDebug_DEMCR_TRCENA_Msk; // 0x01000000;

24位置1对应0x01000000;

4.DWT_CTRL寄存器

DWT_CTRL寄存器是时钟周期计数器

/* Disable clock cycle counter */DWT->CTRL &= ~DWT_CTRL_CYCCNTENA_Msk; //~0x00000001;/* 启动  时钟周期计数器 */DWT->CTRL |=  DWT_CTRL_CYCCNTENA_Msk; //0x00000001;

第一位置"1"对应0x00000001

5.DWT_CYCCNT寄存器

    /* 重置时钟周期计数器值 */DWT->CYCCNT = 0;

它是一个向上的计数器,记录的是内核时钟运行的个数,内核时钟跳动一次,该计数器就加1,精度非常高,决定内核的频率是多少,如果是F103系列,内核时钟是72M,那精度就是1/72M = 14ns

6.DWT_Delay_us() 函数

此函数使用DWT提供以微秒计的延迟

// 该函数使用DWT提供毫秒延迟__STATIC_INLINE void DWT_Delay_ms(volatile uint32_t au32_milliseconds)
{uint32_t au32_initial_ticks = DWT->CYCCNT;uint32_t au32_ticks = (HAL_RCC_GetHCLKFreq() / 1000);au32_milliseconds *= au32_ticks;while ((DWT->CYCCNT - au32_initial_ticks) < au32_milliseconds);
}

演示

以下是本实验的应用程序代码

#include "main.h"
#include "../util/Timer_Delay.h"
#include "../util/DWT_Delay.h"void SystemClock_Config(void);
static void MX_GPIO_Init(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();/* Initialize The TimerDelay*/TimerDelay_Init();while (1){HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0);delay_ms(100);}
}

结果:每10ms翻转一次,动图去帧数才看起来不像


总结一下:

a.先使能DWT外设,由内核调试寄存器DEM_CR的位24控制,写1使能。

b.使能CYCCNT寄存器,由DWT_CTRL的位0控制,写1使能。

c.使能CYCCNT寄存器之前,先清0。

结束

他们从风雨中走来,倒在了泥泞中,后来人踏着他们走出的路,奔赴黎明。 – 《觉醒年代》

STM32CUBE——使用DWT提供毫秒延迟相关推荐

  1. NFTScan x TiDB丨一栈式 HTAP 数据库为 Web3 数据服务提供毫秒级多维查询

    导读 NFTScan 是一家多链 NFT 数据基础设施服务商,为 Web3 用户提供高效简洁的 NFT 资产搜索查询服务,为 Web3 开发者和新一代金融科技公司提供专业的 NFT API 数据服务. ...

  2. fastclick:处理移动端click事件300毫秒延迟

    fastclick:处理移动端click事件300毫秒延迟 1.兼容性 iOS 3及更高版本的移动Safari iOS 5及更高版本的Chrome Android上的Chrome(ICS) Opera ...

  3. ios点击有300毫秒延迟,输入框必须重压或长按才能获取焦点唤起软键盘

    以下方法主要针对在vue中的使用 // ios点击有300毫秒延迟 1. 安装依赖包cnpm install fastclick --save 2. 在 /src/main.js 中引入并使用impo ...

  4. 卡拉赞服务器延迟,魔兽怀旧服:TBC前策划的“小动作”,400毫秒延迟被改!

    魔兽世界怀旧服TBC前策划的"小动作",400毫秒延迟被改!改成了10毫秒,算是大幅度的减少了! 冰环双爆实现不了了吧?这是法师的看家本领,就算改变延迟,法师双爆这个设定也会保留下 ...

  5. LazyT 提供对延迟初始化的支持

    延迟初始化  就是在第一次使用的时候在 进行类的初始化 public class Student{public Student(){this.Name = "DefaultName" ...

  6. 神秘的40毫秒延迟与 TCP_NODELAY

    2019独角兽企业重金招聘Python工程师标准>>> 最近的业余时间几乎全部献给 breeze 这个多年前挖 下的大坑-- 一个异步 HTTP Server.努力没有白费,项目已经 ...

  7. vue.js 使用 fastclick解决移动端click事件300毫秒延迟方法

    一般情况下一些框架就自动解决了这个问题 一.使用npm安装: npm install fastclick -S 二.用法: 安装完以后,可以在在main.js中全局引入,并绑定到body,全局生效.或 ...

  8. 5G在中国一步步满血,高通实现毫米波独立组网:7.1Gbps网速、3.6毫秒延迟

    5G商用三年多,中国也建成了全球最大的5G网络,10月份基站总数就突破200万了,提前实现全年目标,不过5G建设不是一蹴而就的,毫米波5G还在早期阶段,高通日前也在中国实现了5G毫米波的突破. 据高通 ...

  9. 全球五大云巨头“排排坐”,微软令人称奇阿里云需加油

    日前,AWS.微软.阿里云.谷歌云.腾讯云等陆续公布了最新一季度的财报.中国软件网聚焦公有云市场的这五家巨头,发现了一些有意思的信息,记者来梳理梳理. 01 云收入居然微软最大,腾讯云增长最快 每一家 ...

  10. 图解NebulaGraph-开源国产分布式图数据库!

    大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 转载文章请保留以下声明: 原文地址:https://liyangyang.blog.csdn.net/ 正文 注意!以下为官网的一些介绍 ...

最新文章

  1. opencv滤波美颜
  2. 局域网读取文件_教你windows局域网如何设置共享文件
  3. UA MATH563 概率论的数学基础 中心极限定理24 随机变量的特征函数
  4. Android Volley完全解析(四),带你从源码的角度理解Volley
  5. scrollview下拉刷新_SwiftUI之View Tree 实战3(下拉刷新)
  6. python3.2安装tornado
  7. java同步方法同步块_java使用同步方法和同步块的区别
  8. Blender插件初始化范例
  9. java 凸包算法_JAVA凸包算法
  10. 计算机应用基础试卷结果分析,计算机应用基础试卷分析
  11. Unity3D之简单AR游戏
  12. mac系统设置alias
  13. 华为畅享7怎么切换android系统,华为畅享7是什么系统_华为畅享7系统更新-太平洋IT百科...
  14. 百度前端笔试题 css3画三角形
  15. split( )[3].split(:)[0];
  16. 嵌入式设计方案:ARM9多串口服务器
  17. nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘xxx‘ not found错误的详细解决方法
  18. 日记侠:朋友圈总点赞的人是什么心态?
  19. [会议扩声系统 | 音响扩声 | 会议室音响]会议室音响扩声系统方案
  20. 怎样用html做网页上的小标,html基本操作,看了这些你就能做简易网页?

热门文章

  1. 疾病抗争从未停止,糖尿病数据可视化分析
  2. java 如何清除临时文件_如何删除Java中的临时文件?
  3. Linux 挂载光盘镜像配置本地 yum 源安装软件
  4. oracle10g迁移到11g配置,Windows下Oracle10g32位迁移到11g64位
  5. 迪赛智慧数——柱状图(多色柱状图):2021年动画电影票房排行榜
  6. VUE3使用keep-alive页面切换时报错:parentComponent.ctx.deactivate is not a function
  7. 提升思考力的8种日常训练法
  8. python编程从入门到实践——16章
  9. Discuz集思街淘宝客模板 程序源代码
  10. 方法教程 | Python爬虫:爬取美女图片,看到了意想不到的场景美女图片