前面我们讲过,因为在STM32上没有系统时间的接口,因此无法调用sleep函数,在本文中,笔者将利用滴答计时器实现精准延时。

查阅技术手册,滴答计时器依赖于一个SysTick_Type类型寄存器,定义如下

typedef struct{

vu32 CTRL;

vu32 LOAD;

vu32 VAL;

vuc32 CALIB;

} SysTick_TypeDef;

四个成员分别意义是控制和状态,重装载值,当前值,校准值。

滴答计时器的原理很简单,就是利用系统时钟信号,每接到一个时钟信号计数器加一,和校准值相等时就自动归零。

指向SysTick 外设的指针被如下声明:

#define SysTick ((SysTick_TypeDef *) SysTick_BASE)

要使用滴答计时器时,调用此指针即可。

首先,我们用SysTick_CLKSourceConfig函数初始化systick

voidsystick_configer(){

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);

}

注意,我这里给的参数是SysTick_CLKSource_HCLK_Div8,就是时钟信号八分频,每接到8个时钟信号才让计数器+1,因为systick外设时钟频率是72MHz,也就是每秒要跳72M次,如果试图用此信号记录1秒的时间,就会爆计数器,因为计数器只有24位,只能存储16M的数字。

void Delay_ms(intms){while(ms--){

SysTick->LOAD=9000;

SysTick->VAL=0;

SysTick->CTRL|=1;while(!(SysTick->CTRL&(1<<16)));

SysTick->VAL=0;

SysTick->CTRL&=0xfffffffe;

}

}

时钟频率是72MHz,八分频就是9MHz,因此每毫秒就是计数9000次。

首先清空计数器,然后将重装载值设置为9000,一旦计数器达到此值,控制寄存器的第16位就会变成1;

最后,将控制寄存器最后一位置为1,此位是时钟使能开关,若为1则时钟开始计数。

然后等待并判断控制寄存器的第16位是否为1,若此条件达成,重置。

由于systick寄存器每一位都有不同的功能,需要分别操作,甚至有些位无法访问,因此要善于使用位运算。

#ifndef _SYSTICK_H#define _SYSTICK_H

voidsystick_configer();void Delay_ms(intms);#endif

//systick.h

至此,我们利用滴答计时器实现了类似于sleep的功能。

stm32滴答计时器_STM32嵌入式开发学习笔记(四):使用滴答计时器实现精准计时...相关推荐

  1. 嵌入式开发学习笔记9-做一个好玩的LED闪烁

    嵌入式开发学习笔记9-做一个好玩的LED闪烁 前言 实际操作 程序功能 实现思路 程序源码 实现效果展示 前言 LED小灯闪烁实质是控制单片机上的I/O口,通过向I/O口循环输入高低电平,从而控制LE ...

  2. 嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器B、累加器A和程序状态字PSW)

    嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器.累加器和程序状态字) 累加器A 寄存器B 程序状态字PSW 累加器A 累加器A是ACC(Accumulator)的缩写,累加器A是一个具有特 ...

  3. 嵌入式开发学习笔记6-了解单片机中的特殊功能寄存器(定时器/计数器)

    嵌入式开发学习笔记6-了解单片机中的特殊功能寄存器(定时器/计数器) 定时器/计数器简介 TH与TL TMOD工作模式寄存器 TCON定时器控制寄存器 定时器操作实例 定时器/计数器简介 在单片机中, ...

  4. Polyworks脚本开发学习笔记(四)-利用FILE IMPORT进行数据导入及对齐

    Polyworks脚本开发学习笔记(四)-利用FILE IMPORT进行数据导入及对齐 导入参考及数据 FILE IMPORT_REFERENCE导入参考的CAD文件如igs格式 括号内参数分别为(导 ...

  5. 龙芯1C300B主板V3.4嵌入式开发学习笔记二

    1 PMON更新 接着笔记一:https://blog.csdn.net/weixin_38709708/article/details/81271493 笔者手中的开发板一开始就烧写了PMON,当是 ...

  6. 龙芯1C300B主板V3.4嵌入式开发学习笔记一

    1 硬件连接,驱动安装,串口访问: 刚拿到板子,打开配套了一条USB转TTL线,电源适配器,备用PMON芯片(?) 问题一:怎么连接USB-TTL线到主板,这里涉及到线的规定 观察转接线的末端,有四条 ...

  7. Asp.net控件开发学习笔记(四)---Asp.net服务端状态管理

    Asp.net请求处理构架 当一个客户端浏览器对IIS发起访问请求资源时(比如一个.aspx文件),Asp.net会初始化并维护一个包含了多个Response和Request的Http Session ...

  8. 敏捷软件开发学习笔记(四)之结构型设计模式

    PHP结构型设计模式 参考 设计模式 PHP 设计模式全集 2018 什么是结构型是设计模式 结构型模式讲的是如何将类和对象按照某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,其中类结构型 ...

  9. windows内核开发学习笔记四十四:注册表存储结构-储巢

    上一篇文章学习了注册表的逻辑结构,接下来我这篇文章来学习注册表的存储结构.注册表实际存储是由一组储巢构成,每个储巢包含了一个由键和值构成的层次结构.下面表是windows的各个储巢的注册表路径和文件路 ...

最新文章

  1. 算法系列之二十:计算中国农历(二)
  2. 网络资源(4) - extJS视频
  3. JavaScript两个数组是否有相同元素
  4. 医学工作者如何进行医学科研设计?
  5. [转]C++中extern C的含义
  6. WebService客户端开发(Axis2 1.5)
  7. wincc 报警记录 mysql_如何才能把WINCC报警记录中的数据通过SQL取上来-工业支持中心-西门子中国...
  8. 使用 Visual Studio Code 进行远程开发
  9. sqlserver大数据表操作慢_架构师必看!操作日志系统搭建秘技
  10. Python小数据池,代码块
  11. 【影像学基本知识】T1, T2 and PD weighted imaging
  12. 机器学习实战 11- SVD
  13. 七.OpenCv图像轮廓
  14. idea创建web项目的时候报错:Error reading file E:/workspaces/**/pom.xml
  15. realtek没有禁用前面板_为什么HD声卡必须禁用前面板插孔检测前置耳机和麦克才可以有声...
  16. ei检索的cpss_我想查EI会议论文检索情况,请问是如何查询的呢?
  17. 利用Matlab替换图片部分颜色
  18. Formality形式验证教程
  19. dede获取顶级栏目
  20. 北京大学百年讲堂内听果宁法师讲人生——提得起、放得下的深刻含义(摘抄)

热门文章

  1. 51nod1276(xjb)
  2. python数据数据存储-五种使用python储存数据的方式
  3. C#使用Microsoft.ACE.OLEDB来处理Excel数据
  4. 米转经纬度_高速公路十米桩号与经纬度的转换方法与流程
  5. python3数据存储—四个数据库(sqlite,mysql,redis,mongodb)
  6. 一文教你全方位揭秘Ajax指南
  7. CM13编译错误解决
  8. Python数据分析--平民最强宝可梦
  9. 计算机视觉 — 立体视觉
  10. unity 开发HTC vive UI的交互