CubeMX配置IIC与小OLED通讯

前言:废话少说马上开始,关于IIC的一篇比较好的原理理解文章https://blog.csdn.net/XiuHua_Wu/article/details/81381516

软件:

STM32CubeMX V5.3.0  

固件库版本:
STM32Cube FW_F1 V1.8.0

硬件:

STM32F103C8T6

0.96寸IIC接口OLED

正文:

1、开启

CubeMX配置IIC与小OLED通讯_第1张图片

2、配置IIC初始化参数

CubeMX配置IIC与小OLED通讯_第2张图片

3、生成代码&修改代码

关于STM32CubeMx的HAL库IIC收发有几种函数,用户可以根据自己不同的需求进行选择,以下就是主要的几个HAL库IIC收发函数:

/* 第1个参数为I2C操作句柄
   第2个参数为从机设备地址
   第3个参数为从机寄存器地址
   第4个参数为从机寄存器地址长度
   第5个参数为发送的数据的起始地址
   第6个参数为传输数据的大小
   第7个参数为操作超时时间   */
HAL_I2C_Mem_Write(&hi2c2,salve_add,0,0,PA_BUFF,sizeof(PA_BUFF),0x10);

HAL_I2C_Mem_Write_IT();

HAL_I2C_Mem_Read();

HAL_I2C_Mem_Read_IT();

HAL_I2C_Mem_Read_DMA();

HAL_I2C_Mem_Write_DMA();


/*    不需要用到寄存器地址的主机HAL库IIC收发函数   */
HAL_I2C_Master_Receive();     //STM32 主机接收,不需要用到寄存器地址
HAL_I2C_Master_Transmit();

HAL_I2C_Master_Receive_IT();   //中断IIC接收 
HAL_I2C_Master_Receive_DMA();  //DMA 方式的IIC接收  

HAL_I2C_Master_Transmit_IT();   //中断IIC发送  

HAL_I2C_Master_Transmit_DMA();   //DMA 方式的IIC发送  

HAL_I2C_Master_Transmit(&hi2c2,0x0B,PA_BUFF,sizeof(PA_BUFF),0x10); //STM32 主机发送 

/* 不需要用到寄存器地址的从机HAL库IIC收发函数   */ 
HAL_I2C_Slave_Receive();    //STM32 从机机接收,不需要用到寄存器地址 
 
HAL_I2C_Slave_Transmit();   //STM32 从机机发送,不需要用到寄存器地址  

HAL_I2C_Slave_Receive_IT(); 

HAL_I2C_Slave_Receive_DMA(); 

HAL_I2C_Slave_Transmit_IT();

HAL_I2C_Slave_Transmit_DMA();

这里我直接封装一下I2C向寄存器地址写数据函数如下:

CubeMX配置IIC与小OLED通讯_第3张图片

4、之后都是调用这个函数对OLED进行写寄存器操作就不具体介绍了

 

 

PS:

这里分享一个算法:

len = (int)log10(Num) + 1;

这个可以用于求一个数字的位数,其实原理也很简单,归根到底还是取余数,只是这个对10取余很巧妙,这样就不用那些循环操作了。

这里贴一段显示屏开发者没开发的代码,就是把数字显示出来,原理也就是先求数字位数,然后一位位到字库里面索引,最后用显示函数显示,里面一些位移操作很常见。

void OLED_ShowNum(unsigned char x, unsigned char y, uint32_t Num, unsigned char TextSize)
{  
	uint8_t t,temp,len;	
	len = (int)log10(Num) + 1;
    unsigned char c = 0,i = 0;	
	switch(TextSize)
	{
		case 1:
		{
			for(t=0;t 126)
				{
					x = 0;
					y++;
				}
				OLED_SetPos(x,y);
				for(i=0;i<6;i++)
					WriteDat(F6x8[c][i]);
				x += 6;	
			}
		}break;
		case 2:
		{
			for(t=0;t 120)
				{
					x = 0;
					y++;
				}
				OLED_SetPos(x,y);
				for(i=0;i<8;i++)
					WriteDat(F8X16[c*16+i]);
				OLED_SetPos(x,y+1);
				for(i=0;i<8;i++)
					WriteDat(F8X16[c*16+i+8]);
				x += 8;
			}
		}break;
	}
}

 

你可能感兴趣的:(STM32)