目录

前言

基本定时器概念        

定时时间        

定时器时钟确定

        倍频锁相环被正确配置为168MHz

定时器的库函数操作

代码

定时器的寄存器操作

代码

寄存器

后言


前言

使用平台:STM32F407ZET6

使用数据手册:STM32F407数据手册.pdf

使用参考手册:STM32F4xx参考手册(中文).pdf

使用cortex-M手册:Cortex M3与M4权威指南.pdf

        定时器的作用一般是为了使用定时功能和中断功能(洗衣机、微波炉、电风扇、智能空调......),当然在STM32中也可以利用定时器产生周期性的脉冲信号来控制不同的外设(电机的转速、舵机的角度、灯光的亮度........),所以掌握STM32中的定时器对于项目开发是很有必要的。

        定时器有多种,常用的外设定时器有基本定时器、通用定时器与高级定时器。 对于STM32F407微处理器而言,内部一共集成了14个定时器,其中有2个基本定时器(TIM6和TIM7)、10个通用定时器(TIM2~TIM5、TIM9~TIM14)、2个高级定时器(TIM1和TIM8)。其中通用定时器TIM2和TIM5为32位定时器,其他为16位定时器,当然,定时器位数越大,定时时间越久。2的32次方--4 294 967 296,2的16次方65 536。

     

基本定时器概念        

        本文使用的是基本定时器,基本定时器具有16位的自动重载计数器(TIM_Period)与16位的预分频器(TIM_Prescaler)。并且自动重载计数器只能递增计数(TIM_CounterMode_Up),发生更新事件(TIM_IT_Update)会生成中断/DMA请求(计数器上溢)。       

定时时间        

定时时间需要三个参数决定,定时器的时钟频率、预分频器的值与自动重载计数器的值。

这里我提供一下我写的自动计算填的值代码(这个只匹配16位的定时器哦,32位的不一定适用哦):

.\main.exe 84 1 8400这样使用即可,第一个参数84是定时器的频率以MHZ为单位,第二个参数是需要定时的时间,这里以秒为单位,第三个参数可以选择填自己确定的预分配值或者自动重载值即可。这里可以得到匹配的自动重载值或者预分频值(在正式填的时候,不要忘记减1)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>/*** @brief 获得分频系数或者计数器* * @param argc * @param argv * @return int */
int main(int argc, char const *argv[])
{if (argc != 4) // 需要两个参数:时间 和 预分频return -1;int clock = atoi(argv[1])*1000000;              // 84 MHz 定时器时钟float tim_sec = atof(argv[2]); // 期望的定时秒数int prescaler = atoi(argv[3]); // 预分频值// 计算 ARR(自动重装载值)int result = (int)(((float)tim_sec * clock) / ((float)prescaler));if (result > 0 && result < 65536)printf("%d\n", result);elseprintf("Out of range\n");return 0;
}

定时器时钟确定

我的板子芯片是STM32F407ZET6,最大支持的频率是168MHz,通过锁相环分频器(PLLCLOCK)可以将外部高速时钟(HSE)的8MHz转化为168MHz,这里我们通过时钟树来分析。

我们的定时器的频率不是单纯的像总线一样有84MHz或者42MHz限制,这里面的关键就是。

如果设置了板子的频率为168MHz,并且设置了非1的的分频系数,那么定时器的时钟频率是总线的频率的两倍

        倍频锁相环被正确配置为168MHz

        如果在标准库中设置倍频锁相环被正确配置为168MHz。我们其实只要修改两个地方即可,其一外部晶振的正确频率,其一PLL_M

对应代码处为:

我后面会写一篇文章专门介绍为什么这样就可以设置系统时钟为168MHz。可以期待一波。

1.system_stm32f4xx.c文件修改PLL_M值8MHz晶振即为8b 

2.stm32f4xx.h文件修改HSE_VALUE,8MHZ晶振即为8000000

定时器的库函数操作

代码

本质使用了若干函数

RCC_APBxPeriphClockCmd(RCC_APBxPeriph_TIMx, ENABLE)
TIM_TimeBaseInit(TIMx, &TIM_TimeBaseInitStruct)
NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
TIM_ITConfig(TIMx, TIM_IT_Update) 
TIM_Cmd(ENABLE)

这里我使用了基本定时器的TIM7,通过定时器的定时中断操作,把led翻转。

void TimerBaseInit(void)
{// 开启定时器时钟/* 开启TIM6与TIM7基本定时器时钟 84MHz*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);// 为每个定时器赋值/* 基本定时器TIM7 800ms 84MHz*/TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period = 42000 - 1;TIM_TimeBaseInitStruct.TIM_Prescaler = 1600 - 1;TIM_TimeBaseInit(TIM7, &TIM_TimeBaseInitStruct);/* TIM7 */NVIC_InitTypeDef NVIC_InitStruct;NVIC_InitStruct.NVIC_IRQChannel = TIM7_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0xf;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;NVIC_Init(&NVIC_InitStruct);TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);TIM_Cmd(TIM7, ENABLE);
}

定时中断函数:

void TIM7_IRQHandler(void)
{if (TIM_GetITStatus(TIM7, TIM_IT_Update)){TIM_ClearITPendingBit(TIM7, TIM_IT_Update);GPIO_ToggleBits(GPIOF, GPIO_Pin_10);}
}

定时器的寄存器操作

代码

寄存器初始化:

void TimerBaseRegisterInit(void)
{//开启定时器时钟RCC->APB1ENR |= (0b11<<4);    //TIM6、TIM7RCC->APB2ENR |= (0b11<<16);    //TIM9、TIM10//配置定时器/* 配置定时器前先关闭定时器,即关闭计数器 */TIM6->CR1 &= ~(1 <<0 );/* 配置定时器参数 */TIM6->PSC = 10000-1;    //分频值 10000TIM6->ARR = 8400 - 1;   // 对应分频器10000TIM6->CNT = 0;          // 清0计数器,个人认为自动重装初值应该从0开始TIM6->CR1 |= (0b10000100);TIM6->DIER |= (0b1);//配置NVICNVIC->ISER[1] = 1u << (TIM6_DAC_IRQn %32);//配置完成定时器,开启计数器TIM6->CR1 |= (1 << 0);
}

定时中断函数:

void TIM7_IRQHandler(void)
{if (TIM7->SR == 1){TIM7->SR = 0;GPIO_ToggleBits(GPIOF, GPIO_Pin_10);}
}

寄存器

这里提供基本定时器使用的寄存器:

启动定时器时钟寄存器:

控制寄存器CR1:

寄存器配置寄存器,搭配使用

中断使能寄存器

状态寄存器

配置NVIC使能中断寄存器

后言

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

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

相关文章

PCA 实现多向量压缩:首个主成分的深层意义

PCA 实现多向量压缩 第一个主成分(components_[0])正是数据协方差矩阵中最大特征值对应的特征向量。 ,layer_attention_vector[layer] 被赋值为 pca.components_[0],这确实是一个特征向量,具体来说是 PCA 分解得到的第一个主成分(主特征向量)。 关于它的维度: 假设 c…

网络常识-DNS如何解析

DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;是互联网的“地址簿”&#xff0c;负责将人类易记的域名&#xff08;如www.example.com&#xff09;转换为计算机可识别的IP地址&#xff08;如192.168.1.1&#xff09;。其工作流程可以简单理解为“从域名到…

Java中 23 种设计模式介绍,附带示例

文章目录设计模式六大原则设计模式分类1、创建型模式&#xff08;Creational Patterns&#xff09;2、结构型模式&#xff08;Structural Patterns&#xff09;3、行为型模式&#xff08;Behavioral Patterns&#xff09;一、创建型模式&#xff08;Creational Patterns&#x…

嵌入式开发入门——电子元器件~电磁继电器、蜂鸣器

文章目录电磁继电器定义关键参数实物蜂鸣器实物内部结构分类关键参数电磁继电器 定义 概述&#xff1a;电磁继电器是利用电磁感应原理职称的一种电磁开关&#xff0c;他能通过&#xff1a;低电压、低电流的电路&#xff0c;来控制高电压、高电流的电路。 关键参数 线圈电压…

ROS2基础

1.helloworld案例1.创建功能包&#xff08;C&#xff09;终端下&#xff0c;进入ws00_helloworld/src目录&#xff0c;使用如下指令创建一个C 功能包:ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld执行完毕&a…

Python爬虫实战:研究pygalmesh,构建Thingiverse平台三维网格数据处理系统

1. 引言 1.1 研究背景 在数字化浪潮席卷全球的当下,三维建模技术已成为连接虚拟与现实的核心纽带,广泛渗透于工程设计、地理信息系统(GIS)、虚拟现实(VR)、增强现实(AR)、医学影像等关键领域。例如,在建筑工程中,BIM(建筑信息模型)技术依赖高精度三维网格实现施工…

开发者说 | EmbodiedGen:为具身智能打造可交互3D世界生成引擎

概述 具身智能的发展离不开高质量、多样化的可交互3D仿真环境。为突破传统构建方式的瓶颈&#xff0c;我们提出了EmbodiedGen&#xff0c;一个基于生成式AI技术的自动化3D世界生成引擎&#xff0c;助力低成本、高效率地创建真实且可交互的3D场景。用户仅需输入任务定义或场景图…

GitHub Copilot:AI编程助手的架构演进与真实世界影响

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1. 技术背景与核心架构 GitHub Copilot 是由 GitHub 与 OpenAI 联合开…

PDF OCR + 大模型:让文档理解不止停留在识字

在企业数字化的实际场景中&#xff0c;PDF OCR 已经很普遍了&#xff1a;从扫描件提取文本、表格到生成可搜索 PDF。但这类技术往往停留在"把图片变成文字"&#xff0c;对文档背后的语义、逻辑、业务价值理解不足。 而当 OCR 遇上大语言模型&#xff08;LLM&#xff…

半敏捷卫星观测调度系统的设计与实现

半敏捷卫星观测调度系统的设计与实现 摘要 本文详细阐述了一个基于Python的半敏捷卫星观测调度系统的设计与实现过程。系统针对半敏捷卫星特有的机动能力限制&#xff0c;综合考虑了地面目标观测需求、卫星资源约束、能源管理等多重因素&#xff0c;提出了一种混合启发式算法解…

软件测试中,常用的抓包工具有哪些?抓包的原理是什么?

回答重点在软件测试中&#xff0c;常用的抓包工具主要有&#xff1a;1&#xff09;Fiddler2&#xff09;Wireshark3&#xff09;Charles4&#xff09;Postman&#xff08;它的拦截器功能也可以用于抓包&#xff09;5&#xff09;tcpdump抓包的原理大致是通过安装在本地的抓包工…

Cesium学习(二)-地形可视化处理

Cesium地形可视化是其核心功能之一&#xff0c;允许开发者在3D地球中展示真实的地形数据。以下是关于Cesium地形可视化的详细处理方法&#xff1a; 文章目录1. 启用地形可视化基本地形加载自定义地形提供者2. 地形相关操作地形高度采样地形夸张效果3. 地形可视化设置地形照明效…

《告别 if-else 迷宫:Python 策略模式 (Strategy Pattern) 的优雅之道》

《告别 if-else 迷宫:Python 策略模式 (Strategy Pattern) 的优雅之道》 大家好,我是你的朋友,一位与 Python 代码相伴多年的开发者。在我们的编程生涯中,几乎都曾与一种“代码怪兽”搏斗过,它就是那冗长、复杂、牵一发而动全身的 if-elif-else 结构。 每当一个新的需求…

Redis--day7--黑马点评--优惠券秒杀

&#xff08;以下内容全部来自上述课程&#xff09;优惠券秒杀 1. 全局唯一ID 每个店铺都可以发布优惠券:当用户抢购时&#xff0c;就会生成订单并保存到tb voucher order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题: id的规律性太明显受单表数据量的限制…

Vue 与 React 深度对比:设计哲学、技术差异与应用场景

一、核心设计理念对比 特性 Vue React 设计目标 渐进式框架,降低学习曲线 构建大型应用,保持灵活性 设计哲学 “约定优于配置” “配置优于约定” 核心思想 响应式数据绑定 函数式编程 + 虚拟DOM 模板语言 HTML-based 模板 JSX(JavaScript XML) 状态管理 内置响应式系统 依…

软件开发 - foreground 与 background

foreground 与 background 1、foreground词性含义n.前景&#xff1b;最突出的位置.v使突出&#xff1b;强调# 例词in the 【foreground】&#xff08;在最显眼的位置&#xff09;【foreground】 task&#xff08;前台任务&#xff09;【foreground】 color&#xff08;前景色&a…

深度学习——03 神经网络(2)-损失函数

2 损失函数 2.1 概述作用&#xff1a;衡量模型预测结果&#xff08;y^\hat{y}y^​&#xff09;和真实标签&#xff08;yyy&#xff09;的差异&#xff0c;差异越大&#xff0c;说明模型参数“质量越差”&#xff08;需要调整&#xff09;&#xff1b;本质&#xff1a;深度学习训…

【大模型微调系列-04】 神经网络基础与小项目实战

【大模型微调系列-04】 神经网络基础与小项目实战&#x1f4a1; 本章目标&#xff1a;通过构建一个能识别手写数字的AI模型&#xff0c;让你真正理解神经网络是如何"学习"的。2-3小时后&#xff0c;你将拥有第一个自己训练的AI模型&#xff01;4.1 理论讲解&#xff…

JavaWeb前端(HTML,CSS具体案例)

前言 一直在学习B站黑马程序员苍穹外卖。现在已经学的差不多了&#xff0c;但是我学习一直是针对后端开发的&#xff0c;前端也没太注重去学&#xff08;他大部分都给课程资料嘻嘻&#x1f92a;&#xff09;&#xff0c;但我还是比较感兴趣&#xff0c;准备先把之前学JavaWeb&…

核心数据结构:DataFrame

3.3.1 创建与访问什么是 DataFrame&#xff1f;DataFrame 是 Pandas 中的核心数据结构之一&#xff0c;多行多列表格数据&#xff0c;类似于 Excel 表格 或 SQL 查询结果。它是一个 二维表格结构&#xff0c;具有行索引&#xff08;index&#xff09;和列标签&#xff08;colu…