IO引脚在stm32f1xx_hal_msp.c里面。
关于HAL库中stm32f1xx_hal_msp.c文件的认知
https://www.stmcu.org.cn/module/forum/thread-620752-1-3.html
typedef uint8_t u8; typedef uint16_t u16; typedef uint32_t u32; #define AT24CXX_DEV_ADDRESS 0xA0 //写指令IIC地址 #define AT24CXX_DELAY_MS HAL_Delay int i = 0; //值得注意的是AT24C64的地址是16位的,并且内部写EPPROM空间的时间最长为5ms, //之前被这里坑了很久,差点以为I2C的库函数存在问题,所以上方的代码中尝试了多种读取参数的方式。 /* Memory Organization AT24C32/64, 32K/64K SERIAL EEPROM: The 32K/64K is internally organized as 256 pages of 32 bytes each. Ran- dom word addressing requires a 12/13 bit data word address. 32 bytes each===每个页共32个字节 */ void AT24CXX_WriteByte(u16 reg_address,u8 data) { static HAL_StatusTypeDef i; i = HAL_I2C_Mem_Write(&hi2c1,AT24CXX_DEV_ADDRESS,reg_address,I2C_MEMADD_SIZE_16BIT,&data,1,100); AT24CXX_DELAY_MS(5); //AT24C64的最长写入时间是5ms } u8 AT24CXX_ReadByte(u16 reg_address) { u8 data = 0; u8 temp[2]; temp[0] = reg_address>>8; temp[1] = reg_address; //HAL_I2C_Master_Transmit(&hi2c1,AT24CXX,temp,2,100); //HAL_I2C_Master_Receive(&hi2c1,AT24CXX,&data,1,100); HAL_I2C_Mem_Read(&hi2c1,AT24CXX_DEV_ADDRESS,reg_address,I2C_MEMADD_SIZE_16BIT,&data,2,100); return data; } /**************************************************************************** * 名 称: void AT24C02_Write(u8 WriteAddr,u8 *pBuffer,u8 WriteNum) * 功 能:从AT24C02里面的指定地址开始写入指定个数的数据 * 入口参数:WriteAddr :开始写入的地址 0~255 pBuffer :数据数组首地址 WriteNum:要写入数据的个数 * 返回参数: * 说 明: ****************************************************************************/ void AT24C64_Write(u16 WriteAddr,u8 *pBuffer,u8 WriteNum) { while(WriteNum--) { AT24CXX_WriteByte(WriteAddr,*pBuffer); WriteAddr++; pBuffer++; } } /**************************************************************************** * 名 称: void AT24C02_Read(u8 ReadAddr,u8 *pBuffer,u8 ReadNum) * 功 能:从AT24C02里面的指定地址开始读出指定个数的数据 * 入口参数:ReadAddr :开始读出的地址 0~255 pBuffer :数据数组首地址 ReadNum:要读出数据的个数 * 返回参数: * 说 明: ****************************************************************************/ void AT24C64_Read(u16 ReadAddr,u8 *pBuffer,u8 ReadNum) { while(ReadNum--) { *pBuffer++=AT24CXX_ReadByte(ReadAddr++); } } /**************************************************************************** * 名 称: u8 AT24C02_Test(void) * 功 能:测试AT24C02是否正常 * 入口参数:无 * 返回参数:返回1:检测失败 返回0:检测成功 * 说 明: ****************************************************************************/ u8 AT24C02_Test(void) { u8 Testdata; Testdata=AT24CXX_ReadByte(255); //如果开机测试,已有值无需再次写入 if(Testdata==0XAB)return 0; else { AT24CXX_WriteByte(255,0XAB); Testdata=AT24CXX_ReadByte(255); if(Testdata==0XAB)return 0; } return 1; }
调用
if(AT24C02_Test()==0) //检测通过 { HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14, GPIO_PIN_RESET); HAL_Delay(2000); }
AT24CXX_WriteByte(0x0001,0xA2); HAL_Delay(50); i = AT24CXX_ReadByte(0x0001); i = i+1; if(0xA3== i) HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14); HAL_Delay(500);