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

news2024/11/30 10:46:50

时基单元

  • 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 header


void 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;//配置预分频器PSC
	TIMInitStruct.TIM_Period = 999;//配置自动重装寄存器ARR
	TIMInitStruct.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. 配置NVIC
	NVIC_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. 使能定时器TIM3
	TIM_Cmd(TIM3,ENABLE);
	
}

/*
	定时器的中断函数,由上面的定时器初始化得,PSC = 71,则分频72倍,72MHz/72 = 1MHz
	1MHz代表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.coloradmin.cn/o/2059666.html

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

相关文章

5个自动化面试题,助你过关斩将!

一、python深拷贝与浅拷贝的区别 Python中的深拷贝&#xff08;deep copy&#xff09;和浅拷贝&#xff08;shallow copy&#xff09;是两种不同的对象复制方式&#xff0c;它们之间的主要区别在于复制的内容和范围。 浅拷贝&#xff08;Shallow Copy&#xff09; 浅拷贝会创…

最新官方破解版FL Studio24.1.1安装包下载

大家好&#xff01;&#x1f44b;今天我要和大家分享一款让我彻底着迷的音乐制作神器——FL Studio 24.1.1中文版本。作为一个热爱音乐的创作者&#xff0c;我一直在寻找能让我更高效、更有创意地完成作品的软件。直到我遇到了它&#xff0c;我的世界彻底改变了&#xff01; 【…

操作系统(Ubuntu安装配置)

1.1.什么是操作系统 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;是一种系统软件&#xff0c;它是计算机硬件和应用软件之间的桥梁。它管理计算机的硬件和软件资源&#xff0c;为应用程序提供接口和服务&#xff0c;并协调应用程序的运行。操作系统是…

超声波清洗机是智商税吗?专业博主分享四大必买超声波清洗机款式

有些人觉得超声波清洗机不过是个“智商税”&#xff0c;花几百块买个小盒子不值当&#xff0c;毕竟自己用手也能清洗。但这种看法过于片面。事实上&#xff0c;超声波清洗已经有几十年的历史&#xff0c;随着科技的发展&#xff0c;现代超声波清洗机不仅能够批量、自动清洁&…

C#学习之路day2

一、变量 用来在存储计算机当中存储数据 1、常见的数据类型&#xff0c; 2、声明变量的方式 *声明&#xff1a;变量类型 变量名 &#xff1b; *赋值&#xff1a;变量名 值 &#xff1b; 先声明 &#xff0c;再赋值 &#xff0c;再使用 int num ; //声明num 10; //赋值i…

无人系统特刊合集(一)丨MDPI特刊推荐

特刊征稿 01 特刊名称&#xff1a; Civil and Public Domain Applications of Unmanned Aviation 参与期刊&#xff1a; 截止时间&#xff1a; 摘要提交截止日期 2024年10月31日 投稿截止日期 2024年12月31日 目标及范围&#xff1a; 在过去十年中&#xff0c;无人系统经历…

号称企业通讯利器的智能接打电话机器人,好用吗?

企业为了提升效率、优化客户体验&#xff0c;不断探索新的技术工具。智能接打电话机器人作为其中的佼佼者&#xff0c;正逐渐受到市场的广泛关注。那么&#xff0c;智能接打电话机器人究竟好用吗&#xff1f;它能为企业带来哪些实质性的改变呢&#xff1f; 一、智能接打电话机器…

【HTML】弹性盒子 (display: flex) 布局

Flex弹性布局 容器属性flex-direction&#xff08;主轴的方向&#xff09;flex-wrap&#xff08;主轴的项目换行&#xff09;justify-content&#xff08;项目在主轴上的对齐方式&#xff09;align-items&#xff08;项目在交叉轴上的对齐方式&#xff09;align-content&#x…

开学季必备神器!南卡Pro5骨传导耳机,运动学习两不误!

随着科技的不断进步&#xff0c;耳机已经从单纯的听觉工具&#xff0c;演变成了我们日常生活中不可或缺的伴侣。特别是在充满活力的开学季&#xff0c;一款好的耳机不仅能提升学习效率&#xff0c;还能在运动时提供额外的动力。而骨传导技术的出现&#xff0c;更是为耳机领域带…

Flutter入门——从简单的计数器demo入手

Flutter入门——从简单的计数器demo入手 前言 flutter是现如今很热门的跨平台开发框架&#xff0c;只需要一套代码就能在六个平台上运行&#xff0c;现在在移动端的应用比较成熟&#xff0c;本片文章会是Flutter的简单入门&#xff0c;从一个简单的demo入手分析 笔者是Android…

OpenCvSharp.Internal.NativeMethods“的类型初始值设定项引发异常

错误截图&#xff1a; WPF项目 A界面按钮方法调用成员实例B里面这个初始化Mat对象方法 后台ViewModel代码类似&#xff1a; AViewModel{ B b; public void BtnClick(){ b.test(); } } 报错&#xff1a; 看一眼根据经验确认是DLL的问题&#xff0c;于是乎把nuget包配置和…

毛中特25版肖1000题选择题知识点(乱序)

马原&#xff1a;马原25版肖1000题选择题知识点&#xff08;乱序&#xff09;-CSDN博客 毛泽东明确提出的&#xff0c;是把马克思列宁主义基本原理同中国具体实际进行“第二次结合&#xff0c;找出在中国怎样建设社会主义的道路”的任务&#xff0c;不是“第二个结合”(马克思…

USB3.2 摘录(五)

系列文章目录 USB3.2 摘录&#xff08;一&#xff09; USB3.2 摘录&#xff08;二&#xff09; USB3.2 摘录&#xff08;三&#xff09; USB3.2 摘录&#xff08;四&#xff09; USB3.2 摘录&#xff08;五&#xff09; 文章目录 系列文章目录8 协议层&#xff08;Protocol Lay…

爽了!免费的SSL,还能自动续期,支持CDN/OSS!

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 大家好&#xff0c;我是技术UP主小傅哥。 从今年开始&#xff0c;越来越多的云服务厂商开始限制了 ssl 1年期的申请&#xff0c…

Linux驱动学习之点灯(四,linux2.6)

上篇最后的第二种点灯方法年代比较久远&#xff0c;register_chrdev&#xff08;&#xff09;这个函数一下申请了255个设备号&#xff0c;不建议使用 如下图 下图的函数在linux2.6里是上图函数的升级版&#xff0c;不过他是静态分配&#xff0c;后续还得添加到cdev里 从上图函…

计算机的演进之路:历史与组成结构全解析

一、计算机发展历史 &#xff08;一&#xff09;早期计算工具 在计算机诞生之前&#xff0c;人类为了进行计算发明了许多工具。例如&#xff0c;中国古代的算筹和算盘&#xff0c;它们在一定程度上满足了人们进行简单数学运算的需求。而在西方&#xff0c;古希腊的安提凯希拉…

收银系统源码-千呼新零售2.0【线下收银】

千呼新零售2.0系统由零售行业连锁店一体化收银系统和多商户入驻平台商城两个板块组成&#xff0c;打造门店平台的本地生活即时零售模式。 其中连锁店收银系统包括线下收银私域商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。…

相机模型与成像过程:深入解析相机内参、外参及标定方法

相机模型与成像过程&#xff1a;深入解析相机内参、外参及标定方法 引言 相机作为图像采集的重要设备&#xff0c;在图像处理、计算机视觉及机器视觉等领域扮演着核心角色。了解相机的成像原理、模型参数及标定方法&#xff0c;对于提升图像质量和后续处理效果至关重要。本文…

嵌入式学习Day36---Linux软件编程---网络编程

目录 一、TCP并发模型 1.1.阻塞IO 1.2.非阻塞IO 1.步骤 2.函数接口 3.实例 1.3.异步IO 1.步骤 2.函数接口 3.实例 1.4.多路复用IO 1.select 函数接口&#xff1a; 实例 2.poll 3.epoll 二、总结 一、TCP并发模型 1.1.阻塞IO CPU占用率低,等待资源时将任务挂…

初识指针5の学习笔记

目录 1>>前言 2>>qsort函数的实现 2.1>>什么时qsort函数&#xff1f; 2.2>>qsort函数的格式是什么&#xff1f; 2.3>>qsort函数的解析 2.4>>qsort函数的实现&#xff01; 3>>结语 1>>前言 今天我会继续分享一些我做的笔…