【STM32】定时器+基本定时器

news2024/12/27 8:48:31

一、定时器的基本概述

1.软件定时器原理

原来我们使用51单片机的时候,是通过一个__nop()__来进行延时

我们通过软件的方式来进行延时功能是不准确的,受到很多不确定因素。

2.定时器原理:计数之间的比值

因为使用软件延时受到影响,所以我们尽量使用硬件来进行定时。硬件同时执行效率也比软件的高。

3.STM32定时器分类

4.STM32定时器特性表

注意点:

1)基本定时器是向上计数器(递增)

2)预分频器系数是从1-65536(但是实际上存储的数值范围是0-65535)--》所以存在+1和-1的问题

5.STM32基本,通用,高级定时器功能整体区别

二、基本定时器(TIM6/TIM7)

1.基本概念

“触发DAC”---》指的是数据电路和模拟电路之间的转换

2.基本定时器框图

1.注意点

1)基本定时器的时钟源是:内部时钟

2)自动重载寄存器和预分频器都有相对应的影子寄存器

3)决定自动重载寄存器(ARR)和预分频器(PSC)是否马上将值更新(是否有缓冲)到影子寄存器的取决于ARPE位

有缓冲--》减少时间误差

无缓冲---》有大量的时间误差

4)影子寄存器中的值更新也要有事件触发

5)实际起作用的是:影子寄存器,其不能直接被访问到

6)溢出条件是CNT==ARR影子寄存器,而不是ARR本身

7)当溢出时,会产生两种结果:中断和DMA输出   中断事件

2.内部时钟频率问题

1)定时器最终的时钟频率不仅仅取决于外部传入的时钟频率还取决于是否进行分频。

举个例子

3.STM32定时器计数模式及溢出条件

递增计数模式实例说明

递减计数模式实例说明

中心对齐模式实例说明

三、定时器寄存器

1.TIM6 和TIM7 控制寄存器 1(TIMx_CR1)

该寄存器用于设置ARR寄存器是否具有缓冲,并且使能/关闭计数器

是否有缓冲的区别:应用场景

1.假设我们现在让led先亮1s,然后灭,在亮2s,假设1s对应的ARR=99,2s对应的ARR=199

a)此时没有缓冲,则在亮1s后灭,然后再要开始亮的时候,我们要修改CNT的值为199,这个修改过程需要浪费时间

b)此时有缓冲,则再亮1s的这个时间段,我们就可以修改ARR=199,因为有缓冲,是等到下一个周期才起作用。

2.假设我们现在让led先亮1s,然后灭,在亮1s,假设1s对应的ARR=99

a)此时没有缓冲,则在亮1s后灭,然后再要开始亮的时候,此时我们不需要修改,则不需要时间

b)此时有缓冲,则再亮1s,然后再要开始亮的时候,此时我们不需要修改,则不需要时间

2.TIM6 和TIM7 DMA/中断使能寄存器(TIMx_DIER)

用于使能更新中断

3. TIM6 和TIM7 状态寄存器(TIMx_SR)

用于判断是否发生更新中断,由硬件置1,软件清零

4. TIM6 和TIM7 计数器(TIMx_CNT)

计数器是可读可写,并且再运行过程中也是可以对其进行修改。

5. TIM6 和TIM7 预分频器(TIMx_PSC)

6. TIM6 和TIM7 自动重装载寄存器(TIMx_ARR)

四、定时器溢出时间计算方法

1)这里ARR+1,可以这样理解,例如ARR的值为2,则计数器从0到1,从1到2,此时并不会立刻溢出,而是再经过一个时钟脉冲后才会溢出,所以实际的溢出时间是三个时钟脉冲,即ARR+1个时钟脉冲

2)ARR里面的值是从零开始的

推导过程

溢出时间=计数个数*f

五、定时器中断配置步骤

1.具体步骤

注意点:

1)记得开启计数器

2)记得使能中断(定时器,NVIC)

3)编写中断服务函数

4)设置NVIC,时钟等基础

5)设置定时器相关的基础参数

6)定时器溢出中断中断回调函数

1)定时器初始化--》HAL_TIM_Base_Init

2)设置中断优先级,使能中断---》HAL_NVIC_SetPriority &&  HAL_NVIC_EnableIRQ

3)编写中断服务函数---》去start.s文件中查找对应的名字【TIM6_IRQHandler】然后再这个函数中调用【HAL_TIM_IRQHandler(这个再hal_tim.c中)】

3)编写定时器的回调函数--》这个函数是在中断处理程序中调用的--》HAL_TIM_PeriodElapsedCallback

4)启动定时器(计数器)和中断---》HAL_TIM_Base_Start_IT

2.相关HAL库函数

1.HAL_TIM_OC_Init:定时器初始化

在stm32f1xx_hal_tim.c中

HAL_StatusTypeDef HAL_TIM_OC_Init(TIM_HandleTypeDef *htim)
{
  /* Check the TIM handle allocation */
  if (htim == NULL)
  {
    return HAL_ERROR;
  }

  /* Check the parameters */
  assert_param(IS_TIM_INSTANCE(htim->Instance));
  assert_param(IS_TIM_COUNTER_MODE(htim->Init.CounterMode));
  assert_param(IS_TIM_CLOCKDIVISION_DIV(htim->Init.ClockDivision));
  assert_param(IS_TIM_AUTORELOAD_PRELOAD(htim->Init.AutoReloadPreload));

  if (htim->State == HAL_TIM_STATE_RESET)
  {
    /* Allocate lock resource and initialize it */
    htim->Lock = HAL_UNLOCKED;

    /* Init the low level hardware : GPIO, CLOCK, NVIC and DMA */
    HAL_TIM_OC_MspInit(htim);

  }

  /* Set the TIM state */
  htim->State = HAL_TIM_STATE_BUSY;

  /* Init the base time for the Output Compare */
  TIM_Base_SetConfig(htim->Instance,  &htim->Init);

  /* Initialize the TIM state*/
  htim->State = HAL_TIM_STATE_READY;

  return HAL_OK;
}

关键结构体介绍

2.HAL_TIM_Base_MspInit

这个函数的作用:MSP是指和MCU相关的初始化

 3.HAL_TIM_Base_Start

启动计数器

4.HAL_TIM_Base_Start_IT

启动定时器的中断

5. TIM6_IRQHandler

1)这个函数名根据所使用的定时器类型去start.s中查找

2)再这个函数中调用“HAL_TIM_IRQHandler”

6.HAL_TIM_PeriodElapsedCallback

编写定时器溢出回调函数,这个是用户根据相关的要求编写

三、中断服务函数VS中断回调函数

HAL库中的中断,在callback回调函数和中断函数中处理有何区别 (amobbs.com 阿莫电子论坛 - 东莞阿莫电子网站)

中断服务函数:TIM6_IRQHandler--->这个实际上不编写业务代码,只是提供一个中断入口

中断回调函数:HAL_TIM_PeriodElapsedCallback--->这个回调函数中编写了相关的业务代码,真正的处理

  1. 中断服务函数(ISR): 中断服务函数是由硬件触发并由操作系统或者嵌入式系统执行的函数。当中断事件(例如,定时器溢出、外部触发等)发生时,CPU会跳转到相应的中断服务函数来执行相关的操作。在这个上下文中,ISR 是系统级别的,用于响应底层的硬件事件。

  2. 中断回调函数: 中断回调函数通常是用户或应用程序级别定义的函数,它会在中断服务函数的上下文中执行。在某些情况下,中断服务函数可能会调用用户定义的回调函数。这个回调函数是由用户定义的,用于处理中断事件,执行与中断相关的应用程序逻辑。在这个上下文中,回调函数是应用程序级别的,用于定制中断发生时的行为。

六、编程实战:定时器中断实验

STM32CubeMX学习笔记(5)——基本定时器接口使用_counter mode mx-CSDN博客

1.条件分析

2.相关频率,溢出时间的计算

3.代码编写

操作代码

TIM_HandleTypeDef g_timx_handle;

//定时器中断初始化函数
void btim_timx_int_init(uint16_t arr,uint16_t psc){
	
	g_timx_handle.Instance=TIM6;
	g_timx_handle.Init.Prescaler=psc;//分频参数
	g_timx_handle.Init.Period=arr;//预装载值
	
	//定时器初始化的基本参数
	HAL_TIM_Base_Init(&g_timx_handle);
	
	//打开定时器6的中断
	HAL_TIM_Base_Start_IT(&g_timx_handle);
	
}
//定时器基础MSP初始化函数(就是初始化NVIC,CLOCK等)
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim){
	
	//判断地址是否为定时器6
	if(htim->Instance==TIM6){
		//打开定时器6的时钟
		__HAL_RCC_TIM6_CLK_ENABLE();
		
		//初始化NVIC
		HAL_NVIC_SetPriority(TIM6_IRQn,1,3);//设置优先级
		HAL_NVIC_EnableIRQ(TIM6_IRQn);//打开定时器6中断
		
	}
	
}

//编写中断服务函数
//去start.s文件中查找
//代码作用:实际上这个函数是提供了一个定时器中断的入口
//并不进行业务的处理
void TIM6_IRQHandler(){
	
	HAL_TIM_IRQHandler(&g_timx_handle);
}

//编写定时器溢出回调函数
//代码作用:编写用户相关的业务代码
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
	//判断地址是否为定时器6
	if(htim->Instance==TIM6){
		//翻转led,使得闪烁
		HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7);
	}
}

main函数

int main(){
    HAL_Init();
    sys_stm32_clock_init(RCC_PLL_MUL9);
    delay_init();
    btim_timx_int_init(5000-1,7200-1);
    while(1){
    
    }

}

通用定时器

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

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

相关文章

RK3568驱动指南|第七期-设备树-第66章of操作函数实验:获取设备树节点

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

正点原子嵌入式linux驱动开发——Linux ADC驱动

在之前的笔记中,学习了如何给ICM20608编写IIO驱动,ICM20608本质就是ADC,因此纯粹的ADC驱动也是IIO驱动框架的。本章就学习一下如何使用STM32MP1内部的ADC,并且在学习巩固一下IIO驱动。 ADC简介 ADC ADC,Analog to D…

里氏代换原则

package com.jmj.principles.dmeo2.after;/*** 四边形接口*/ public interface Quadrilateral {double getLength();double getWidth();}package com.jmj.principles.dmeo2.after;/*** 长方形类*/ public class Rectangle implements Quadrilateral{private double length;priv…

(附源码)基于SSM旅行社网站-计算机毕设 90030

SSM旅行社网站 摘 要 旅游业是一个信息密集型产业,传统的旅游景点门票售卖受到技术和人力的限制,旅行社网站则可以建立景区与游客之间的有效通道,能更好的满足游客便捷旅游的需求。旅行社网站的设计是基于SSM框架、Mysql数据库、JSP技术、Aja…

立体库堆垛机水平电机输出控制程序功能

###############水平电机输出控制程序################# #############水平变频器输出控制程序################# *******************水平速度曲线建立*********************** 列距离差值,建立与速度的关系式:VX/k MW220为K系数 水平速度控制K系数 列…

EDA实验-----3-8译码器设计(QuartusII)

目录 一. 实验目的 二. 实验仪器 三. 实验原理及内容 1.实验原理 2.实验内容 四.实验步骤 五. 实验报告 六. 注意事项 七. 实验过程 1.创建Verilog文件,写代码 ​编辑 2.波形仿真 3.连接电路图 4.烧录操作 一. 实验目的 学会Verilog HDL的…

AI艺术字比赛;OpenAI GPTs 分享网站;AI项目坟场;农村程序员独立开发者;小红书·大模型与推荐系统 | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 🉑 Alibaba X 堆友「AI造字」主题作品设计大赛 https://d.design/competition/ai-word 堆友 (D.DESIGN) 是一个在线设计平台,…

堆的应用-----Top k 问题

目录 前言 Topk问题 1.问题描述 2.解决方法 3.代码实现(C/C) 前言 在人工智能算法岗位的面试中,TopK是问得最多的几个问题之一: 到底有几种方法? 这些方案里蕴含的优化思路究竟是怎么样的? 为啥T…

OpenAI发布会,看看GPT又有哪些大动作!2023.11.7【浓缩精华】

ChatGPT GPT-4 Turbo其它applications 北京时间11月7日OpenAI首届开发者大会 GPT-4 Turbo Context length 支持12.8万个上下文contextMore control JSON模式 可复制输出 未来:在API中查看日志Better knowledge 平台启动检索 拥有截至2023年3月的知识New modaliti…

2020年12月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

一、单选题(共25题,每题2分,共50分) 第1题 下面哪个区域是“舞台区”? A:A B:B C:C D:D 答案:B 第2题 下面哪段程序可以随机切换三个背景? A: B: C: D:

2.1 Windows驱动开发:内核链表与结构体

在Windows内核中,为了实现高效的数据结构操作,通常会使用链表和结构体相结合的方式进行数据存储和操作。内核提供了一个专门用于链表操作的数据结构LIST_ENTRY,可以用来描述一个链表中的每一个节点。 使用链表来存储结构体时,需要…

搜狐2023年Q3营收1.45亿美元 宣布最高8000万美元股票回购计划

2023年11月13日,搜狐公司公布2023年第三季度财务报告。财报显示,搜狐公司第三季度总收入为1.45亿美元,其中,品牌广告收入为2200万美元,在线游戏收入为1.17亿美元;同时宣布为期两年,总金额最高为…

Code Former安装及使用

Code Former是南洋理工大学和商汤科技联合研究中心联合开发一款AI人脸修复算法,通过该算法,可以对已经模糊的图片进行人脸修复,找回斑驳的记忆 由于网上对于Code Former的封装,全都是要花钱,或者需要其他什么曲折的方式…

Pyside6/PYQT6如何实现无边框设计,解决无边框窗口无法移动和实现窗口拖拽改变大小的问题

文章目录 💢 问题 💢💯 解决方案 💯🍔 准备工作📚 setWindowFlags、setWindowFlag和setAttribute的区别🐾 操作步骤🐾 窗口无边框🐾 窗口透明🐾 实现窗口可移动🐾 实现窗口拖拽改变大小⚓️ 相关链接 ⚓️💢 问题 💢 有时候我们需要一个无边框的UI设…

转本考前4个月,手把手教你逆袭上岸

现在离转本考试的时间还剩下4个月,绝大多数同学会在之后的寒假期间全力学习,谁在这段时期懈怠,谁就丢掉了一半的分数。 不管是复习了很长一段时间,还是刚起步的同学,都有必要重新规划后面的复习。下面给大家讲讲&…

告别瞎忙+拖延,工作中必不可少的便签工具

在平常的工作中,很多人都会感慨,每天的工作都是在瞎忙,一天忙忙碌碌结束后发现仍旧有许多待完成的任务,也有一些人在工作中碌碌无为,消极怠工拖延时间,瞎忙拖延归根到底是没有提前将工作中的各项工作安排妥…

vscode使用flake8设置单行最长字符限制设置失败的问题

vscode使用flake8设置单行最长字符限制设置失败的问题 问题描述解决方案 问题描述 如图所示,使用flake8单行字数过长,就会有有红色底的波浪线 一般情况下很多教程都会让你在setting.json里面设置 但是我打开我的setting.json,发现我已经进…

List中的迭代器实现【C++】

List中的迭代器实现【C】 一. list的结构二. 迭代器的区别三. 迭代器的实现i. 类的设计ii. 重载iii. !重载iiii. begin()iiiii. end()iiiii. operator* 四.测试五. const迭代器的实现i. 实现5.2 优化实现 一. list的结构 其实按照习惯来说,应该要专门出一篇博客来写…

体验家XMPlus收购NPSMeter,稳固体验管理行业“领头羊”地位

2023年9月30日,体验家XMPlus(以下简称“体验家”)成功完成了对NPSMeter的收购。此次收购是中国客户体验管理(CEM)赛道进入快速发展以来的首单收购,标志着体验家在CEM领域的进一步扩张,旨在继续完…

2023亚太杯数学建模C题思路

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料5 最后 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 2023年第十三…