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);
