生活中,我们通过看表来知道当前时间,知道我们在这个点应该做什么事情,那么芯片呢,就通过各种定时器来记录时间,滴答时钟就是定时器的一种,它可以用来做操作系统的节拍(心跳),可以用来计时,可以用来做闹钟,延时,今天,我们就简单看一下滴答时钟。

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滴答时钟[直接用寄存器]相关推荐

  1. 基于STM32滴答时钟的多任务定时器

    基于STM32滴答时钟的多任务定时器 基于STM32滴答时钟的多任务定时器 概述 声明:此定时器仅提升个人编程能力和学习使用,不得用于商用,用于商用一切后果自行负责. API说明 滴答时钟初始化并创建 ...

  2. stm32成长记之滴答时钟

    SysTick具体操作可参照: http://www.st.com/content/ccc/resource/technical/document/programming_manual/5b/ca/8 ...

  3. 4、系统滴答时钟SysTick

    写在开篇前: 首先要明确的第一点:学习知识我们都会到网上查询各种资料,但是由于网上资料大多不全 面,我们对于这些资料需要加以自身的理解并对其有所取舍,所以建议网上查来的资料只做引导. 参考作用,最终确 ...

  4. stm32f4xx-systick系统滴答时钟

    文章目录 一.系统滴答时钟 1.简介 注意: 2.工作原理(向下计数,向上计数) 3.频率的概念 二.库函数 四.延时函数 1.系统定时器的用途 2.官方示例 3.寄存器 4.毫秒级延时函数 5.微秒 ...

  5. hal库选择滴答时钟函数_stm32h7“理解hal库框架”

    1.按照初始化流程调用的hal库文件 完成初始化工作需要调用到的hal库文件,如下表 序号功能调用hal库文件 1Module Selection(模块选择) Oscillator Values ad ...

  6. STM32CbueMX之利用滴答时钟delay us

    参考<PM0214: STM32 Cortex®-M4 MCUs and MPUs programming manual.pdf>(STM32 Cortex_-M4内核参考手册.pdf)的 ...

  7. freeRTOS滴答时钟相关源码分析

    最近学习白问网韦东山老师在B站开源的freeRTOS课程,网址:韦东山直播公开课:RTOS实战项目之实现多任务系统 第1节:裸机程序框架和缺陷_哔哩哔哩_bilibili和7天物联网训练营[第2期]7 ...

  8. STM32学习笔记9(SysTick滴答时钟)

    我不得不说意法半导体确实有点风骚!甚至有点变态.我对ST文档 STM32F10XXX参考手册的编辑水平真是不敢恭维.手册中好多说明都是含糊不清,甚至将好多对初学者来说很重要的地方都一笔带过,让人着实摸 ...

  9. 滴答定时器的计数模式_【高手私藏】STM32学习笔记:SysTick滴答时钟

    今天我们来说说SysTick定时器.SysTick定时器在从参考手册中根本没有介绍.我费了九牛二虎之力才在一个犄角格拉里找到SysTick定时器的英文版的说明.在Cotex-M3有介绍,为什么要找ST ...

最新文章

  1. 声音匹配_如何调节人声音色方法如下
  2. 反模式? 只有模式不彻底吧
  3. Quicker--文件搜索工具介绍
  4. Beyond Compare 3 设置自动换行
  5. Oracle 与 Mysql NULL值,空字符串''的区别
  6. HDU(1572),最短路,DFS
  7. 曙光服务器优势,5大核心优势 探秘曙光Cloudview三大平台
  8. HTML 5 input placeholder 属性
  9. spring mysql 连接池配置_SpringBoot数据库连接池常用配置
  10. jquery插件制作 -- 3.表单验证
  11. oracle设置表的主键和外键,Oracle中给表添加主键、外键
  12. Juniper SSG 550M HA配置文档
  13. Image.FormFile引起的若干问题
  14. Podfile 文件写法
  15. windows系统安全
  16. wps文件没有保存怎么恢复,学这一招就够了!
  17. *Error* illegal LHS in continous assignment
  18. C#串口开发案例:迈瑞血球分析仪
  19. 文本选择毒战:我的过度阐释
  20. 哦也!伟大的回文树(回文自动机)!

热门文章

  1. ubuntu 设置中文环境
  2. 三相超快恢复二极管整流桥开关模块
  3. DRILLNET 2.0------第二十八章 背景知识
  4. 【洛谷P1359租用游艇】
  5. JAVA宠物医院后台管理系统设计与实现计算机毕业设计Mybatis+系统+数据库+调试部署
  6. G1 收集器 面向服务端(多CPU)应用的垃圾回收器
  7. 收藏文章《不要Google,要Stumble!》
  8. 哥斯拉加密WebShell过杀软
  9. VRTRIX数据手套的配置以及在Unity3D场景下的多种交互实现
  10. Selenium + Python + Chrome 中国大学慕课网视频爬取