赞
踩
首先,我们想象一下,让LED灯点亮,引脚应该是输出模式,那么应该是通用模式,还是复用模式喃?我们只是让LED灯亮,并没有使用是什么特殊功能,不需要其他的片上外设。使用引脚使用通用模式。那使用推挽模式还是开漏模式喃?其实2种模式都可以。
我们一般选择开漏模式,当输出0时,LED点亮,输出1时,LED熄灭。
我们连接PA0引脚。下面是使用PA0,把他设置为通用开漏输出模式编写程序的步骤:
②开启APB2总线上的片上外设的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,Enable);//开启GPIOA的时钟,相当于把GPIOA的开关打开
我们对这个函数名双击然后右键,点击go to,查看这个函数是怎么定义的。
这个函数有2个形式参数,我们看见上面的注释中,GPIOx can be (A…G)。所以GPIOx我们填写GPIOA,而GPIO_InitStruct:pointer to a GPIO_InitTypeDef structure that contains the configuration information for the specified GPIO peripheral.(指向GPIO_InitTypeDef结构体的指针,该结构体包含指定GPIO外设的配置信息)
我们对GPIO_InitTypeDef双击然后右键,点击go to,
我们找到了这个结构体的定义
这个结构体里面由3部分组成,我们可以在红色框里面,找到这3部分的取值。我们双击然后Ctrl+F就会跳转过去
uint16_t GPIO_Pin:
GPIOSpeed_TypeDef GPIO_Speed;
由此可见:GPIOSpeed_TypeDef等于这个枚举中的一个变量。
GPIOMode_TypeDef GPIO_Mode;
所以我们先创建一个GPIO_InitTypeDef类型的结构体变量,变量名为GPIO_InitStruct,我们将结构体中的3个元素按我们是需求取值。
GPIO_InitTypeDef GPIOInitStruct;
GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;
GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出
GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&GPIOInitStruct);
好了,我们分析完毕后开始写程序让LED灯点亮
程序1:
/*点亮一个LED灯*/ #include "stm32f10x.h" #include "stm32f10x_pal.h" int main(void) { PAL_Init(); //1.打开APB2上面的GPIOA的时钟, RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //2.创建一个GPIO_InitTypeDef类型的结构体 GPIO_InitTypeDef GPIOInitStruct; GPIOInitStruct.GPIO_Pin = GPIO_Pin_0; GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOA ,&GPIOInitStruct); //3.给GPIOA0输出一个低电平,点亮LED //3.1给ODR的最低位写入一个低电平 // GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET); //3.2给ODR整体写入数据 // GPIO_Write(GPIOA,0x0000); //3.3给ODR某一位写入数据0 GPIO_ResetBits(GPIOA,GPIO_Pin_0); while(1) { } }
程序2:
/*让LED闪烁起来*/ #include "stm32f10x.h" #include "stm32f10x_pal.h" int main(void) { PAL_Init(); //1.开启APB2上面的GPIOA的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //2.创建一个GPIO_InitTypeDef类型的结构体变量GPIOInitStruct GPIO_InitTypeDef GPIOInitStruct; GPIOInitStruct.GPIO_Pin = GPIO_Pin_0; GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOA,&GPIOInitStruct); while(1) { //3.让灯闪烁起来 //3.1先让灯熄灭 GPIO_WriteBit(GPIOA ,GPIO_Pin_0 ,Bit_SET); PAL_Delay(1000); //3.2先让灯点亮 GPIO_WriteBit(GPIOA ,GPIO_Pin_0 ,Bit_RESET); PAL_Delay(1000); } }
我们通过检测按钮是否按下,来控制LED灯的状态。所以按钮连接的IO引脚应该配位输入模式,一般情况下,我们的输入模式配置为上拉输入模式。我们将按钮连接在PA1引脚
#include "stm32f10x.h" #include "stm32f10x_pal.h" int main(void) { PAL_Init(); //1.打开APB2上面的GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //2.对GPIOA0进行配置,连接LED GPIO_InitTypeDef GPIOInitStruct; GPIOInitStruct.GPIO_Pin = GPIO_Pin_0; GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz; GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出 GPIO_Init(GPIOA,&GPIOInitStruct); //3.对GPIOC1进行配置 GPIOInitStruct.GPIO_Pin = GPIO_Pin_1; GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;//上拉输入 GPIO_Init(GPIOA,&GPIOInitStruct); //4.先让LED点亮 GPIO_ResetBits(GPIOA ,GPIO_Pin_0); while(1) { if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) == Bit_RESET)//按键按下 { PAL_Delay(10); if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) == Bit_SET)//按键抬起 { PAL_Delay(10); if(GPIO_ReadOutputDataBit(GPIOA ,GPIO_Pin_0) == Bit_RESET)//读取PA0引脚的电平,如果是点亮 { GPIO_SetBits(GPIOA ,GPIO_Pin_0);//让灯熄灭 } else { GPIO_ResetBits(GPIOA ,GPIO_Pin_0);//点亮 } } } } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。