STM32滴答时钟[直接用寄存器]
生活中,我们通过看表来知道当前时间,知道我们在这个点应该做什么事情,那么芯片呢,就通过各种定时器来记录时间,滴答时钟就是定时器的一种,它可以用来做操作系统的节拍(心跳),可以用来计时,可以用来做闹钟,延时,今天,我们就简单看一下滴答时钟。
void Delay(unsigned int xx)
{while(xx--);
}
滴答时钟也是填入一个值,然后倒数到零,然后通知芯片,但是相比上边的粗略延时函数就精确了很多很多,可以精确到微秒、毫秒。
滴答时钟配置有两种:
- 查询式(不断去查询有没有计时完毕)
- 中断式(计时完毕发出信号)
因为还没讲到中断,这章先讲解查询式。
这里得知道 1MHZ=1μs目录
- 一、滴答时钟在STM32的哪里
- 二、滴答时钟相关的寄存器
- 1、SysTick->CTRL(控制和状态寄存器)
- 2、SysTick->RELOAD(重装载数值寄存器)
- 3、SysTick->VAL(当前数值寄存器)
- 4、SysTick->CALIB(校准数值寄存器)
- 三、寄存器地址定义
- 四、滴答时钟配置步骤
- 五、微秒延时和毫秒延时总程序
- 1、微秒延时
- 2、毫秒延时
一、滴答时钟在STM32的哪里
首先我们得知道,ARM公司制造了CortexM3,ST公司以CortexM3为内核,造了STM32,这个滴答时钟就是在CortexM3里,也就是STM32内核中,所以用到的寄存器地址可以在Cortex-权威指南里查找。
二、滴答时钟相关的寄存器
1、SysTick->CTRL(控制和状态寄存器)
因为是查询式,所以我们不用第1位
- 0位(打开滴答时钟)
- 2位(选择时钟源,我们一般选择外部时钟源)
- 16位(查看是否数到了零)
2、SysTick->RELOAD(重装载数值寄存器)
这个寄存器就比较简单了,这个就是重新向滴答时钟里加载计时次数,可以看到总共有24位可设置,所以重新加载值最大不能超过24位。
3、SysTick->VAL(当前数值寄存器)
这个寄存器作用在读取的时候返回当前计数值,在写入的时候就是计数器清零,同时还清除掉了SysTick->CTRL第16位的标志。
4、SysTick->CALIB(校准数值寄存器)
这个寄存器不常用,所以我们不再讲解。
以上四种寄存器,我们常用的有:
- SysTick->CTRL(控制和状态寄存器)
- SysTick->RELOAD(重装载数值寄存器)
- SysTick->VAL(当前数值寄存器)
三、寄存器地址定义
//----------------GPIOB配置寄存器 ------------------------
#define GPIOB_CRL *((unsigned volatile int*)0x40010C00)
#define GPIOB_ODR *((unsigned volatile int*)0x40010C0C)
寄存器少的时候,我们可以像以上这样定义,那么寄存器多的时候呢?我们就用C语言里学的结构体来定义,比如下边这次我们的滴答时钟寄存器地址
//-----------------SysTick寄存器地址----------------------
#define SysTick_Base 0xE000E010 //这是我们结构体的首地址,也是结构体第一个成员地址
#define SysTick ((SysTick_Typedef*)SysTick_Base) //转换为指针类型
typedef struct
{volatile unsigned int CTRL; //控制和状态寄存器 0xE000E010volatile unsigned int RELOAD; //重装载寄存器 0xE000E014volatile unsigned int VAL; //当前值寄存器 0xE000E018volatile unsigned int CALIB; //校准寄存器 0xE000E01C
}SysTick_Typedef;
四、滴答时钟配置步骤
在时钟树里可以看到,对于Cortex时钟,有两种选择方法,一是选用经过八分频的外部时钟源,二是选用内核时钟,我们一般在设置的时候选用八分频后的外部时钟源,我们之前设置了系统时钟为72MHZ,经过八分频后变为了9MHZ,也就是说,滴答时钟的频率是9MHZ,那让滴答时钟计1次,时间过去了1/9μs,滴答时钟计9次,才是1μs,于是我们有了以下的设计:
- 计1μs:我们向计数器里放入9
- 计1ms:我们向计数器里放入9000
1ms(毫秒)=1μs(微秒)
配置滴答时钟步骤如下: - 1、清空计数器
- 2、重新装载数值
- 3、打开定时器
- 4、等待计时器数到0
- 5、关闭计数器
- 6、清空计数器
五、微秒延时和毫秒延时总程序
1、微秒延时
//-----------------SysTick寄存器地址----------------------
#define SysTick_Base 0xE000E010
#define SysTick ((SysTick_Typedef*)SysTick_Base)
//-----------------SysTick寄存器定义----------------------
typedef struct
{volatile unsigned int CTRL; //控制和状态寄存器volatile unsigned int RELOAD; //重装载寄存器volatile unsigned int VAL; //当前值寄存器volatile unsigned int CALIB; //校准寄存器
}SysTick_Typedef;
//----------------------滴答定时器---------------------------
void SysTick_us(unsigned int time)
{unsigned long int num;SysTick->VAL=0; //计数器清零SysTick->RELOAD=9*time; //重装载计数值SysTick->CTRL|=1<<0; //定时器使能,打开定时器do{num=SysTick->CTRL;}while((num&0x01)&&!(num&(1<<16))); //等待计数器到0SysTick->CTRL&=~(1<<0); //关闭计数器SysTick->VAL=0; //计数器清零
}
int main(void)
{SysTick_us(10); //调用滴答定时器,延时10微秒
}
2、毫秒延时
//-----------------SysTick寄存器地址----------------------
#define SysTick_Base 0xE000E010
#define SysTick ((SysTick_Typedef*)SysTick_Base)
//-----------------SysTick寄存器定义----------------------
typedef struct
{volatile unsigned int CTRL; //控制和状态寄存器volatile unsigned int RELOAD; //重装载寄存器volatile unsigned int VAL; //当前值寄存器volatile unsigned int CALIB; //校准寄存器
}SysTick_Typedef;
//----------------------滴答定时器---------------------------
void SysTick_ms(unsigned int time)
{unsigned long int num;SysTick->VAL=0; //计数器清零SysTick->RELOAD=9000*time; //重装载计数值SysTick->CTRL|=1<<0; //定时器使能,打开定时器do{num=SysTick->CTRL;}while((num&0x01)&&!(num&(1<<16)));//等待计数器到0SysTick->CTRL&=~(1<<0); //关闭计数器SysTick->VAL=0; //计数器清零
}
int main(void)
{SysTick_ms(10); //调用滴答定时器,延时10毫秒
}/*while((num&0x01)&&!(num&(1<<16)));//等待计数器到0(num&0x01) 这一句是判断用来判断SysTick定时器是否处于开启状态,可以防止SysTick被意外关闭导致的死循环。(num&(1<<16)) 这一句是用来判断SysTick->CTRL第16位是否为1,如果为一,说明计数器延时时间已到定时器正常开启,那么 (num&0x01) 为1,如果倒数时间已到,(num&(1<<16)) 为 1,(num&0x01)&&!(num&(1<<16)) ==>(1)&&!(1)可以看到后边的1取反为0,那么 (1)&&(0)=0,while(0)循环结束,执行后边的语句。
*/
STM32滴答时钟[直接用寄存器]相关推荐
- 基于STM32滴答时钟的多任务定时器
基于STM32滴答时钟的多任务定时器 基于STM32滴答时钟的多任务定时器 概述 声明:此定时器仅提升个人编程能力和学习使用,不得用于商用,用于商用一切后果自行负责. API说明 滴答时钟初始化并创建 ...
- stm32成长记之滴答时钟
SysTick具体操作可参照: http://www.st.com/content/ccc/resource/technical/document/programming_manual/5b/ca/8 ...
- 4、系统滴答时钟SysTick
写在开篇前: 首先要明确的第一点:学习知识我们都会到网上查询各种资料,但是由于网上资料大多不全 面,我们对于这些资料需要加以自身的理解并对其有所取舍,所以建议网上查来的资料只做引导. 参考作用,最终确 ...
- stm32f4xx-systick系统滴答时钟
文章目录 一.系统滴答时钟 1.简介 注意: 2.工作原理(向下计数,向上计数) 3.频率的概念 二.库函数 四.延时函数 1.系统定时器的用途 2.官方示例 3.寄存器 4.毫秒级延时函数 5.微秒 ...
- hal库选择滴答时钟函数_stm32h7“理解hal库框架”
1.按照初始化流程调用的hal库文件 完成初始化工作需要调用到的hal库文件,如下表 序号功能调用hal库文件 1Module Selection(模块选择) Oscillator Values ad ...
- STM32CbueMX之利用滴答时钟delay us
参考<PM0214: STM32 Cortex®-M4 MCUs and MPUs programming manual.pdf>(STM32 Cortex_-M4内核参考手册.pdf)的 ...
- freeRTOS滴答时钟相关源码分析
最近学习白问网韦东山老师在B站开源的freeRTOS课程,网址:韦东山直播公开课:RTOS实战项目之实现多任务系统 第1节:裸机程序框架和缺陷_哔哩哔哩_bilibili和7天物联网训练营[第2期]7 ...
- STM32学习笔记9(SysTick滴答时钟)
我不得不说意法半导体确实有点风骚!甚至有点变态.我对ST文档 STM32F10XXX参考手册的编辑水平真是不敢恭维.手册中好多说明都是含糊不清,甚至将好多对初学者来说很重要的地方都一笔带过,让人着实摸 ...
- 滴答定时器的计数模式_【高手私藏】STM32学习笔记:SysTick滴答时钟
今天我们来说说SysTick定时器.SysTick定时器在从参考手册中根本没有介绍.我费了九牛二虎之力才在一个犄角格拉里找到SysTick定时器的英文版的说明.在Cotex-M3有介绍,为什么要找ST ...
最新文章
- 声音匹配_如何调节人声音色方法如下
- 反模式? 只有模式不彻底吧
- Quicker--文件搜索工具介绍
- Beyond Compare 3 设置自动换行
- Oracle 与 Mysql NULL值,空字符串''的区别
- HDU(1572),最短路,DFS
- 曙光服务器优势,5大核心优势 探秘曙光Cloudview三大平台
- HTML 5 input placeholder 属性
- spring mysql 连接池配置_SpringBoot数据库连接池常用配置
- jquery插件制作 -- 3.表单验证
- oracle设置表的主键和外键,Oracle中给表添加主键、外键
- Juniper SSG 550M HA配置文档
- Image.FormFile引起的若干问题
- Podfile 文件写法
- windows系统安全
- wps文件没有保存怎么恢复,学这一招就够了!
- *Error* illegal LHS in continous assignment
- C#串口开发案例:迈瑞血球分析仪
- 文本选择毒战:我的过度阐释
- 哦也!伟大的回文树(回文自动机)!
热门文章
- ubuntu 设置中文环境
- 三相超快恢复二极管整流桥开关模块
- DRILLNET 2.0------第二十八章 背景知识
- 【洛谷P1359租用游艇】
- JAVA宠物医院后台管理系统设计与实现计算机毕业设计Mybatis+系统+数据库+调试部署
- G1 收集器 面向服务端(多CPU)应用的垃圾回收器
- 收藏文章《不要Google,要Stumble!》
- 哥斯拉加密WebShell过杀软
- VRTRIX数据手套的配置以及在Unity3D场景下的多种交互实现
- Selenium + Python + Chrome 中国大学慕课网视频爬取