使用固件库点亮LED灯-GPIO输出

目录

学习目标:

1.1:LED原理图

1.2:STM32的IO口简介 

1.3:V3.5库函数的函数介绍

1.3.1 设置GPIO模式

 1.3.2:GPIO的输出

1.4 主函数


学习目标:

1、了解STM32用有几种GPIO模式。

2、怎么学会设置STM32的GPIO输出控制LED灯。

1.1:LED原理图

         从上面的图,我们可以看到LED灯是接到单片机的PC口的PC0到PC7。而点
亮一盏LED的原理就是把相应LED接到单片机的相应的IO口输出低电平,IO口
输出为高电平就能够熄灭LED。

1.2:STM32的IO口简介 

         我们知道了,LED灯的操作原理之后,接下来我们来看一下怎么设置STM3
2的IO口。STM32的GPIO设计得很精细,GPIO端口的每个位可以由软件分别配置成多
种模式,而GPIO的模式有8种模式。

输入模式输出模式
输入浮空开漏输出
输入上拉推挽式输出
输入下拉推挽式复用功能
模拟输入开漏复用功能

STM32模式表

        在这里我们用来控制LED的时候,IO口可以设置为推挽输出模式。而大家可
能有点疑惑,那其他输出模式的时候,是什么时候使用呢?一般来说复用功能
的输出是在使用STM32内部外设的时候使用,比如说ADC、SPI等,到后面我
们使用的时候回逐渐讲到。而输出模式呢,我们看到还有个开漏输出,我们为
什么不用开漏输出来控制LED灯呢?其实推挽输出和开漏输出学过模拟电路的
同学应该都知道它的工作原理,一般来说推挽输出:可以输出高,低电平,连接数
字器件;开漏输出:输出端相当于三极管的集电极,
要得到高电平状态需要上拉电阻才行,
适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。所以这里
我们选择推挽输出控制LED灯。

1.3:V3.5库函数的函数介绍

1.3.1 设置GPIO模式

        而如何设置STM32的GPIO模式呢?在3.5的库中,它提供了一个初始化函数,GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef*GPIO_InitStruct)这么个函数,通过调用这个函数我们就可以配置GPIO口的模式了。这个函数的详细说明,大家可以翻看《STM32固件库使用手册(中文翻译版).pdf》在书签的第10个通过输入输出(GPIO)中查找到这个函数的详细说明。(在这里给大家说明一点就是这个函数库使用说明不是3.5的库,不过大致是相同的,3.5的库中文函数说明没有找到,如果没有找到相应的函数,大家还可以查找《stm32f10x_stdperiph_lib_um.chm》这个说明,这个是英文版原本函数说明。)
在这里我们来简单介绍一下GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)这么个函数。

        这个函数有两个参数,第一个参数是用来指定要设置GPIO,取值范围为GPIOA~GPIO
G,比如你要设置GPIOA,那么就是GPIOA。第二个参数为初始化参数结构体指针,结构
体类型为 GPIO_InitTypeDef。这个结构体的定义如下:

它一共定义定义了三个参数:
1、GPIO_Pin:用来选择要设置的Pin口。
2、GPIO_Speed:用来设置IO口的速率
3、GPIO_Mode:用来选择要设置的IO模式。
而这些参数的设置,库函数中也帮你定义好了,只要你选择就好了。
比如:推挽输出在库函数中定义为GPIO_Mode_Out_PP。
接下来我们来看一下我们库函数例程里面的LED初始化。

void LED_Config(void)
{
 GPIO_InitTypeDef GPIO_InitStructure; 
//声明一个结构体变量,用来初始化GPIO
 /* 开启GPIO时钟 */
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
 /* 配置GPIO的模式和IO口 */
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_LED; 
//选择你要设置的IO口
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置传输速率
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
//设置推挽输出模式
 /* 初始化GPIO */
 GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化GPIO_LED
 /* 初始化GPIO */
 GPIO_SetBits(GPIOC, GPIO_Pin_LED); 
//将LED的IO口全部赋值为1,即熄灭LED灯
}


从原理图中,我们知道控制LED的单片机IO口分别是PC口的PC1~PC。所以
我们要设置的GPIO_Pin就是GPIOC中的PC0~PC7。在led.h头文件中,定义了:
/* 定义要设置的LED使用的PIN口 */
#define GPIO_Pin_LED (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |
GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7)
LED_Config()函数中GPIO_Pin选择的时候是PC0~PC7。
可能大家注意到,在这个初始化函数中还有个开启GPIO时钟的函数,这个
是做什么用的呢。STM32为了降低功耗,所以每个外设都设有一个时钟开关,
在单片机启动的时候,这个外设的时钟都是关闭的,而你要使用相应的外设的
时候就要将它的时钟打开,这里我们要使用GPIOC,那么我们就要将GPIOC的
时钟打开。(这个打开时钟是要注意的,一般初学者最容易犯的错误就是没有
将时钟打开,所以你的外设一直都不工作。) 

 1.3.2:GPIO的输出

 在库函数中也定义了,相应的输出函数。
1、GPIO_Write()函数

这个函数一次是要操作一组GPIO的,也就是说它是一次操作16个Pin口的。
所以大家使用的时候要注意。

2、GPIO_SetBits()函数 这个函数是将相应的位设置为1。

3、GPIO_ResetBits()函数

这个函数是将相应的位清除为0。
接下来我们看一下我们设置LED灯的函数。

void LED_SetState(uint8_t stateValue)
{ 
 /* 设置LED灯的状态, GPIO一次设置16位,将其值强制转换位16位 */
 GPIO_SetBits(GPIOC, (uint16_t)stateValue & 0x00FF); 
//将要熄灭的LED熄灭
GPIO_ResetBits(GPIOC, (~(uint16_t)stateValue) & 0x00FF); 
//将要点亮的LED点亮 
}


在设置GPIO_Pin这个参数的时候,应该是选择相应的参数。我们打开LED
灯的例程,然后将鼠标放到GPIO_Pin_0位置,然后右键选择Go To Definition of
“GPIO_Pin_0”。我们可以看到:

#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< Pin 3 selected */
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< Pin 4 selected */
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< Pin 5 selected */
#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< Pin 6 selected */
#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< Pin 7 selected */


其实呢,这个参数就是一个每个IO口的对应位为1,所以我们就可以很简单
的知道,我们输入的状态值可以很简单的转化为设置的Pin口值了。


1.4 主函数

int main(void)
{
 uint32_t i;
 uint8_t ledState;
 /* 彩屏显示文字,大家可以先不去理解这些函数 */
 TFT_Init();
 FLASH_Init();
GUI_DisplayInit();
 LED_Config(); //配置IO口的模式
 ledState = 0xFE; //初始化LED的状态
while(1)
{
 LED_SetState(ledState); //设置LED
 for(i=0; i<0x000FFFFF; i++); //延时
 
 /* 流水灯数据处理 */
 ledState <<= 1; //相当于 ledState = ledState << 1;
 ledState += 1; //相当于 ledState = ledState + 1;
 if(ledState == 0xFF) //当流水灯点亮到尽头时
 {
 /* 所有LED都闪烁一下 */
 GPIO_Write(GPIOC, 0x0000); //LED都点亮
 for(i=0; i<0x000FFFFF; i++); //延时
 GPIO_Write(GPIOC, 0x00FF); //LED都熄灭
 for(i=0; i<0x000FFFFF; i++); //延时
 GPIO_Write(GPIOC, 0x0000); //LED都熄灭
 for(i=0; i<0x000FFFFF; i++); //延时
 GPIO_Write(GPIOC, 0x00FF); //LED都熄灭
 ledState = 0xFE; //重新设置流水灯状态
 }
}
}


这个主函数的效果是:顺序点亮一盏LED灯,当点亮到最后一盏之后所有L
ED灯闪烁两下。 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想使用固件点亮LED,你可以按照以下步骤进行操作: 1. 首先,创建一个新的文件夹,用于存放LED的控制代码。例如,你可以创建一个名为"led"的文件夹。 2. 在"led"文件夹中创建两个文件,分别是"led.c"和"led.h"。这些文件将包含LED的控制函数。 3. 打开"led.h"文件,并在其中定义LED的引脚。根据引用中的说明,你可以将PF6、PF7和PF8引脚分别与RGB的R、G和B连接起来。 4. 在"led.h"文件中声明LED控制函数。根据你的需求,你可以创建函数来控制单个LED的亮灭,或者同时控制多个LED来混合成不同的颜色。 5. 打开"led.c"文件,并实现LED控制函数。根据引用中的示例代码,你可以使用GPIO来配置LED的引脚,并在main函数中测试LED的亮灭。 6. 在main函数中,你可以使用控制函数来点亮或熄灭LED。根据你的需求,你可以选择控制单个LED,或者轮流显示不同颜色的。 以下是使用固件点亮LED的示例代码: #include "./led/led.h" int main(void) { /* LED 端口初始化 */ LED_GPIO_Config(); /* 控制LED */ while (1) { LED1( ON ); // 点亮LED1 Delay(0xFFFFFF); LED1( OFF ); // 熄灭LED1 Delay(0xFFFFFF); // 其他LED的控制... // 轮流显示不同颜色的LED LED_RED; Delay(0xFFFFFF); LED_GREEN; Delay(0xFFFFFF); LED_BLUE; Delay(0xFFFFFF); // 其他颜色的控制... LED_RGBOFF; Delay(0xFFFFFF); } } void Delay(__IO uint32_t nCount) { for (; nCount != 0; nCount--); }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值