(一)GPIO外设的库文件
stm32f10x_gpio.c、stm32f10x_gpio.h
(二)GPIO常用库函数
1、初始化函数
void GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)
功能:初始化一个或多个IO口(同一组端口)的工作模式、输出速度即GPIO的2个配置寄存器
GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//选择你要设置的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置推挽输出模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置传输速率
GPIO_Init(GPIOC,&GPIO_InitStructure);//初始化GPIO
可以一次对多个管脚进行初始化,前提必须是它们的配置模式需一样。比如:
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
2、设置管脚输出电平函数
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:设置某个IO口为高电平(可同时设置同一端口的多个IO)。底层是通过配置BSRR寄存器
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:设置某个IO口为低电平(可同时设置同一端口的多个IO)。底层为配置BSRR寄存器
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//写一个引脚
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//写全部引脚
功能:设置为输出电平,很少用
3、读取管脚输入电平函数
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);
功能:读取端口中的某个管脚输入电平。底层是通过读取IDR寄存器。
uint8_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
功能:读取某组端口的输入电平。底层是通过读取IDR寄存器。
4、读取管脚输出电平函数
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:读取端口中的某个管脚输出电平。底层是通过读取ODR寄存器。
uint8_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
功能:读取某组端口的输出电平。底层是通过读取ODR寄存器。
(三)使能GPIO时钟函数
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
不同的外设调用的时钟使能函数可能不一样,因为不同的外设挂接的总线可能不一样,GPIO挂接在APB2总线上
例,使能GPIOC端口时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
在编写程序之间要先配置模板库,模板库配置参见五、STM32固件库介绍及库函数模板创建_并不傻的袍子-CSDN博客
新建APP文件夹用于存放led.h和led.c文件,在工程中新建目录APP,将led.c文件添加进目录,再在魔术棒配置->C/C++中将led.h的路径添加进来
在led.h文件中,添加:
#ifndef _led_H
#define _led_H
#include "stm32f10x.h"
//定义LED灯的引脚时钟
#define LED_PORT_RCC RCC_APB2Periph_GPIOC
//定义LED灯的引脚
#define LED_PIN (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灯的端口名称
#define LED_PORT GPIOC
//LED灯初始化函数
void LED_Init(void);
#endif
在led.c文件中添加
#include "led.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//定义引脚配置的结构体变量
RCC_APB2PeriphClockCmd(LED_PORT_RCC,ENABLE);//开启GPIOC的时钟
GPIO_InitStructure.GPIO_Pin=LED_PIN;
//GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//选择引脚为GPIO的0号引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置引脚为推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置时钟频率为50MHz
GPIO_Init(LED_PORT,&GPIO_InitStructure);//调用引脚配置函数
//将GPIOC的所有引脚设置为高电平
GPIO_SetBits(LED_PORT,LED_PIN);
}
在main.c函数中添加
#include "stm32f10x.h"
#include "led.h"
int main()
{
LED_Init();
while(1)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_0);
}
}
编译执行,将生成的hex文件下载到普中STM32f103ZET6开发板上,即可点亮第一个LED灯。