STM32CUBE——使用DWT提供毫秒延迟
起因
由于使用了CUBE,原子哥的延时就用不了,所以尝试其他延时函数:CUBE的HAL_Delay()和使用STM32的DWT(Data watchpoint trigger)
前言
为什么要学习这种延时的方法?
- HAL_Delay实用程序函数:它建立在SysTick计时器上,当我们跑操作系统,就一般会占用一个硬件定时器——SysTick(也可以把其他定时器当成时钟),这样一来又难免产生冲突。
- 以便为在阻塞和非阻塞模式下工作的驱动程序提供两个版本。阻塞函数将使用我们今天将要开发的延迟实用程序(DWT)。非阻塞功能将由 SysTick 计时器处理
1.系统图
2.DWT_Initialization() 函数
要实现延时的功能,总共涉及到三个寄存器:DEMCR
、DWT_CTRL
、DWT_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提供毫秒延迟相关推荐
- NFTScan x TiDB丨一栈式 HTAP 数据库为 Web3 数据服务提供毫秒级多维查询
导读 NFTScan 是一家多链 NFT 数据基础设施服务商,为 Web3 用户提供高效简洁的 NFT 资产搜索查询服务,为 Web3 开发者和新一代金融科技公司提供专业的 NFT API 数据服务. ...
- fastclick:处理移动端click事件300毫秒延迟
fastclick:处理移动端click事件300毫秒延迟 1.兼容性 iOS 3及更高版本的移动Safari iOS 5及更高版本的Chrome Android上的Chrome(ICS) Opera ...
- ios点击有300毫秒延迟,输入框必须重压或长按才能获取焦点唤起软键盘
以下方法主要针对在vue中的使用 // ios点击有300毫秒延迟 1. 安装依赖包cnpm install fastclick --save 2. 在 /src/main.js 中引入并使用impo ...
- 卡拉赞服务器延迟,魔兽怀旧服:TBC前策划的“小动作”,400毫秒延迟被改!
魔兽世界怀旧服TBC前策划的"小动作",400毫秒延迟被改!改成了10毫秒,算是大幅度的减少了! 冰环双爆实现不了了吧?这是法师的看家本领,就算改变延迟,法师双爆这个设定也会保留下 ...
- LazyT 提供对延迟初始化的支持
延迟初始化 就是在第一次使用的时候在 进行类的初始化 public class Student{public Student(){this.Name = "DefaultName" ...
- 神秘的40毫秒延迟与 TCP_NODELAY
2019独角兽企业重金招聘Python工程师标准>>> 最近的业余时间几乎全部献给 breeze 这个多年前挖 下的大坑-- 一个异步 HTTP Server.努力没有白费,项目已经 ...
- vue.js 使用 fastclick解决移动端click事件300毫秒延迟方法
一般情况下一些框架就自动解决了这个问题 一.使用npm安装: npm install fastclick -S 二.用法: 安装完以后,可以在在main.js中全局引入,并绑定到body,全局生效.或 ...
- 5G在中国一步步满血,高通实现毫米波独立组网:7.1Gbps网速、3.6毫秒延迟
5G商用三年多,中国也建成了全球最大的5G网络,10月份基站总数就突破200万了,提前实现全年目标,不过5G建设不是一蹴而就的,毫米波5G还在早期阶段,高通日前也在中国实现了5G毫米波的突破. 据高通 ...
- 全球五大云巨头“排排坐”,微软令人称奇阿里云需加油
日前,AWS.微软.阿里云.谷歌云.腾讯云等陆续公布了最新一季度的财报.中国软件网聚焦公有云市场的这五家巨头,发现了一些有意思的信息,记者来梳理梳理. 01 云收入居然微软最大,腾讯云增长最快 每一家 ...
- 图解NebulaGraph-开源国产分布式图数据库!
大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 转载文章请保留以下声明: 原文地址:https://liyangyang.blog.csdn.net/ 正文 注意!以下为官网的一些介绍 ...
最新文章
- opencv滤波美颜
- 局域网读取文件_教你windows局域网如何设置共享文件
- UA MATH563 概率论的数学基础 中心极限定理24 随机变量的特征函数
- Android Volley完全解析(四),带你从源码的角度理解Volley
- scrollview下拉刷新_SwiftUI之View Tree 实战3(下拉刷新)
- python3.2安装tornado
- java同步方法同步块_java使用同步方法和同步块的区别
- Blender插件初始化范例
- java 凸包算法_JAVA凸包算法
- 计算机应用基础试卷结果分析,计算机应用基础试卷分析
- Unity3D之简单AR游戏
- mac系统设置alias
- 华为畅享7怎么切换android系统,华为畅享7是什么系统_华为畅享7系统更新-太平洋IT百科...
- 百度前端笔试题 css3画三角形
- split( )[3].split(:)[0];
- 嵌入式设计方案:ARM9多串口服务器
- nested exception is org.apache.ibatis.binding.BindingException: Parameter ‘xxx‘ not found错误的详细解决方法
- 日记侠:朋友圈总点赞的人是什么心态?
- [会议扩声系统 | 音响扩声 | 会议室音响]会议室音响扩声系统方案
- 怎样用html做网页上的小标,html基本操作,看了这些你就能做简易网页?
热门文章
- 疾病抗争从未停止,糖尿病数据可视化分析
- java 如何清除临时文件_如何删除Java中的临时文件?
- Linux 挂载光盘镜像配置本地 yum 源安装软件
- oracle10g迁移到11g配置,Windows下Oracle10g32位迁移到11g64位
- 迪赛智慧数——柱状图(多色柱状图):2021年动画电影票房排行榜
- VUE3使用keep-alive页面切换时报错:parentComponent.ctx.deactivate is not a function
- 提升思考力的8种日常训练法
- python编程从入门到实践——16章
- Discuz集思街淘宝客模板 程序源代码
- 方法教程 | Python爬虫:爬取美女图片,看到了意想不到的场景美女图片