HAL库常见报错(1):error: #20: identifier “HAL_StatusTypeDef“ is undefined


再给HAL库工程移植标准库的GPIO功能的时候出现了error: #20: identifier "HAL_StatusTypeDef" is undefined问题。而且报错的文件还是HAL库中的文件,现象如下:
HAL库常见报错(1):error: #20: identifier “HAL_StatusTypeDef“ is undefined_第1张图片
这里我是打算添加一个GPIO口模拟I2C的驱动的。

问题解决:

  1. 首先注意一下初始化的函数。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();
}
  1. 头文件不要写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 日

你可能感兴趣的:(嵌入式)