再给HAL库工程移植标准库的GPIO功能的时候出现了error: #20: identifier "HAL_StatusTypeDef" is undefined
问题。而且报错的文件还是HAL库中的文件,现象如下:
这里我是打算添加一个GPIO口模拟I2C的驱动的。
问题解决:
- 首先注意一下初始化的函数。
GPIO_InitTypeDef
结构体与标准库中的成员的大小写,可赋的值不一样。开时钟也不一样。初始化函数调用HAL库自己的。尤其是引脚不同标准库是GPIO_Pin_6,而HAL库是GPIO_PIN_6
/* 定义I2C总线连接的GPIO端口, 用户只需要修改下面4行代码即可任意改变SCL和SDA的引脚 */
#define EEPROM_GPIO_PORT_I2C GPIOB /* GPIO端口 */
//#define EEPROM_RCC_I2C_PORT RCC_APB2Periph_GPIOB /* GPIO端口时钟 */
#define EEPROM_I2C_SCL_PIN GPIO_PIN_6 /* 连接到SCL时钟线的GPIO */
#define EEPROM_I2C_SDA_PIN GPIO_PIN_7 /* 连接到SDA数据线的GPIO */
/**
@brief 配置I2C总线的GPIO,采用模拟IO的方式实现
@param 无
@return 无
*/
static void i2c_CfgGpio(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 打开GPIO时钟 */
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStructure.Pin = EEPROM_I2C_SCL_PIN | EEPROM_I2C_SDA_PIN;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD; /* 开漏输出 */
GPIO_InitStructure.Pull = GPIO_NOPULL;
HAL_GPIO_Init(EEPROM_GPIO_PORT_I2C, &GPIO_InitStructure);
/* 给一个停止信号, 复位I2C总线上的所有设备到待机模式 */
i2c_Stop();
}
- 头文件不要写
stm32f1xx_hal_gpio.h
,使用main.h
或者stm32f1xx_hal.h
。
分析一下:
如果原来的工程本身就使能了GPIO库文件,那可以直接使用main.h
。此头文件会包含stm32f1xx_hal.h
文件,而stm32f1xx_hal.h
文件又包含stm32f1xx_hal_conf
文件。stm32f1xx_hal_conf.h
文件中对一些HAL头文件做了使能,另一部分头文件是处于注释状态(即未使能)如下:
#define HAL_MODULE_ENABLED
/*#define HAL_ADC_MODULE_ENABLED */
/*#define HAL_CRYP_MODULE_ENABLED */
/*#define HAL_CAN_MODULE_ENABLED */
/*#define HAL_CEC_MODULE_ENABLED */
/*#define HAL_CORTEX_MODULE_ENABLED */
/*#define HAL_CRC_MODULE_ENABLED */
/*#define HAL_DAC_MODULE_ENABLED */
#define HAL_DMA_MODULE_ENABLED
/*#define HAL_ETH_MODULE_ENABLED */
/*#define HAL_FLASH_MODULE_ENABLED */
#define HAL_GPIO_MODULE_ENABLED
#define HAL_I2C_MODULE_ENABLED
/*#define HAL_I2S_MODULE_ENABLED */
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
/*#define HAL_NOR_MODULE_ENABLED */
/*#define HAL_NAND_MODULE_ENABLED */
/*#define HAL_PCCARD_MODULE_ENABLED */
#define HAL_PCD_MODULE_ENABLED
/*#define HAL_HCD_MODULE_ENABLED */
...
...
#ifdef HAL_RCC_MODULE_ENABLED
#include "stm32f1xx_hal_rcc.h"
#endif /* HAL_RCC_MODULE_ENABLED */
...
#ifdef HAL_GPIO_MODULE_ENABLED
#include "stm32f1xx_hal_gpio.h"
#endif /* HAL_GPIO_MODULE_ENABLED */
而单独包含stm32f1xx_hal_gpio.h
其中一些支撑文件不能跳转。
• 由 青梅煮久 写于 2021 年 05 月 21 日