MB039可通过转接板接到OLED模块。
5
// FSMC 控制OLED的软件设计
FMSC Demo应用中,使在库函数样例工程中使用选用:
MM32F327x_Samples\LibSamples\FSMC\FSMC_Ex6800OLED\ 中的 FSMC_Ex6800OLED.uvprojx
样例展示如何初始化OLED接口与实现OLED并行驱动显示。
软件分为两个部分:
(1)FSMC接口GPIO与FSMC接口参数初始化
(2)OLED显示初始化与OLED显示
FSMC接口GPIO与FSMC接口参数初始化
void FSMC_Ex6800OLED_Demo(void)
{
u8 t = 0;
u8* p = (u8*)0x60080000;
OLED_nRST_Pin_Config();
OLED_GPIO_Init();
FSMC_Init_6800();
OLED_nRST_Setting();
OLED_Init();
//其他用户代码
}
① 在OLED_GPIO_Init ()中实现OLED对应IO初始化
包括OLED对应nRST引脚,背光控制引脚,FSMC相关的片选,读写,E信号,数据/命令,数据D0~D7引脚的初始化。
② 在FSMC_Init_6800 ()中实现FSMC功能配置初始化
A. 写操作周期
B. 单个bit数据写入保持时间
C. 写操作时,地址线的建立时间
D. 读操作周期长度设置
E. 存储器数据总线位宽
F. 模式选择:6800模式
G. 外接设备的内存大小
void FSMC_Init_6800(void)
{
FSMC_InitTypeDef FSMC_InitStructure;
FSMC_NORSRAM_Bank_InitTypeDef FSMC_BankInitStructure;
FSMC_NORSRAM_BankStructInit(&FSMC_BankInitStructure);
FSMC_NORSRAMStructInit(&FSMC_InitStructure);
RCC_AHB3PeriphClockCmd(RCC_AHB3ENR_FSMC, ENABLE);
FSMC_BankInitStructure.FSMC_SMReadPipe = 0;
FSMC_BankInitStructure.FSMC_ReadyMode = 0;
FSMC_BankInitStructure.FSMC_WritePeriod = 7;
FSMC_BankInitStructure.FSMC_WriteHoldTime = 0;
FSMC_BankInitStructure.FSMC_AddrSetTime = 1;
FSMC_BankInitStructure.FSMC_ReadPeriod = 9;
FSMC_BankInitStructure.FSMC_DataWidth = FSMC_DataWidth_16bits;
FSMC_NORSRAM_Bank_Init(&FSMC_BankInitStructure, FSMC_NORSRAM_BANK0);
FSMC_InitStructure.FSMC_Mode = FSMC_Mode_6800;
FSMC_InitStructure.FSMC_TimingRegSelect = FSMC_TimingRegSelect_0;
FSMC_InitStructure.FSMC_MemSize = FSMC_MemSize_64MB;
FSMC_InitStructure.FSMC_MemType = FSMC_MemType_NorSRAM;
FSMC_InitStructure.FSMC_AddrDataMode = FSMC_AddrDataMUX;
FSMC_NORSRAMInit(&FSMC_InitStructure);
}
OLED显示初始化
Bank0地址为0x60000000,0x80000=(0x01 << 19)则是地址线A18的偏移量。首先完成写OLED_WR_REG和OLED_WR_DATA驱动:
void OLED_WR_DATA(u16 data)
{
*(vu16*)0x60000000 = data;
}
void OLED_WR_REG(u16 regval)
{
*(vu16*)(0x60000000 | (0x01 << 19)) = regval;
}
void OLED_WR_Byte(u8 dat, u8 cmd)
{
if(cmd) {
OLED_WR_REG(dat);
}
else {
OLED_WR_DATA(dat);
}
}
读DATA和REG是一样的操作,不同的是从相应地址读取数据。
通过OLED_Refresh_Gram()函数,可以实现数据的实时刷新。void OLED_Refresh_Gram(void)
{
u8 i, n;
for(i = 0; i < 8; i++) {
OLED_WR_Byte (0xb0 + i, OLED_CMD); // Set page address (0~7)
OLED_WR_Byte (0x00, OLED_CMD); // Set display location - column low address
OLED_WR_Byte (0x10, OLED_CMD); // Set display location - column height address
for(n = 0; n < 128; n++) {
OLED_WR_Byte(OLED_GRAM[n]
, OLED_DATA);
}
}
}
结合OLED_Fill和OLED_ShowChar函数可以实现OLED的显示填充与字符输出。
通过演示,观察到在OLED上显示出了MindMotion 的字符与年月日等打印信息。
Demo程序可登录MindMotion的官网下载MM32F3270 lib_Samples:
https://www.mindmotion.com.cn/pr ... instream/mm32f3270/
工程路径如下:
~MM32F327x_Samples\LibSamples\FSMC\FSMC_Ex6800OLED。
0