HAL库定时器配置

定时器的开启需要手动开启,例如在driver_capature.c开启,该文件主要写了具体的函数实现,与driver_can.c一样,同时还有回调函数等一些高级的自定义函数。

这段代码是 STM32 HAL 库中用于初始化 定时器 2 (TIM2) 的函数 MX_TIM2_Init。它配置了定时器的基础功能,时钟源,输入捕获通道以及中断功能。以下是逐行解释:

1. 函数开始部分

void MX_TIM2_Init(void)
{/* USER CODE BEGIN TIM2_Init 0 *//* USER CODE END TIM2_Init 0 */

这部分是用户自定义代码的区域,通常用于在初始化代码执行之前添加自定义操作。USER CODE 区域通常是可以修改的区域。

2. 定时器配置结构体定义

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};TIM_MasterConfigTypeDef sMasterConfig = {0};TIM_IC_InitTypeDef sConfigIC = {0};

这里定义了三个结构体,用于定时器配置:

  • TIM_ClockConfigTypeDef:用于配置定时器的时钟源。
  • TIM_MasterConfigTypeDef:用于配置定时器的主/从模式。
  • TIM_IC_InitTypeDef:用于配置定时器的输入捕获通道。

3. 定时器实例配置

  htim2.Instance = TIM2;htim2.Init.Prescaler = 167;htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 65535;htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

这里配置了定时器 2 (TIM2) 的一些基本参数:

  • Instance = TIM2:指定定时器 2。
  • Prescaler = 167:设置定时器预分频器值。它决定定时器的计数频率。具体计数频率为系统时钟频率除以(预分频器 + 1)。
  • CounterMode = TIM_COUNTERMODE_UP:设置计数模式为递增模式(计数从 0 到 Period)。
  • Period = 65535:设置定时器的自动重载值,即计数器从 0 增加到 65535 后重载(溢出)。
  • ClockDivision = TIM_CLOCKDIVISION_DIV1:定时器时钟分频因子。
  • AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE:禁用自动重载预加载。

4. 初始化定时器

  if (HAL_TIM_Base_Init(&htim2) != HAL_OK){Error_Handler();}

这行代码调用 HAL_TIM_Base_Init 函数来初始化定时器。若初始化失败,则调用 Error_Handler() 来处理错误。

5. 配置定时器时钟源

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK){Error_Handler();}
  • 设置定时器时钟源为内部时钟源 (TIM_CLOCKSOURCE_INTERNAL)。
  • 调用 HAL_TIM_ConfigClockSource 来配置时钟源,如果配置失败,则调用 Error_Handler()

6. 初始化定时器的输入捕获功能

  if (HAL_TIM_IC_Init(&htim2) != HAL_OK){Error_Handler();}
  • 调用 HAL_TIM_IC_Init 来初始化定时器的输入捕获功能。如果失败,则调用 Error_Handler()

7. 配置定时器的主模式

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK){Error_Handler();}
  • 配置定时器的主输出触发为复位信号(TIM_TRGO_RESET)。
  • 设置主从模式为禁用(TIM_MASTERSLAVEMODE_DISABLE)。
  • 使用 HAL_TIMEx_MasterConfigSynchronization 来配置同步。如果配置失败,则调用 Error_Handler()

8. 配置输入捕获通道

  sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;sConfigIC.ICFilter = 0;if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK){Error_Handler();}if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2) != HAL_OK){Error_Handler();}if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_3) != HAL_OK){Error_Handler();}if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_4) != HAL_OK){Error_Handler();}

这些代码为 TIM2 的 4 个输入捕获通道进行配置:

  • ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING:设置输入捕获的极性为上升沿触发。
  • ICSelection = TIM_ICSELECTION_DIRECTTI:选择直接连接输入信号。
  • ICPrescaler = TIM_ICPSC_DIV1:设置输入捕获的预分频器(没有分频)。
  • ICFilter = 0:设置输入滤波器。

这些配置分别应用于定时器 2 的通道 1、2、3 和 4。

9. 配置中断和启动输入捕获

  /* USER CODE BEGIN TIM2_Init 2 *//* Add by xinggaoyong */__HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE|TIM_FLAG_CC1|TIM_FLAG_CC2);__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_UPDATE);__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_CC1);__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_CC2);__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_CC3);__HAL_TIM_ENABLE_IT(&htim2, TIM_IT_CC4);HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_1);HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_2);HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_3);HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_4);  __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_3, TIM_INPUTCHANNELPOLARITY_FALLING);__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_4, TIM_INPUTCHANNELPOLARITY_FALLING);/* USER CODE END TIM2_Init 2 */
  • __HAL_TIM_CLEAR_FLAG:清除定时器的标志位,如溢出标志和输入捕获标志。
  • __HAL_TIM_ENABLE_IT:使能定时器的中断(溢出中断、输入捕获中断)。
  • HAL_TIM_IC_Start:启动输入捕获功能。
  • __HAL_TIM_SET_CAPTUREPOLARITY:设置捕获极性为下降沿,意味着输入信号的下降沿触发捕获事件。

10. 函数结束

}

函数结束,所有初始化工作完成。

总结

这段代码主要用于初始化 TIM2 定时器,配置输入捕获功能并启用中断。它设置了定时器的时钟、输入捕获的配置、定时器的主从模式、并启用了多通道的输入捕获中断。

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

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

相关文章

使用Python开发自动驾驶技术:车道线检测模型

友友们好! 我是Echo_Wish,我的的新专栏《Python进阶》以及《Python!实战!》正式启动啦!这是专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会…

Modern C++面试题及参考答案

目录 解释右值引用的定义及其与左值引用的核心区别 std::move 的实现原理是什么?为什么它本身不执行移动操作? 移动构造函数与拷贝构造函数的调用场景有何不同? 实现一个支持移动语义的类需要遵循哪些原则? 完美转发(Perfect Forwarding)的实现原理及 std::forward 的…

Thinkphp(TP)框架漏洞攻略

1.环境搭建 vulhub/thinkphp/5-rce docker-compose up -d 2.访问靶场 远程命令执行: ? sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1] []whoami 远程代码执行: ? s/Index/\think\app/invokefunc…

QT笔记---JSON

QT笔记---JSON JSON1、JSON基本概念1.1、判断.json文件工具 2、生成.json数据3、解析.json数据 JSON 在现代软件开发中,数据的交换和存储格式至关重要。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,以其简洁易…

Unity 使用 Protobuf(Pb2)二进制数据全流程工具详解

前言 在Unity游戏开发中,高效、快速、安全地读取配置数据是一项重要需求。本文介绍一种完整的解决方案——使用Protobuf二进制格式(Pb2)存储和读取游戏数据,并详细分享实现全流程的Unity工具。 一、技术流程概览 实现Unity读取…

MySQL-----视图与索引

目录 视图 1.视图 2.操作 11.索引 1.定义 2.优缺点: 3.分类 4.索引的设计原则 5.索引的使用 作业 视图 1.视图 ❓如果需要在原表中隐藏部分字段时,怎么办? 视图 📖视图: 是一个没有存储任何数据的表,可以对其CRUD视图…

stm32-IIC

i^2c,iiCBus,集成电路总线,同步串行半双工通信总线方式 sck:时钟同步信号 SDA:发送数据 GND:接地 通信对象:芯片与芯片 主从应答方式: SDA:数据总线 SCL:时钟总线 在硬件设计中: 上拉电阻&#…

`chromadb` 是什么

chromadb 是什么 chromadb 是一个开源的向量数据库,它专门用于存储、索引和查询向量数据。在处理自然语言处理(NLP)、计算机视觉等领域的任务时,通常会将文本、图像等数据转换为向量表示,而 chromadb 可以高效地管理这些向量,帮助开发者快速找到与查询向量最相似的向量数…

机器视觉工程师如何看机器视觉展会,有些机器视觉兄弟参加机器视觉展会,真的是参加了?重在参与?

作为机器视觉工程师,参加机器视觉展会不仅是了解行业前沿技术的窗口,也是拓展专业网络、寻找解决方案的重要机会。以下是结合展会信息和工程师视角的综合建议: 一、聚焦技术趋势与创新应用 参与技术论坛与研讨会 展会同期的技术论坛是获取行业洞见的核心渠道。例如: 上海展…

Centos操作系统安装及优化

Centos操作系统安装及优化 零、环境概述 主机名 centos版本 cpu 内存 Vmware版本 ip地址 test CentOS Linux release 7.6.1810 (Core) 2C 2G 15.5.1 10.0.0.10 一、介质下载 1、7.6版本下载 CentOS7.6标准版下载链接: https://archive.kernel.org/centos-vault/7.6.1810/i…

Edge浏览器如何默认启动某个工作区 / 为工作区添加快捷方式

Edge浏览器的工作区确实非常好用,可以多端同步标签页。但是打开Edge时默认是没有在工作区的状态,这个状态下的标签页可能会丢失。所以我研究了一下,如何点击快捷方式时自动启动一个工作区,方法如下: 先找到WorkspaceCa…

mac上安装nvm及nvm的基本语法使用!!

种一棵树,最好是十年前,其次是现在!想要改变,从此刻开始,一切都不晚! 目录 nvm是什么?前提条件:安装homebrew如果系统已经有node版本:在mac上安装nvm:用nvm安…

CPP中的numeric库中的accumulate求和函数说明

导入 accumulate函数位于numeric库中,作用是对数组或向量求和 // 设定初始值为0,从dp[0]到dp[n-1]进行累加 accumulate(dp,dpn,0);注意:这里的第二个参数是开区间,所以求和时不包含dp[n]这一位

Qt 高效读写JSON文件,玩转QJsonDocument与QJsonObject

一、前言 JSON作为轻量级的数据交换格式,已成为开发者必备技能。Qt框架为JSON处理提供了完整的解决方案,通过QJsonDocument、QJsonObject和QJsonArray三大核心类,轻松实现数据的序列化与反序列化。 JSON vs INI 特性JSONINI数据结构支持嵌…

Kubernetes(k8s)-Pod亲和性(Affinity)和反亲和性(Anti-affinity)

作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是K…

ESP32-C3物联网方案,智能设备创新升级,无线交互控制通信应用

在物联网技术迅猛发展的今天,各类智能设备如雨后春笋般涌现,深度融入我们生活与工作的各个角落,物联网正以一种前所未有的速度改变着我们的世界。 想象一下,清晨,当第一缕阳光洒进房间,智能窗帘自动缓缓拉…

Python自动化测试 之 DrissionPage 的下载、安装、基本使用详解

Python自动化测试 之 DrissionPage 使用详解 🏡前言:一、☀️DrissionPage的基本概述二、 🗺️环境安装2.1 ✅️️运行环境2.2 ✅️️一键安装 三、🗺️快速入门3.1 页面类🛰️ChromiumPage🛫 SessionPage&…

【操作系统安全】任务3:Linux 网络安全实战命令手册

目录 一、基础网络信息获取 1. 网络接口配置 2. 路由表管理 3. 服务端口监控 二、网络监控与分析 1. 实时流量监控 2. 数据包捕获 3. 网络协议分析 三、渗透测试工具集 1. 端口扫描 2. 漏洞利用 3. 密码破解 四、日志审计与分析 1. 系统日志处理 2. 入侵检测 3…

社群经济4.0时代:开源链动模式与AI技术驱动的电商生态重构

摘要:在Web3.0技术浪潮与私域流量红利的双重驱动下,电商行业正经历从"流量收割"到"用户深耕"的范式转变。本文基于社群经济理论框架,结合"开源链动21模式"、AI智能名片、S2B2C商城小程序源码等创新工具&#x…

从技术架构和生态考虑,不是单纯的配置优化,还有哪些方式可以提高spark的计算性能

从技术架构和生态系统层面提升Spark的计算性能,可采取以下核心策略: 一、计算模型重构与执行引擎升级 1. 弹性分布式数据集(RDD)的血统优化 通过RDD的Lineage(血统)机制实现容错时,采用增量式…