news 2026/6/7 4:34:38

STM32——定时器:基本定时器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32——定时器:基本定时器

定时器归纳总页:



STM32——定时器-CSDN博客

一、定时器概述

1.1 软件定时原理

51单片机计时,主频 12MHz,1us for(n) { __nop(); /* 空语句 执行时间1us */ }

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

但是不会很精准,原因:

1.函数有压栈操作耗时

2.有流水线,指令执行可能是多个步骤共同执行。

软件延时缺点:

1.延时不精准

2.CPU死等

所以需要外设硬件定时器

1.2 定时器定时原理(硬件)

使用精准的时基,通过硬件的方式,实现定时功能。

核心就是计数器。

原理:

1.3 STM32定时器分类

1.4 STM32定时器特性表(常规定时器 F1系列)

开发指南:

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

二、基本定时器

2.1 基本定时器简介(F1)

F1-H7都是这两个基本定时器

2.2 基本定时器框图

总线挂载:

芯片手册12页,参考手册56页。

2.3 定时器计数模式以及溢出条件

递减模式

中心对齐,模式

2.4 基本定时器中断实验相关寄存器(TIM6/TIM7)

定时器控制寄存器(TIMx_CR1)

例子:

控制LED 1s亮,2s灭,如果计时满了才操作寄存器,有一定的时延误差,如果在计时结束前提前准备好值,减少操作寄存器的时间误差。

缓冲的作用:提前准备,减少误差

定时器 DMA 中断使能寄存器(TIMx_DIER)

定时器状态寄存器(TIMx_CR1)

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

计数器(TIMx_CNT)

计数器实时数值,可用于设置计数器初始值。在计数器运行过程中,也可进行写操作。

定时器预分频器(TIMx_PSC)

自动重装载寄存器(TIMx_ARR)

实际作用的是影子寄存器。

2.5 定时器溢出时间计算方法

:定时器溢出时间,秒

:定时器的未分频的时钟源频率

:自动重装载寄存器的值,需要 ARR+1才是溢出时间

:预分频器寄存器的值,真正的分频系数为PSC+1

推导:

数一个数的时间:

溢出计数的时间:

2.6 定时器中断实验配置步骤

步骤HAL库函数备注主要寄存器
1.配置定时器基础工作参数HAL_TIM_Base_Init()初始化定时器基础参数CR1、ARR、PSC
2.定时器基础MSP初始化HAL_TIM_Base_MspInit()

空函数,用于存放配置

NVIC、CLOCK、GPIO等的代码

3.使能更新中断并启动计数器HAL_TIM_Base_Start_IT()使能更新中断,并启动计数器DIER、CR1
4.设置优先级,使能中断

HAL_NVIC_SetPriority()

HAL_NVIC_EnableIRQ()

5.编写中断服务函数TIMx_IRQHandler()等

此函数会调用定时器公共处理函数:

HAL_TIM_IRQHandler()

会在此公共处理函数中,调用各种callback函数,处理各种中断

SR
6.编写定时器更新中断回调函数HAL_TIM_PeriodElapsedCallback()空函数,定时器更新终端回调函数,需要重新定义

关键结构体1:TIM_HandleTypeDef

或者直接搜索 TIM6

句柄的初始化结构体:TIM_Base_InitTypeDef

1.由于基本定时器只允许递增计数模式,也没有其他的寄存器来配置其他的计数模式。所以CounterMode成员对于基本定时器来说是无效的,只有在通用、高级定时器才有效。

2.由于基本定时器没有时钟分频因子的寄存器。所以只有在通用、高级定时器才有效。

3.由于F1的基本、通用定时器没有重复计数器的寄存器。所以只有在高级定时器才有效。

总结:

基本定时器用到了:Prescaler、Period、AutoReloadPreload三个结构体成员

2.7 编程实战:基本定时器中断实验

【免费】基本定时器中断实验工程资源-CSDN下载https://download.csdn.net/download/PinnsiR/92282791

更新中断的两种方式:

1.定时器溢出(硬件),伴随着 更新事件 和 更新中断 的产生(例程使用此方式)

2.软件通过寄存器 的 UG 位,产生软件的更新事件。从而产生更新中断

溢出时间计算:

500ms 溢出时间,主频为 72MHz。

为了得到整数,设置PSC值为 7199,算出ARR为4999

例程:

TIM_HandleTypeDef g_timx_handle; /* 定时器句柄 */ /** * @brief 基本定时器TIMX定时中断初始化函数 * @note * 基本定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候 * 基本定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz * 定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us. * Ft=定时器工作频率,单位:Mhz * * @param arr: 自动重装值。 * @param psc: 时钟预分频数 * @retval 无 */ void btim_timx_int_init(uint16_t arr, uint16_t psc) { g_timx_handle.Instance = BTIM_TIMX_INT; /* 通用定时器X */ g_timx_handle.Init.Prescaler = psc; /* 设置预分频系数 */ g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */ g_timx_handle.Init.Period = arr; /* 自动装载值 */ HAL_TIM_Base_Init(&g_timx_handle); HAL_TIM_Base_Start_IT(&g_timx_handle); /* 使能定时器x及其更新中断 */ } /** * @brief 定时器底层驱动,开启时钟,设置中断优先级 此函数会被HAL_TIM_Base_Init()函数调用 * @param htim:定时器句柄 * @retval 无 */ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) { if (htim->Instance == BTIM_TIMX_INT) { BTIM_TIMX_INT_CLK_ENABLE(); /* 使能TIM时钟 */ HAL_NVIC_SetPriority(BTIM_TIMX_INT_IRQn, 1, 3); /* 中断号,子优先级3,组2 */ HAL_NVIC_EnableIRQ(BTIM_TIMX_INT_IRQn); /* 开启ITM3中断 */ } } /** * @brief 定时器TIMX中断服务函数 * @param 无 * @retval 无 */ void BTIM_TIMX_INT_IRQHandler(void) { HAL_TIM_IRQHandler(&g_timx_handle); /* 定时器中断公共处理函数 */ } /** * @brief 定时器更新中断回调函数 * @param htim:定时器句柄 * @retval 无 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == BTIM_TIMX_INT) { LED1_TOGGLE(); /* LED1反转 */ } }
#define LED0_TOGGLE() do{ HAL_GPIO_TogglePin(LED0_GPIO_PORT, LED0_GPIO_PIN); }while(0) /* 翻转LED0 */ int main(void) { HAL_Init(); /* 初始化HAL库 */ sys_stm32_clock_init(RCC_PLL_MUL9); /* 设置时钟, 72Mhz */ delay_init(72); /* 延时初始化 */ usart_init(115200); /* 串口初始化波特率为115200 */ led_init(); /* 初始化LED */ btim_timx_int_init(5000 - 1, 7200 - 1); /* 10Khz的计数频率,计数5K次为500ms */ while (1) { LED0_TOGGLE(); delay_ms(200); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/2 9:44:23

前端基础知识

前端基础知识完整梳理(2026年实用版) 适合0-2年前端从业者快速查漏补缺 / 面试复习 / 自学路线规划 一、前端知识体系层级图(2026主流认知) ┌──────────────────────────────┐ │ 浏览…

作者头像 李华
网站建设 2026/5/20 17:43:45

警惕新型网络攻击:伪装ChatGPT指令传播MacStealer恶意软件

仅限会员阅读 网络攻击警告:MacStealer恶意软件通过伪造ChatGPT指令传播 AI前沿观察 关注 | 阅读时间约2分钟 3天前发布 请按回车键或点击查看完整图片 安全研究人员发现,攻击者正在利用ChatGPT诱骗Mac用户将命令行粘贴到终端中,从而安装恶意…

作者头像 李华
网站建设 2026/6/5 1:17:08

学长亲荐2026TOP9AI论文软件:本科生毕业论文全场景测评

学长亲荐2026TOP9AI论文软件:本科生毕业论文全场景测评 推荐1:「千笔AI」—— 一站式学术支持“专家”,学术写作全场景王者(推荐指数:★★★★★) 在众多AI论文工具中,「千笔AI」凭借其强大的功…

作者头像 李华
网站建设 2026/5/26 6:14:02

面向 OpenHarmony 的 Flutter UI 实践:便签卡片组件从设计到落地

文章目录面向 OpenHarmony 的 Flutter UI 实践:便签卡片组件从设计到落地前言背景Flutter OpenHarmony 跨端开发介绍架构定位开发核心代码便签卡片组件实现代码结构解析1. 状态驱动的颜色设计2. Card InkWell 的交互组合3. 顶部信息区:标题 完成状态4…

作者头像 李华
网站建设 2026/6/6 11:31:57

linux 如何查看udp协议缓冲区的默认大小

在 Linux 系统中,UDP 协议的接收和发送缓冲区大小可以通过内核参数进行配置。要查看 UDP 缓冲区的默认大小(即未显式设置时的初始值)以及最大限制,可以使用以下方法:1. 查看系统级别的 UDP 缓冲区默认值和限制这些值由…

作者头像 李华
网站建设 2026/6/6 11:34:51

【AI大模型开发】-基于FAISS的语义搜索系统(实战)

向量数据库实战:基于FAISS的语义搜索系统 一、项目概述 1.1 什么是向量数据库? 向量数据库是一种专门用于存储、索引和检索高维向量数据的数据库系统。在AI领域,向量通常是指通过预训练模型(如Transformer)将文本、图像…

作者头像 李华