HAL学习笔记04------定时器与计数器

本文介绍了STM32中定时器和计数器的区别,重点讲解了如何使用定时器控制LED灯的闪烁,避免HALdelay的CPU资源消耗,并提供了实战代码示例和预分频系数设置的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:b站up皖江工与STM32

一、定时器和计数器的基本概念

1.1 区别

是否知道信号的周期,是则为定时器,否则为计数器

1.2 定时器的理解

1.3 关注的三个值以及计算

1.4 定时器的开启

二、实战

为什么不用HALdelay?消耗CPU的资源

示例:利用定时器,控制开发板上的指示灯LED1,每隔1s闪烁

分析:1s钟定时?

注意,预分频系数PSC arr是有范围的

先找到中断回调函数:

先编译再跳转!!!!!!!!!!!!!!!!!!

完整工程:

链接:https://pan.baidu.com/s/18U3h_XsEOnUbeTvMdCkVbg?pwd=1yqa 
提取码:1yqa

### 蓝桥杯嵌入式竞赛中按键操作的学习笔记 #### 按键硬件连接初始化 STM32单片机上的四个按键分别连接至PB0~PB2以及PA0引脚。这些按键的一端通过外部上拉电阻连接到电源,另一端接地。当按键被按下时,对应的GPIO引脚电平会被拉低[^1]。 ```c // 初始化GPIO引脚用于按键输入 void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /* Configure PB0-PB2 and PA0 as input with pull-up */ GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_0; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` #### 中断优先级处理 为了防止在按键消抖过程中受到其他中断的影响,特别是SysTick定时器的中断,应当调整其相对于外部中断线(EXTI)的优先级。确保SysTick中断具有更高的抢占优先级可以有效避免因毛刺引起的误触发问题[^2]。 ```c // 配置SysTick中断优先级高于按键中断 void SystemClock_Config(void) { ... // 设置SysTick中断优先级为最高 NVIC_SetPriority(SysTick_IRQn, 0); ... } ``` #### 定时扫描机制实现消抖及长短按识别 采用滴答计数器(Tick Timer),即每过一定周期(如10毫秒),执行一次按键状态检查。这种方法不仅能够完成基本的去抖动工作,还可以区分短按和长按事件。对于长时间保持按下的情况,可以通过记录连续几次扫描期间按键的状态来判定具体的动作类型[^3]。 ```c volatile uint8_t key_status = KEY_RELEASED; // 当前按键状态,默认释放态 volatile uint16_t press_duration = 0; // 按下持续时间计数值 /* 私有化的按键检测函数 */ static void KeyScan(void) { static uint8_t last_key_state = KEY_RELEASED; if (HAL_GPIO_ReadPin(KEY_BUTTON_PORT, KEY_BUTTON_PIN) == GPIO_PIN_RESET) { if (last_key_state != KEY_PRESSED) press_duration = 0; // 清零计数器 ++press_duration; // 更新计数器 last_key_state = KEY_PRESSED; if(press_duration >= SHORT_PRESS_THRESHOLD && press_duration < LONG_PRESS_THRESHOLD) { key_status = KEY_SHORT_PRESS; } else if(press_duration >= LONG_PRESS_THRESHOLD) { key_status = KEY_LONG_PRESS; } }else{ last_key_state = KEY_RELEASED; key_status = KEY_RELEASED; } } /* 主循环内调用 */ while (1) { if(key_status == KEY_SHORT_PRESS){ // 处理短按逻辑... key_status = KEY_RELEASED; } if(key_status == KEY_LONG_PRESS){ // 处理长按逻辑... key_status = KEY_RELEASED; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值