实验1:点亮LED
实验2:按键控制LED
实验3:外部中断检测按键
实验4:扩展芯片检测按键
实验5:定时器实现LED闪烁
实验6:基于PWM的呼吸灯
实验7:检测输入的PWM频率和脉宽
实验8:串口的输入和输出
实验9:串口使用PRINTF函数
实验10:SPI接口操作片外FLASH
实验11:SPI接口操作TF卡
实验12:IIC接口操作OLED屏幕
实验13:ADC电压采样
本节实验,使用STM32自带的IIC硬件接口,操作OLED屏幕,显示相关信息。实验并不复杂,就是对OLED屏幕卖家提供的代码进行一下移植。因为卖家提供的代码中,使用了GPIO来模拟IIC接口,我们要把模拟的IIC变成硬件IIC。这是板子上的接口:
这是STM32上对应的管脚:
步骤如下:
1、新建工程,进行基本配置。通过点击“ACCESS TO MCU SELECTOR”来创建一个新的工程:
参照实验1,芯片选择“STM32F103C8”。
打开外部时钟,点击“System Core”,选择RCC,在右侧弹出的菜单栏中选择“Crystal/Ceramic Resonator”。
选择调试接口,点击“System Core”,选择RCC。,在右侧弹出的菜单栏中选择“Serial Wire”。
2、配置IIC接口。如图,使能STM32的IIC1,并配置相关参数:
3、时钟配置。参照实验1.
4、参照实验1的步骤7,进行相应配置,生成工程文件。
5、向工程添加文件。参照实验4的步骤6,把屏幕卖家提供的OLED部分的驱动程序添加到工程中,如下:
6、添加头文件。在main.c文件中,把驱动程序中,相关的头文件,包含进工程。
代码:
#include "oled.h"
#include "bmp.h"
7、替换延时函数。OLED驱动过程中需要用到延时函数,把工程内自带的延时函数给它进行替换。
代码:
#define delay_ms(delay) HAL_Delay(delay)
8、定义变量。定义一个变量,用来暂存要显示的字符。
代码:
uint8_t t=' ';
9、OLED工作配置。添加初始化、显示代码。
代码:
OLED_Init(); //初始化OLED
OLED_Clear() ;
OLED_ShowCHinese(0,0,0);//中
OLED_ShowCHinese(18,0,1);//景
OLED_ShowCHinese(36,0,2);//园
OLED_ShowCHinese(54,0,3);//电
OLED_ShowCHinese(72,0,4);//子
OLED_ShowCHinese(90,0,5);//科
OLED_ShowCHinese(108,0,6);//技
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
OLED_Clear();
OLED_ShowCHinese(0,0,0);//中
OLED_ShowCHinese(18,0,1);//景
OLED_ShowCHinese(36,0,2);//园
OLED_ShowCHinese(54,0,3);//电
OLED_ShowCHinese(72,0,4);//子
OLED_ShowCHinese(90,0,5);//科
OLED_ShowCHinese(108,0,6);//技
OLED_ShowString(6,3,"0.96' OLED TEST",16);
OLED_ShowString(0,6,"ASCII:",16);
OLED_ShowString(63,6,"CODE:",16);
OLED_ShowChar(48,6,t,16);//显示ASCII字符
t++;
if(t>'~')t=' ';
OLED_ShowNum(103,6,t,3,16);//显示ASCII字符的码值
delay_ms(8000);
OLED_DrawBMP(0,0,128,8,BMP1); //图片显示(图片显示慎用,生成的字表较大,会占用较多空间,FLASH空间8K以下慎用)
delay_ms(8000);
OLED_DrawBMP(0,0,128,8,BMP1);
delay_ms(8000);
}
10、修改IIC读写函数。在oled.c文件中,修改下面几个函数,由GPIO模拟,改为硬件IIC操作。
代码:
/**********************************************
// IIC Write Command
**********************************************/
void Write_IIC_Command(unsigned char IIC_Command)
{
HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&IIC_Command,1,0x100);
}
/**********************************************
// IIC Write Data
**********************************************/
void Write_IIC_Data(unsigned char IIC_Data)
{
HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&IIC_Data,1,0x100);
}
void OLED_WR_Byte(unsigned char dat,unsigned cmd)
{
if(cmd)
{
HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&dat,1,0x100);
}
else
{
HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&dat,1,0x100);
}
}
修改后,保存,编译、下载,重新上电。观察OLED屏幕,显示相关字符。
整个过程有PPT、数据手册、原理图、源码、相关软件,在公众号(单片机爱好者)回复关键词:002或者STM32CUBEMX教程,即可获取下载链接。
我是直接学着移植u8g2库,也很方便。
方法很多,会用就行
oled.c里面的GPIO配置函数不需要了是吗
不用了,因为是硬件,所以那里面的不用管