一、硬件介绍
使用的是正点原子战舰开发板,主控为STM32F103ZET6
开发板上有两个LED可以配置,有下图可以看到这两个电阻都经过一个电阻上拉到VCC3.3,分别连接到PB5和PE5,这个510Ω的电阻做限流使用,改变这个阻值可以改变LED的亮度。
二、实现目的
开机后点亮两个LED
三、设计思路
3.1 GPIO的输入和输出模式
输出模式 | 输入模式 |
---|---|
推挽输出 | 浮空输入 |
开漏输出 | 上拉输入 |
复用推挽输出 | 下拉输入 |
复用开漏输出 | 模拟输入 |
想要点亮LED,需要将GPIO设置为推挽输出
3.2 点亮、熄灭LED时电平的状态
要点亮LED0和LED1就要把PB5和PE5S设置为低电平;
要熄灭LED0和LED1就要把PB5和PE5S设置为高电平;
3.3 需要进行的配置
1、使能PB、PE时钟
2、将PB5、PE5设置为推挽输出
3、设置IO口速度
2、初始化GPIO
四、代码简介
点亮LED主要需要三个文件,主函数main.c、驱动的源文件led.c、驱动的头文件led.h
led.h
#define LED0 PBout(5)// 宏定义LED0为GPIOB.5输出
#define LED1 PEout(5)// 宏定义LED1为GPIOE.5输出
void LED_Init(void);//定义函数
led.c
//LED初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB.5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化GPIOE.5
}
main.c
//主函数
int main(void)
{
LED_Init(); //函数初始化
LED0=0;//点亮LED0
LED1=0;//点亮LED1
while(1)
{
}
}
通过以上的配置就可以点亮两个LED
五、现象展示
|
|
扩展
PS:如果想实现LED闪烁只需要修改main.c函数如下:
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
while(1)
{
LED0=0;//点亮LED0
LED1=1;//熄灭LED1
delay_ms(300); //延时300ms
LED0=1;//熄灭LED0
LED1=0;//点亮LED1
delay_ms(300); //延时300ms
}
}