【STM32+HAL+Proteus】系列学习教程---定时器(TIM2)

实现目标

1、STM32 基于HAL库定时器的使用;

2、加强学习GPIO取反函数的学习。

3、具体实现:利用定时器2定时1mS,定时器中断回调函数里计数1000次,也就是1S。最后利用1S定时实现LED1 1S亮,1S灭。


一、定时器概述?

1、生活中哪些场景会用到定时器?

        许多家用电器都配备了定时器功能,如电饭煲、热水器、空调等。通过设定开始和结束时间,用户可以确保在需要的时候这些设备能够自动开启或关闭,从而节省能源和电费。例如,晚上临睡前可以设定好电饭煲的定时功能,第二天早上就能吃到热腾腾的早餐。

2、STM32F1定时器

        STM32定时器种类多,功能强大,这些定时器完全独立、互不干扰,可以同步操作。

3、 STM32定时器分类比较表

                                    STM32定时器分类比较表

4、 STM32定时器的主要功能

定时器的主要功能

二、原理图设计

三、STM32CubeMX 配置

1.定时器时钟挂载

       定时器TIM2~TIM7挂接在APB1上 ,定时器TIM1和TIM8挂接在APB2上。在计算定时器计时参数时要相应的要调节他们时钟频率。注:此步默认不用修改。

2.定时器2及LED的配置

       定时器的定时时间主要取决于定时周期和预分频因子,计算公式为: 定时时间=(ARR+1)×(预分频值PSC+1)/输入时钟频率 或 T=(TIM_Period +1)*(TIM_Prescaler +1)/TIMxCLK 这里ARR+1是因为计数器都是从0开始计数的。

例如:使用通用定时器定时1ms。假设系统时钟为8MHz,通用定时器时钟TIMxCLK为8MHz,设置如下: 预分频系数PSC=8-1;    ARR=1000-1; 则,定时时间=8×1000/8000000=1ms。

3.开启定时器2中断

四、程序设计

1.打开定时器2中断

开启定时中断函数:   HAL_TIM_Base_Start_IT(&htimx);   //x  为要开启的定时器号,下面代码为开启定时器2中断,x= 2.

  /* USER CODE BEGIN 2 */
	
	HAL_TIM_Base_Start_IT(&htim2);//开启定时器2中断
	
  /* USER CODE END 2 */

2.重写中断回调函数

        先在main.c 文件 前面定义一个全局变量:  int ms =  0 ;   中断回调函数内尽量少放我们处理的代码。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == htim2.Instance) //1mS进入1次中断
	{			
	    //书写我们想要执行的功能
		ms++;//毫秒 ++
		if ( ms >= 1000)//1s 到
		{
			ms = 0;
			HAL_GPIO_TogglePin(GPIOB, LED1_Pin);	//LED1状态取反
		}	
	}  
}

五、实验现象

六、仿真实现


总结

### STM32CubeMX 配置定时器并配合 Proteus 模拟 #### 工具准备 为了完成基于 STM32定时器配置以及在 Proteus 中模拟的任务,需准备好以下工具和环境: - **硬件平台**: STM32 开发板(如 STM32F103C8T6 或其他型号)。 - **软件工具**: - STM32CubeMX:用于初始化外设配置。 - Keil uVision5:编译生成的代码。 - Proteus:电路设计与仿真。 --- #### 使用 STM32CubeMX 配置定时器 以下是通过 STM32CubeMX 配置 TIMx 定时器的关键步骤: 1. 打开 STM32CubeMX 软件,创建一个新的项目并选择目标 MCU 型号[^1]。 2. 进入 Pinout & Configuration 页面,在 Peripherals 列表中找到 Timer 外设模块,并启用所需的 TIMx 定时器实例。 3. 设置定时器的工作模式为通用计数器或者 PWM 输出模式。对于 LED 控制应用,通常会设置为输出比较模式 (Output Compare Mode)[^2]。 4. 在 Clock Configuration 下调整系统时钟源及时基分频参数,确保满足需求的时间精度。 5. 如果需要中断支持,则勾选对应通道下的 Interrupt Enable 和 DMA Request 功能选项。 6. 生成功能框架代码后导入到 Keil 编辑器继续完善业务逻辑部分。 --- #### 实现具体功能案例分析 假设我们要利用 TIM2 来驱动一个简单的呼吸灯效果: ```c // 初始化TIM2作为PWM信号发生器 void MX_TIM2_Init(void){ __HAL_RCC_TIM2_CLK_ENABLE(); //使能TIM2时钟 TIM_HandleTypeDef htim2; htim2.Instance = TIM2; htim2.Init.Prescaler = 7999;//预分频系数,决定载波频率f=SYSCLK/(Prescaler+1)/ARR htim2.Init.CounterMode = TIM_COUNTERMODE_UP ;//向上计数方式 htim2.Init.Period = 999 ;//自动重装载寄存器值,即占空比最大范围 HAL_TIM_PWM_Init(&htim2); //调用库函数完成基本结构体填充及资源分配等工作 TIM_OC_InitTypeDef sConfigOC ; sConfigOC.OCMode = TIM_OCMODE_PWM1 ;//指定为PWM模式1 sConfigOC.Pulse = 500 ; //初始脉宽设定一半位置处点亮程度适中的状态 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;//高电平有效 HAL_TIM_PWM_ConfigChannel (&htim2,&sConfigOC,TIM_CHANNEL_1); } int main(){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM2_Init(); while(1){ static uint16_t duty_cycle = 0; if(duty_cycle >=1000){duty_cycle=0;} __HAL_TIM_SET_COMPARE(htim2,TIM_CHANNEL_1,duty_cycle++); delay_ms(1); //延时一段时间让变化更加平稳自然 } } ``` 上述代码片段展示了如何借助 HAL 库快速搭建起一个基础版的呼吸灯程序[^2]。 --- #### 将工程移植至 Proteus 平台测试验证 当所有软硬件准备工作就绪之后,可以按照下面流程把实际运行状况搬到虚拟环境中观察检验: 1. 构建好包含微控制器单元在内的完整电子线路图; 2. 把由 Keil 导出的目标文件(.hex/.bin)加载关联起来; 3. 启动动态行为演示查看预期成果是否一致即可[^1]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

面包板扎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值