-
LED的硬件电路
我的电路:
LED 共阴极指的是LED共同的接点是GND(接地),而共阳极指的是LED共同的接点是电源。LED亮灯的条件是两端有电势差。
1.共阴极:
当LED另一端接入5V电源的时候,与另一端产生电势差因此会有电流从正极流到GND,最后会亮灯
当LED另一端接入0V的时候,则不会产生电势差也就不会亮灯。
优点是符合人类的正向思维,送电ON就是开,OFF就是关。
2.共阳极:
当LED另一端接入5V电源的时候,不会产生电势差因此不会亮灯。
当LED另一端接入0V的时候,会产生电势差,电流会从5V端流经LED到0V端,会亮灯。
-
步骤
- 配置LED的GPIO:选定引脚、工作模式
- 使能时钟:GPIOB在APB2上,库函数RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE)
- 控制引脚输出电平
库函数RCC_APB2PeriphClockCmd的解释:
配置RCC_APB2ENR寄存器,RCC_APB2Periph_GPIOB定义为0x00000008,也就是1000,对应寄存器的第3位(红框框出)。
-
代码
main函数:
int main(void) { InitLED(); while(1) { LEDFlicker(500); } }
LED.c文件
/********************************************************************************************************* * 模块名称: LED.c * 摘 要: * 当前版本: 1.0.0 * 作 者: xiamii * 完成日期: 2020年07月06日 * 内 容: * 注 意: ********************************************************************************************************** * 取代版本: * 作 者: * 完成日期: * 修改内容: * 修改文件: *********************************************************************************************************/ /********************************************************************************************************* * 包含头文件 *********************************************************************************************************/ #include "LED.h" /********************************************************************************************************* * 宏定义 *********************************************************************************************************/ /********************************************************************************************************* * 枚举结构体定义 *********************************************************************************************************/ /********************************************************************************************************* * 内部变量 *********************************************************************************************************/ /********************************************************************************************************* * 内部函数声明 *********************************************************************************************************/ static void ConfigLEDGpio(void); /********************************************************************************************************* * 内部函数实现 *********************************************************************************************************/ /********************************************************************************************************* * 函数名称: ConfigLEDGpio * 函数功能: 配置LED的GPIO,作为系统运行指示灯 * 输入参数: void * 输出参数: void * 返 回 值: void * 创建日期: 2020年07月06日 * 注 意: *********************************************************************************************************/ static void ConfigLEDGpio(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能时钟 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStruct); //PB3 LED1 GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStruct); //PB4 LED2 GPIO_WriteBit(GPIOB, GPIO_Pin_3, Bit_SET); //LED1默认值为熄灭 GPIO_WriteBit(GPIOB, GPIO_Pin_4, Bit_SET); //LED2默认值为熄灭 } /********************************************************************************************************* * API函数实现 *********************************************************************************************************/ /********************************************************************************************************* * 函数名称: InitLED * 函数功能: * 输入参数: * 输出参数: * 返 回 值: void * 创建日期: 2020年07月06日 * 注 意: *********************************************************************************************************/ void InitLED(void) { ConfigLEDGpio();//配置LED的GPIO } /********************************************************************************************************* * 函数名称: LEDFlicker * 函数功能: LED闪烁函数 * 输入参数: cnt * 输出参数: * 返 回 值: void * 创建日期: 2020年07月06日 * 注 意: cnt为500时表示2s亮一次 *********************************************************************************************************/ void LEDFlicker(u16 cnt) { static u16 s_iCnt; s_iCnt++; if(s_iCnt >= cnt) { s_iCnt = 0; // 对B3、B4取反 GPIO_WriteBit(GPIOB, GPIO_Pin_3, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_3))); GPIO_WriteBit(GPIOB, GPIO_Pin_4, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_4))); //GPIO_WriteBit(GPIOE, GPIO_Pin_5, (BitAction)!GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_5)); } }
LED.h文件:
/********************************************************************************************************* * 模块名称: LED.h * 摘 要: * 当前版本: 1.0.0 * 作 者: * 完成日期: 2020年07月04日 * 内 容: * 注 意: none ********************************************************************************************************** * 取代版本: * 作 者: * 完成日期: * 修改内容: * 修改文件: *********************************************************************************************************/ #ifndef _LED_H_ #define _LED_H_ /********************************************************************************************************* * 包含头文件 *********************************************************************************************************/ #include "stm32f10x.h" #include "DataType.h" /********************************************************************************************************* * 宏定义 *********************************************************************************************************/ #define LED_VERSION 0x00010000 //即1.0.0版本 #define LED0 0 #define LED1 1 #define LED_OFF 1 #define LED_ON 0 //共阳极低电平有效 /********************************************************************************************************* * 枚举结构体定义 *********************************************************************************************************/ /********************************************************************************************************* * API函数声明 *********************************************************************************************************/ void InitLED(void); //LED初始化 void LEDFlicker(u16 cnt); //cnt=500表示每2s亮一次 #endif