用stm32f103ve完成基础题:按下GPIO口PD13按键,按下第一次两个灯亮,按下第二次,两个灯灭掉,以此类推。
时间: 2024-10-18 19:09:39 浏览: 5
在STM32F103VE单片机上实现这个基础题需要几个步骤:
1. **初始化GPIO**:
首先,你需要配置PD13作为输入模式,并连接到外部中断线(EXTI)。这样当你按下键时,GPIO的状态改变会被检测到。
```c
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 配置PA时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; // PD13接PB0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 输入浮动模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0; // EXTI线对应PB0
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 边沿触发中断
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 开启中断
EXTI_Init(&EXTI_InitStructure);
```
2. **处理中断函数**:
使用`EXTI_IRQHandler()`函数作为中断服务程序,当PB0(连接了PD13)的中断触发时,会进入这里。你可以用一个标志位来记录按键的次数。
```c
static uint8_t keyCount = 0;
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET)
{
if (keyCount % 2 == 0) // 按下两次才切换灯光状态
{
// 控制其他LED(假设是GPIOB)
GPIO_SetBits(GPIOB, GPIO_Pin_1 | GPIO_Pin_2); // 两个灯亮
}
else
{
GPIO_ResetBits(GPIOB, GPIO_Pin_1 | GPIO_Pin_2); // 两个灯灭
}
keyCount++; // 记录按下的次数
EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断标志
}
}
```
3. **启用中断**:
最后,在主循环里开启EXTI中断并设置适当的延时防止频繁触发。
```c
void Delay(__IO uint32_t nTime) // 自定义延时函数
{
while(nTime--)
{}
}
int main(void)
{
// ... 其他初始化代码 ...
NVIC_EnableIRQ(EXTI0_IRQn); // 启动EXTI0中断
Delay(1000); // 延迟启动中断,避免瞬间多次触发
while (1)
{
// 主循环...
}
}
```
阅读全文