STM32CubeIDE创建基于定时器的延时函数

第一步,配置时钟,主频64M;

第二步:设置定时器16,分频后(64/63+1)1M;此处不选择自动重装;

第三步:确定生成代码,查看配置是否一致;

/*
 * delay.h
 *
 *  Created on: Jan 2, 2025
 *      Author: Lin
 */

#ifndef INC_DELAY_H_
#define INC_DELAY_H_

typedef   signed char     int8_t;
typedef   signed short    int16_t;
typedef   signed long     int32_t;

/*!< Unsigned integer types  */
typedef unsigned char     uint8_t;
typedef unsigned short    uint16_t;
typedef unsigned long     uint32_t;
typedef int32_t  s32;
typedef int16_t s16;
typedef int8_t  s8;

typedef uint32_t  u32;
typedef uint16_t u16;
typedef uint8_t  u8;


void delay_ms(u16 nms);
void delay_us(u32 nus);

#endif /* INC_DELAY_H_ */

第四步:添加延时函数的头文件《delay.h》;

/*
 * delay.c
 *
 *  Created on: Jan 2, 2025
 *      Author: Lin
 */

#include "delay.h"
#include "main.h"

extern TIM_HandleTypeDef htim16;

//nus 最小延时nus=2  2us
void delay_us(u32 nus)
{
	__HAL_TIM_SET_COUNTER(&htim16, 0);
	__HAL_TIM_ENABLE(&htim16);
	while (__HAL_TIM_GET_COUNTER(&htim16) < nus);
	__HAL_TIM_DISABLE(&htim16);
}

//nms  最大延时不建议超过65ms

void delay_ms(u16 nms)
{
	__HAL_TIM_SET_COUNTER(&htim16, 0);
	__HAL_TIM_ENABLE(&htim16);
	while (__HAL_TIM_GET_COUNTER(&htim16) < nms*1000);
	__HAL_TIM_DISABLE(&htim16);
}

//-------end-----------//

第五步:添加延时函数C代码《delay.c》

 /* USER CODE END WHILE */

     delay_ms(50);
     HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);   
     delay_us(50); 
     HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
     
/* USER CODE BEGIN 3 */

最后一步:在主函数main.c文件中添加测试代码,用示波器测试波形是否成功。

### 配置定时器以实现延时函数STM32CubeIDE中配置定时器来实现延时功能涉及几个关键步骤。这些步骤不仅适用于特定型号如STM32F103C8T6,也广泛应用于其他支持相同外设接口的MCU。 #### 定义项目并初始化硬件资源 启动STM32CubeMX工具创建新工程文件,选择目标微控制器型号,在Pinout & Configuration界面下找到TIM模块(例如 TIM3),将其模式设置为Timer Output Compare。这一步骤确保了后续可以精确控制时间间隔[^3]。 ```c // 初始化代码由STM32CubeMX自动生成 HAL_Init(); SystemClock_Config(); // 系统时钟配置 MX_GPIO_Init(); // GPIO初始化 MX_TIM3_Init(); // TIM3初始化 ``` #### 编写延时函数逻辑 对于毫秒级或更长时间单位的延迟,可以通过设定计数周期和预分频寄存器值来调整实际等待的时间长度。下面展示了一个简单的例子,展示了如何通过编程方式调用`__HAL_TIM_SET_COUNTER()` 和 `HAL_Delay()` 来达到预期效果: ```c void delay_ms(uint32_t ms){ __HAL_TIM_SET_COUNTER(&htim3, 0); // 设置计数值为零 while (__HAL_TIM_GET_COUNTER(&htim3) < (ms * SystemCoreClock / 1000)); } ``` 此方法依赖于之前定义好的系统核心频率(`SystemCoreClock`)以及所选定时器实例(htim3),从而计算出每经过一毫秒对应的计数值变化量。 为了提高精度与灵活性,还可以考虑采用中断驱动的方式处理超时事件,而不是简单地轮询状态。这种方式允许CPU执行更多有用的任务而不必一直忙等直到指定时间段结束。 #### 使用Systick定时器替代方案 值得注意的是,除了上述提到的一般用途定时器之外,STM32还内置有专门用于提供短时间间隔测量服务的SysTick定时器。该定时器特别适合用来构建简易的操作系统调度机制或是作为全局性的滴答源[^2]。 然而,当计划集成RTOS或其他高级中间件组件时,则建议优先选用通用型定时器而非占用宝贵的SysTick资源,以便留作将来可能的需求变更之用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值