利用STM32TIM自制延迟函数实验
- 互联网
- 2025-09-17 13:06:01

一、实验目的 掌握STM32定时器(TIM)的工作原理及配置方法学习使用HAL库实现微秒级/毫秒级延时函数理解定时器中断服务程序的编写规范 二、实验原理
定时器基础:
STM32定时器包含向上计数器、向下计数器、中心对齐模式通过预分频器(PSC)和自动重载寄存器(ARR)控制计数周期时间计算公式:
延时时间 = (自动重载值 + 预分频系数 - 1) / (系统时钟频率 × 预分频系数) 三、硬件准备 开发板:STM32F103C8T6 四、实验步骤 选择STM32F103C8T6芯片 设置调试接口 启用TIM1定时器 配置TIM1选择RCC做为时钟信号源
计算TIM需要的参数
如图我们PSC = 7,ARR = 999,RCR = 0,同时使用ARR寄存器预加载
设置updata中断 生成项目代码配置:
我们要实现自己的延迟函数首先要自定义一个函数
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利用STM32TIM自制延迟函数实验由讯客互联互联网栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“利用STM32TIM自制延迟函数实验”