2.1.LED灯基础知识
2.1.1.LED灯结构组成
LED灯,也称发光二极管,是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光。LED的内部是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极,整个晶片环-氧树脂封装起来。常见的LED灯如图2-1所示。
图2-1 常见LED灯
2.1.2.LED灯发光原理
半导体晶片由两部分组成,一部分是P型半导体,另一端是N型半导体。这两种半导体连接起来的时候,它们之间就形成了一个P-N结。当电流通过导线作用于这个晶片的时候,电子就会被推向P区,在P区里电子跟空穴复合,然后就会以光子的形式发出能量,这就是LED灯发光的原理。
2.1.3.LED灯驱动原理
LED 驱动指的是通过稳定的电源为 LED 提供合适的电流和电压,使其正常工作点亮。LED 驱动方式主要有恒流和恒压两种。限定电流的恒流驱动是最常见的方式,因为 LED 灯对电流敏感,电流大于其额定值可能导致损坏。恒流驱动保证了稳定的电流,从而确保了 LED 安全。
LED 灯的驱动比较简单,只需要给将对应的正负极接到单片机的正负极即可驱动。LED的接法也分有两种,灌入电流和输出电流。
图2-2 LED接法示例
灌入电流指的是LED的供电电流是由外部提供电流,将电流灌入我们的MCU;风险是当外部电源出现变化时,会导致MCU的引脚烧坏。
输出电流指的是由MCU提供电压电流,将电流输出给LED;如果使用 MCU的GPIO 直接驱动 LED,则驱动能力较弱,可能无法提供足够的电流驱动 LED。
需要注意的 是 LED 灯的颜色不同,对应的电压也不同。电流不可过大,通常需要接入220欧姆到10K欧姆左右的限流电阻,限流电阻的阻值越大,LED的亮度越暗。
2.2.LED灯原理图
CW32F003小蓝板关于LED灯的原理图如图2-3所示
图 2-3 小蓝板LED灯原理图
2.3.LED灯驱动流程(库函数)
通过上面的原理图可以了解到,LED2中负极接到了电源地,LED2的正极经限流电阻R3连接到电源正。当核心板上电时,使LED2导通,这时便有电流流过发光二极管LED2,使LED2发光指示电源接入;
LED1的正极经限流电阻R5接到电源正极,LED1的负极连接到单片机的GPIO口上,通过LED灯的驱动原理,只需要将相应GPIO(PC0)配置为低电平即可点亮LED1。CW32F003小蓝板的LED部分实物图如图2-4所示
图 2-4 小蓝板LED实物图
2.3.1.配置流程
一般我们使用GPIO的端口,都需要有以下几个步骤。
开启GPIO的端口时钟
配置GPIO的模式
配置GPIO的输出
从开发板原理图了解到LED2接的是单片机的PC0。我们要使能LED就需要配置GPIOC端口。下面我们就以LED1接的PC0进行介绍。
2.3.1.1.开启CW32F003系统内部时钟
CW32的系统内部时钟默认并不是我们想要的运行频率,在使用CW32之前我们需要先配置内部时钟树。查找CW32F003的用户手册可以找到系统内部时钟树如下图:
图2-5 CW32F003内部时钟树
在CW32的库函数中找到cw32f003_rcc.h,头文件中有时钟树相关配置的函数,如下图:
图2-6 时钟树相关配置函数
void RCC_Configuration(void) { FLASH_SetLatency(FLASH_Latency_2); // 设置主频为48MHZ需要注意,Flah的访问周期需要更改为FLASH_Latency_2。 RCC_HSI_Enable(RCC_HSIOSC_DIV1); // 设置频率为48M RCC_SYSCLKSRC_Config(RCC_SYSCLKSRC_HSI); //选择SYSCLK时钟源 48MHz RCC_HCLKPRS_Config(RCC_HCLK_DIV1); //配置SYSTICK到HCLK分频系数 48MHz RCC_PCLKPRS_Config(RCC_PCLK_DIV8); //配置HCLK 到 PCLK的分频系数 6MHz }
2.3.1.2.开启GPIO的端口时钟
CW32的外时钟默认是全部关闭,使用GPIO外设之前我们需要先开启对应的时钟。
在CW32提供的库函数中找到cw32f003_rcc.h,这个头文件包含了所有时钟相关的函数接口。外设时钟的接口如下图所示:
图2-7 GPIO配置相关函数
LED1的控制IO是PC0,因此需要打开GPIOC对应的时钟,代码如下:
__RCC_GPIOC_CLK_ENABLE();//打开GPIOC的时钟2.3.1.3.配置GPIO初始化
图2-8 GPIO模式 GPIO模式包含了模拟输入,数字输入,数字上拉输入,数字下拉输入,数字推挽输出,数字开漏输出模式。
根据发光二极管控制原理,PC0接在LED的反向端,因此PC0为低电平时,LED点亮。我们需要PC0输出高低电平,模式需要选择数字输出模式,由于开漏模式需要外部有上拉或者下拉电阻才可输出高低电平,所以我们选择推挽模式。代码如下:
GPIO_Init_Struct.Mode = GPIO_MODE_OUTPUT_PP;中断使能包含了:无中断,上升沿,下降沿,低电平,高电平中断使能。
图2-9 GPIO中断 因为我们需要的是GPIO输出,因此不需要中断使能,代码如下:
GPIO_Init_Struct.IT = GPIO_IT_NONE;GPIO位号如下图所示:
图2-10 GPIO位脚 LED的控制端为PC0,最后的这个0就是位号,配置代码如下:
GPIO_Init_Struct.Pins = GPIO_PIN_0;引脚输出还需要配置GPIO的输出速度,有高低速两种速度设置,我们设置高速:
GPIO_Init_Struct.Speed = GPIO_SPEED_HIGH;以上配置就完成了GPIO的结构体初始化,然后我们需要调用初始化函数,在cw32f003_rcc.h里找到void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);包含了两个参数,第一个参数是GPIO的基地址,第二个参数是初始化配置结构体。调用代码如下:
GPIO_Init(CW_GPIOC, &GPIO_Init_Struct);结合以上配置,完整代码如下:
GPIO_InitTypeDef GPIO_Init_Struct; __RCC_GPIOC_CLK_ENABLE(); GPIO_Init_Struct.IT = GPIO_IT_NONE; GPIO_Init_Struct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_Init_Struct.Pins = GPIO_PIN_0; GPIO_Init(CW_GPIOC, &GPIO_Init_Struct);2.3.1.4.配置LED输出
GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins, GPIO_PinState PinState); 传参有三个,第一个是第一个参数是GPIO的基地址,第二个参数是引脚位号,第三个参数是输出状态。
GPIO_WritePin(CW_GPIOC,GPIO_PIN_0,GPIO_Pin_SET);//PC0输出高电平 GPIO_WritePin(CW_GPIOC,GPIO_PIN_0,GPIO_Pin_RESET);//PC0输出低电平我们要点亮LED1根据上文的电路图可知要将PC0置低。
图2-11 DAP-Link接线图
图2-12 CW32F003程序下载接线
2.3.2.实验效果
最终的实验效果如下图所示:
图2-13 LED点亮实验现象
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !