操作STM32的GPIO总共需要三个步骤
1、使用RCC开启GPIO的时钟
2、使用GPIO_Init函数初始化GPIO
3、使用输出或输入的函数控制GPIO口
RCC_APB2PeriphClockCmd 外设时钟控制函数
用于使能或禁用STM32系列芯片的APB2总线上的外设时钟,参数有要操作的外设和状态。
在操作外设之前必须先使能时钟
LED闪烁
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
//使能外设时钟,状态开启
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启GPIOA的时钟
//GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
//在推挽输出模式下高低电平都有驱动能力
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//GPIO模式,赋值为推挽输出
//使用PA0号引脚点亮LED
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//GPIO引脚,赋值为第0号引脚
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;//GPIO速度,赋值为50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure);//将赋值后的结构体变量地址传递给GPIO_Init函数
//循环
while(1)
{
//设置PA0引脚的高点电平,实现LED闪烁
//方法一:GPIO_ResetBits设置低电平,GPIO_SetBits设置高电平
GPIO_ResetBits(GPIOA,GPIO_Pin_0); //将PA0引脚设置为低电平 亮
Delay_ms(500); //延时500毫秒
GPIO_SetBits(GPIOA,GPIO_Pin_0); //将PA0引脚设置为高电平 灭
Delay_ms(500);
//方法二:GPIO_WriteBit设置低/高电平,由Bit_RESET/Bit_SET指定
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET); //将PA0引脚设置为低电平 亮
Delay_ms(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET); //将PA0引脚设置为高电平 灭
Delay_ms(500);
//方法三:GPIO_WriteBit设置低/高电平,由数据0/1指定,数据需要强制类型转换为(BitAction)
GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);
Delay_ms(500);
GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
Delay_ms(500);
}
LED流水灯
#include "stm32f10x.h" // Device header
#include "delay.h"
int main(void)
{
//使能时钟,开启GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出
//使用PA0...PA7号引脚作为LED流水灯引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; //GPIO引脚,赋值为所有引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz
GPIO_Init(GPIOA,&GPIO_InitStructure); //将赋值后的结构体变量地址传递给GPIO_Init函
//主循环
while(1)
{
//使用GPIO_Write,同时设置GPIOA所有引脚的高低电平,实现LED流水灯
GPIO_Write(GPIOA,~0x0001); //按位取反转换为二进制的值 1111 1111 1111 1110,PA0引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
GPIO_Write(GPIOA, ~0x0002); //按位取反转换为二进制的值 1111 1111 1111 1101,PA1引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
GPIO_Write(GPIOA, ~0x0004); //按位取反转换为二进制的值 1111 1111 1111 1011,PA2引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
GPIO_Write(GPIOA, ~0x0008); //按位取反转换为二进制的值 1111 1111 1111 0111,PA3引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
GPIO_Write(GPIOA, ~0x0010); //按位取反转换为二进制的值 1111 1111 1110 1111,PA4引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
GPIO_Write(GPIOA, ~0x0020); //按位取反转换为二进制的值 1111 1111 1101 1111,PA5引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
GPIO_Write(GPIOA, ~0x0040); //按位取反转换为二进制的值 1111 1111 1011 1111,PA6引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
GPIO_Write(GPIOA, ~0x0080); //按位取反转换为二进制的值 1111 1111 0111 1111,PA7引脚为低电平,其他引脚均为高电平
Delay_ms(100); //延时100ms
}
}
蜂鸣器
#include "stm32f10x.h" // Device header
#include "delay.h"
int main(void)
{
因为蜂鸣器用的是PB12号引脚 使能时钟,开启GPIOB的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量
//列出结构体的成员并赋值
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP; //GPIO模式,赋值为推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //GPIO引脚,赋值为第12号引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,赋值为50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure); //将赋值后的结构体变量地址传递给GPIO_Init函数
//主循环体
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_12); //将PB12引脚设置为低电平,蜂鸣器鸣响
Delay_ms(100); //延时100ms
GPIO_SetBits(GPIOB,GPIO_Pin_12); //将PB12引脚设置为高电平,蜂鸣器停止
Delay_ms(100); //延时100ms
GPIO_ResetBits(GPIOB,GPIO_Pin_12); //将PB12引脚设置为低电平,蜂鸣器鸣响
Delay_ms(100); //延时100ms
GPIO_SetBits(GPIOB,GPIO_Pin_12); //将PB12引脚设置为高电平,蜂鸣器停止
Delay_ms(700); //延时700ms
}
}
GPIO有八种工作模式
GPIO_Mode_AIN = 0x0, //AIN(Analog IN)是模拟输入
GPIO_Mode_IN_FLOATING = 0x04, //IN_FLOATING 是浮空输入
GPIO_Mode_IPD = 0x28, //IPD(IN Pull Down) 下拉输入
GPIO_Mode_IPU = 0x48, / /IPU(IN Pull Up) 上拉输入
GPIO_Mode_Out_OD = 0x14, //Out_OD(Out Open Drain)是开漏输出
//在开漏输出模式下,高电平没有驱动能力,低电平有驱动能力
//开漏输出高电平相当于高阻态,没有驱动能力,低电平有驱动能力
GPIO_Mode_Out_PP = 0x10, //Out_PP(Out Push Pull) 是推挽输出
//在推挽模式下高低电平都有驱动能力
GPIO_Mode_AF_OD = 0x1C, //AF_OD(Atl Open Drain)是复用开漏
GPIO_Mode_AF_PP = 0x18 //AF_PP(Atl Push Pull) 是复用推挽
点灯用的是推挽输出,即GPIO_Mode_Out_PP