单片机延时函数实现

2023-11-07

在编写单片机程序时,我们经常要用到延时函数,记得我们在学51单片机时,第一个延时是通过软件延时来实现的,代码如下:

void delay(volatile uint32_t cnt)
{ 
    volatile uint32_t i = 0; 
    volatile uint32_t j = 0; 
    for(i = 0;i<cnt;i++) 
        for(j = 0;j<1000;j++); 
}

软件延时的优点是方便,然而却不能提供很精确的延时,而且占用CPU资源,下面的以STM32L1为例,采用定时器方式实现,可以提供很精确的延时。代码如下:

/* CPU主频:32MHz Timer2_clk = 32MHz */ 
void Delay_Init(void) 
{ /* TIM2 clock enable */ 
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); 
} 

void Delay_ms(uint16_t ms) 
{ 
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
	TIM_TimeBaseStructure.TIM_Period = ms - 1; 
	TIM_TimeBaseStructure.TIM_Prescaler = 32000 - 1; 
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
	/*每当初始化计数器会使计数器更新,TIM_FLAG_Update被置位*/ 
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
	TIM_ClearFlag(TIM2, TIM_FLAG_Update); 
	TIM_Cmd(TIM2, ENABLE); 
	while (TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == RESET);
	TIM_Cmd(TIM2, DISABLE); 
}

void Delay_us(uint16_t us) 
{ 
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* Time base configuration */ 
	TIM_TimeBaseStructure.TIM_Period = us - 1; 
	TIM_TimeBaseStructure.TIM_Prescaler = 32 - 1; 
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); 
	TIM_ClearFlag(TIM2, TIM_FLAG_Update); 
	TIM_Cmd(TIM2, ENABLE); 
	while (TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) == RESET); 
	TIM_Cmd(TIM2, DISABLE); 
}

调用延时函数时,我们每次对定时器的溢出时间进行设置,我们以更新标志置位作为延时结束。注意上面函数的参数不能为1,如果为1会使函数跑死。当然这个延时函数也是阻塞式的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单片机延时函数实现 的相关文章

  • 浅谈Chrome开发者工具--- Console面板与常见报错类型

    Console面板 在学习JS之后 Console面板就成了我离不开的工具 在我们的程序无法达到我们所期望的效果时候 就可以在Console面板上调试我们的程序 在面板上 除了报错以外 还可以打印出我们在程序中所想要补货到的一些数据 我用的
  • npm脚本命令npm run script的使用

    npm 可以在项目package json里面自定义脚本命令 package json文件 script dev webpack w package json文件中的字段script的每一个属性都是一个自定义的脚本命令 在命令行中可以通过执
  • pyinstaller no module named ‘pkg_resources.py2_warn‘解决方法

    在用pyinstaller打包python编写好的程序时 遇到了一些问题 其中有一个是no module named pkg resources py2 warn 经过一些探索后 找到了解决方法 1 先用pyinstaller D F xx

随机推荐

  • 二叉树的中序遍历算法(Java三种实现方法)

    文章目录 题目 一 二叉树的节点定义 二 三种遍历方法 1 递归 算法思想 2 迭代 算法思想 3 Morris 中序遍历 算法思想 总结 题目 给定一个二叉树的根节点 root 返回它的 中序 遍历 一 二叉树的节点定义 public c
  • Linux 使用 Qt 和Occ,报错 qcoreevent.h X.h

    因为
  • [蓝桥杯][2013年第四届真题]危险系数

    题目 题目链接 题解 DFS 蓝桥杯中 一般看到图不是BFS就是DFS 代码1对应第一种方法 我的方法 根据关键点的定义 删除这个点之后 无法实现从u到v 那么我们就枚举每个点作为删除点 判断删除这个点之后还能不能实现从u到v 若不能说明删
  • 文献调研(九):基于rough set理论和深度学习算法的建筑能耗预测模型

    A building energy consumption prediction model based on rough set theory and deep learning algorithms Energy and Buildin
  • H5适配iPhoneX底部小黑线,CSS一招搞定!

    做移动端H5的同学 在你的前端开发生涯中 是否遇到过这种问题 浮在手机屏幕底部的功能区 在你的安卓和苹果的大部分机型上展示极其完美 这种 可是在iPhone上却是这种 遇到这样的情况 不要着急 不用js 不用vue css一招教你轻松搞定
  • 探索深度学习世界:掌握PyTorch,成为AI领域的行家

    探索深度学习世界 掌握PyTorch 成为AI领域的行家 PyTorch的背景介绍 PyTorch的基本概念与特点 PyTorch的基本应用 张量和自动求导 神经网络搭建 训练和测试模型 模型的保存和加载 模型保存 模型加载 模型使用 Py
  • idea开启热部署

    一 开启IDEA的自动编译 静态 具体步骤 打开顶部工具栏 File gt Settings gt Default Settings gt Build gt Compiler 然后勾选 Build project automatically
  • 【Java笔记+踩坑】SSM整合

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 1 SSM整合入门案例 图书的增删改查 1 1
  • ebtables介绍

    ebtables是与iptables类似的命令 区别在于ebtables用于对以太网帧的过滤 iptables用于对ip数据包的过滤 过滤流程见图 原图来源于 http blog csdn net wuruixn article detai
  • 力扣刷题——数组(2)

    将每个元素替换为右侧最大元素 给你一个数组 arr 请你将每个元素用它右边最大的元素替换 如果是最后一个元素 用 1 替换 完成所有替换操作后 请你返回这个数组 示例 输入 arr 17 18 5 4 6 1 输出 18 6 6 6 1 1
  • 网络基础:ACL与NAT

    目录 一 理论 1 ACL 2 NAT 二 实验 1 基础ACL 2 高级ACL 3 静态NAT 4 Easy IP 一 理论 1 ACL 1 ACL ACL 是Access Control List的简写 中文名称叫做 访问控制列表 它是
  • 面向对象设计原则——合成复用原则

    合成复用原则又称为组合 聚合复用原则 Composition Aggregate Reuse Principle C ARP 定义 尽量使用对象组合 而不是继承来达到复用的目的 合成复用原则就是在一个新的对象里通过关联关系 包括组合关系和聚
  • nRF52832 — Keil中如何配置RAM地址

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX 作 者 文化人 XX 联系方式 XX 版权声明 原创文章 欢迎评论和转载 转载时能告诉我一声就最好了 XX 要说的
  • 1.新建按钮,窗口,按钮移动

    include my widget 01first project h include
  • IMU监测髋关节术后康复状况

    髋关节置换手术是一种用于治疗磨损导致的关节炎的针对性手术 为许多忍受长期疼痛和失去活动能力的患者带来了新生 2020年 在美国进行的所有初级和修正全髋关节置换术中 分别有约10 和20 的手术使用了双动臼杯 DM 因为与传统的单动关节相比
  • java环境的配置,下载jdK安装及安装

    1 java环境的配置下载jdK安装 2 jdk exe会解析两个文件jdk文件 jre文件 安装步骤 1 JDK jdk1 7 0 75 windows x64 exe 下载 选择 Accept License Agreement 根据系
  • RN开发系列<8>--Redux(1)入门篇

    1 Redux的基本用法 前言 说明 本文只针对移动端的Redux的基本用法进行描述 希望这一篇文章 就能帮助你搞定redux的基本用法 甚至不用再去查阅其他文档 因为我个人脑子比较笨 查阅了很多文档 看了不少视频资料才理解了 2 原理阐述
  • Python 使用函数作为返回值

    视频版教程 Python3零基础7天入门实战视频教程 Python还支持使用函数作为其他函数的返回值 def test bol if bol return add else return sub def add x y return x y
  • 基于Proteus的四位数码管显示

    1实验原理 P0口接断码线 P2口低四位接位选线 第一位数码管的位选线由P2 0来控制 第二位数码管的位选线由P2 1来控制 依次类推 由此可知可以控制P2 0到p2 3引脚 从而控制这个数码管哪一位来显示字符 而通过控制P0口输出断码值来
  • 单片机延时函数实现

    在编写单片机程序时 我们经常要用到延时函数 记得我们在学51单片机时 第一个延时是通过软件延时来实现的 代码如下 void delay volatile uint32 t cnt volatile uint32 t i 0 volatile