前面我们讲过,因为在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

void systick_configer(){
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
}

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

void Delay_ms(int ms){
while(ms--){
SysTick->LOAD=;
SysTick->VAL=;
SysTick->CTRL|=;
while(!(SysTick->CTRL&(<<)));
SysTick->VAL=;
SysTick->CTRL&=0xfffffffe;
}
}

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

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

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

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

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

#ifndef _SYSTICK_H
#define _SYSTICK_H
void systick_configer();
void Delay_ms(int ms);
#endif
//systick.h

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

STM32嵌入式开发学习笔记(四):使用滴答计时器实现精准计时的更多相关文章

  1. STM32嵌入式开发学习笔记(五):中断

    我们过去了解了用循环实现延时,或用系统滴答计时器实现延时,但这两种方法都有一种问题:会阻塞处理器的运行.下面我们学习一种不阻塞处理器运行其他事件的功能:时钟中断. 所谓中断,就是让处理器放下手头的事情 ...

  2. STM32嵌入式开发学习笔记(一)

    本文中,笔者将介绍使用嵌入式开发工具Keil uVision5,使用C语言,对微处理器STM32F103C8进行嵌入式开发. 开发使用C语言,首先需要新建一个C语言文件,将其设为主函数的入口,因此,将 ...

  3. STM32嵌入式开发学习笔记(六):串口通信(上)

    本文我们将了解STM32与外部设备通过串口通信的方式. 所谓串口通信,其实是一个类似于计算机网络的概念,它有物理层,比如规定用什么线通信,几伏特算高电平,几伏特算低电平.传输层,通信前要发RTS,CT ...

  4. STM32嵌入式开发学习笔记(三):使用按键控制小灯

    按键和小灯一样,也是通过GPIO外设与主板连接,也是通过GPIO_InitStruct类型结构体控制其工作. 查阅技术手册,按钮连接GPIOA控制下的管脚0. 但与之不同的是,按键是一种输入设备,输入 ...

  5. STM32嵌入式开发学习笔记(七):串口通信(下)

    下面我们进行几个串口通信的实际应用. 实验一:发信实验,让开发板通过串口向电脑发送信息: #include <stdio.h> #include <stm32f10x.h> # ...

  6. STM32嵌入式开发学习笔记(二):将功能封装为库文件

    将所有的函数都堆在main.c文件里不是好的选择,庞大的代码文件会是你维护的障碍,明智的做法是,一种功能封装到一个库文件里. 库文件就是你代码开始部分写的#include<xxxx.h>里 ...

  7. python-django开发学习笔记四

    先插入一条广告,博主新开了一家淘宝店,经营自己纯手工做的发饰,新店开业,只为信誉!需要的亲们可以光顾一下!谢谢大家的支持!店名: 小鱼尼莫手工饰品店经营: 发饰.头花.发夹.耳环等(手工制作)网店: ...

  8. Photon + Unity3D 线上游戏开发 学习笔记(四)

    这一节 我们建立 photon Server 端的框架 一个最简单的Photon框架 就包括一个 Applocation 类 和 一个 peer 类,作用例如以下: *  Application 类是 ...

  9. C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...

随机推荐

  1. 函数————swap

    swap(vec[i],vec[j]); 交换两个元素.

  2. 前端每日实战:77# 视频演示如何用纯 CSS 创作旗帜飘扬的动画

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qydvBm 可交互视频 此视频是可 ...

  3. zju1610Count the Colors

    ZOJ Problem Set - 1610 Count the Colors Time Limit: 2 Seconds      Memory Limit: 65536 KB Painting s ...

  4. mysql事件(定时任务)处理超时失效订单

    MySQL事件(定时任务) https://blog.csdn.net/pan_junbiao/article/details/86489237 UPDATE wz_mer_goods_spec as ...

  5. 力扣算法——142LinkedListCycleII

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. To r ...

  6. activiti7查询流程定义的相关信息

    package com.zcc.activiti02; import org.activiti.engine.ProcessEngine;import org.activiti.engine.Proc ...

  7. JavaScript中Function函数与Object对象的关系

    函数对象和其他内部对象的关系 除了函数对象,还有很多内部对象,比如:Object.Array.Date.RegExp.Math.Error.这些名称实际上表示一个 类型,可以通过new操作符返回一个对 ...

  8. pytest的执行方式及搜索原则

    pytest的执行方式 Pytest/py.test(终端,命令行,pycharm可配置pytest方式执行) 1. Pytest –v (最高级别信息—verbose) 2. pytest -v - ...

  9. 域名访问和ip访问区别

    域名访问和ip访问区别 ip访问对应某一台确定的服务器: 域名访问相当于在ip访问的基础上,做了一个反向代理的中间功能.例如:百度,很多人会同时使用,如果使用的是同一台服务器的话,服务器估计会扛不住, ...

  10. elasticsearch启动常见问题

    原文:https://blog.csdn.net/qq_22211217/article/details/80740873 一.Exception in thread "main" ...