stm32点亮LED灯
野火烧不尽,春风吹又生,我购买的是野火的指南针开发板,接下来我就以发表动态来跟大家一起学习,也可以让我学习这块开发板更有动力,增加印象。
每一块开发板,第一个例程无一例外就是通过他的GPIO口点亮一颗led灯
图中3个led灯的阳极引出连接到3.3V的电源,阴极各通过一个100欧的限流电阻引入stm32的3个GPII引脚中,我们要控制led亮灭,只需控制三个引脚的高低电平。
我们通过固件库编程来实现led灯的亮灭,stm32的功能非常强大,led是一个RGB灯,里面有红蓝绿三种颜色,使用pwm可以实现256种不同颜色
具体怎么操作,为什么要使能相关总线还是要了解这个框图
1.让三颗led灯循环亮灭
编程步骤
(1).使能GPIO端口时钟
(2).初始化GPIO目标引脚为推挽输出模式,配置相应的速度
(3).控制GPIO引脚引脚输出高低电平
一般都通过#define把硬件相关的宏定义封装起来,若改变了GPIO,只需修改这些宏即可。
为了使工程更加有条理,我们把 LED 灯控制相关的代码独立分开存储,方便以后移植。在“工 程模板”之上新建“bsp_led.c”及“bsp_led.h”文件
#ifndef __BSP_LED_H
#define __BSP_LED_H
#include "stm32f10x.h"
#define LED_GPIO_PORT GPIOB
//这里定义的是LED所在的GPIO
#define LED_B_GPIO_PIN GPIO_Pin_1
#define LED_G_GPIO_PIN GPIO_Pin_0
#define LED_R_GPIO_PIN GPIO_Pin_5
//定义GPIO引脚
//声明
void LED1_GPIO_Config(void);
void LED2_GPIO_Config(void);
void LED3_GPIO_Config(void);
#endif
#include "bsp_led.h"
void LED1_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//定义一个GPIO_InitTypeDef结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//使能GPIO相关的外部时钟
GPIO_InitStruct.GPIO_Pin = LED_B_GPIO_PIN;
//选择要控制的GPIO引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
//推挽输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
//设置引脚速率为50MHZ
GPIO_Init(LED_GPIO_PORT,&GPIO_InitStruct);
//调用库函数,初始化GPIO
}
void LED2_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Pin =LED_G_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_GPIO_PORT,&GPIO_InitStruct);
}
void LED3_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStruct.GPIO_Pin = LED_R_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_GPIO_PORT,&GPIO_InitStruct);
}
具体这些函数怎么实现的,都是固件库编程好相应的库,我们直接调出来用
想了解推挽输出可以在网上找资料,一堆。
以下是野火开发实战开源资料的函数执行过程
(1) 使用 GPIO_InitTypeDef 定义 GPIO 初始化结构体变量,以便下面用于存储 GPIO 配置。 (2) 调用库函数 RCC_APB2PeriphClockCmd 来使能 LED 灯的 GPIO 端口时钟,在前面的章节中 我们是直接向 RCC 寄存器赋值来使能时钟的,不如这样直观。该函数有两个输入参数,第 一个参数用于指示要配置的时钟,如本例中的“RCC_APB2Periph_GPIOB”,应用时我们使 用“|”操作同时配置 3 个 LED 灯的时钟;函数的第二个参数用于设置状态,可输入“Disable” 关闭或“Enable”使能时钟。 (3) 向 GPIO 初始化结构体赋值,把引脚初始化成推挽输出模式,其中的 GPIO_Pin 使用宏 “LEDx_GPIO_PIN”来赋值,使函数的实现方便移植。 (4) 使用以上初始化结构体的配置,调用 GPIO_Init 函数向寄存器写入参数,完成 GPIO 的初始 化,这里的 GPIO 端口使用“LEDx_GPIO_PORT”宏来赋值,也是为了程序移植方便。 (5) 使用同样的初始化结构体,只修改控制的引脚和端口,初始化其它 LED 灯使用的 GPIO
编辑好LED灯的控制函数后,就可以通过main函数来执行了
#include "stm32f10x.h"
#include "bsp_led.h"
void delay(uint32_t count) //定义延时函数
{
for(;count!=0;count--);
}
int main(void)
{
LED1_GPIO_Config(); //端口初始化
LED2_GPIO_Config();
LED3_GPIO_Config();
while(1)
{
GPIO_ResetBits(LED_GPIO_PORT,LED_B_GPIO_PIN); //打开led灯
delay(0xffff);//延时
GPIO_SetBits(LED_GPIO_PORT,LED_B_GPIO_PIN);//关闭led灯
delay(0xffff);
GPIO_ResetBits(LED_GPIO_PORT,LED_G_GPIO_PIN);
delay(0xffff);
GPIO_SetBits(LED_GPIO_PORT,LED_G_GPIO_PIN);
delay(0xffff);
GPIO_ResetBits(LED_GPIO_PORT,LED_R_GPIO_PIN);
delay(0xffff);
GPIO_SetBits(LED_GPIO_PORT,LED_R_GPIO_PIN);
delay(0xffff);
}
}
程序执行成功
亮了!