嵌入式系统中的流水灯是一种常见的示例项目,通常用于演示嵌入式系统的基本功能和控制能力。流水灯由多个发光二极管(LED)组成,这些LED按照一定的顺序依次点亮和熄灭,形成一种像水流一样的流动效果。
这里我们使用STM32F40xxx这个板子来实现流水灯这个小项目

由上图可知,LED0这个灯所在引脚 PF9,LED1这个灯所在引脚 PF10
可知 PF9:"PF"表示端口F,"9"表示该端口上的第9号引脚
PF10:"PF"表示端口F,"10"表示该端口上的第10号引脚
![]()
根据硬件引脚号码,LED0和LED1都是PF,那么控制他俩的时钟型号都是GPIOF,而根据上图可知,GPIOF在AHB1总线上,根据这个逻辑就能找到GPIOF时钟型号,并打开时钟信号。
AHB1ENR 寄存器用于配置 AHB1 总线上各个模块的时钟使能位。通过将 0x00000020 写入 AHB1ENR 寄存器的相应位置,启用了 GPIOF 的时钟


所以打开控制LED0,LED1的时钟信号就是使用一下
RCC->AHB1ENR=0x00000020;//时钟使能

GPIOF->MODER=0x00040000;//配置引脚为输出模式

GPIOF->OTYPER=0x00000000;//设置输出模式为推挽输出

GPIOF->OSPEEDR=0x000C0000;//
原理:开灯需要一个低电平,注意不是高电平


//GPIOF->ODR=0x00000000;
原理:关灯需要一个高电平,注意不是低电平

找到引脚9 然后将值改成1,后续通过非门输出就为0,即关灯
//GPIOF->ODR=0x0200;
注意这里我们的逻辑还是和二一样,首先重重之重的就是时钟信号,必须先打开时钟信号,然后创建一个结构体,这个结构体当中有输入输出模型,速度,引脚等,用于初始化灯。






- void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//关灯
- void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//开灯
注意:开灯是低电平有效,关灯是高电平有效。
GPIO_SetBits函数用于将某位引脚置1,使其输出高电平。
GPIO_ResetBits函数用于将某位引脚置0,使其输出低电平。
- #ifndef _LED_H_
- #define _LED_H_
- void LED_Init(void);
-
- void LED1_ON(void);
- void LED1_OFF(void);
-
- void LED2_ON(void);
- void LED2_OFF(void);
-
- #endif // GPIO_CONFIG_H
- #include "LED.h"
- #include "stm32f4xx.h"
- void LED1_ON(void)//开灯
- {
- GPIO_ResetBits(GPIOF,GPIO_Pin_9);
- }
- void LED1_OFF(void)//关灯
- {
- GPIO_SetBits(GPIOF,GPIO_Pin_9);
- }
-
- void LED2_ON(void)
- {
- GPIO_ResetBits(GPIOF,GPIO_Pin_10);
- }
- void LED2_OFF(void)
- {
- GPIO_SetBits(GPIOF,GPIO_Pin_10);
- }
- void LED_Init(void)
- {
- RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能
- GPIO_InitTypeDef GPIO_InitTypeDefStruct1;
- GPIO_InitTypeDefStruct1.GPIO_Mode=GPIO_Mode_OUT;//输出
- GPIO_InitTypeDefStruct1.GPIO_OType=GPIO_OType_PP;//推挽输出
- GPIO_InitTypeDefStruct1.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10;//引脚
- GPIO_InitTypeDefStruct1.GPIO_Speed= GPIO_High_Speed ;//速度
- GPIO_Init(GPIOF,&GPIO_InitTypeDefStruct1);
- }
-
- int main()
- {
- LED_Init();
-
- LED1_OFF();
- LED2_OFF();
- /*
- int n=500000;
- while(1)
- {
- while(n--)
- {
- };
- n=5000000;//延时
- LED1_ON();
- while(n--)
- {
- };
- n=5000000;
- LED1_OFF();
- while(n--)
- {
- };
- n=5000000;
- LED2_ON();
- while(n--)
- {
- };
- n=5000000;
- LED2_OFF();
- }
- */
- }