STM32基础学习笔记-Timer定时器面试基础题5
第五章、TIMER
1、基本概念:什么是定时器 ?作用 ?分类 ?
2、时基单元 ?组成 ?计数模式 ?溢出条件 ? 溢出时间计算 ?
3、systick原理 ?代码讲解 ?
4、systick与hal_delay的关系 ?为什么不能再中断里使用中断 ?
5、看门狗原理?独立看门狗 ? 窗口看门狗 (下限 0x3f)?
6、RTC ?
7、定时器框图 ?基础、通用、高级的区别 ?
1、定时器
定时->计数
1.定时器分类
三种: 高级定时器(TIM1,TIM8)、通用定时器(TIM2~TIM5)以及基本定时器(TIM6、TIM7)区别:高级定时器具有捕获/比较通道和互补输出,通用定时器只有捕获/比较通道,基本定时器没有以上两者。
计数器模式:通用定时器可以向上计数、向下计数、向上向下双向计数模式。
①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
②向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
③中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
2.定时器框图
四个大的部分:时钟产生器部分、时基单元部分、输入捕获部分以及输出比较部分
时钟产生器:STM32的定时器有四种时钟源:
①内部时钟(CK_INT)
②外部时钟模式:外部触发输入(ETR)
③内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。
④外部时钟模式:外部输入脚(TIx)
3.输出比较通道(PWM)
有两种模式:边沿对齐模式以及中心对齐模式
频率*周期=1
72MHz的时钟,代表它发射的方波,一秒钟发72000000个方波;
通过方波的个数去计时,就把计数和计时关联了起来;
一个方波的时间72*10的六次方之一秒,可以算出n个方波的时间;
如果某段时间经过了72个方波,就意味着已经经历了1M分之一秒
这样理解,就可以把计时和计数划一个等号
4.定时器
它的计数在某种意义上等于计时
核心组件:时基单元;
时基单元由三个部分组成,第一个部分是预分频器,作用都是对时钟做除法,就是进行分频;第二个是ARR,重装载寄存器;最后一个是CNT,也就是计数寄存器;这三个设备完成定时器的核心功能;
首先,给它一个初始的时钟源,给它一个72M的频率,想要得到1M的频率,那就用预分频器将初始的时钟源除以72;计数要计1M次,将这个1M的次数首先放在重装载寄存器中,计数寄存器进行计数的同时,不停地和ARR进行对比,次数正确的时候,就进行更新事件这么一个处理。
计算思路:比如问,8M的ALK,定时1ms
首先,单位化统一:s
列公式:1/CLK PSCARR=t
得出PSC*ARR等于? 最后合理分配:PSC/ARR
5.计数模式
第一种:向上计数模式:CNT++ ->ARR
CNT等于0,CNT一直加,直到和ARR一样大,最后更新事件,
它的溢出条件(也就是停止计数,触发更新事件:CNT=ARR);
第二种、计数方式是:向下计数:
首先让CNT等于ARR,然后让CNT去趋近于0,就是向下计数模式
在这个模式里,CNT初始值=ARR,对CNT进行–,直到CNT=0,触发更新事件;向下计数的溢出条件就是CNT==0;
第三种:中心对称计数
6.内核定时器
为系统提供时钟,和延时函数有关;
(滴答定时器),不管什么定时器,都离不开时基单元(PSC.ARR.CNT还需要加上一个更新中断)
代码当中寻找;内核定时器的时钟源是内部的一个高速时钟(16M),它的ARR是16000;CNT是0,向上计数;
更新中断:tick++(用来给hel_delay做延时)(每次tick++都代表过了1ms)两次gettick相当于毫秒级的延时,这是本质;
两个用法:第一个是通过修改systick handler的优先级(提高优先级)来实现中断嵌套,就可以在中断中使用延时函数;
第二个用法是自定义延时函数:重写ARR和CNT的代码,分别可以实现毫秒级延时和微秒级延时以及秒级延时;
第二个外设:
2、看门狗
(分为独立看门狗和窗口看门狗)
当代码出现异常或者跑飞的时候,让计算机自动复位
这里重点是,如何实现计算机的自动复位
一个时基单元,看门狗是向下计数的,看门狗启动的时候,CNT的初始值会等于ARR,喂狗的程序也是让CNT等于ARR,如果CNT==0,就会触发复位(程序正常的时候,CNT永远都不等于0)
当程序异常的时候,喂狗的代码就无法执行,此时必然会出现CNT==0的情况,触发条件让计算机进行复位;
1.窗口看门狗
0x3f(64) 它的上限是ARR,也就是我们自己设置的值,窗口看门狗的CNT也会从ARR向0减少,它的喂狗时间必须在窗口期内,0x3f这点设置为更新事件,这时会有一个中断产生,此时喂狗行为进行;
3、RTC
实时时钟:
外部时钟芯片:稳定
专供电供:纽扣电池
专供晶振:32.768k
反映的信息:年、月、日、时、分、秒
内部的时基单元,年月日时分秒不停累加,前提是不断电
需求:定时器每隔1s,打印或者闪烁一次
cubemx:选择一个定时器、
分频定时:clk,psc,arr怎么选择,设置一个合理的值
与定时器相关的nvic打开
uart/gpio
keil:定时器中断开关(只需要打开一次
更新回调函数)
4、定时器分类(三种)
第一种是内核定时器:systick
专用定时器有独立看门狗和窗口看门狗,只需要看代码和应用层,寄存器这儿不用看,只需要到应用层就足够了(应用层相关配置部分)(面试问,你说你用过uart,你用的时候,使用到了哪些:hal库中在使用uart时,在初始化uart时,需要配置的参数:答案都在keil的代码里面,自己课后去寻找)
专用看门狗还有讲到了一个RTC
常用定时器:基础定时器、通用定时器以及高级定时器
如果定时器只弄了时基单元,那就是基础定时器,
如果还有输入通道和输出通道,就是有输入捕获功能和输出比较功能(就是生成PWM波)主动向外发出一些方波,单片机有能力自己创造波形并且输出这个波;有以上两个额外功能的,就叫做通用定时器;
高级定时器,专门为电机服务;电机有专门的通道,实现“刹车”,如果电机要停止,会有一个瞬间的停止,电机具有刹车功能,芯片有意识地迎合这个功能(多一个接口)
此外,高级定时器还有一个死区功能,还能输出互补通道
5、PWM
脉冲宽度调制
每种波,都有自己的周期和频率,这两个可以决定这个波的高电平和低电平的时间
占空比:t1/t*100%,在整个方波的周期内,高电平所占时间的比值
脉冲:时基单元来确定一个波的周期t
周期可以由时基单元分配:分频定时去控制
宽度:高电平的时间t1
调制:动态地改变占空比->应用场景:呼吸灯的亮度,逐渐变亮再逐渐变暗 改变占空比就是改变高电平的持续时间,
比较值:计数为100个,PWM1模式:令CNT在0到x的时候,为高电平,x到100为低电平;;;PWM2模式:x到100的时候为高电平;0到x为低电平
应用:呼吸灯:本质:控制led灯高电平的时间(动态改变占空比)
6、实验
1、systick与han_delay 代码解析
2、RTC
HAL_RTC_GetTime()
HAL_RTC_GetDate()
3、独立看门狗
HAL_IWDG_Refresh()
4、窗口看门狗
HAL_WWDG_Refresh()
HAL_WWDG_IRQHandler()
HAL_WWDG_EarlyWakeupCallback()
#include <stdio.h>
void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef *hwwdg)
{
HAL_WWDG_Refresh(hwwdg);
printf(“dog eat now…\n”);
HAL_Delay(2000);
printf(“dog eat end…\n”);
}
( 不喂狗时,只会打印部分值,因为不喂狗时会触发中断,然后直接复位)
5、基础定时器 :1s延时
HAL_TIM_Base_Start_IT(&htim14)
HAL_TIM_PeriodElapsedCallback()
void delay_us(uint16_t nus){ // 利用CNT进行微秒延时
__HAL_TIM_SetCounter(&htim14,0);
__HAL_TIM_ENABLE(&htim14);
while( __HAL_TIM_GetCounter(&htim14)< nus);
__HAL_TIM_DISABLE(&htim14);
}
6、通用定时器 PWM : 呼吸灯 ( 微秒级延时 )
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
__HAL_TIM_SetCompare();
6、通用定时器 PWM : 呼吸灯 ( 微秒级延时 )
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_3);
__HAL_TIM_SetCompare();
相关文章:

STM32基础学习笔记-Timer定时器面试基础题5
第五章、TIMER 常见问题 1、基本概念:什么是定时器 ?作用 ?分类 ? 2、时基单元 ?组成 ?计数模式 ?溢出条件 ? 溢出时间计算 ? 3、systick原理 ?代码讲解 &…...

CSS06-元素显示模式、单行文字垂直居中
一、什么是元素显示模式 1-1、块级元素 1-2、行内元素 1-3、行内块元素 1-4、小结 二、元素显示模式转换 三、单行文字垂直居中 CSS 没有给我们提供文字垂直居中的代码,这里我们可以使用一个小技巧来实现。 解决方案: 让文字的行高等于盒子的高度,就可…...

【车联网安全】车端网络攻击及检测的框架/模型
参考标准: 《汽车数据安全管理若干规定(试行)》ISO/SAE 21434《道路车辆 网络安全工程》威胁分析和风险评估(TARA)ISO/DIS 24089R155法规的国标转换:《汽车整车信息安全技术要求》(UN R155&…...

58.【C语言】内存函数(memcpy函数)
目录 1.memcpy *简单使用 翻译: *模拟实现 注意事项: *例题 1.memcpy *简单使用 memcpy:memory copy cplusplus的介绍 点我跳转 翻译: 函数 memcpy void * memcpy ( void * destination, const void * source, size_t num ); 复制内存块 直接从source指向的位置复制num…...
rust一些通用编程的概念
rust一些通用编程的概念 官网文档数据类型 - Rust 程序设计语言 中文版 (rustwiki.org) 变量,数据类型,条件判断,循环 变量 rust中变量的可变性是值得注意的 例如: fn main(){let number 1;number 2;println!("the number is {}&quo…...

SpringBoot基础知识
谈一谈你对SpringBoot的理解,它有哪些特性(优点)? SpringBoot用来快速开发Spring应用的一个脚手架,其目的是用来简化新Spring应用的初始搭建以及开发过程。 优点: 简化配置:提供了很多内置的…...
ubuntu配置libtorch CPU版本
配置环境:Ubuntu 20.04Date:2024 / 08 1、下载最新版本的libtorch wget https://download.pytorch.org/libtorch/nightly/cpu/libtorch-shared-with-deps-latest.zip unzip libtorch-shared-with-deps-latest.zip2、创建一个C工程文件夹,目…...
Docker MySql 数据备份、恢复
docker-compose.yaml实例 version: 3.8 services:db:image: mysql:9.0.1environment:MYSQL_ROOT_PASSWORD: 123456MYSQL_DATABASE: dataMYSQL_USER: dataMYSQL_PASSWORD: 123456MYSQL_ROOT_HOST: % 1、备份 docker exec -it <容器名称> /usr/bin/mysqldump -u root -p12…...

django项目添加测试数据的三种方式
文章目录 自定义终端命令Faker添加模拟数据基于终端脚本来完成数据的添加编写python脚本编写shell脚本执行脚本需要权限使用shell命令来完成测试数据的添加 添加测试数据在工作中一共有三种方式: 可以根据django的manage.py指令进行[自定义终端命令]可以采用第三方…...

用Python提取PDF表格到Excel文件
在对PDF中的表格进行再利用时,除了直接将PDF文档转换为Excel文件,我们还可以提取PDF文档中的表格数据并写入Excel工作表。这样做可以避免一些不必要的文本和格式带来的干扰,获得更易于分析和处理的表格数据,并方便进行更多的格式设…...
Java基础|多线程:多线程分页拉取
前言: 通常我们都会遇到分页拉取的需求,比如与第三方系统同步数据,定时拉取全量数据做缓存,下面我们简单介绍下多线程分页写法 需求: 全量同步第三方系统数据,并在全部数据同步完后,统一做缓存…...

Android RecyclerView 实现 GridView ,并实现点击效果及方向位置的显示
效果图 一、引入 implementation com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30 二、使用步骤 1.Adapter public class UnAdapter extends BaseQuickAdapter<UnBean.ResultBean, BaseViewHolder> {private int selectedPosition RecyclerView.NO_POSITIO…...
Centos中dnf和yum区别对比
dnf和yum是两种不同的包管理工具,它们各自具有独特的特点和优势,主要用于在Linux系统上安装、更新和卸载软件包。以下是dnf和yum之间的主要区别: 1. 依赖关系解决 dnf:dnf在处理依赖关系方面表现出更强的能力。它能够更高效地解…...

CVPT: Cross-Attention help Visual Prompt Tuning adapt visual task
论文汇总 当前的问题 图1:在VTAB-1k基准测试上,使用预训练的ViT-B/16模型,VPT和我们的CVPT之间的性能和Flops比较。我们将提示的数量分别设置为1、10、20、50,100,150,200。 如图1所示,当给出大量提示时,VPT显示了性能的显著下降…...
基于双向 LSTM 和 CRF 的序列标注模型
基于双向 LSTM 和 CRF 的序列标注模型 在自然语言处理中,序列标注是一项重要的任务,例如命名实体识别、词性标注等。本文将介绍如何使用 Keras 构建一个基于双向 LSTM 和 CRF 的序列标注模型。 一、引言 序列标注任务要求为输入序列中的每个元素分配一个标签。传统的方法可…...

为何美国与加拿大边界看似那么随意?
我们在《日本移民巴西超200万,会成第二个“巴勒斯坦”吗?》一文中探讨了日本移民巴西的历史,以及移民对巴西的风险与挑战。 今天我们来探讨美国与加拿大边界为什么那么随意,并整理了加拿大和美国的国界、省界、市界行政边界数据分享给大家&a…...
什么是触发器(Trigger)?触发器何时会被触发?
在数据库管理系统中,触发器是一种特殊的存储过程,它会在特定的表上执行插入、更新或删除操作时自动触发。 触发器的主要用途是维护数据的一致性和完整性,以及实现一些复杂的业务逻辑。 触发器何时会被触发? 触发器可以在以下几…...
一步一步优化一套生成式语言模型系统
以下是这套生成式语言模型解决任务的流程图概述: #mermaid-svg-keXg8yGoCyObKDtu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-keXg8yGoCyObKDtu .error-icon{fill:#552222;}#mermaid-svg-keXg8yGoCyO…...

Q必达任务脚本
文章目录 1.购买服务器地址2.部署教程3. 代码如下4. 如何联系我 1.购买服务器地址 服务器购买地址 https://t.aliyun.com/U/rUHk58 若失效,可用地址 https://www.aliyun.com/activity/wuying/dj?source5176.29345612&userCode49hts92d 2.部署教程 2024年最…...

问请问请问2312123213123
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...