STM32F4 点亮灯泡【顺序点亮、按键点亮】

一、顺序点亮灯泡

①初始化

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设置为高电平,关闭所有灯泡。

问题一:为什么低电平才是点亮灯泡呢?
STM32F4 点亮灯泡【顺序点亮、按键点亮】_第1张图片
我们可以将引脚看作一个开关,通过改变开关的状态来控制灯泡。当引脚处于高电平时,相当于开关处于关闭状态(因为接地线了),电流无法通过开关流向灯泡,因此灯泡不亮。
而当引脚处于低电平时,相当于开关处于打开状态(未接地线),电流可以通过开关流向灯泡,从而使灯泡亮起。

②添加点亮灯泡函数

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文件中调用

main.c文件中,我们需要调用Light_Three_Leds函数来点亮灯泡。可以在适当的位置添加如下代码:

int main(void)
{
    // ...

    LED_GPIO_Config();  // 初始化LED

    // ...

	Light_Three_Leds();  // 调用函数点亮灯泡

    while (1)
    {
        // ...


        // ...
    }
}

在主函数中,我们首先调用LED_GPIO_Config函数来初始化LED引脚

然后,可以在适当的位置使用Light_Three_Leds函数来点亮灯泡

二、按键点亮灯泡

修改EXTI中断处理函数

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函数清除中断挂起标志,表示中断已处理完毕。

你可能感兴趣的:(嵌入式开发,stm32,单片机,嵌入式硬件)