本帖最后由 kevinfan 于 2022-8-4 18:15 编辑
@21小跑堂 #申请原创# #技术资源# #有奖活动# #每日话题#
上一篇体验了简单的电灯程序,那么这个程序是如何实现的呢?在固件包CW32F030_StdPeriph_Lib中的Examples目录我们找到了电灯工程gpio目录,gpio_blink项目就是用来控制 GPIO LED 闪烁 。
我们来看下gpio_blink的工程文件,.uvprojx是Keil V5的工程文件,.uvoptx是Keil V5工程选项配置文件。双击Project.uvprojx打开工程,工程中主要包含了源文件和头文件。头文件主要是CW32F030提供的函数引用库,源文件则是用来构建项目的功能。
main.c文件是用户程序的入口也是我们程序的起始位置,我们来看下程序都做了什么。GPIO_InitTypeDef定义了点灯的全局初始化类型,根据GPIO_InitTypeDef中指定的参数初始化外设硬件。RCC_HSI_Enable则是通过SHI配置RCC时钟寄存器来获取系统时钟,__RCC_GPIOB_CLK_ENABLE用来开启GPIOB时钟。GPIO_Init用来初始化需要用到的引脚的工作模式,包括具体引脚的工作速度、是否复用模式、上下拉等等参数。GPIO_TogglePin用来翻转某个引脚的电平状态,参数GPIOx为引脚所在的组号,GPIO_Pin则是具体引脚。
int32_t main(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //结构体:全局初始化类型
RCC_HSI_Enable(RCC_HSIOSC_DIV6); //启用RCC系统时间
__RCC_GPIOB_CLK_ENABLE(); //开启GPIOB时钟
GPIO_InitStruct.IT = GPIO_IT_NONE; //没有被选中
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //开漏输出
GPIO_InitStruct.Pins = LED_GPIO_PINS; //选用的管脚
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; //管脚的速率
GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
while (1)
{
GPIO_TogglePin(LED_GPIO_PORT, LED_GPIO_PINS);
Delay(0xFFFF);
}
延时
这里的Delay是给程序一个间隔时间,达到一个闪烁的效果。通过while循环调用GPIO_TogglePin来点亮LED灯,0Xffff是16进制字符转换成十进制等于65535。void Delay(__IO uint16_t nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
LED点亮原理
一般情况下LED可以直接在LED两端接上电源和地线来连接,但是LED一般是额定电流。电流太大会烧坏LED,通常我们会串联电阻来调节电流。这里用个简单的单片机为例,
在单片机IO端连接LED的负极或正极,如果接LED的负极那么IO端默认电平需要设置为高电平(即默认灯灭),LED另一个引脚需要接VCC(直流5V电源)。当需要点亮LED时,只需将开发板对的IO端电平拉低即可。如果IO端接LED正极那么单片机IO端默认电平需要设置为低电平,LED的另一端接GND(负极)。当需要点亮LED时,只需要将开发板对应IO电平拉高。
|