GPIO的相关库函数
1.void GPIO_DeInit(GPIO_TypeDef* GPIOx);
调用函数后,所指定的GPIO口外设回复位。
2.void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
用结构体函数初始化指定IO口。
GPIO_InitTypeDef GPIO_InitStructure;
//结构体成员参数
GPIO_InitStructure.GPIO_Mode= //选择工作模式;
GPIO_InitStructure.GPIO_Pin= //选择引脚;
GPIO_InitStructure.GPIO_Speed= //输出速度设置;
GPIO_Init(GPIOA,&GPIO_InitStructure);
工作模式
GPIO_Mode_AIN = 0x00; //模拟输入
GPIO_Mode_IN_FLOATING = 0x04; //浮空输入
GPIO_Mode_IPD = 0x28; //下拉输入
GPIO_Mode_IPU = 0x48; //上拉输入
GPIO_Mode_Out_OD = 0x14; //开漏输出
GPIO_Mode_Out_PP = 0x10; //推挽输出
GPIO_Mode_AF_OD = 0x1C; //复用开漏
GPIO_Mode_AF_PP = 0x18; //复用推挽
3. void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
给结构体变量赋默认值。
4.void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
将指定端口设置为高电平。
5.void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
将指定端口设置为低电平。
6.void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
根据第三个参数的值设置指定端口。
7.void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
可同时对16个端口进行写入操作。
8.uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
用来读取输入寄存器某一段端口的输入值,返回值代表端口的电平高低。
9.uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
用来读取整个寄存器的输入值,返回值为一个16位的数据,每一位代表对应端口值。
10.uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
在输出模式下用来读取输出寄存器指定端口的输出值。
11.uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
用来读取整个输出寄存器每一位的值。
RCC时钟函数
在使用外设时都需要打开对应的时钟才能进行正常的工作
常见的三个外设时钟控制函数
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_AHBPeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
用于使能对应外设的时钟
点亮LED灯
一.LED灯闪烁
接线图
LED灯正极接电源正,负极接IO口,则输出低电平点亮
代码部分
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体名称
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //指定Pin0口
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //输出速度50Hz
GPIO_Init(GPIOA,&GPIO_InitStructure); //注意需要取结构体的地址
while(1)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_0); //A0口输出低电平
Delay_ms(500); //延时500ms
GPIO_SetBits(GPIOA,GPIO_Pin_0); //A0口输出高电平
Delay_ms(500);
}
}
二.LED流水灯
接线图
LED灯正极接电源正,负极接IO口,则输出低电平点亮
代码部分
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体名称
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All; //指定GPIOA所有IO口
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //输出速度50Hz
GPIO_Init(GPIOA,&GPIO_InitStructure); //注意需要取结构体的地址
while(1)
{
GPIO_Write(GPIOA,~0x0001); //0000 0000 0000 0001
Delay_ms(200);
GPIO_Write(GPIOA,~0x0002); //0000 0000 0000 0010
Delay_ms(200);
GPIO_Write(GPIOA,~0x0004); //0000 0000 0000 0100
Delay_ms(200);
GPIO_Write(GPIOA,~0x0008); //0000 0000 0000 1000
Delay_ms(200);
GPIO_Write(GPIOA,~0x0010); //0000 0000 0001 0000
Delay_ms(200);
GPIO_Write(GPIOA,~0x0020); //0000 0000 0010 0000
Delay_ms(200);
GPIO_Write(GPIOA,~0x0040); //0000 0000 0100 0000
Delay_ms(200);
GPIO_Write(GPIOA,~0x0080); //0000 0000 1000 0000
Delay_ms(200);
}
}