利用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
#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库的使用主要是具体多看库中函数的注释,一般都有对函数的说明