STM32 HAL库函数——HAL_TIM_Base_Start_IT()详解
以STM32G030C8T6中的HAL_TIM_Base_Start_IT()函数为例,进行解释;
文章目录
- 一、函数原型和源代码
- 二、函数用法详解:
- 2.1 参数
- 2.1.1 TIM_HandleTypeDef结构体详解
- 2.2 使用场景:
- 2.3 使用方法:
- 三、函数使用示例:
- 四、函数源代码
- 五、函数逐行解释
- 六、函数使用注意事项
一、函数原型和源代码
函数原型:
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
二、函数用法详解:
函数原型:
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim);
该函数用于启动定时器的中断模式。在使用该函数之前,需要先初始化好定时器的配置,并将相关的中断处理函数注册到对应的中断向量中。
2.1 参数
- htim:指向TIM_HandleTypeDef结构体的指针,包含了定时器的实例和配置信息。
返回值:
- HAL_OK:函数执行成功。
- 其他值:函数执行失败。
2.1.1 TIM_HandleTypeDef结构体详解
TIM_HandleTypeDef结构体是用于配置和管理定时器的HAL库结构体之一。它包含了定时器的实例和配置信息,用于对定时器进行初始化和操作。
TIM_HandleTypeDef结构体定义如下:
typedef struct
{TIM_TypeDef *Instance; // 定时器实例TIM_Base_InitTypeDef Init; // 定时器基本配置HAL_TIM_ActiveChannel Channel; // 定时器活动通道DMA_HandleTypeDef *hdma[TIM_DMA_ID_CC1]; // 定时器DMA句柄数组HAL_LockTypeDef Lock; // 定时器锁__IO HAL_TIM_StateTypeDef State; // 定时器状态
} TIM_HandleTypeDef;
结构体成员解释如下:
Instance
:指向TIM_TypeDef的指针,表示定时器的实例。TIM_TypeDef是一个包含了定时器寄存器的结构体,用于对寄存器进行配置和操作。Init
:定时器基本配置,是一个TIM_Base_InitTypeDef类型的结构体变量,包含了定时器的时钟分频系数、计数模式、自动重装载值等信息。Channel
:定时器活动通道,用于指示当前活动的通道。在定时器的输入捕获和输出比较等功能中使用。hdma[TIM_DMA_ID_CC1]
:定时器DMA句柄数组,用于配置和管理定时器的DMA传输。在使用DMA传输时,可以将DMA句柄与定时器关联。Lock
:定时器锁,用于保护对定时器的并发访问。在多线程或中断环境中使用。State
:定时器状态,表示定时器的当前状态。是一个HAL_TIM_StateTypeDef类型的枚举变量,包括以下值:- HAL_TIM_STATE_RESET:定时器已复位。
- HAL_TIM_STATE_READY:定时器准备好并且未启动。
- HAL_TIM_STATE_BUSY:定时器正在进行配置或操作。
- HAL_TIM_STATE_TIMEOUT:定时器操作超时。
- HAL_TIM_STATE_ERROR:定时器操作错误。
使用TIM_HandleTypeDef结构体的步骤如下:
- 创建一个TIM_HandleTypeDef结构体的变量。
- 初始化结构体的成员,特别是Instance和Init成员。
- 调用HAL库提供的定时器初始化函数,并将TIM_HandleTypeDef结构体的地址作为参数传入。
例如,在使用HAL_TIM_Base_Start_IT()函数的示例中,就使用了TIM_HandleTypeDef结构体来配置定时器2的初始化信息。
注意事项:
- 在使用TIM_HandleTypeDef结构体时,需要根据具体的定时器实例和功能进行适当的配置和初始化。
- 需要根据定时器的特性和要求,正确设置Init成员的各个参数,以满足实际需求。
- 在使用DMA传输时,可以关联DMA句柄到hdma数组中的对应位置,以实现定时器与DMA的协同工作。
- 注意在多线程或中断环境中使用定时器时,使用锁机制保护对定时器的并发访问。
2.2 使用场景:
- 当需要定时器以中断模式工作时,可以使用该函数启动定时器的中断功能。
2.3 使用方法:
- 首先,需要创建一个TIM_HandleTypeDef结构体的变量,并初始化其中的成员,包括定时器的实例、时钟分频系数、自动重装载值等。
- 调用HAL_TIM_Base_Start_IT()函数,将上述结构体变量的地址作为参数传入。
三、函数使用示例:
#include "stm32g0xx_hal.h"TIM_HandleTypeDef htim2;void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim->Instance == TIM2){// 在此处理定时器2中断事件}
}int main(void)
{// 初始化定时器2的配置htim2.Instance = TIM2;htim2.Init.Prescaler = 0;htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 1000;// 初始化HAL库HAL_Init();// 配置定时器2HAL_TIM_Base_Init(&htim2);// 启动定时器2的中断模式HAL_TIM_Base_Start_IT(&htim2);while (1){// 主循环}
}
四、函数源代码
函数源代码:
/*** @brief Starts the TIM Base generation in interrupt mode.* @param htim TIM Base handle* @retval HAL status*/
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
{uint32_t tmpsmcr;/* Check the parameters */assert_param(IS_TIM_INSTANCE(htim->Instance));/* Check the TIM state */if (htim->State != HAL_TIM_STATE_READY){return HAL_ERROR;}/* Set the TIM state */htim->State = HAL_TIM_STATE_BUSY;/* Enable the TIM Update interrupt */__HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE);/* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */if (IS_TIM_SLAVE_INSTANCE(htim->Instance)){tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)){__HAL_TIM_ENABLE(htim);}}else{__HAL_TIM_ENABLE(htim);}/* Return function status */return HAL_OK;
}
五、函数逐行解释
逐行解释该函数的代码:
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
{uint32_t tmpsmcr;/* Check the parameters */assert_param(IS_TIM_INSTANCE(htim->Instance));
- 该行代码检查传入的参数是否合法,确保传入的定时器实例是一个有效的TIM实例。
/* Check the TIM state */if (htim->State != HAL_TIM_STATE_READY){return HAL_ERROR;}
- 该行代码检查定时器的状态,如果定时器的状态不是HAL_TIM_STATE_READY(准备就绪)状态,则返回错误状态HAL_ERROR。
/* Set the TIM state */htim->State = HAL_TIM_STATE_BUSY;
- 该行代码将定时器的状态设置为HAL_TIM_STATE_BUSY(忙碌)状态,表示定时器正在进行配置或操作。
/* Enable the TIM Update interrupt */__HAL_TIM_ENABLE_IT(htim, TIM_IT_UPDATE);
- 该行代码使能定时器的更新中断,即使能定时器的溢出中断。
/* Enable the Peripheral, except in trigger mode where enable is automatically done with trigger */if (IS_TIM_SLAVE_INSTANCE(htim->Instance)){tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)){__HAL_TIM_ENABLE(htim);}}else{__HAL_TIM_ENABLE(htim);}
- 该段代码根据定时器的类型(主定时器或从定时器)来使能定时器。
- 如果是从定时器,会进一步判断是否处于触发模式,并根据触发模式的使能状态来决定是否使能定时器。
- 如果是主定时器,直接使能定时器。
/* Return function status */return HAL_OK;
}
- 该行代码表示函数执行成功,返回HAL_OK状态。
该函数的作用是启动定时器的中断模式,具体步骤包括:
- 检查传入的参数是否合法。
- 检查定时器的状态,确保定时器处于准备就绪状态。
- 设置定时器的状态为忙碌状态。
- 使能定时器的更新中断。
- 根据定时器的类型和触发模式的使能状态,使能定时器。
- 返回函数执行成功的状态HAL_OK。
六、函数使用注意事项
在使用HAL_TIM_Base_Start_IT函数时,需要注意以下事项:
-
参数合法性检查:在调用函数之前,需要确保传入的TIM_HandleTypeDef结构体指针(htim)是有效的,并且对应的定时器实例(htim->Instance)是一个合法的TIM实例。
-
定时器状态检查:在调用函数之前,需要确保定时器的状态(htim->State)处于HAL_TIM_STATE_READY(准备就绪)状态。如果定时器状态不正确,调用函数可能会返回错误状态HAL_ERROR。
-
定时器中断处理函数:在启用定时器中断模式后,需要编写相应的定时器中断处理函数。在中断处理函数中,可以执行特定的操作或任务,以响应定时器的中断事件。
-
定时器配置:在调用HAL_TIM_Base_Start_IT函数之前,需要先对定时器进行正确的初始化和配置。这包括设置定时器的时钟分频系数、计数模式、自动重装载值等。根据实际需求,还可以配置其他定时器功能,如输入捕获、输出比较等。
-
定时器使能:在启用定时器中断模式之前,需要确保定时器已经使能。在函数内部,会根据定时器的类型(主定时器或从定时器)和触发模式的使能状态来决定是否使能定时器。
-
中断优先级设置:如果系统中存在多个中断,需要根据优先级要求设置定时器中断的优先级。确保定时器中断的优先级不会被其他中断抢占,以保证定时器中断的及时响应。
-
适当的修改和调整:示例代码中的超时时间为5秒,可以根据实际需求和任务完成条件进行适当的修改和调整。例如,可以修改自动重装载值、时钟分频系数等参数,以满足特定的超时要求。
-
定时器资源冲突:在使用多个定时器的情况下,需要注意定时器资源的冲突问题。确保不同的定时器实例使用不同的资源,避免冲突和干扰。
-
可重入性:在多线程或中断环境中使用定时器时,需要注意保护对定时器的并发访问。可以使用适当的锁机制或其他同步手段,保证对定时器的操作是线程安全的。
-
HAL库版本兼容性:注意确保使用的HAL库版本与目标芯片和开发环境兼容,并且具备所需的功能和修复的问题。
相关文章:
STM32 HAL库函数——HAL_TIM_Base_Start_IT()详解
以STM32G030C8T6中的HAL_TIM_Base_Start_IT()函数为例,进行解释; 文章目录 一、函数原型和源代码二、函数用法详解:2.1 参数2.1.1 TIM_HandleTypeDef结构体详解 2.2 使用场景:2.3 使用方法: 三、函数使用示例ÿ…...

C语言之通讯录的实现篇优化版
目录 动态内存管理 通讯录声明 静态版本 动态版本 初始化通讯录 静态版本 动态版本 Add增加通讯录 静态版本 动态版本 Checkcapacity增容 DestroyContact释放动态空间 文件操作 SaveContact保存信息到文件中 初始化通讯录 旧版本 文件版本 LoadContact加载…...

C++17中std::string_view的使用
为了解决std::string初始化(或拷贝)成本高昂的问题,C17引入了std::string_view。std::string_view提供对现有字符串(C风格字符串、std::string、或另一个std::string_view)的只读访问,而无需进行拷贝。当想要有效地处理和操作字符串而不修改它们时&#…...

C#,数值计算——分类与推理Phylo_nj的计算方法与源程序
1 文本格式 using System; using System.Collections.Generic; namespace Legalsoft.Truffer { public class Phylo_nj : Phylagglom { public double[] u; public override void premin(double[,] d, int[] nextp) { i…...

element-ui 图片压缩上传
picture.js export const compressImgNew (file) > {return new Promise(resolve > {const reader new FileReader()const image new Image()image.onload (imageEvent) > {const canvas document.createElement(canvas) // 创建画布const context canvas.getCo…...

【Java 进阶篇】Java XML约束:确保数据一致性和有效性
XML(可扩展标记语言)是一种常用的数据交换格式,用于存储和交换数据。然而,为了确保数据的一致性和有效性,通常需要定义XML约束。XML约束是一种规则集,定义了XML文档的结构、元素、属性和数据类型。本篇博客…...

第一章概述
一、学习目的与要求 本章对软件测试作了概括性的介绍,目的是使学生对软件测试有个初步的认识。通过本章的学习,应使学生掌握软件测试的基本概念,了解软件测试的发展历程和行业现状,掌握软件测试技术的分类,理解软件测试…...

XCode15与iOS17/17.1 真机测试问题处理
XCode15与iOS17/17.1 真机测试问题处理,网上相关博客很多,摘录了如下实践后能起作用的地址如下:Xcode 15 报错处理 - 简书iOS17版本适配-CSDN博客 Xcode15适配-六虎 主要介绍下:Assertion failure in void _UIGraphicsBeginImag…...

使用 Rust 和 cURL 库下载程序
以下是一个使用 Rust 和 cURL 库的下载器程序,用于下载 图像。此程序使用了 https://www.duoip.cn/get_proxy 的代码。 extern crate curl; use std::io::{self, Read}; use std::error::Error; fn main() {let url "https://www.baidu.com";let …...

三维模型表面积计算方法
【版权声明】 本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。 更多算法总结请关注我的博客:https://blog.csdn.net/suiyingy,或”乐乐感知学堂“公众号。 本文章来自于专栏《Python三维模型处理基础》的系列文…...

unity脚本_力 c#
创建一个脚本 将代码挂载到物体上 取消物体的重力 运行即向z轴运动 加力之后 是否停止是由阻力影响 如果阻力为零 则会一直运动 如果希望就算有阻力也让物体一直动就将加力代码放在Update函数里 using UnityEngine; public class Power : MonoBehaviour{ Rigidbody rigidBo…...
LeetCode 面试题 10.05. 稀疏数组搜索
文章目录 一、题目二、C# 题解 一、题目 稀疏数组搜索。有个排好序的字符串数组,其中散布着一些空字符串,编写一种方法,找出给定字符串的位置。 示例1: 输入: words [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”…...

分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测
分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测 目录 分类预测 | MATLAB实现基于BiLSTM-AdaBoost双向长短期记忆网络结合AdaBoost多输入分类预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于BiLSTM-…...
Sobel算子详解及例程
Sobel算子是一种经典的边缘检测算子,被广泛应用于图像处理领域。它基于图像亮度的变化率来检测边缘的位置,主要通过计算图像中像素点的梯度来实现。 Sobel算子分为水平和垂直两个方向的算子,记作Gx和Gy。它们分别对图像进行水平和垂直方向的…...

ScrapeKit 和 Swift 编写程序
以下是一个使用 ScrapeKit 和 Swift 编写的爬虫程序,用于爬取 图片。同时,我们使用了proxy 这段代码来获取代理。 import ScrapeKit class PeopleImageCrawler: NSObject, ScrapeKit.Crawler {let url: URLlet proxyUrl: URL init(url: URL, proxy…...
Java基础面试题知识点总结(上篇)
大家好,我是栗筝i,从 2022 年 10 月份开始,我持续梳理出了全面的 Java 技术栈内容,一方面是对自己学习内容进行整合梳理,另一方面是希望对大家有所帮助,使我们一同进步。得到了很多读者的正面反馈。 而在 2…...

STM32进行LVGL裸机移植
本文的移植参考的是正点原子的课程《手把手教你学LVGL图形界面编程》 基于该课程和《LVGL开发指南_V1.3》“第二章 LVGL 无操作系统移植”,然后结合自身的实际情况进行整理。 先根据自己的习惯,创建基础的单片机工程,然后在APP业务层和DRIVE…...
python解析robot framework的output.xml并生成html
一、用pyh模块解析stat结点数据(output.py) #codingutf-8import xml.dom.minidom import xml.etree.ElementTree#打开xml文档 dom xml.dom.minidom.parse(./ui/output.xml);root2 xml.etree.ElementTree.parse(./ui/output.xml) #得到文档元素对象 ro…...
【RuoYi移动端】uni-app中的单击和双击事件
1、单击事件: click"enterpriseSelect" 2、双击事件: touchend"userinfo"...
使用 conda 在 Ubuntu 16.04 上安装 Python 3.9 的步骤:和 VSCode配置
一、使用conda在 Ubuntu 16.04 上安装 Python 3.9 的步骤: 当然可以,conda 是一个非常强大的包管理器,它可以方便地管理不同版本的 Python 和各种库包。以下是使用 conda 在 Ubuntu 16.04 上安装 Python 3.9 的步骤: 1. 安装 Miniconda Miniconda 是 Anaconda 的轻量级版…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...