短按键
电路图
按键按下后接地变为低电平,未按下为高电平;
不用定时器的简单按键:
1 | if(HAL_GPIO_ReadPin (GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET ) { |
CubeMX配置
引脚配置
配置PB0-2
和PA0
为GPIO_Input
并将GPIO Pull-up/Pull-down
配置为Pull-up
定时器配置
选一个定时器(这里选择TIM4)
配置时钟源为内部时钟
选项解释
Prescaler (PSC-16 bits value):
- Prescaler是用于将输入时钟频率进行分频的参数,以降低计数器的工作频率。16位值表示了分频比,用于控制计数器每次计数之前如何分频输入时钟。较大的分频比会使计数器工作在较低的频率下。例如,如果一个系统的输入时钟频率为10 MHz,而计数器需要以1 kHz的频率进行计数,那么可以通过设置适当的预分频器值来实现这一要求。假设我们设置预分频器的16位值为10000,在这种情况下,输入时钟在进入计数器之前会先进行10,000倍的分频。这样,每10,000个输入时钟周期,计数器才会计数一次,从而使得计数器的工作频率为1 kHz。不同的应用场景会有不同的计数需求。例如,某些应用可能需要高速计数,一种计数器的频率可能需要达到几十MHz甚至更高的频率。在这种情况下,计数器需要以更高的速率进行计数,以满足对计数精度和速度的要求。另一方面,一些应用可能只需要低速计数,比如在一些传感器监测系统中,计数器可以以较低的频率进行计数,以实时监测并记录事件发生的次数。
Counter Mode:
- 此处设置计数器的工作模式为”Up”,即计数器会从0开始递增计数,计数到最大值后重新从0开始。
Dithering:
- 在这里设置了禁用抖动(Dithering),抖动是指通过微小的随机变化来减小量化误差的一种技术。在这种情况下,抖动被禁用,即不会在计数器中引入这种微小的变化。
Counter Period (AutoReload Register):
- 设置计数器的计数周期,通常通过AutoReload Register(自动重装载寄存器)来实现。在这里设置了计数器的周期为0到65535之间的值,当计数器达到最大值时会重新加载初始值。
Internal Clock Division (CKD):
- 设置内部时钟分频(CKD),在这里选择了”No Division”,表示计数器的时钟不会被分频,以确保计数器运行在输入时钟的最高频率下。
Auto-reload preload:
- 在这里禁用了自动加载预设值功能,即不会在计数器自动重新加载时预先装载新的值。
这些设置有助于调整计时器/计数器的行为和性能,例如调整计数模式、周期以及时钟分频等,以满足特定的应用需求。通过合理设置这些参数,可以有效地控制计时器/计数器的功能,确保其在系统中正确、稳定地运行。
Prescaler:分频系数,决定定时器的工作频率
定时器工作频率=外部总线频率(80MHz)/(PSC+1)
这里设置为80-1,即定时器工作频率=80,000,000/80=1,000,000Counter Period:
定时频率=定时器工作频率/counter
这里设置为10000-1,即定时频率=1,000,000/10,000=100Hz,即定时周期10ms;
10ms中断一次;
使能中断
生成工程
点击右上角”GENERATE CODE”,生成工程
代码
新建两个文件
保存interrupt.c
和interrupt.h
到bsp
文件夹
然后添加interrupt.c
到项目bsp
文件夹里
写中断回调函数
记不住函数名复制这个:
interrupt.h
1 |
|
interrupt.c
1 |
|
main.c中extern结构体/打开中断
1 | extern struct keys key[]; |
main函数里:
1 | HAL_TIM_Base_Start_IT(&htim4 ); |
一定要放在
MX_TIM4_Init();
后面!!!!!!!!!!!
启动定时器 TIM4 的基本定时器模式并使能定时器中断.
长按键
interrupt.h
1 |
|
interrupt.c
1 |
|
key[i].time>200:
之前配置的定时器一个周期10ms,200也就是2s
函数封装
1 | unsigned char view=0; |