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真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
随机推荐
- Database基础(七):部署集群基础环境、MySQL-MMM架构部署、MySQL-MMM架构使用
一.部署集群基础环境 目标: 本案例要求为MySQL集群准备基础环境,完成以下任务操作: 数据库授权 部署MySQL双主多从结构 配置本机hosts解析记录 方案: 使用4台RHEL 6虚拟机,如下图 ...
- jquery实现回车键登录/搜索等确认功能
button按钮提交方式: $('#search').click(function() { get_table(); }); //keyCode=13是回车键,设置回车键提交 $("body ...
- 探索Redis设计与实现1:Redis 的基础数据结构概览
本文转自互联网 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial ...
- Jquery 实现回车键触发功能
keyup,上抬键盘 .$(function(){ 方法一: $(document).keyup(function(event){ if(event.keyCode ==13){ alert(&quo ...
- MacBook Pro常用快捷键
MacBook Pro常用快捷键 Mac fn + left / right / up / down 相当于 home/end/page up /page down delete 删除光标前一个字符 ...
- 16. Django基础数据访问
如果我们想使用Django对数据库进行访问,我们可以使用django自带的shell. 进入blog目录,打开cmd命令窗口,输入python manage.py shell,如下图所示: 插入数据 ...
- PAT_A1089#Insert or Merge
Source: PAT A1089 Insert or Merge (25 分) Description: According to Wikipedia: Insertion sort iterate ...
- Leetcode 算法题
lEETCODE 算法题 0013 罗马数字转整数
- 浅谈HTTP与其工作流程
一.什么是HTTP协议 HTTP协议(Hyper Text Transfer Protocol)翻译过来是超文本传输协议,也是一种restful风格的协议,在web开发和APP接口开发都很常用. HT ...
- day07 python列表 集合 深浅拷贝
day07 python 一.知识点补充 1."".join() s = "".join(('1','2','3','4','5')) #将字符串 ...