20:【stm32】定时器一:时基单元

时基单元

  • 1、什么是定时器
  • 2、时基单元的基本结构
    • 2.1:脉冲的来源
    • 2.2:预分频器PSC
    • 2.3:计数器CNT
    • 2.4:update事件与预加载
  • 3、标准库编程
    • 3.1:通过定时器中断来设置延迟函数

1、什么是定时器

定时器是一种专门负责定时功能的片上外设,而F1系列的单片机最多由14个定时器(TIM1~TIM14)。而STM32F103C8T6一共只有4个定时器。

在这里插入图片描述
如上图所示:STM32F103C8T6有一个高级定时器TIM1,3个通用定时器TIM2~4。而高级定时器TIM1挂载在APB2上面。

2、时基单元的基本结构

在这里插入图片描述
如图为定时器的基本结构,而时基单元是定时器结构的一部分,如下图所示。

在这里插入图片描述
如图:时基单元的基本结构由预分频器PSC,计数器CNT,自动重装寄存器ARR,重复计数器RCR组成。而RCR只有高级定时器才有,通用定时器没有。

 PSC (Prescaler): 对速时钟信号 分频CNT (Counter) :在时钟脉冲激励下 计数ARR (Auto Reload Register ):用于设置定时周期RCR (Repetition Counter Register):用于设置定时的 的次 Update事件 - 当RCR溢 时产生Update中断 - 由Update事件引发的中断

2.1:脉冲的来源

在这里插入图片描述
由晶振而来,具体情况可参考时钟树的相关知识。

在这里插入图片描述

由上图所示:如果是APB1产生的频率,那么频率 * 2,如果是APB2产生的频率,那么频率 * 1 STM32F103C8T6的定时器来源的频率max = 72MHz

2.2:预分频器PSC

在这里插入图片描述

预分频器由PSC由计数器,比较器和自动重装器构成。

在这里插入图片描述
想要分频率的频率脉冲连接计数器,作为输入信号。当计数器从1开始计数,数值和计数周期通过比较器相较,如果计数值 > 计数周期时,比较器输出一个脉冲,计数值归0,重新开始计数。

如上图所示:计数周期为7,输入脉冲输入了8个脉冲,比较器才输出1个脉冲,实现8分频
如上图:预分频器为16bit,就是计数器为16bit,则它能分频的最大倍数为:2^16 = 65536 。

2.3:计数器CNT

在这里插入图片描述
例如:如果是2bit的计数器,N也为2bit,那么最大分频倍数为2^2 = 4。
没有脉冲来时:计数器为00
第1个脉冲来:计数器为01
第2个脉冲来:计数器为10
第3个脉冲来:计数器为11
第4个脉冲来:计数器变为00,然后向外输出一个脉冲。
在这里插入图片描述

在这里插入图片描述

2.4:update事件与预加载

在这里插入图片描述N值决定了 的周期,有时我们需要在 运行的过程中 态地调整N的值为了防止出错这个调整需要加一些保护措施(预加载 Preload)。
新的N值首先被写 shadow中,等到下一次Update事件时传 active ,至此才能真正发挥作用。
在这里插入图片描述
如图:在计数的中途改变N的值时,N的值保存在影子寄存器中,然后等待这一次的计数完成后,影子寄存器在将N的值写入shadow里面。

3、标准库编程

在这里插入图片描述

3.1:通过定时器中断来设置延迟函数

#include "stm32f10x.h"                  // Device headervoid Time_Init(void);
void LED_Init(void);
void Delay_us(uint64_t us);
void Delay_ms(uint32_t ms);
static uint32_t count = 0;int main(void)
{Time_Init();LED_Init();while(1){GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);Delay_ms(1000);GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);Delay_us(1000000);}
}void LED_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC, &GPIO_InitStruct);
}/*定时器的初始化
*/
void Time_Init(void)
{//1. 使能挂载定时器TIM3的总线时钟RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3,ENABLE);//复位RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM3,DISABLE);//复位RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能时钟//2. 使能ARR寄存器的预加载特性TIM_ARRPreloadConfig(TIM3,ENABLE);//打开预加载特性//3. 初始化时基单元,这些都是配置影子寄存器中TIM_TimeBaseInitTypeDef TIMInitStruct;TIMInitStruct.TIM_Prescaler = 71;//配置预分频器PSCTIMInitStruct.TIM_Period = 999;//配置自动重装寄存器ARRTIMInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//配置计数器为向上计数模式TIM_TimeBaseInit(TIM3,&TIMInitStruct);//4. 收到启动Update事件,必须手动启动,因为配置好了的定时器参数在影子寄存器中TIM_GenerateEvent(TIM3,TIM_EventSource_Update);//5. 使能Updata中断TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//打开Updata触发的中断源//6. 配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitTypeDef NVICInitStruct;NVICInitStruct.NVIC_IRQChannel = TIM3_IRQn;NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVICInitStruct.NVIC_IRQChannelSubPriority = 0;NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVICInitStruct);//7. 使能定时器TIM3TIM_Cmd(TIM3,ENABLE);}/*定时器的中断函数,由上面的定时器初始化得,PSC = 71,则分频72倍,72MHz/72 = 1MHz1MHz代表1s/1000000 = 0.000001s = 1us,所以没间隔1us计数一次。自动重装器为999,则代表每隔1000 * 1us = 1ms触发一个Update事件,然后产生一个中断。*/
void TIM3_IRQHandler(void)
{//判断中断标准位,是谁产生的中断源if(TIM_GetFlagStatus(TIM3,TIM_FLAG_Update) == SET)//如果是Update产生的中断源{TIM_ClearFlag(TIM3,TIM_FLAG_Update);//清除中断标准位count++;//代表每隔1ms,count加1。}
}/*定义一个ms的延迟函数
*/
void Delay_ms(uint32_t ms)
{uint64_t time = count + ms;while(count < time);
}/*定义一个us的延迟函数
*/
void Delay_us(uint64_t us)
{uint64_t time = count * 1000 + TIM_GetCounter(TIM3) + us;//TIM_GetCounter(TIM3)获取计数器计数的值while(count * 1000 + TIM_GetCounter(TIM3) < time);
}

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

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

相关文章

Vue 满屏纵向轮播图

目录 前言轮播图效果展示具体实现实现思路具体代码前言 今天汇总一个需求,还是之前写的,要求写一个满屏的轮播图,准确的说,是鼠标滑动到轮播图的时候,轮播图固定在屏幕上,随着其中的轮播子项遍历结束后,解除固定的效果。原本我最开始想直接修改Element-UI的组件的,但是…

CISAW认证考试的时间是多久

CISAW&#xff0c;即中国信息安全保障人员&#xff0c;是中国信息安全认证与审查中心进行权威认证的缩写。它是全国范围内最为权威、最高端的信息安全认证之一。作为信息安全领域的重要认证&#xff0c;对于从事网络安全工作的人员来说具有极其重要的意义。因此&#xff0c;备考…

【容器安全系列Ⅲ】- 深入了解Capabilities的作用

在本系列的上一部分中&#xff0c;我们提到 Docker 容器尚未使用 time 命名空间。我们还探讨了容器在许多情况下如何以 root 用户身份运行。考虑到这两点&#xff0c;如果我们尝试更改容器内的日期和时间会发生什么&#xff1f; 为了测试这一点&#xff0c;我们先运行 docker r…

入门网络安全工程师要学习哪些内容

大家都知道网络安全行业很火&#xff0c;这个行业因为国家政策趋势正在大力发展&#xff0c;大有可为!但很多人对网络安全工程师还是不了解&#xff0c;不知道网络安全工程师需要学什么?知了堂小编总结出以下要点。 网络安全工程师是一个概称&#xff0c;学习的东西很多&…

2000-2023年逐年最大NDVI数据集(500m)

植被指数&#xff08;NDVI, Normalized Difference Vegetation Index&#xff09;可以准确反映地表植被覆盖状况。目前&#xff0c;NDVI时序数据已经在各尺度区域的植被动态变化监测、土地利用/覆被变化检测、宏观植被覆盖分类和净初级生产力估算等研究中得到了广泛的应用。 中…

【java】RuoYi-Vue前后端分离版本-请求被拦截,怎么修改拦截过滤器,解决方案

【java】RuoYi-Vue前后端分离版本-请求被拦截&#xff0c;怎么修改拦截过滤器 它用到了一个安全管理框架Spring Security 你可以通过这篇文章《Spring Security 详解》 去了解它&#xff0c;怎么使用或者使用原理。 所有业务都受SecurityConfig配置所过滤 SecurityConfig配置…

【功能自动化】使用Excel文档获取参数数据

环境搭建&#xff1a; 1.需要配置WebTours网站 2.安装pandas pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python_dateutil…

设计模式(3)结构型模式

结构型模式 结构型模式1. Adapter&#xff08;适配器模式&#xff09;2. Bridge&#xff08;桥接模式&#xff09;3.Composite&#xff08;组合模式&#xff09;4.Decorator&#xff08;装饰模式&#xff09;5.Facade&#xff08;外观模式&#xff09;6.Flyweight&#xff08;享…

14、Ripper

难度 低->中 目标 一个root 两个flag kali 192.168.135.58 靶机 192.168.135.104 netdiscover -i eth0 -r 192.168.135.0/24 端口扫描 先访问一下80端口和10000端口&#xff0c;这两个都是web服务的样子 80端口是初始化界面&#xff0c;可以尝试扫扫目录 访问10000端口…

Linux升级lib64中的libc.so.6导致所有命令失效

ls: relocation error: libpthread.so.0: symbol __libc_dl_error_tsd, version GLIBC_PRIVATE not defined in file libc.so.6 with link time reference 升级Glibc后出现所有shell命令都不可用 # systemctl status systemctl: relocation error: /lib64/libpthread.so.0: sy…

Ollama 企业私有化部署大模型最佳解决方案

为什么要私有化部署大模型&#xff1f; 很多企业为了控制成本和减少核心数据外泄的风险&#xff0c;会通过私有化部署大模型&#xff0c;来控制成本和保障企业的数据安全。 说到本地化部署&#xff0c;这时就需要说到Ollama框架了。 Ollama 是什么&#xff1f; Ollama 是一个开…

张宇1000题vs武忠祥严选题,哪本更接近真题?

张宇1000题强化篇难度还是挺大的 首先是综合度比较高&#xff0c;如果你基础复习的不好&#xff0c;不建议做&#xff0c;张宇1000题强化篇的难度还是比较大的&#xff0c;适合基础已经比较扎实的同学来做&#xff01; 张宇1000题与张宇的高数18讲等课程紧密结合&#xff0c;…

BEV世界:通过统一的BEV潜在空间实现自动驾驶的多模态世界模型

BEVWorld: A Multimodal World Model for Autonomous Driving via Unified BEV Latent Space BEV世界&#xff1a;通过统一的BEV潜在空间实现自动驾驶的多模态世界模型 Abstract World models are receiving increasing attention in autonomous driving for their ability t…

ROS机械臂——ROS结合OpenCV案例(含资源)

纲要 摄像头驱动 图像属性 图像压缩 ### Realsense摄像头 点云展示 ### 点云图像属性 ## 摄像头标定 摄像头标定流程 如何使用标定文件 OpenCV ROS与OpenCV的集成框架 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/b0ff143b710543839325d19c7a3c04c5.png R…

【GH】【EXCEL】P4: Chart

文章目录 data and chartdonut chart (radial chart)Radial Chart bar chartBar Chart line chartLine Chart Scatter ChartScatter Chart Surface ChartSurface Chart Chart DecoratorsChart Decorators Chart GraphicsChart Graphics data and chart donut chart (radial cha…

每日一问:深入理解JVM——结构与类的加载过程解析

每日一问&#xff1a;深入理解JVM——结构与类的加载过程解析 在Java的世界中&#xff0c;JVM&#xff08;Java Virtual Machine&#xff0c;Java虚拟机&#xff09;是一个核心概念。它是Java程序能够跨平台运行的基础&#xff0c;负责执行Java字节码&#xff0c;并为Java应用程…

海南云亿商务咨询有限公司助力抖音商家破浪前行

在当下这个短视频与直播电商风起云涌的时代&#xff0c;抖音作为头部平台&#xff0c;正以其庞大的用户基数和强大的算法推荐机制&#xff0c;成为众多品牌与商家竞相追逐的新蓝海。而在这片波澜壮阔的海洋中&#xff0c;海南云亿商务咨询有限公司如同一艘稳健的航船&#xff0…

OpenCV几何图像变换(1)映射转换函数convertMaps()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像变换映射从一种表示形式转换为另一种表示形式。 该函数将用于 remap 的映射对从一种表示形式转换为另一种表示形式。以下选项 ((map1.type…

43.x86游戏实战-XXX寻找吸怪坐标

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

VMware vSphere ESXi确定vmnic*网络适配器用途的方法

近期有VMware vSphere ESXi宿主机从VMware ESXi, 6.7.0, 17499825版本重装为VMware ESXi, 7.0.3, 21930508后&#xff0c;发现对应网卡的物理适配器名vmnic*发生变化&#xff0c;本文记录了如何确定网络适配器用途的方法。 一、问题描述 原宿主机为ESXi, 6.7.0, 17499825&am…