目录
前言
做为一个点灯工程师,首先第一步当然是点灯啦,使用单片机点灯就如同软件工程师的 “Hello World" 一样,这将是我们跨入单片机的第一步。下面就让我们一起来看一下如何使用C语言搭配标准库来控制一颗LED灯珠吧!!!
水平有限,如有错漏之处,敬请指正
GPIO简介
GPIO:全名General Purpose Input Output (其实不重要),我们只需要知道它是单片机的一个管脚,可以实现输入和输出的功能,并且可以使用我们写的程序对其进行控制。
GPIO可以通过软件配置为以下模式:
- GPIO_Mode_AIN 模拟输入
- GPIO_Mode_IN_FLOATING 浮空输入
- GPIO_Mode_IPD 下拉输入
- GPIO_Mode_IPU 上拉输入
- GPIO_Mode_Out_OD 开漏输出
- GPIO_Mode_Out_PP 推挽输出
- GPIO_Mode_AF_OD 复用开漏输出
- GPIO_Mode_AF_PP 复用推挽输出
其特征为:
模式 | 功能及用法 |
模拟输入 | 该功能接入模拟量,不使用ADC |
浮空输入 | 可读取引脚电平,若引脚悬空,则电平不确定 |
下拉输入 | 可读取引脚电平,内部连接下拉电阻,悬空时默认低电平 |
上拉输入 | 可读取引脚电平,内部连接上拉电阻,悬空时默认高电平 |
开漏输出 | 可输出引脚电平,高电平为高阻态,低电平接VSS |
推挽输出 | 可输出引脚电平,高电平接VDD,低电平接VSS |
复用开漏输出 | 由片上外设控制,高电平为高阻态,低电平接VSS |
复用推挽输出 | 由片上外设控制,高电平接VDD,低电平接VSS |
点灯原理图
GPIO可以输出高低电平,既然可以控制高低电平了,那么我们就可以直接通过这个电平来控制LED的亮和灭,这里博主使用的是一颗RGB的三色灯,原理图如下:
由这个图我们可以得知,当PE13,PE14,PE15为低电平时LED导通从而使小灯点亮,接下来一起看一下怎么样控制这个管脚为低电平吧。
点灯程序
创建好标准库的程序模板后,我们可以单独创建一个.c文件,用于控制LED
然后再创建一个对应的头文件.h,为了方便主函数调用
用于STM32单片机的管脚功能可以复用为其他的功能,所以我们在使用一些功能之前要对其进行初始化,打开对应的时钟,我们可以定义一个GPIO初始化的一个函数。
用RCC_APB2PeriphClockCmd()函数打开时钟,对应的挂载关系为:
标准库中提供了GPIO初始化的结构体GPIO_InitTypeDef
其成员有:
GPIO_Pin -- 需要配置的管脚
GPIO_Mode -- 需要配置的模式
GPIO_Speed -- 这个管脚输出的速度
GPIO_Init() 初始化这个管脚
GPIO_SetBits() 将这个管脚设置为1
void led_init(void)
{
GPIO_InitTypeDef GPIO_typeDef; //定义一个结构体用于初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //使能GPIOE的时钟信号
GPIO_typeDef.GPIO_Pin = LED_R_PIN| LED_G_PIN| LED_B_PIN; //初始化的pin脚
GPIO_typeDef.GPIO_Mode = GPIO_Mode_Out_PP; //初始化模式为输出
GPIO_typeDef.GPIO_Speed = GPIO_Speed_50MHz; //初始化速度为高速
GPIO_Init(GPIOE,&GPIO_typeDef);
GPIO_SetBits(GPIOE,LED_R_PIN| LED_G_PIN| LED_B_PIN); //输出管脚
}
然后可以配置一些宏定义,用于更方便的移植程序和操作GPIO
//开灯
#define LED_R_OPEN() {GPIO_SetBits(LED_RGB_GPIO,LED_R_PIN);}
#define LED_G_OPEN() {GPIO_SetBits(LED_RGB_GPIO,LED_G_PIN);}
#define LED_B_OPEN() {GPIO_SetBits(LED_RGB_GPIO,LED_B_PIN);}
//关灯
#define LED_R_CLOSE() {GPIO_ResetBits(LED_RGB_GPIO,LED_R_PIN);}
#define LED_G_CLOSE() {GPIO_ResetBits(LED_RGB_GPIO,LED_G_PIN);}
#define LED_B_CLOSE() {GPIO_ResetBits(LED_RGB_GPIO,LED_B_PIN);}
然后再主函数里调用初始化,然后在循环里调用循环,就可以控制GPIO的状态了
#include "main.h"
void delay(int time);
int main(void)
{
led_init();
while(1)
{
LED_G_OPEN();
delay(1000);
LED_G_CLOSE();
delay(1000);
}
}
void SystemInit(void)
{
}
void delay(int time)
{
while(--time)
{
int i;
for(i=0;i<50000;i++);
}
}
下载程序就可以看到led一闪一闪亮的啦!!