当前位置: 首页 > news >正文

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

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

工程文件:放在百度云盘里,需要的自行下载!!!
链接: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

相关文章:

  • 【C++】托管类和托管函数
  • jenkins分布式构建
  • C高级(Day21)
  • XPath基础知识点讲解——用于在XML中查找信息的语言
  • [vulnhub] Jarbas-Jenkins
  • numpy is not available
  • 982. 按位与为零的三元组
  • UI设计师面试整理-工具和技术技能
  • list(二) (list模拟实现)
  • HOJ网站开启https访问 申请免费SSL证书 部署证书详细操作指南
  • CANopen开源库canfestival的移植
  • 深度解析APP软件开发:构建卷轴式分销系统的实践探索
  • 一个PDF样本册免费上传网站
  • 【HTTP 和 HTTPS详解】3
  • 【PAM】Linux登录认证限制
  • Angular 2 DI - IoC DI - 1
  • Apache Pulsar 2.1 重磅发布
  • echarts的各种常用效果展示
  • ES6 学习笔记(一)let,const和解构赋值
  • in typeof instanceof ===这些运算符有什么作用
  • JWT究竟是什么呢?
  • Nacos系列:Nacos的Java SDK使用
  • Redux 中间件分析
  • unity如何实现一个固定宽度的orthagraphic相机
  • Webpack 4 学习01(基础配置)
  • 第2章 网络文档
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 学习JavaScript数据结构与算法 — 树
  • ​第20课 在Android Native开发中加入新的C++类
  • ​你们这样子,耽误我的工作进度怎么办?
  • # Panda3d 碰撞检测系统介绍
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (13):Silverlight 2 数据与通信之WebRequest
  • (160)时序收敛--->(10)时序收敛十
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (七)Activiti-modeler中文支持
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • .bat文件调用java类的main方法
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net core + vue 搭建前后端分离的框架
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @antv/x6 利用interacting方法来设置禁止结点移动的方法实现。
  • @Async 异步注解使用
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • []sim300 GPRS数据收发程序
  • [20160902]rm -rf的惨案.txt