STM32嵌入式开发学习笔记(四):使用滴答计时器实现精准计时
前面我们讲过,因为在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嵌入式开发学习笔记(四):使用滴答计时器实现精准计时的更多相关文章
- STM32嵌入式开发学习笔记(五):中断
我们过去了解了用循环实现延时,或用系统滴答计时器实现延时,但这两种方法都有一种问题:会阻塞处理器的运行.下面我们学习一种不阻塞处理器运行其他事件的功能:时钟中断. 所谓中断,就是让处理器放下手头的事情 ...
- STM32嵌入式开发学习笔记(一)
本文中,笔者将介绍使用嵌入式开发工具Keil uVision5,使用C语言,对微处理器STM32F103C8进行嵌入式开发. 开发使用C语言,首先需要新建一个C语言文件,将其设为主函数的入口,因此,将 ...
- STM32嵌入式开发学习笔记(六):串口通信(上)
本文我们将了解STM32与外部设备通过串口通信的方式. 所谓串口通信,其实是一个类似于计算机网络的概念,它有物理层,比如规定用什么线通信,几伏特算高电平,几伏特算低电平.传输层,通信前要发RTS,CT ...
- STM32嵌入式开发学习笔记(三):使用按键控制小灯
按键和小灯一样,也是通过GPIO外设与主板连接,也是通过GPIO_InitStruct类型结构体控制其工作. 查阅技术手册,按钮连接GPIOA控制下的管脚0. 但与之不同的是,按键是一种输入设备,输入 ...
- STM32嵌入式开发学习笔记(七):串口通信(下)
下面我们进行几个串口通信的实际应用. 实验一:发信实验,让开发板通过串口向电脑发送信息: #include <stdio.h> #include <stm32f10x.h> # ...
- STM32嵌入式开发学习笔记(二):将功能封装为库文件
将所有的函数都堆在main.c文件里不是好的选择,庞大的代码文件会是你维护的障碍,明智的做法是,一种功能封装到一个库文件里. 库文件就是你代码开始部分写的#include<xxxx.h>里 ...
- python-django开发学习笔记四
先插入一条广告,博主新开了一家淘宝店,经营自己纯手工做的发饰,新店开业,只为信誉!需要的亲们可以光顾一下!谢谢大家的支持!店名: 小鱼尼莫手工饰品店经营: 发饰.头花.发夹.耳环等(手工制作)网店: ...
- Photon + Unity3D 线上游戏开发 学习笔记(四)
这一节 我们建立 photon Server 端的框架 一个最简单的Photon框架 就包括一个 Applocation 类 和 一个 peer 类,作用例如以下: * Application 类是 ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
随机推荐
- 【LeetCode 41】缺失的第一个正数
题目链接 [题解] 先明确一点假设给的数字有n个. 那么最后的答案最情况下就是n+1 首先我们先判断一下所给的数组里面有没有1 如果没有直接返回1 否则. 把数组中所有的范围超过n或者小于1的数字全都 ...
- Linux下Mysql安装与常见问题解决方案
1.Mysql安装 环境: Mysql版本: 开始安装: 首先检查环境有没有老版本mysql,有的话先卸载干净,具体百度. 接着先获取mysql的安装包:wget https://dev.mysql. ...
- 微信小程序观察者模式 observers
const app = getApp(); const request = require('../../../utils/request.js'); Component({ options: { m ...
- J. The Volcano Eruption(圆相交+并查集)
题目链接:https://codeforces.com/gym/101915/problem/J 思路:将所有相交的圆用并查集维护看做一个整体,然后枚举每个整体的左边界和右边界,判断能不能同时覆盖整个 ...
- 第六周实验总结&学习总结
一.实验目的 (1)掌握类的继承方法 (2)变量的继承和覆盖,方法的继承,重载和覆盖实现 二.实验内容 源代码 package java2; import java.util.Scanner; cla ...
- MySQL总结01
window删除MySQL服务 cmd下执行 sc delete MySQL 登陆登出 登陆: mysql -uroot -ppasswd -h host 退出登陆 mysqladmin -uroot ...
- yum update过程中失败后再次执行出现“xxxx is a duplicate with xxxx”问题
问题现象: 解决办法: 利用yum-uitls中的工具package-cleanup指令,使用方法见下图,具体可通过man package-cleanup查询 列出重复的rpm包 pac ...
- python#父与子编程之旅-11嵌套与可变循环
for multiplier in range(5,8): for i in range(2,11): print(i,"x",multiplier,"=",i ...
- Python可以用于客户端Web开发吗?
N00b在Python,但我有大量的PHP经验,并希望扩展我的技能. 我知道Python在服务器端执行方面很出色,只是想知道客户端. 解决方案 你看过skulpt吗? http://www.skulp ...
- 菩提圣心诀---zabbix自定义key监控oracle连接状态(python脚本)
目的:此次实验目的是为了zabbix服务端能够实时监控某服务器上oracle实例能否正常连接 环境:1.zabbix_server 2.zabbix_agent(含有oracle) 主要知识点: 1. ...