利用HAL库硬件IIC驱动OLED

利用CubeMX生成工程文档就不用细说了,网上很多类似的教程.主要谈一下自己将原来驱动OLED的库例程 移植为HAL库的驱动,本质上没有多大的区别,只是几个函数运用的问题.

 

  1.  利用CubeMX 选用I2C1,配置默认即可
  2. 生成工程之后,单独创建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库的使用主要是具体多看库中函数的注释,一般都有对函数的说明

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值