利用HAL庫硬體IIC驅動OLED
利用CubeMX生成工程文件就不用細說了,網上很多類似的教程.主要談一下自己將原來驅動OLED的庫例程 移植為HAL庫的驅動,本質上沒有多大的區別,只是幾個函式運用的問題.
- 利用CubeMX 選用I2C1,配置預設即可
- 生成工程之後,單獨建立oled.c oled.h 檔案,在其中新增驅動程式碼,具體程式碼如下:
I2C_HandleTypeDef hi2c1; void WriteCmd(unsigned char I2C_Command)//寫命令 { // uint8_t pData[1]; // pData[0] = I2C_Command; uint8_t *pData; pData = &I2C_Command; HAL_I2C_Mem_Write(&hi2c1,OLED_ADDRESS,0x00,I2C_MEMADD_SIZE_8BIT,pData,1,100); } void WriteDat(unsigned char I2C_Data)//寫資料 { // uint8_t pData[1]; // pData[0] = I2C_Data; uint8_t *pData; pData = &I2C_Data; HAL_I2C_Mem_Write(&hi2c1,OLED_ADDRESS,0x40,I2C_MEMADD_SIZE_8BIT,pData,1,100); }
一般將這兩個函式修改之後,後面的驅動按照原商家提供的程式碼基本就沒什麼問題了,再就注意一下延時函式,需要呼叫HAL庫的延時函式HAL_Delay();
3. HAL_I2C_Mem_Write函式分析
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)
函式原型看起來有點複雜,對比官方說明再仔細分析一下,發現也不難理解.
/**
* @brief Write an amount of data in blocking mode to a specific memory address
* @param hi2c Pointer to a I2C_HandleTypeDef structure that contains
* the configuration information for the specified I2C.
* @param DevAddress Target device address
* @param MemAddress Internal memory address
* @param MemAddSize Size of internal memory address
* @param pData Pointer to data buffer
* @param Size Amount of data to be sent
* @param Timeout Timeout duration
* @retval HAL status
*/
I2C_HandleTypeDef *hi2c 定義你自己使用的具體哪個I2C 一般會自動生成 在main.c中的初始定義中可以找到
uint16_t DevAddress裝置的地址 即oled螢幕的地址,具體看廠家的說明,在給的驅動程式碼中應該是可以找到的, 類似
#define OLED_ADDRESS 0x78 //通過調整0R電阻,屏可以選擇0x78 0x7A兩個地址 預設為0x78
uint16_t MemAddress 裝置內部地址 可以參考原驅動程式碼
uint16_t MemAddSize 裝置內部地址編址方式,根據裝置決定是8位編址或者16位編址方式; 這個引數的填寫有兩種 I2C_MEMADD_SIZE_8BIT I2C_MEMADD_SIZE_16BIT,可以在庫程式碼中找到具體定義.
uint8_t *pData寫入的資料,因為定義為一個指標,在寫自己的驅動函式時需要略作修改,上面例子程式碼中兩種方式皆可
uint16_t Size寫入資料的位元組大小
uint32_t Timeout超時時間 可以靈活設定
其他驅動程式碼沒有什麼太大改變,HAL庫的使用主要是具體多看庫中函式的註釋,一般都有對函式的說明