STM32CubeMX設定IIC匯流排讀寫EEPROM學習記錄(學不會找我)

2020-10-29 11:01:10

一、STM32CubeMX 設定

首先開啟STM32CubeMX 選擇晶片型號建立工程,我這裡選擇STM32F03ZET6(正點原子戰艦V3) 具體新建工程的過程不再贅述,太基礎。
首先設定System Core目錄下的SYS和RCC索引標籤如下圖:

設定SYS下的Debug為Serial Wire

配置

設定RCC下的HSE(高速時鐘)

我這裡設定為外部晶振Crystal/Ceramic Resonator,具體根據板子的硬體設定設定

在這裡插入圖片描述

IIC匯流排介面設定

STM32F103ZET6有兩路硬體IIC,設定Connectivity索引標籤下的I2C1為I2C基本引數(parameter Setting)保持預設不變,DMA和NVIC暫不設定,以後單獨講

在這裡插入圖片描述

串列埠設定

為了方便測試程式碼效果看現象,增加一個串列埠設定輸出相關資訊。
串列埠設定老生常談了,上篇文章有詳細過程,包括串列埠的中斷和DMA,連結放下面自己去看,這裡不講了

上篇文章傳送門

時鐘樹

時鐘樹配置
這個測試比較簡單,只用到IIC和USART兩個外設,所以STM32CubeMX的設定至此就結束了,設定專案名稱,檔案路徑,IDE,和程式碼風格就可以生成程式碼了,具體設定點這裡看STM32CubeMX 設定部分的最後有詳細說明。

二、程式碼實現(上才藝)

EEPROM的地址

#define ADDR_AT24C02_Write 0xA0
#define ADDR_AT24C02_Read 0xA1

首先是define了EEPROM晶片AT24C02的讀寫地址,為什麼就是0xA0和0xA1呢,為什麼不是別的噻,聽我細細道來,這就跟晶片的電路連線有關係了,如下圖:

在這裡插入圖片描述
EEPROM的寫地址定義為:0 1 0 1 A0 A1 A2 0
EEPROM的讀地址定義為:0 1 0 1 A0 A1 A2 1
這其中A0~A2就代表晶片的A0到A2三個引腳的電平狀態,我這裡都接了地,所以A0 A1 A2都是0,所以帶進去就分別是0xA0 和0xA1,具體可以看AT24C02的datasheet。

程式碼

(1)首先我定義了兩個陣列,分別用於往EEPROM裡寫資料和儲存從EEPROM裡讀出的資料

uint8_t I2C_Buffer_Write[256];
uint8_t I2C_Buffer_Read[256];

(2)下面是關鍵程式碼,我把我的程式碼貼出來給跟大家參考,如有錯誤請指正:

void Fill()
{
	uint16_t i;

	sprintf((char *)test,"\r\n\r\n I2C AT24C02 Example\r\n");
	HAL_UART_Transmit(&huart1,test, 39, 100); 
	sprintf((char *)test,"\r\n I2C Write Buffer:\r\n");
	HAL_UART_Transmit(&huart1,test, 22, 100);
	for(i=0; i<255; i++)
	{
	  I2C_Buffer_Write[i]=i;     /* WriteBuffer Initialization */
	}
	for(i=0; i<256; i=i+8)
	{
		if (HAL_I2C_Mem_Write(&hi2c1, ADDR_AT24C02_Write, i, I2C_MEMADD_SIZE_8BIT,I2C_Buffer_Write+i,8, 10000) == HAL_OK)
		{
			sprintf((char *)test,"Success\r\n");
			HAL_UART_Transmit(&huart1,test, 9, 100);
			HAL_Delay(5);
		}
		else
		{
			sprintf((char *)test,"False\r\n");
			HAL_UART_Transmit(&huart1,test, 7, 100);
			HAL_Delay(5);
		}
	}
	HAL_I2C_Mem_Read(&hi2c1, ADDR_AT24C02_Read, 0, I2C_MEMADD_SIZE_8BIT,I2C_Buffer_Read,256, 1000);
	for(i=0; i<255; i++)
	{
		sprintf((char *)test,"%d\r\n",I2C_Buffer_Read[i]);
		HAL_UART_Transmit(&huart1,test,4, 100);
	}

}

此函數的功能也比較簡單,通過一個256維的陣列往EEPROM裡填充數位1~256,然後按地址逐個讀取出來放在I2C_Buffer_Read陣列裡面並通過串列埠列印出來,另外AT24C02的容量就是256Byte,也就是256*8=2Kbit,這裡還涉及到分頁儲存的概念,每八個位元組為一頁,大於八個位元組的資料,一頁一頁儲存,程式碼在這大家自己研究。

結果

在這裡插入圖片描述
在這裡插入圖片描述

可以看出程式執行正常,每成功寫入一位元組資料列印出一個Sucess否則列印False,寫入完畢後讀取出來的資料也是我們寫入的資料。
另外提一下,EEPROM是掉電不丟失的儲存裝置,寫入之後,可以把程式碼中寫入的部分註釋掉,只保留讀取的部分,燒錄進去重新上電,發現依然可以正常讀取資料,由此證明實驗的正確性。

能力不高水平有限如有錯誤請批評指正,謝謝大家,如果對你有幫助評論告訴我哈哈