STM32嵌入式编程学习到提高:【5】delay函数

server/2024/12/22 20:16:51/

-------------------------------------------------------------------------------------------------------------------------

工程文件:放在百度云盘里,需要的自行下载!!!
链接:http:// https://pan.baidu.com/s/1tLv_dqTEkdYNSnlVzTdYMA?pwd=xyza

提取码: xyza

-------------------------------------------------------------------------------------------------------------------------

在嵌入式开发中,我们经常需要用到delay延时函数,本文用systick来实现delay函数,分us,ms,s延时。当然我们也可以用最简单的for循环来做,但是它的缺点就是不太准确。

例如:j<1000这个值需要根据平时时钟和指令时间,去调整 ,延时一个时间然后用示波器去看一下延时时间的长短,然后通过调整1000这个值的大小,来达到相对准确的一个延时。

/****************************************************************************************************************************************** 
* 函数名称: hal_delay_ms()
* 功能说明: 延时ms
* 输    入: 无
*			
* 输    出: 无
* 注意事项: 
******************************************************************************************************************************************/
void hal_delay_ms(u32 ms)
{u32 i, j;for (i = 0; i < ms; i++){for (j = 0; j < 1000; j++){}}
}

这里我们用systick的滴答数来做延时,能做到比较准确!!!

1:首先需要初始化:现在的主时钟是72Mhz(SystemCoreClock = 72 000 000),我们用主时钟的1/8作为systick的时钟源,相当1s有9M个时钟信号,那么1us就是9个时钟信号

所以1us = SystemCoreClock /8000000

        1ms = 1000*1us

2:设置好时钟源后,我们再来认识一下systick的寄存器

SysTick->LOAD:重加载寄存器,我们需要delay多长时间,数值是存在这里面的

SysTick->VAL:计数器寄存器,计到多少数了存在这里

SysTick->CTRL:控制寄存器,第16位,countflag:当计算到0后置为1

/****************************************************************************************************************************************** 
* 函数名称: delay_us()
* 功能说明: 延时us
* 输    入: 无
*			
* 输    出: 无
* 注意事项: 
******************************************************************************************************************************************/
void delay_us(u32 nus)
{		u32 temp;	    	SysTick->LOAD=nus*fac_us; //时间加载	  		 SysTick->VAL=0x00;        //清空计数器SysTick->CTRL=0x01 ;      //开始倒数 	 do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));			//等待时间到达   SysTick->CTRL=0x00;       								//关闭计数器SysTick->VAL =0X00;       								//清空计数器	 
}
/****************************************************************************************************************************************** 
* 函数名称: delay_ms()
* 功能说明: 延时ms
* 输    入: 无
*			
* 输    出: 无
* 注意事项: 对于72M情况,ms<1864
******************************************************************************************************************************************/
void delay_ms(u16 nms)
{	 u32 temp;		   SysTick->LOAD=(u32)nms*fac_ms;						//时间加载(SysTick->LOAD为24bit)SysTick->VAL =0x00;           						//清空计数器SysTick->CTRL=0x01 ;          						//开始倒数  do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));			//等待时间到达   SysTick->CTRL=0x00;       								//关闭计数器SysTick->VAL =0X00;       								//清空计数器	  	
} 
/****************************************************************************************************************************************** 
* 函数名称: delay_s()
* 功能说明: 延时s
* 输    入: 无
*			
* 输    出: 无
* 注意事项: 调用delay_ms函数s*1000次,因为1秒=1000毫秒
******************************************************************************************************************************************/
void delay_s(u16 ns) 
{  u16 i;for (i = 0; i < ns; i++) {  delay_ms(1000);  }  
} 

3:我们再来验证下

延时1000us,打印:this is us delay

延时200ms,打印:this is ms delay

延时1s,打印:this is s delay

us用串口打印不是太准哈,可以用示波器量一下

重点注意:

因为SysTick->VAL:是一个16位的寄存器,所以给它的值有一个上值,要少于2^16-1


http://www.ppmy.cn/server/123143.html

相关文章

PDD 各岗位薪资一览表

PDD 昨天聊到 PDD 可能会执行双休政&#xff0c;当中提到了「PDD 的年包在互联网行业中名列前茅」&#xff0c;不少同学一下子来兴趣了。 我这里也从脉脉中找到一份较新的 PDD 各岗位薪资一览表&#xff1a; 注意&#xff0c;这里的平均月薪的计算方式是年收入除以 12&#xff…

网络安全-长亭雷池waf的sql绕过,安全狗绕过(5种绕过3+2)

目录 一、环境 二、讲解 三、绕过前思路整理 3.1 思路 3.1.1 入门思路 0x00截断filename 3.1.2 双写上传描述行(差异绕过&#xff09;【成功】 3.1.3双写整个 part 开头部分 3.1.4 构造假的 part 部分 1【成功】 3.1.5 构造假的 part 部分2【成功】 3.1.6 两个 bounda…

配置项取值给静态类用

在 Java 中&#xff0c;如果要从 application.yml 文件中取值并供静态类使用&#xff0c;可以考虑以下几种方法&#xff1a; 一、使用 Spring 的 Environment 类 1. 首先确保你的项目是一个 Spring 项目&#xff0c;并且配置文件被正确加载。 2. 在需要获取配置值的类中注入…

MySQL 性能剖析全攻略

在使用 MySQL 数据库的过程中&#xff0c;性能问题往往是让开发者和管理员头疼的难题。为了有效地解决这些问题&#xff0c;我们需要对 MySQL 进行性能剖析。那么&#xff0c;如何在 MySQL 中进行性能剖析呢&#xff1f;本文将为你详细介绍。 一、为什么要进行性能剖析&#x…

爬取元气手机壁纸简单案例(仅用于教学,禁止任何非法获利)

爬虫常用的库 爬虫&#xff08;Web Scraping&#xff09;是一种从网页上提取数据的技术。在 Python 中&#xff0c;有许多库可以帮助实现这一目标。以下是一些常用的爬虫库&#xff0c;以及对 BeautifulSoup 的详细介绍。 常用爬虫库 1.Requests ​ a.功能&#xff1a;用于发…

JAVA自助高效安全无人台球茶室棋牌室系统小程序源码

​探索“自助高效安全无人台球茶室棋牌室系统”的奇妙之旅 &#x1f3b1;&#x1f375;&#x1f3b2; &#x1f50d; 初见惊艳&#xff1a;未来娱乐新体验 &#x1f50d; 走进这家无人值守的台球茶室棋牌室&#xff0c;第一感觉就像是穿越到了未来&#xff01;没有繁琐的前台登…

Kafka技术详解[3]: 生产与消费数据

目录 Kafka 生产与消费数据详解 生产数据 命令行操作 工具操作 Java API 消费数据 命令行操作 Java API Kafka 生产与消费数据详解 生产数据 一旦消息主题创建完成&#xff0c;就可以通过Kafka客户端向Kafka服务器的主题中发送消息。Kafka生产者客户端是一套API接口&#x…

新React v19特性

服务器组件(RSC)&#xff1a;经过多年的开发&#xff0c;React 引入了服务器组件&#xff0c;而不是需要借助Next.js 动作(Action)&#xff1a;Action也将彻底改变我们与 DOM 元素的交互方式。 增强的 hooks&#xff1a;引入了很多新 hooks&#xff0c;将改变我们的编码体验。…