stm32单片机在代码中加入按键的驱动,实现简易秒表功能(按一下可以停止计时)。
时间: 2023-06-27 16:05:58 浏览: 567
下面是一个基本的示例代码,可以实现简易秒表功能,使用了STM32F103C8T6单片机和Keil μVision5开发平台。
首先,需要在代码中引入头文件和定义一些宏:
```c
#include "stm32f10x.h" // 包含STM32F103C8T6的头文件
#define KEY GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) // 定义按键GPIO输入宏
```
然后在主函数中初始化相关的GPIO引脚和定时器:
```c
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); // 使能GPIOA和AFIO时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能TIM3时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // 设置GPIOA.0为输入引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 设置GPIOA.0为上拉输入模式
GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化GPIOA
TIM_TimeBaseStructure.TIM_Period = 999; // 设置计时器自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler = 7199; // 设置计时器分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 设置计时器时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 设置计时器为向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); // 初始化计时器
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; // 设置计时器中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 设置计时器中断优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure); // 初始化中断
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 使能计时器更新中断
TIM_Cmd(TIM3, ENABLE); // 启动计时器
while(1);
}
```
在初始化完成后,需要编写中断服务函数来处理计时器的计数和按键的检测:
```c
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) // 判断计时器更新中断是否发生
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除计时器更新中断标志
static uint16_t count = 0; // 定义计数器变量
count++; // 每次中断计数器加1
if (KEY == 0) // 判断按键是否按下
{
count = 0; // 如果按键按下,则计数器清零
}
if (count > 999) // 如果计数器大于计时器最大值
{
count = 0; // 计数器清零
}
printf("%d\n", count); // 在串口终端输出计数器值
}
}
```
在以上代码中,使用了一个静态变量 `count` 来记录计数器的值,每次中断都加1,同时检测按键是否按下。如果按键按下,则将计数器清零。当计数器大于计时器最大值时,将计数器清零。最后,在串口终端输出计数器的值。
需要注意的是,以上代码中的串口输出需要先初始化串口,并且需要在 `main()` 函数中加入相应的代码。
完整代码如下:
阅读全文