目录
学习目标:
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灯闪烁两下。
使用固件库点亮LED灯-GPIO输出
最新推荐文章于 2024-08-01 23:08:51 发布