STM32F103 TIM基本定时器

news/2025/2/7 15:45:53/文章来源:https://www.cnblogs.com/jeikerxiao/p/18702699

STM32F103C8T6 最小系统开发板使用HAL固件库驱动TIM基本定时器

1. 硬件设计

1.1 最小系统开发板

STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,具备多个定时器模块,其中包括基本定时器。我们将在本项目中使用一个基本定时器(TIM2)来实现定时任务。

最小系统开发板硬件设计图中,TIM2定时器的时钟由系统时钟源提供,而输出引脚可以配置为GPIO,用于产生定时中断或控制外设。

STM32F103C8T6 引脚 说明
PA0 TIM2_CH1(用于定时器输入/输出)

1.2 TIM基本定时器原理

TIM基本定时器(例如TIM2)是一种非常简单的定时器,通常用于延时或周期性任务。它的工作原理是:定时器在每个定时周期到达时产生一个中断或输出信号,应用程序可以通过中断服务程序来处理这些定时事件。

基本定时器的工作原理:

  1. 计数器:定时器内部有一个16位的计数器,当计数器达到预定的值时,会触发一个事件。
  2. 自动重载寄存器:用于设置定时器的最大计数值(即定时周期)。
  3. 时钟源:定时器的计时依据系统时钟或外部时钟,时钟源可以设置为不同的频率。
  4. 中断:定时器达到预定值时,会产生中断请求,程序可以通过中断服务程序来执行特定的任务。

2. 软件设计

2.1 开发环境

  • 开发工具:STM32CubeMX、Keil uVision 5
  • 下载工具:ST-Link V2(用于将程序烧录到STM32开发板)
  • 固件库:STM32Cube HAL库

2.2 STM32CubeMX配置

  1. 打开STM32CubeMX,选择STM32F103C8T6芯片。
  2. Pinout & Configuration界面,选择TIM2,并配置PA0为TIM2的输出引脚(PWM输出)。
  3. 配置TIM2:
    • 设置计数器模式。
    • 设置自动重载值(ARR)和预分频器(PSC),从而设定定时器的时间间隔。
  4. 配置时钟,并生成代码。
  5. 打开Keil uVision 5,载入生成的代码。

2.3 TIM2的初始化与配置

首先,配置TIM2的工作模式,设置定时器的预分频器和自动重载值:

/* TIM2初始化代码 */
TIM_HandleTypeDef htim2;void TIM2_Init(void)
{__HAL_RCC_TIM2_CLK_ENABLE();  // 启用TIM2时钟htim2.Instance = TIM2;htim2.Init.Prescaler = 7999;  // 设置预分频器,系统时钟为72MHz,定时器时钟为9kHzhtim2.Init.CounterMode = TIM_COUNTERMODE_UP;  // 向上计数模式htim2.Init.Period = 999;  // 设置自动重载值,定时器周期为100mshtim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;HAL_TIM_Base_Init(&htim2);  // 初始化定时器
}

2.4 配置定时器中断

如果希望定时器在计数完成时产生中断,我们可以启用定时器中断。设置并启用定时器中断:

/* 配置TIM2中断 */
void TIM2_NVIC_Config(void)
{HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);  // 设置中断优先级HAL_NVIC_EnableIRQ(TIM2_IRQn);  // 启用TIM2中断
}

2.5 启动定时器

启动定时器并启用中断,使定时器能够周期性触发事件:

/* 启动TIM2 */
void TIM2_Start(void)
{HAL_TIM_Base_Start_IT(&htim2);  // 启动TIM2并启用中断
}

2.6 中断服务程序

在定时器计数到达预定值时,产生中断并执行相应的操作。在中断服务程序中,可以执行特定的任务,例如切换LED状态或输出PWM信号:

/* TIM2中断服务程序 */
void TIM2_IRQHandler(void)
{if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET)  // 检查更新中断标志{__HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);  // 清除中断标志// 执行定时任务,如切换LED状态HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);  // 假设连接了一个LED}
}

2.7 完整程序

以下是完整的定时器配置与使用示例:

#include "stm32f1xx_hal.h"/* TIM2句柄 */
TIM_HandleTypeDef htim2;/* 定时器初始化 */
void TIM2_Init(void)
{__HAL_RCC_TIM2_CLK_ENABLE();  // 启用TIM2时钟htim2.Instance = TIM2;htim2.Init.Prescaler = 7999;  // 设置预分频器htim2.Init.CounterMode = TIM_COUNTERMODE_UP;htim2.Init.Period = 999;  // 设置自动重载值htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;HAL_TIM_Base_Init(&htim2);  // 初始化定时器
}/* 启动定时器 */
void TIM2_Start(void)
{HAL_TIM_Base_Start_IT(&htim2);  // 启动定时器并启用中断
}/* 配置TIM2中断 */
void TIM2_NVIC_Config(void)
{HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);  // 设置中断优先级HAL_NVIC_EnableIRQ(TIM2_IRQn);  // 启用TIM2中断
}/* TIM2中断服务程序 */
void TIM2_IRQHandler(void)
{if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET){__HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);  // 清除中断标志HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);  // 假设连接了一个LED}
}/* 主程序 */
int main(void)
{HAL_Init();TIM2_Init();TIM2_NVIC_Config();  // 配置中断TIM2_Start();  // 启动定时器while (1){// 主循环中可以执行其他任务}
}

3. 下载工具

使用ST-Link V2将程序烧录到STM32F103C8T6开发板。通过ST-Link V2调试接口连接到开发板,并使用Keil uVision 5的下载功能将程序烧录到微控制器中。

4. 结语

本博客介绍了如何使用STM32F103C8T6最小系统开发板和HAL固件库,通过基本定时器(TIM2)实现定时任务。通过硬件设计、TIM定时器原理、软件设计、详细操作步骤及示例代码,您可以轻松实现定时器的应用。希望本博客对您的项目开发有所帮助。

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

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

相关文章

中电金信:大咖漫话|如何营销AI赋能的远程银行

看过“从远程银行看AIGC”连载,今天将与各位漫话AI的营销“哲学”。祝各位事业蟠蟠,巳巳如意,我们开年再会!

miniconda配置及常用命令,windows系统环境变量设置

安装完miniconda后,如果cmd中输入"conda info"没有输出信息,说明需要手动配置环境变量。 (1)右键点击桌面上“此电脑”,点击“属性” (2)在弹出的页面里点击“高级系统设置”(3)点击“环境变量”(4)双击“系统变量”里面的"Path":(5)点击“新…

CPUID CPU-Z(CPU检测工具) v2.14.0 中文绿色版

软件介绍 CPU-Z是最权威的CPU处理器检测工具。它支持的CPU种类相当全面,软件的启动速度及检测速度也很快,能够准确的检测出CPU、主板、内存、显卡、SPD等相关信息,包含制造厂及处理器名称,核心构造及封装技术,内部外部频率,最大超频速度侦测,处理器相关可以使用的指令集…

Windows11本地部署DeepSeek加速

本文介绍了一个可以相比之下更快速的在本地部署DeepSeek的方法,除了在上一篇博客中介绍的从Github或者Github加速网站获取Ollama之外,还可以通过从国内的其他大模型文件平台下载模型文件,来加速本地模型的构建。技术背景 在上一篇文章中我们介绍了在Ubuntu Linux操作系统上部…

EverEdit扩展脚本:在当前文件目录下新建同类型文件(增强)

1 扩展脚本:在当前文件目录下新建同类型文件(增强) 1.1 应用场景之前使用JS写了一个EverEdit的脚本,用于在当前打开的文档目录下新建一个同类型的文件,比如,在进行python语言学习时,做完练习,需要再开一个文件写代码,原脚本的不足是,每次弹出提示输入文件名的输入框,输…

Deepseek R1 + LMStudio 本地部署(windows)

DeepSeek-R1本地部署配置要求 Github地址:https://github.com/deepseek-ai/DeepSeek-R1?tab=readme-ov-file模型规模最低 GPU 显存推荐 GPU 型号纯 CPU 内存需求适用场景1.5B 4GB RTX 3050 8GB 个人学习7B、8B 16GB RTX 4090 32GB 小型项目14B 24GB A5000 x2 64GB 专业应用32…

GO指南之练习答案

GO指南之练习答案 Go指南 练习:循环与函数 为了练习函数与循环,我们来实现一个平方根函数:给定一个数 x,我们需要找到一个数 z 使得 z 尽可能地接近 x。 计算机通常使用循环来计算 x 的平方根。从某个猜测的值 z 开始,我们可以根据 z 与 x 的近似度来改进 z,产生一个更好…

第三轮easy~hard题目

题目1代码 #include<iostream> #include<queue> #include<string> using namespace std; int main() {priority_queue<int> s;string str;int a;str="0";while(str!="end"){cin>>str;if(str=="insert"){cin>&g…

通过Ollama本地部署DeepSeek R1以及简单使用

本文介绍了在Windows环境下,通过Ollama来本地部署DeepSeek R1。该问包含了Ollama的下载、安装、安装目录迁移、大模型存储位置修改、下载DeepSeek以及通过Web UI来对话等相关内容。1、下载Ollama 首先我们到Ollama官网去下载安装包,此处我们下载的是Windows版本的安装包,如下…

git删除gitee上传大文件转载

前言:在提交推送本地更改至仓库时,误将大文件给提交了,导致push时报错文件过大,因此需要将已经commit的大文件移除后再push 若已知要删除的文件或文件夹路径,则可以从第4步开始 1.对仓库进行gc操作 $ git gc 2.查询大文件 git verify-pack -v .git/objects/pack/pack-*.id…

Axure RP 9.0 软件安装、汉化

‌Axure RP9是一款专业的原型设计工具,主要用于快速创建交互式的高保真原型,帮助设计师和产品经理进行用户体验设计和界面设计‌。‌ 主要功能和应用场景‌原型设计‌:Axure RP9提供了丰富的交互组件和功能,如可交互的按钮、链接、表单元素等,用户可以模拟真实的应用程序或…

第八节 BERT实战

做下游分类任务,如何处理一句话的输入input_dis:输入哪些字 21128个汉字里编码 mask:输入的话有多长. 模型输入固定,不够的话用padding补上 Seq_ids:句子编码 segmentBERT输入token embedding 字编码(21128, 768) segment embedding 句子编码(2, 768) position embedding不用给…