当前位置: 首页 > news >正文

利用STM32TIM自制延迟函数实验

一、实验目的

  1. 掌握STM32定时器(TIM)的工作原理及配置方法
  2. 学习使用HAL库实现微秒级/毫秒级延时函数
  3. 理解定时器中断服务程序的编写规范

二、实验原理

  1. 定时器基础

    • STM32定时器包含向上计数器、向下计数器、中心对齐模式
    • 通过预分频器(PSC)和自动重载寄存器(ARR)控制计数周期
  2. 时间计算公式

    延时时间 = (自动重载值 + 预分频系数 - 1) / (系统时钟频率 × 预分频系数)

三、硬件准备

  1. 开发板:STM32F103C8T6

四、实验步骤

  • 选择STM32F103C8T6芯片

  • 设置调试接口

  • 启用TIM1定时器

  • 配置TIM1

选择RCC做为时钟信号源

计算TIM需要的参数

如图我们PSC = 7,ARR = 999,RCR = 0,同时使用ARR寄存器预加载

  • 设置updata中断

  • 生成项目

  1. 代码配置:

 我们要实现自己的延迟函数首先要自定义一个函数

static void MyDelay(uint32_t Delay){uint32_t expireTime = MyGetTick() + Delay;while(MyGetTick() < expireTime)//等待延迟结束
}

其中MyGetTick()是获取当前计时器时间的函数,也是我们要自编写的函数之一。Delay是要延迟的毫秒数。

实现MyGetTick()函数

static volatile uint32_t currentMiliSeconds = 0;
static uint32_t MyGetTick(void){return currentMiliSeconds;
}

我们是通过计时器中断的方法来实现自己的延迟函数的,我们要使用先关的库函数,要重写库函数完成currentMiliSeconds值的累加。基本原理是启动定时器,产生update事件并触发中断并回调重写函数HAL_TIM_PeriodElapsedCallback()。

组织代码如下

static volatile uint32_t currentMiliSeconds = 0;static void MyDelay(uint32_t Delay){uint32_t expireTime = MyGetTick() + Delay;  while(MyGetTick() < expireTime);//等待延迟结束
}static uint32_t MyGetTick(void){return currentMiliSeconds;
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){if(htim == &htim1){currentMiliSeconds++; }
}

编写GPIO闪灯代码

 while (1){HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);MyDelay(1000);HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);MyDelay(1000);    }

五、预期现象

  • LED灯以1Hz频率交替闪烁(亮0.5s/灭0.5s)
  • 使用逻辑分析仪测量TIM1计数周期应为1ms
http://www.lryc.cn/news/545695.html

相关文章:

  • 创建一个MCP服务器,并在Cline中使用,增强自定义功能。
  • Android Activity栈关系解析
  • java使用word模板填充内容,再生成pdf
  • 回归实战详细代码+解析:预测新冠感染人数
  • AI人工智能机器学习之聚类分析
  • (下:补充——五个模型的理论基础)深度学习——图像分类篇章
  • 使用Python自动生成图文并茂的网页分析报告
  • uniapp-原生android插件开发摘要
  • GIT工具学习【1】:基本操作
  • 《国密算法开发实战:从合规落地到性能优化》
  • 【语法】C++中string类中的两个问题及解答
  • LeetCode-154. 寻找旋转排序数组中的最小值 II
  • 2.数据结构:1.Tire 字符串统计
  • C语言复习4:有关数组的基础常见算法
  • Ubuntu从零创建Hadoop集群
  • GPIO概念
  • Node.js, Bun, Deno 比较概述
  • C# 类库打包dll文件
  • Linux中的UDP编程接口基本使用
  • RAG项目实战:金融问答系统
  • 大白话React第十一章React 相关的高级特性以及在实际项目中的应用优化
  • 虚拟机Linux操作(持续更新ing)
  • 【开源-线程池(Thread Pool)项目对比】
  • JMeter 实战项目脚本录制最佳实践(含 BadBoy 录制方式)
  • Jackson注解实战:@JsonInclude的妙用
  • CAN总线通信协议学习1——物理层
  • Vim 常用快捷键大全:跳转、编辑、查找替换全解析
  • 【Python 数据结构 2.时间复杂度和空间复杂度】
  • 【Qt QML】QML鼠标事件(MouseArea)
  • LeetCode 202. 快乐数 java题解