stm32点亮LED灯

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 引 论坛:https://www.firebbs.cn/ 174 天猫:https://yehuosm.tmall.com STM32 库开发实战指南 基于野火指南者开发板 脚。 (6) 使用宏控制 RGB 灯默认关闭。
 

编辑好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);
	
	}
}

程序执行成功

亮了!

 

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焊五弟:

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值