正点原子--STM32定时器学习笔记(1)

这部分是笔者对基本定时器的理论知识进行学习与总结!,主要记录自己在学习过程中遇到的重难点,其他一些基础点就一笔带过了!

1. 定时器概述

1.1 软件定时原理

使用纯软件(CPU死等)的方式实现定时(延时)功能。

比如想要延时1s,那么CPU就卡在延时函数里1s,什么事情都不能干,就会大大占用CPU资源。

软件定时不精准的原因:
1.函数调用有一个压栈和出栈的过程,压栈和出栈也需要消耗时间。
2.stm32是arm架构,有三级流水线,( 流水线可以在一个时钟周期内同时处理多个指令的不同阶段,降低了单个指令的执行时间。),所以指令执行的时间是不确定的。
因为有压栈出栈的不确定,以及流水线指令执行时间的不确定,导致软件编写的函数是一个不精准的延时。

1.2 定时器定时原理

使用精准的时钟源,通过硬件的方式,实现定时功能;定时器核心就是计数器。

时钟源(CLK)通过预分频器(PSC)分频,得到TIM CLK(定时器工作的时钟频率),每来一个时钟,计数器就计一个数,当计数值到达自动重装载值时产生事件/中断,达到计时的效果。

1.3 定时器分类

1.4 定时器特性表

F1系列

说明:

计数器位数表示定时器可以计数的值,16位可以计数2^16 = 65536个数,计数范围0~65535;

当计数时间到后会产生DMA请求;

1.5 基本、通用、高级定时器的功能整体区别

从基本定时器到通用定时器到高级定时器层层迭代!基本定时器具有的功能通用定时器都有,通用定时器具有的功能高级定时器都有。

2. 基本定时器简介

基本定时器有两个,TIM6和TIM7

主要特性:

16位递增计数器(计数值范围:0~65535),16位预分频器(分频系数:1~65536)

定时器溢出时,会产生触发信号,用于触发DAC,进行数模转换;

在更新事件(计数器溢出)时,会产生中断/DMA请求。

3. 基本定时器框图

流程框图分析:首先时钟源经过控制器来到预分频器PSC里,经过分频之后得到计数器的真正工作频率CK_CNT,每来一个时钟则计数器自增1,当计数值等于ARR(影子寄存器)的值时,会产生溢出,即产生事件/中断。

第①部分:定时器时钟TIMxCLK,即内部时钟CK_INT;

第②部分:控制器控制CNT计数器复位、使能、计数;当CNT计数器溢出时触发控制器产生触发输出信号TRGO,触发一次DAC数模转换。

第③部分:

影子寄存器:是实际起作用的寄存器,不能直接访问,而ARPE位决定了ARR是否具有缓冲,当设置为有缓冲时,ARR的预装载寄存器写入某个值,这个值不会立即起作用,必须等到更新事件发生时,才会把ARR的预装载寄存器的值转移到影子寄存器,从而真正起作用生效;而设置无缓冲时,给ARR的预装载寄存器写入某个值,它会立即转移到影子寄存器中,会立即生效。

预装载寄存器实际上起到一个缓冲的作用。

特别说明: 

两者区别:计数器溢出时,默认会产生事件,也可以人为设置为不产生事件;而中断和DMA请求是默认不产生,可以人为的配置它产生。
总的来说,当计数器溢出时,事件会默认产生,中断和DMA输出默认不产生。

产生更新事件后,会让预装载寄存器的值加载到对应的影子寄存器当中。预装载寄存器是黑色的那个框框,影子寄存器是灰色的那个矩形。

时钟树分析

模块框图

在《STM32F103系列数据手册》 中可以找到该模块框图,由图知,TIM6和TIM7挂载在APB1总线,该总线的最高频率为36M。

由时钟树得知,想要TIM2~TIM7的时钟频率为72MHz,就要对AHB、APB1进行分频配置,下面两张图分别是通过STM32CubeMX配置的时钟树,以及正点原子官方给的sys.c文件中的时钟树配置,配置效果都是一样,对AHB进行1分频,APB1进行2分频,APB2进行1分频。当SYSCLK为最大72MHz时,AHB进行1分频为72M,APB1进行2分频为36M,因为此时APB1的预分频系数≠1,所以输入到定时器2~7的TIMXCLK为36M*2=72M。

STM32CubeMX配置
正点原子提供的SYSTEM

本篇完。

本人博客仅代表个人见解方便记录成长笔记。

若有不足,请指出,感谢您的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665865.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习_15_贝叶斯算法

文章目录 1 贝叶斯定理相关公式2 朴素贝叶斯算法2.1 朴素贝叶斯算法推导2.2 朴素贝叶斯算法流程 3 高斯朴素贝叶斯4 伯努利朴素贝叶斯5 多项式朴素贝叶斯6 贝叶斯网络6.1 最简单的一个贝叶斯网络6.2 全连接贝叶斯网络6.3 “正常”贝叶斯网络6.4 实际贝叶斯网络:判断…

算法学习——华为机考题库5(HJ31 - HJ35)

算法学习——华为机考题库5(HJ31 - HJ35) HJ31 单词倒排 描述 对字符串中的所有单词进行倒排。 说明: 1、构成单词的字符只有26个大写或小写英文字母; 2、非构成单词的字符均视为单词间隔符; 3、要求倒排后的单…

LeAPI 后端接口开发 - 发布、下线接口

一、上线接口(仅管理员) 1. 校验请求参数 2. 判断(测试)接口是否可以调用 引入调用接口的客户端(自己写的 SDK)注入客户端实例调用接口 3. 修改数据库中接口的状态 /*** 上线(发布&#xff…

爬虫(二)

1.同步获取短视频 1.只要播放地址对Json数据解析,先把列表找出: 2.只想要所有的播放地址,通过列表表达式循环遍历这个列表拿到每个对象,再从一个个对象里面找到Video,再从Video里面找到播放地址(play_addr),再从播放地址找到播放…

动态内存管理 智能指针 shared_ptr、unique_ptr、weak_ptr + 定制删除器

动态内存管理常出现的两种问题: 1.忘记释放内存,造成内存泄漏 2.这块内存还有其他指针指向的情况下,就释放了它,会产生引用非法内存的指针,例如 如果类中有属性指向堆区,做赋值操作时会出现浅拷贝的问题 内存泄漏分…

在jetbrains IDEA/Pycharm/Android Studio中安装官方rust插件,开始rust编程

在idea插件市场搜索rust:JetBrains Marketplace ,就可以找到rust插件: jetbrains官方rust插件地址:[Deprecated] Rust - IntelliJ IDEs Plugin | Marketplace 直接在idea中搜索rust好像是搜不到的: 需要在这个插件市场…

【数据结构】二叉树链式结构的实现

简单不先于复杂,而是在复杂之后。 文章目录 1. 二叉树链式结构的实现1.1 前置说明1.2 二叉树的遍历1.2.1 前序、中序以及后序遍历1.2.2 层序遍历 1.3 节点个数以及高度等1.4 二叉树基础oj练习1.5 二叉树的创建和销毁 1. 二叉树链式结构的实现 1.1 前置说明 在学习二…

Cambalache in Ubuntu

文章目录 前言apt install flatpak这很ok后记 前言 gtkmm4相比gtkmm3有很多改革, 代码也干净了许多, 但在windows上开发 有ui设计器那自然方便很多, 但glade又不支持gtkmm4, windows上装Cambalache很是困难. 各种问题都找不到答案.于是 我用VMware虚拟机Ubuntu20.xx安装Cambal…

macOS虚拟机安装全过程的详细教程

macOS虚拟机安装全过程的详细教程 一、安装虚拟机软件 选择软件:首先,你需要选择一个适合macOS的虚拟机软件。在本教程中,我们以VirtualBox为例。下载与安装:访问VirtualBox的官网,下载适用于macOS的安装包。运行安装…

高校建设AI算力平台方案探索

近年来,人工智能行业发展迅速,在自动驾驶、金融、医疗、教育等行业广泛应用。尤其是ChatGPT发布以后更是掀起了生成式AI的热潮,国内各大互联网厂商也相继发布自己的AI大模型。这也造成了大量的AI人才缺口,同时促进了高校的AI专业建…

CSP-202305-2-矩阵运算

CSP-202305-2-矩阵运算&#xff1a;题目链接 知识点一&#xff1a;申请矩阵 1.动态分配 // 申请 int** dynamicArray new int*[rows]; for (int i 0; i < rows; i) {dynamicArray[i] new int[cols]; }// 释放 for (int i 0; i < rows; i) {delete[] dynamicArray[…

解决浏览器端 globalThis is not defined 报错

解决浏览器端 globalThis is not defined 报错 前言解决办法&#xff1a; 前言 在使用低版本火狐浏览器出现报错globalThis is not defined 解决办法&#xff1a; 在vue的index.html 中添加 this.globalThis || (this.globalThis this) <head><script>this.g…

Lambda表达式(匿名函数)

C11中引入了lambda表达式&#xff0c;定义匿名的内联函数。 我们可以直接原地定义函数而不用再跑到外面去定义函数跳来跳去。 同时在stl的排序上也有作用。 [capture] (parameters) mutable ->return-type {statement}下面逐一介绍各个参数的含义. [capture] : 捕获&#…

Java语法学习线程基础

Java语法学习线程基础 大纲 概念创建线程线程终止常用方法用户线程和守护线程线程的七大状态线程的同步互斥锁线程死锁释放锁 具体案例 1.概念 2. 创建线程 第一种&#xff1a; class Cat extends Thread {int time 0;Overridepublic void run() {while (true) {System.o…

重写Sylar基于协程的服务器(5、IO协程调度模块的设计)

重写Sylar基于协程的服务器&#xff08;5、IO协程调度模块的设计&#xff09; 重写Sylar基于协程的服务器系列&#xff1a; 重写Sylar基于协程的服务器&#xff08;0、搭建开发环境以及项目框架 || 下载编译简化版Sylar&#xff09; 重写Sylar基于协程的服务器&#xff08;1、…

红日靶场1搭建渗透

环境搭建 下载好镜像文件并解压&#xff0c;启动vmware 这里我用自己的win7 sp1虚拟机作为攻击机&#xff0c;设置为双网卡NAT&#xff0c;vm2 其中用ipconfig查看攻击机ip地址 设置win7 x64为双网卡&#xff0c;vm1&#xff0c;vm2 设置win08单网卡vm1&#xff0c;win2k3为单…

jupyter notebook更改工作目录的2个细节

详细步骤参考知乎原文&#xff1a; 如何更改Jupyter Notebook的默认工作路径&#xff1f; - 知乎 (zhihu.com​​​​​​) 步骤4中需要删除 #符号和后面的空格&#xff01;一定要删除空格&#xff0c;否则会出现语法错误的报错 步骤5中&#xff0c;经过评论区提醒后&#xf…

蓝桥杯备战——12.PCF8591芯片的使用

目录 1.芯片简介2.读写时序3.控制字4.代码封装库5.原理图分析6.使用示例 1.芯片简介 截取自NXP的PCF8591芯片数据手册&#xff0c;我把重点关注部分划出来了&#xff0c;请务必自行阅读一遍数据手册&#xff01; 2.读写时序 ①器件地址&#xff1a; Bit0决定是读还是写操作&…

Python 数据分析(PYDA)第三版(七)

原文&#xff1a;wesmckinney.com/book/ 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 附录 附录 A&#xff1a;高级 NumPy 原文&#xff1a;wesmckinney.com/book/advanced-numpy 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 此开放访问网络版本的《Pyt…

ctfshow web-77

开启环境: 先直接用伪协议获取 flag 位置。 c?><?php $anew DirectoryIterator("glob:///*"); foreach($a as $f) {echo($f->__toString(). );} exit(0); ?> 发现 flag36x.txt 文件。同时根目录下还有 readflag&#xff0c;估计需要调用 readflag 获…