在user.c
文件中,我们需要对LED进行初始化设置。
在函数LED_GPIO_Config
中,可以修改代码如下:
/***********************************************************************
LED初始化
备注 LED 接在GPC14引脚上
***********************************************************************/
void LED_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_2 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_SetBits(GPIOD, GPIO_Pin_3 ); // 关闭所有灯泡
GPIO_SetBits(GPIOD, GPIO_Pin_2 );
GPIO_SetBits(GPIOD, GPIO_Pin_1 );
}
在这段代码中,我们使用GPIO_InitTypeDef
结构体对GPIO进行初始化配置。
我们选择使用GPIOD的引脚12、13和14作为LED的控制引脚,并设置为输出模式。
另外,我们将引脚的输出类型设置为推挽输出(PP),输出速度为100MHz,上拉电阻使能。
最后,通过GPIO_SetBits
函数将引脚12、13和14设置为高电平,关闭所有灯泡。
问题一:为什么低电平才是点亮灯泡呢?
我们可以将引脚看作一个开关,通过改变开关的状态来
控制灯泡。当引脚处于高电平时,相当于开关处于关闭状态(因为接地线了),电流无法通过开关流向灯泡,因此灯泡不亮。
而当引脚处于低电平
时,相当于开关处于打开状态(未接地线),电流可以通过开关流向灯泡,从而使灯泡亮起。
在user.c
文件中,我们需要添加一个函数来顺序点亮灯泡。可以在文件末尾添加如下代码:
void Light_Three_Leds(void)
{
GPIO_ResetBits(GPIOD, GPIO_Pin_1);
Delay_MS(1000);
GPIO_SetBits(GPIOD, GPIO_Pin_1);
GPIO_ResetBits(GPIOD, GPIO_Pin_2);
Delay_MS(1000);
GPIO_SetBits(GPIOD, GPIO_Pin_2);
GPIO_ResetBits(GPIOD, GPIO_Pin_3);
Delay_MS(1000);
GPIO_SetBits(GPIOD, GPIO_Pin_3);
}
这个函数用于控制三个灯泡的点亮和熄灭。
我们通过GPIO_ResetBits
函数将指定的引脚设置为低电平,点亮对应的灯泡,并延时一段时间(这里设置为1秒)。
然后,通过GPIO_SetBits函
数将引脚设置为高电平,熄灭灯泡。
在main.c
文件中,我们需要调用Light_Three_Leds函数来点亮灯泡。可以在适当的位置添加如下代码:
int main(void)
{
// ...
LED_GPIO_Config(); // 初始化LED
// ...
Light_Three_Leds(); // 调用函数点亮灯泡
while (1)
{
// ...
// ...
}
}
在主函数中,我们首先调用LED_GPIO_Config
函数来初始化LED引脚。
然后,可以在适当的位置使用Light_Three_Leds函数来点亮灯泡。
在user.c
文件中,我们需要修改EXTI9_5_IRQHandler
函数,使其在检测到按键按下时点亮灯泡。可以将代码修改如下:
void EXTI9_5_IRQHandler(void)
{
Delay_MS(20);
if (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8) == 0) // 检测按键是否按下
{
while (!GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8));
printf("This is the system's default operation.\r\n");
Delay_MS(1);
Light_Three_Leds(); // 调用函数点亮灯泡
}
EXTI_ClearITPendingBit(EXTI_Line8);
}
在这段代码中,我们首先进行一个20毫秒的延时,以防止按键抖动。
然后,使用GPIO_ReadInputDataBit
函数检测按键是否按下(假设按键连接到GPIOE的引脚8)。
如果检测到按键按下,我们进入一个循环,直到按键释放。
在循环中,我们打印一条消息表示系统的默认操作,并进行一个1毫秒的延时。然后,调用Light_Three_Leds
函数来点亮灯泡。
最后,通过EXTI_ClearITPendingBit
函数清除中断挂起标志,表示中断已处理完毕。