当前位置: 首页 > 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

相关文章:

  • jeecgboot项目idea启动项目(二)
  • Java基础语法38(异常处理try-catch和throws)
  • 40岁开始学Java:避免创建不必要的对象
  • 分治算法+题目
  • 基金 word-->pdf图片模糊的解决方法
  • MyBatis调用外部静态方法
  • 飞致云开源社区月度动态报告(2025年2月)
  • 基于HTML的贪吃蛇小游戏
  • 目前主流 AI 大模型体系全解析:架构、特点与应用
  • 代码规范和简化标准
  • macos下myslq图形化工具之Sequel Ace
  • 记Android12上一个原生bug引起的system_server crash
  • Scala的match表达式的基本简单介绍
  • ​Java 实体类中的常见问题:@Data 注解与 is 前缀字段的陷阱​
  • DrissionPage动态库过(某网)滑块(100%成功)
  • LeetCode279完全平方数(动态规划)
  • LeetCode 2 - 两数相加
  • 关于博客系统的测试报告
  • 机器人学习模拟框架 robosuite (3) 机器人控制代码示例
  • 【redis】redis持久化
  • 软件项目管理软件/seo技术培训教程视频
  • 网站经常做封面的那些番号/网络推广整合平台
  • 国外客户推广网站/seo需要付费吗
  • 智能家居型网站开发/广告策划方案范文
  • 做更好的自己 网站/北京网站排名seo
  • dede打包好的网站怎么提取模板/爱站网长尾词挖掘