最近太热了,没头绪,今天终于忍痛打开空调冷静了一下,开始玩开发板。
找到了一块SSD1306 驱动的0.96寸OLED,该OLED的引脚顺序为 GND VCC SCL SDA共计4根引脚,I2C通信协议。
接下来先采用最简单的GPIO来驱动。
查看开发板,寻找合适的引脚方便插入OLED显示模块,如下图所示
为了方便插入模块,选选择了其中的GND,PA1,PA3,PF5引脚分别对应GND、VCC、SCL、SDA。
使用PA1推挽输出高电平代替VCC。
有了思路,配置如下
GPIO_Config_T gpioConfig;
RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
/* SCL GPIO configuration */
gpioConfig.pin = GPIO_PIN_3;
gpioConfig.mode = GPIO_MODE_OUT;
gpioConfig.outtype = GPIO_OUT_TYPE_OD;
gpioConfig.speed = GPIO_SPEED_50MHz;
gpioConfig.pupd = GPIO_PUPD_NO;
GPIO_Config(GPIOA, &gpioConfig);
RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOF);
/* SDA GPIO configuration */
gpioConfig.pin = GPIO_PIN_5;
GPIO_Config(GPIOF, &gpioConfig);
/* OLED VCC GPIO configuration */
gpioConfig.pin = GPIO_PIN_1;
gpioConfig.outtype = GPIO_OUT_TYPE_PP;
GPIO_Config(GPIOA, &gpioConfig);
GPIO_SetBit(GPIOA, GPIO_PIN_1);
接下来就是移植程序了
将oled.c文件添加进工程,将OLED库函数目录文件夹添加到头文件包含路径
修改oled.h头文件中的引用头文件和宏定义映射函数
#include "stdlib.h"
#include "apm32e030_gpio.h"
#include "apm32e030_rcm.h"
//-----------------OLED端口定义----------------
#define OLED_SCL_Clr() GPIO_ClearBit(GPIOA, GPIO_PIN_3)
#define OLED_SCL_Set() GPIO_SetBit(GPIOA, GPIO_PIN_3)
#define OLED_SDA_Clr() GPIO_ClearBit(GPIOF, GPIO_PIN_5)
#define OLED_SDA_Set() GPIO_SetBit(GPIOF, GPIO_PIN_5)
#define OLED_CMD 0 //写命令
#define OLED_DATA 1 //写数据
#define u8 unsigned char
#define u16 unsigned int
#define u32 unsigned long int
在main.c中引用oled.h头文件
在之前写的Blink测试函数基础上增加oled测试函数
int main(void)
{
GPIO_Config_T gpioConfig;
RCM_EnableAHBPeriphClock(LED2_GPIO_CLK | LED3_GPIO_CLK);
/* LED2 GPIO configuration */
gpioConfig.pin = LED2_PIN;
gpioConfig.mode = GPIO_MODE_OUT;
gpioConfig.outtype = GPIO_OUT_TYPE_PP;
gpioConfig.speed = GPIO_SPEED_50MHz;
gpioConfig.pupd = GPIO_PUPD_NO;
GPIO_Config(LED2_GPIO_PORT, &gpioConfig);
/* LED3 GPIO configuration */
gpioConfig.pin = LED3_PIN;
GPIO_Config(LED3_GPIO_PORT, &gpioConfig);
/* Turn LED2 on */
GPIO_ClearBit(LED2_GPIO_PORT, LED2_PIN);
/* Turn LED3 off */
GPIO_SetBit(LED3_GPIO_PORT, LED3_PIN);
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
OLED_ShowPicture(0,0,128,64,BMP1,1);
OLED_Refresh();
for (;;)
{
/* LED Toggle*/
APM_TINY_LEDToggle(LED2);
Delay();
APM_TINY_LEDToggle(LED3);
Delay();
}
}
编译烧录,".\Objects\001.axf" - 0 Error(s), 0 Warning(s).
非常奈斯,烧录后,按下复位按键,屏幕点亮。如开头的图片所示。
|