本篇文章带着大家来认识一下 STM32 的时钟系统,以及利用 systick 定时器来实现一个比较准确的延时。

  我们首先从时钟说起,时钟在MCU中的作用,就好比于人类的心脏一样不可或缺。STM32 的时钟相比 51 的单一时钟要复杂些,它有多个时钟源可以使用,那么大家可能会有所疑惑,STM32 的时钟搞的那么复杂干什么,原因其实在于,STM32的外设资源比起51来说,是很丰富的,那么不同外设使用的时钟也会不一样,同时我们要知道时钟越快,功耗就越大,抗电磁干扰的能力就会减弱,因此,比较复杂的MCU 都会采用多时钟来解决这些问题。

  那么,这个时钟系统究竟是什么呢??

  这里给大家简单总结了下:STM32 共有 5个时钟源,分别为 HSE、LSE、HSI、LSI、PLL,其中,HSE叫做高速外部时钟,可以接外部 4-16 MHz的时钟源;HSI 是高速内部时钟,它内部有一个RC振荡器,可以提供 8 MHz的时钟;LSE是低速外部时钟,外接32.768KHz时钟,作为RTC时钟;LSI 是低速内部时钟,也是一个内部的RC 振荡器,可以提供 40 KHz的时钟,可用作独立看门狗,或RTC的时钟;最后一个 PLL 是锁相环倍频,它的来源可以是HSI/2、HSE、HSE/2,倍频范围为 2-16 倍,这5个时钟源就简单给大家介绍到这里。

  

  当选择8MHz的外部时钟经PLL倍频,默认上电后 sysclk = APB2 的时钟 为72MHz,APB1时钟为 36MHz。

  下面我们再来介绍下一个特殊的定时器, 这个定时器是 systick ,它属于cortex m3 内核,是一个24位倒计数定时器,我们通过使用这个定时器,可得到一个比较准确的延时。

  在学习了STM32的时钟系统后,我们知道系统上电默认是 72MHz的主频,然后在延时初始化中设置了 systick的时钟为9MHz,也就是systick VAL寄存器,里面的值每减少一次就需要 1/9 us的时间,然后下面的代码分别计算了微秒、毫秒的系数,接着在us 延时函数中,我们传入多少us 就会延时多少us。

  这里要注意的是,LOAD的寄存器是24位的,因此最大传入的数值为1864135,也就是最多延时这么多微秒,大约1864毫秒,当我们需要延时大于这个值时,多次调用即可。

  下面我们直接在主循环中调用毫秒延时,延时1秒,编译无误后,下载到实验板上,观察效果。在这里,我们可以用软件仿真 简单检测下这个延时的准确性。

  首先,点开魔术棒工具,然后我们需要在目标选项卡下,将晶振大小修改为我们实验板所外接的晶振 8MHz,然后在 debug 选项卡中选择软件仿真,保存后,我们进入软件调试,复位后我们在输出高低电平加两个断点,然后点击全速运行,观察左侧区域的秒数差,我们可以看到这个延时还是很精准的。

视频资料

(时钟系统)
http://www.makeru.com.cn/live/1392_1082.html?s=45051
STM32中断系统
http://www.makeru.com.cn/live/3523_1745.html?s=45051

(stm32 USART串口应用)
http://www.makeru.com.cn/live/1392_1164.html?s=45051

(定时器)
http://www.makeru.com.cn/live/1392_1199.html?s=45051

STM32时钟系统之利用 systick 定时器来实现准确的延时。的更多相关文章

  1. STM32入门系列-STM32时钟系统,STM32时钟树

    时钟对于单片机来说是非常重要的,它为单片机工作提供一个稳定的机器周期从而使系统能够正常运行.时钟系统犹如人的心脏,一旦有问题整个系统就崩溃.我们知道STM32属于高级单片机,其内部有很多的外设,但不是 ...

  2. STM32时钟系统的配置寄存器和源码分析

    一.时钟系统 概述 时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令,时钟系统就是CPU的脉搏,决定cpu速率. STM32有多个时钟来源的选择,为什么 STM32 要有多个时钟源呢 ...

  3. 关于STM32时钟系统

    初学STM32,感觉最蛋疼的是它的时钟系统,每次看到它的那个时钟树就有点晕,虽然看了很多这方面的资料,甚至也已经写过很多STM32的模块代码,做过一些小项目,但一直还是对这一块模模糊糊,似懂非懂,所以 ...

  4. STM32时钟系统

    一.在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. ①HSI是高速内部时钟,RC振荡器,频率为8MHz. ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率 ...

  5. STM32入门-STM32时钟系统,时钟初始化配置函数

    在前面推文的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,然后进入主函数main.那么我们就来看下SystemInit()函数到底做了哪些操作,首先打开我们前面使 ...

  6. STM32入门系列-STM32时钟系统,时钟使能配置函数

    之前的推文中说到,当使用一个外设时,必须先使能它的时钟.怎么通过库函数使能时钟呢?如需了解寄存器配置时钟,可以参考<STM32F10x中文参考手册>"复位和时钟控制(RCC)&q ...

  7. STM32入门系列-STM32时钟系统,自定义系统时钟

    在时钟树的讲解中我们知道,通过修改PLLMUL中的倍系数值(2-16)可以改变系统的时钟频率.在库函数中也有对时钟倍频因子配置的函数,如下: void RCC_PLLConfig(uint32_t R ...

  8. STM32入门系列-STM32时钟系统,时钟初始化配置函数

    在前面推文的介绍中,我们知道STM32系统复位后首先进入SystemInit函数进行时钟的设置,然后进入主函数main.那么我们就来看下SystemInit()函数到底做了哪些操作,首先打开我们前面使 ...

  9. STM32 时钟系统

    1.在 STM32F4 中,有 5 个最重要的时钟源,为 HSI.HSE.LSI.LSE.PLL.其中 PLL 实际是分为两个时钟源,分别为主 PLL 和专用 PLL. 2.   ①.LSI 是低速内 ...

随机推荐

  1. 通过HttpURLConnection下载图片到本地--批量下载

    一.背景说明 这篇文章讲述的是批量下载附件,在上一篇文章中,介绍了下载单个附件(上一篇文章). 二.实现思路 主要的实现思路:创建文件夹->文件夹中创建需要下载的文件->压缩文件夹-> ...

  2. 三剑客之awk 逐行读取

    目录: 一.awk工作原理 二.按行输出文本 三.按字段输出文本 四.通过管道,双引号调用shall命令 五.CPU使用率 六.使用awk 统计 httpd 访问日志中每个客户端IP的出现次数 一.a ...

  3. SpringCloudAlibaba - 整合 Nacos 实现服务注册与发现

    目录 前言 环境 Nacos是什么? 服务发现原理 搭建 Nacos Server Nacos Server 下载地址 Nacos Server 的版本选择 运行 Nacos Server Nacos ...

  4. Jmeter系列(12)- 上传接口压测

    step-1上传接口分析 上传接口源码分析:分析上传文件类型.有无大小限制.存放上传文件服务器 没有源码通过抓包工具,或者Chrome查看框架源代码 接口路径/uploadfile,接口请求POST, ...

  5. js中date类型的格式转化为yyyy-MM-dd HH:mm:ss的String类型

    在vue中或其他框架中可以在Date的原型链中添加Format的方法,如ruoyi可以写在main.js中更好,如果写在utils还需要去导入包. 正常的js直接放到utils.js就好 Date.p ...

  6. jmeter监控linux服务器资源

    https://blog.csdn.net/weixin_38102592/article/details/100136375 https://blog.csdn.net/liuqiuxiu/arti ...

  7. Ajax与Gson

    1. ajax的底层操作方法: 代码get请求  Get请求 2. Post请求 $("#chufa").click(function () { var val = $(" ...

  8. Kettle学习笔记(四)— 总结

    目录 Kettle学习笔记(一)- 环境部署及运行 Kettle学习笔记(二)- 基本操作 kettle学习笔记(三)- 定时任务的脚本执行 Kettle学习笔记(四)- 总结 Kettle中设置编码 ...

  9. IceCream in Python

    IceCream in Python 你还在使用print 在Python 中 debug 吗?赶快使用Icecream吧. 提到 Icecream,你是不是会想到ta? 动机 如果你使用print去 ...

  10. MYSQL小版本升级(5.7.21至5.7.25)

    1.环境确认 [root@mysql ~]# ps -ef |grep -i mysql root 9173 1 0 2020 ? 00:00:00 /bin/sh /mysql/data/mysql ...