STM32F0xx_GPIO配置详细过程

推荐

分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang

 

我的网站:https://www.strongerhuang.com

我的知乎:https://www.zhihu.com/people/strongerHuang.com

 

 

前言

对于初学STM32的人来说,很多基础的知识没有掌握,这些基础知识就成为阻挡他们入门的门槛。因此,今天也把基础的知识分享出来,带领那些还没有迈过这个门槛的人入门。

今天总结“GPIO配置详细”,以F0标准外设库初始化结构体来重点讲解。接着昨天“新建软件工程详细过程”来进行讲解,今天分两大部分内容总结。工程描述、IO配置源代码详细讲解。

 

下载

ST标准外设库和参考手册、数据手册等都可以在ST官网下载的到(请自行下载)。关于F0系列芯片的参考手册有多个版本(针对F0不同芯片),但有一个通用版本,就是“STM32F0x128参考手册V8(英文)2015-07”建议使用这个,以后如果你换用一种型号芯片也方便了解。

今天提供下载的软件工程其实和昨天差不多,只是多了IO配置的中文注释,方便了解。

今天的软件工程下载地址(360云盘):

https://yunpan.cn/cSE9Rmyu6SyMZ  访问密码 3b8f

 

STM32F0xx的资料可以在我360云盘下载:

https://yunpan.cn/cS2PVuHn6X2Bj  访问密码 8c37

 

工程描述

①文件夹描述

针对初学者描述一下工程的基本信息。解压软件工程包,打开就看到如下图文件,红色框出来的部分主要是用于软件工程里面的源代码文件。

App: 应用部分代码(如我们写的一些应用文件)

Bsp: 底层代码(如底层驱动文件)

Doc: 文档(这里添加一些对工程的描述)

Libraries: 标准库(提取标准外设库)

Listings: 编译生成列表文件

Objects: 编译生成目标文件

GPIO:这两个文件是工程文件
删除编译产生垃圾文件:需要打包整个工程的时候,双击这个文件可删除不需要的文件(如上面两个文件夹Listings和Objects下的文件)。

 

②结构描述

当我们用MDK-ARM软件直接打开软件工程,就可以看到下图所示的结构,将文件夹的“Libraries”分为三项,如下图:

 

 

源代码详情

①RCC时钟

该函数位于bsp.c文件下面;

我个人习惯第一步配置时钟,ST官方提供的例程也是把配置时钟放在前面。

为了防止大家修改来使用其他端口而忘记配置RCC,这里将F0常用的几个端口都配置上(实际应该使用那些端口才配置)。

 

②IO配置

该函数位于bsp.c文件下面;

这里的配置就是对一个“输入输出IO”的初始化配置,也就是对结构体“GPIO_InitStructure”进行初始化。这里面主要就是对那其中的五个参数初始化。

关于结构体“GPIO_InitTypeDef”详情可以Go To Definition...或者选中“GPIO_InitTypeDef”、按下F12,跳转到定义关于“GPIO_InitTypeDef”的定义,详情请看下面③的讲解。

 

GPIO_InitTypeDef详情

 

参数1GPIO_Pin引脚:GPIO_Pin_0  -  GPIO_Pin_15

 

参数2GPIO_Mode模式: 输入GPIO_Mode_IN、输出GPIO_Mode_OUT、GPIO_Mode_AF复用功能、GPIO_Mode_AN模拟功能

 

参数3GPIO_Speed速度: 低速GPIO_Speed_2MHz、中速GPIO_Speed_10MHz、高速GPIO_Speed_50MHz

 

参数4GPIO_OType输出类型(只对输出起作用):推完输出GPIO_OType_PP、漏极输出GPIO_OType_OD

 

参数5GPIO_PuPd上下拉: 浮空GPIO_PuPd_NOPULL、上拉GPIO_PuPd_UP、下拉GPIO_PuPd_DOWN

 

说明

STM32F0的芯片软件兼容性很好,可以适用于F0的很多芯片(具体请看手册、或者亲自尝试)。

 

 

最后

我的网站:https://www.strongerhuang.com

我的微信公众号(ID:strongerHuang)还在分享STM8、STM32、Keil、IAR、FreeRTOS、UCOS、RT-Thread、CANOpen、Modbus…等更多精彩内容,如果想查看更多内容,可以关注我的微信公众号。

 

微信公众号

 

 

<think>我们正在处理用户关于STM32开发中GPIO头文件缺失和函数找不到的问题。用户提到在STM32F0系列开发中找不到stm32f10x_gpio.h,并询问是否应该使用stm32f0xx_hal_gpio.h,以及为什么其中没有GPIO_SetBits函数。 关键点: 1. 用户之前使用的是STM32F10x系列(标准外设库),现在切换到STM32F0系列(使用HAL库)。 2. HAL库(硬件抽象层)与标准外设库(SPL)在函数命名和用法上有很大不同。 3. STM32F0系列应该使用对应的HAL库(stm32f0xx_hal_gpio.h)而不是F10x的标准外设库。 解决方案: 1. 确认工程配置为使用HAL库(而非标准外设库)。 2. 包含正确的头文件:`#include "stm32f0xx_hal.h"`(这个头文件会自动包含GPIO等模块的头文件)。 3. 使用HAL库提供的GPIO控制函数:`HAL_GPIO_WritePin()` 替代 `GPIO_SetBits` 和 `GPIO_ResetBits`。 详细步骤: ### 1. 包含头文件 在STM32F0系列中,使用HAL库,需要包含: ```c #include "stm32f0xx_hal.h" // 包含所有HAL模块的声明 ``` ### 2. 启用GPIO时钟 在HAL库中,时钟的启用通过`__HAL_RCC_GPIOx_CLK_ENABLE()`宏实现(x为端口名,如A、B、C等)。 ### 3. 配置GPIO 使用`GPIO_InitTypeDef`结构体配置GPIO,然后调用`HAL_GPIO_Init()`函数。 ### 4. 控制GPIO输出 使用`HAL_GPIO_WritePin(GPIOx, GPIO_PIN_y, GPIO_PIN_SET)`设置高电平,`HAL_GPIO_WritePin(GPIOx, GPIO_PIN_y, GPIO_PIN_RESET)`设置低电平。 ### 完整示例代码(控制PC13) ```c #include "stm32f0xx_hal.h" int main(void) { HAL_Init(); // 初始化HAL库 // 1. 启用GPIOC时钟 __HAL_RCC_GPIOC_CLK_ENABLE(); // 2. 配置PC13为输出 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_13; // 注意:这里使用GPIO_PIN_13 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); while (1) { // 设置PC13高电平 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); HAL_Delay(500); // 延时500ms // 设置PC13低电平 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); HAL_Delay(500); } } ``` ### 为什么HAL库中没有GPIO_SetBits? - HAL库(硬件抽象层)是ST公司为STM32系列提供的统一库,旨在提供跨系列的一致性API。 - HAL库使用`HAL_GPIO_WritePin()`函数替代了标准外设库中的`GPIO_SetBits`和`GPIO_ResetBits`,通过参数`GPIO_PIN_SET`或`GPIO_PIN_RESET`来控制高低电平。 - 这种设计使得函数调用更加统一,同时支持同时操作多个引脚(通过或运算组合多个引脚号)。 ### 相关问题 1. **如何同时控制多个GPIO引脚?** 使用位或组合引脚:`HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);` 同时设置PA0和PA1为高电平[^1]。 2. **HAL库与标准外设库(SPL)有何区别?** HAL库提供更高层次的抽象,支持跨系列移植,但效率略低于直接寄存器操作的标准外设库[^2]。 3. **如何配置GPIO中断?** 使用`HAL_GPIO_Init()`配置为中断模式,然后实现对应的中断回调函数`HAL_GPIO_EXTI_Callback()`[^3]。 4. **HAL_Delay函数是如何实现的?** 依赖于系统滴答定时器(SysTick),在HAL_Init()中初始化。 5. **STM32F0系列是否支持标准外设库?** 官方已停止维护标准外设库,推荐使用HAL库或LL库(低层库)进行开发[^2]。 ### 注意事项 - 在STM32CubeMX生成的代码中,以上初始化步骤通常由MX_GPIO_Init()函数自动完成。 - 如果使用STM32CubeIDE创建工程,务必在CubeMX中配置好引脚并生成代码。 ### 引用说明 [^1]: 根据HAL库文档,`HAL_GPIO_WritePin`函数支持同时操作同一端口的多个引脚。 [^2]: STM32F0系列官方推荐使用HAL库,标准外设库(SPL)已不再更新。 [^3]: HAL库中断处理机制:通过EXTI中断服务函数调用回调函数。</think>### 解决STM32F0系列GPIO开发问题 您的问题核心在于STM32F0系列开发中正确使用GPIO库的选择和函数差异。以下是详细解答: #### 1. **头文件选择问题** - **STM32F10x系列**:使用标准外设库(SPL),对应头文件`stm32f10x_gpio.h` - **STM32F0系列**:必须使用HAL库,对应头文件`stm32f0xx_hal_gpio.h` (您观察到的现象是正确的) **原因**: STM32F0系列是Cortex-M0内核,与F10x系列的M3内核不同架构。ST官方为F0/F3/F4等新系列设计了统一的HAL库(硬件抽象层)替代旧版标准外设库[^2]。 #### 2. **GPIO_SetBits缺失原因** 在HAL库中,**没有`GPIO_SetBits`函数**,因为: - HAL库采用了更统一的API设计 - 替代函数:`HAL_GPIO_WritePin()` - 操作方式改变: ```c // 设置高电平(替代GPIO_SetBits) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 设置低电平(替代GPIO_ResetBits) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); ``` #### 3. 完整开发流程(STM32F0系列) ```c #include "stm32f0xx_hal.h" // 主HAL头文件 int main(void) { HAL_Init(); // 初始化HAL库 // 1. 启用GPIOC时钟 __HAL_RCC_GPIOC_CLK_ENABLE(); // 2. 配置PC13为输出 GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; // 无上下拉 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 输出速度 HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); while(1) { // 3. 控制引脚电平 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // 高电平 HAL_Delay(500); HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); // 低电平 HAL_Delay(500); } } ``` #### 4. 关键差异对比表 | 特性 | 标准外设库(F10x) | HAL库(F0/F4等) | |------|-----------------|---------------| | 头文件 | stm32f10x_gpio.h | stm32f0xx_hal_gpio.h | | 设置高电平 | GPIO_SetBits() | HAL_GPIO_WritePin(..., GPIO_PIN_SET) | | 设置低电平 | GPIO_ResetBits() | HAL_GPIO_WritePin(..., GPIO_PIN_RESET) | | 时钟使能 | RCC_APB2PeriphClockCmd() | __HAL_RCC_GPIOx_CLK_ENABLE() | | 初始化 | GPIO_Init() | HAL_GPIO_Init() | | 跨系列兼容性 | 差 | 良好 | #### 5. 项目配置要点 1. **工程设置**: - 在IDE(Keil/IAR)中选择正确的芯片型号:STM32F0xx - 确保包含HAL库路径:`Drivers/STM32F0xx_HAL_Driver` 2. **头文件包含**: ```c // 正确包含方式 #include "stm32f0xx_hal.h" // 自动包含所有子模块 ``` 3. **STM32CubeMX**(推荐): 使用图形化工具配置引脚,自动生成初始化代码: ```c // CubeMX生成的GPIO初始化代码 static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOC_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; ... HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } ``` ### 相关问题 1. **如何在HAL库中同时操作多个GPIO引脚?** 使用位或操作组合引脚: `HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_SET);` 2. **HAL库与标准外设库性能有何差异?** HAL库增加了一层抽象,执行效率略低但移植性好;标准库更接近寄存器操作[^1]。 3. **STM32F0系列是否支持标准外设库?** 官方不提供支持,ST已停止更新标准库,推荐使用HAL或LL(Low Layer)库[^2]。 4. **如何实现GPIO电平翻转?** 使用HAL库专用函数: `HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);` 5. **HAL_Delay函数需要特殊配置吗?** 需确保系统时钟和SysTick定时器已正确初始化(通常在HAL_Init()中完成)。 > 提示:最新开发建议使用STM32CubeIDE(免费),包含CubeMX配置工具和HAL库完整支持[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

strongerHuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值