STM32F103VET6中断方式配置按键1,实现按键按一次,LED1-LED8循环亮灭,按键再按一次,停止循环的代码
时间: 2024-11-10 10:25:29 浏览: 33
在STM32F103VET6微控制器上,我们可以使用中断的方式来配置按键1,并结合定时器控制LED的亮灭。这里是一个简单的示例代码,假设已经初始化了GPIO和EXTI(外部中断),并且使用了TIM2定时器:
```c
#include "stm32f1xx_hal.h"
// LED定义
#define LED1_GPIO GPIOB
#define LED1_PIN PB6
#define LED8_GPIO GPIOD
#define LED8_PIN PD4
// EXTI按键配置
#define KEY_BUTTON_EXTI_LINE EXTI_Line0
#define KEY_BUTTON_PORT GPIOA
#define KEY_BUTTON_PIN PA0
// TIM2定时器预设值
#define TIMER_PRESET (1000000 / 8) // 按键触发,LED亮灭周期为1s / 8 = 125ms
static uint8_t ledIndex = 0;
void TIM2_IRQHandler(void)
{
if (EXTI_GetITStatus(KEY_BUTTON_EXTI_LINE, IT_RISING) != RESET) {
EXTI_ClearITPendingBit(KEY_BUTTON_EXTI_LINE);
// 判断当前是否点亮第几个LED
ledIndex++;
if (ledIndex > 7) {
ledIndex = 0; // 循环到第一个LED
}
// 点亮LED
__HAL_GPIO_ToggleBits(LED1_GPIO, LED1_PIN);
__HAL_GPIO_ToggleBits(LED8_GPIO, LED8_PIN);
// 如果按键再次按下,则关闭计数
if (EXTI_GetITStatus(KEY_BUTTON_EXTI_LINE, IT_FALLING)) {
EXTI_ClearITPendingBit(KEY_BUTTON_EXTI_LINE);
ledIndex = -1;
}
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
// 初始化GPIO和EXTI
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitStructure.Pin = KEY_BUTTON_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStructure.Pull = GPIO_NOPULL;
GPIO_Init(KEY_BUTTON_PORT, &GPIO_InitStructure);
EXTI_InitStructure.Line = KEY_BUTTON_EXTI_LINE;
EXTI_InitStructure Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure Interrupt = EXTI_Interrupt_Enable;
EXTI_Init(&EXTI_InitStructure);
// 初始化TIM2并设置通道2为上升沿捕获模式
TIM_HandleTypeDef htim2;
htim2.Instance = TIM2;
htim2.Init.Prescaler = ((CPU frec) / 1000000) - 1; // 根据系统频率调整
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = TIMER_PRESET;
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim2.Init.RepetitionCounter = 0;
HAL_TIM_Base_Init(&htim2);
// 开启TIM2计时器和外部中断
HAL_TIM_Base_Start_IT(&htim2);
HAL_NVIC_EnableIRQ(TIM2_IRQn);
while (1)
{
// 主程序在这里等待按键中断
}
}
```
注意:此代码未包含中断全局开启、延时处理以及错误检查等细节。实际项目中,你需要确保所有硬件初始化正确,并可能需要添加适当的延时或锁存机制。
阅读全文