【GPIO初始化】以及【GPIO相关函数】详解

#以正点原子mini开发板为例

与GPIO有关的函数如下:

void GPIO_DeInit(GPIO_TypeDef* GPIOx);
void GPIO_AFIODeInit(void);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);

void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);

void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

在固件库中, GPIO 端口操作对应的库函数函数以及相关定义在文件stm32f10x_gpio.h 和 stm32f10x_gpio.c 中。
 STM32 的 IO 口可以由软件配置成如下 8 种模式,4种输入模式,4种输出模式:
1、输入浮空
2、输入上拉
3、输入下拉
4、模拟输入
5、开漏输出
6、推挽输出
7、推挽式复用功能
8、开漏复用功能

IO 口寄存器必须要按 32 位字被访问。

STM32 的每个 IO 端口都有 7 个寄存器来控制:

  • 2 个 32 位的端口配置寄存器 CRL 和 CRH;
  • 2 个 32 位的数据寄存器 IDR 和 ODR;
  • 1 个 32 位的置位/复位寄存器BSRR;
  • 一个 16 位的复位寄存器 BRR;
  • 1 个 32 位的锁存寄存器 LCKR;

通过固件库设置 GPIO的相关参数和输出
在固件库开发中,操作寄存器 CRH 和 CRL 来配置 IO 口的模式和速度是通过 GPIO 初始化
函数完成:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

第一个参数取值范围为 GPIOA~GPIOG,用来指定 GPIO;
第二个参数为初始化GPIO的结构体指针,结构体类型为 GPIO_InitTypeDef;

相当于利用设置好的GPIO_InitTypeDef型结构体直接给某个GIPO整体赋值

通过初始化结构体,初始化 GPIO 的常用格式是:
 

GPIO_InitTypeDef GPIO_InitStructure;//定义GPIO_InitTypeDef类型结构体
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//根据初始化结构体,初始化 GPIO

其中赋给GPIO_InitStructure.GPIO_Mode的值为枚举类型,根据配置表选择下列某一种即可,配置参考《stm32f10x参考手册》110~113页
 

typedef enum
{ GPIO_Mode_AIN = 0x0, //模拟输入
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 //复用推挽
}GPIOMode_TypeDef;

赋给GPIO_InitStructure.GPIO_Speed的值也是枚举类型,有以下选项

typedef enum
{
GPIO_Speed_10MHz = 1,//后面不再写等号,表示顺序自增
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;

GPIO初始化完成以后才能进行相应的读或者写操作,包括之后的位带操作;

GPIO写函数有

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//第一个参数为GPIO(A~G)任意一端口;第二个参数为GPIO_Pin(0~16)任意值;
//函数用于给GPIOx.y口写1

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//第一个参数为GPIO(A~G)任意一端口;第二个参数为GPIO_Pin(0~16)任意值;
//函数用于给GPIOx.y口写0

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
//第一个参数为GPIO(A~G)任意一端口;第二个参数为GPIO_Pin(0~16)任意值;
//第三个参数为Bit_RESET(写0)或者 Bit_SET(置1);
//第三个参数可以直接写0或者1,但是应有强制类型转换,即加上(uint16_t )
//函数用于给GPIOx.y口写1或者1

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
//第一个参数为GPIO(A~G)任意一端口,第二个参数为写入ODR整体的值
//用于GPIO口输出值整体写入

GPIO读函数有

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//第一个参数为GPIO(A~G)任意一端口;第二个参数为GPIO_Pin(0~16)任意值;
//函数用于读取GPIOx.y口数值,返回8位整型;

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
//第一个参数为输入模式下的GPIO(A~G)任意一端口;
//函数用于读取输入模式下的GPIO口数值,返回16位整型;

uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//第一个参数为输出模式下的GPIO(A~G)任意一端口;
//第二个参数为输出模式下GPIO_Pin(0~16)任意值;
//函数用于读取输出模式下GPIOx.y口数值,返回8位整型;

uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
//第一个参数为输出模式下的GPIO(A~G)任意一端口;
//函数用于读取输出模式下GPIOx口整体数值,返回16位整型;

此外GPIO还有和中断/事件有关的函数如下:

void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//第一个参数GPIO(A~G)任意一端口;
//第二个参数为输出模式下GPIO_Pin(0~15)任意值;
//锁定 GPIOx.y的管脚设置寄存器

void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
//第一个选择用作事件输出的 GPIO 端口,取GPIO_PortSourceGPIO(A~E)任意值
//第二个参数为用作事件输出的管脚GPIO_PinSource(0~15)
//选择 GPIO 管脚用作事件输出

void GPIO_EventOutputCmd(FunctionalState NewState);
//使能或者失能事件输出,参数为    ENABLE或者DISABLE
//跟在选择完管脚作为事件输出之后,对相应管脚进行使能或失能

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
//参数参考《stm32固件库参考手册》132页
//改变指定管脚的映射

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
//第一个参数为选择用作外部中断线源的 GPIO 端口,即GPIO_PortSource_GPIOx(x可以是A~G)
//第二个参数为待设置的外部中断线路,即 GPIO_PinSourcex(x 可以是 0-15)
//选择GPIO管脚用作外部中断线路线源

void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

与GPIO初始有关的函数

void GPIO_DeInit(GPIO_TypeDef* GPIOx);
//参数为需恢复默认值的的GPIOX(X为A~E任意值)
//将GPIO端口恢复为默认值

void GPIO_AFIODeInit(void);
//将复用功能(重映射事件控制和 EXTI 设置)重设为缺省值

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
//第一个参数是要初始化的GPIOX(X为A~E任意值)
//第二个参数为& GPIO_InitStruct 
//根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器

void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
//第一个参数为待复位的&GPIO_InitStruct 
//把 GPIO_InitStruct 中的每一个参数按缺省值填入

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RT Thread中的GPIO初始化可以通过以下步骤实现: 1. 在main函数中导入对应的头文件`rtdevice.h`,这个头文件包含了GPIO相关函数和宏定义。\[1\] 2. 使用宏定义设置对应的引脚,这样可以方便地在代码中引用特定的GPIO引脚。\[1\] 3. 在main函数初始化GPIO引脚,将其设置为推挽输出模式。这可以通过调用相应的函数来实现。\[1\] 4. 编写LED闪烁的逻辑代码,可以使用循环和延时函数来实现LED的闪烁效果。\[1\] 5. 最后,编译并烧录程序到目标设备上。\[1\] 下面是一个示例的main函数,展示了如何在RT Thread中进行GPIO初始化和LED闪烁的逻辑代码: ```c #include <rtthread.h> #include <rtdevice.h> #define LED_PIN 10 // 假设LED连接到引脚10 int main(void) { rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); // 初始化LED引脚,设置为推挽输出模式 while (1) { rt_pin_write(LED_PIN, PIN_HIGH); // 将LED引脚设置为高电平,点亮LED rt_thread_mdelay(500); // 延时500毫秒 rt_pin_write(LED_PIN, PIN_LOW); // 将LED引脚设置为低电平,熄灭LED rt_thread_mdelay(500); // 延时500毫秒 } return RT_EOK; } ``` 通过以上步骤,你可以在RT Thread中成功进行GPIO初始化和控制。\[1\] #### 引用[.reference_title] - *1* *3* [RT Thread Studio使用经验——GPIO驱动实现(LED闪烁)](https://blog.csdn.net/sup_Exclusive/article/details/129544670)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [二、RT-Thread启动流程详解(硬件初始化篇)](https://blog.csdn.net/Sep_maple/article/details/117603656)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值