[开发资料] CW32L031 移植OLED驱动

[复制链接]
 楼主| lulugl 发表于 2023-9-25 20:27 | 显示全部楼层 |阅读模式

OLED为常用的外设,主要用于显示功能,常用接口为I2C、SPI。而I2C只需要2线就可以实现,更为常见。I2C可以用软件模拟I2C以及硬件的I2C驱动。软件I2C可以灵活选择GPIO来实现,在不同的单片机中移方便,但是速度相比硬件i2c慢,占用资源多。而硬件I2C速度快,占用资源小,但是硬件I2C需要指的IO,而且在有些单片机硬件i2c的兼容性不是很好,移植性差。
IO的选取,这次移植为硬件i2c驱动OLED屏。开饭盒派的开发板上面有I2C的插座,接的IO为SCK-PB6,SDA-PB7。
4b89c8c5ec1ea3d8e63dcde4be5a83b7
I2C的初始化
void OLED_I2C_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
I2C_InitTypeDef I2C_InitStruct = {0};
CW_SYSCTRL->AHBEN_f.GPIOB  = 1;  //打开GPIOB的时钟
CW_SYSCTRL->APBEN1_f.I2C1 = 1U;    //打开I2c1的时钟
//端口复用
PB06_AFx_I2C1SCL();
PB07_AFx_I2C1SDA();
//配置IO输出
GPIO_InitStructure.Pins = I2C1_SCL_GPIO_PIN | I2C1_SDA_GPIO_PIN;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
GPIO_Init(I2C1_SCL_GPIO_PORT, &GPIO_InitStructure);
//配置I2C1
I2C_InitStruct.I2C_Baud = 0x1; // 48000 000/(8*(1+11) = 500k
I2C_InitStruct.I2C_BaudEn = ENABLE;
  I2C_InitStruct.I2C_FLT = DISABLE;
  I2C_InitStruct.I2C_AA =  DISABLE;
I2C1_DeInit();
  I2C_Master_Init(CW_I2C1,&I2C_InitStruct);//初始化I2C为主机模式
I2C_Cmd(CW_OLED_I2C, ENABLE);
}
发送一个byte的函数:
//向OLED寄存器地址写一个byte的数据
int I2C_WriteByte(uint8_t addr,uint8_t data)
{
uint8_t u8i = 0, u8State;
  uint16_t timeout = 0xffff;
I2C_GenerateSTART(CW_OLED_I2C, ENABLE);
//获取状态
while(1)
{
while((0 == I2C_GetIrq(CW_OLED_I2C)) && timeout--);
if(timeout == 0) return 1;
u8State = I2C_GetState(CW_OLED_I2C);
switch(u8State)
{
case 0x08:  //发送完START信号
I2C_GenerateSTART(CW_OLED_I2C, DISABLE);
I2C_Send7bitAddress(CW_OLED_I2C, OLED_ADDR, 0x00);
break;
case 0x18:  //发送完SLA+W信号,ACK已收到
I2C_SendData(CW_OLED_I2C, addr);
break;
case 0x28:
I2C_SendData(CW_OLED_I2C, data);
u8i ++;
break;
case 0x20: //发送完SLA+W后从机返回NACK
break;
case 0x38: //主机在发送 SLA+W 阶段或者发送数据阶段丢失仲载  或者  主机在发送 SLA+R 阶段或者回应 NACK 阶段丢失仲裁
I2C_GenerateSTART(CW_OLED_I2C, ENABLE);
        break;
case 0x30:
I2C_GenerateSTOP(CW_OLED_I2C, ENABLE);
break;
default:
break;
}
if(u8i>1)
{
I2C_GenerateSTOP(CW_OLED_I2C, ENABLE);
I2C_ClearIrq(CW_OLED_I2C);
break;
}
I2C_ClearIrq(CW_OLED_I2C);
}
return 0;
}
函数中主要编程思想为轮询查询I2C的状态寄存器,根据不同的状态来确定下一个状态。
在写好发送一个byte的函数上,根据OLED的数据手册,定义好发送数据与命令函数如下:
//写指令
void WriteCmd(unsigned char I2C_Command)
{
I2C_WriteByte(0x00,I2C_Command);
}
//写数据
void WriteData(unsigned char I2C_Data)
{
I2C_WriteByte(0x40,I2C_Data);
}
至此,最基本的代码已经移植完毕代码与字库我附在后面。
在主函数里面调用OLED的初始化,然后清屏,显示效果如下:
d581c54dbd9ee27a9311e26294074a55
oled.zip (6.04 KB, 下载次数: 2)

sesefadou 发表于 2023-10-5 13:15 | 显示全部楼层
可能需要配置CW32L031的系统时钟以满足驱动的时序要求。

评论

采用硬件I2c,对时钟主频没有要求。但对数所传输有一定的影响。  发表于 2023-10-5 19:29
wilhelmina2 发表于 2023-10-5 13:37 | 显示全部楼层
OLED显示器的刷新率通常由MCU的系统时钟决定。
benjaminka 发表于 2023-10-5 13:48 | 显示全部楼层
在移植OLED驱动时,还需要考虑功耗问题。
burgessmaggie 发表于 2023-10-5 14:00 | 显示全部楼层
OLED显示屏的数据手册和通信协议,编写适当的程序代码。可能需要配置OLED显示屏的寄存器、设置显示模式等。
pmp 发表于 2023-10-6 20:56 | 显示全部楼层
可以使用CW32L031的低功耗模式来降低功耗,或者在不需要显示时关闭OLED屏幕等。
hilahope 发表于 2023-10-6 21:04 | 显示全部楼层
配置OLED驱动程序中的引脚定义,包括CS、DC、SCK、MOSI等。
wangdezhi 发表于 2023-10-6 21:20 | 显示全部楼层
需要考虑OLED显示屏的闪烁问题,可以通过调整OLED显示屏的刷新率来避免闪烁现象。
xiaoyaodz 发表于 2023-10-6 21:50 | 显示全部楼层
OLED显示屏和微控制器的时钟频率要求,配置微控制器的时钟分频或时钟源
51xlf 发表于 2023-10-6 22:01 | 显示全部楼层
建议仔细阅读OLED模块和CW32L031的相关文档,并参考相关的示例代码和驱动库。
qiufengsd 发表于 2023-10-6 22:22 | 显示全部楼层
OLED显示器通常需要专用的驱动程序来控制其显示内容。
backlugin 发表于 2023-10-6 22:38 | 显示全部楼层
如果OLED显示屏需要显示大量图像或文本,需要考虑内存管理。

评论

现在还不知道如何用字库。  发表于 2023-10-7 09:06
wwppd 发表于 2023-10-8 12:34 | 显示全部楼层
可以根据CW32L031的硬件架构和外设接口,寻找与之兼容的OLED驱动库。确保使用的驱动库提供了CW32L031所需的功能和API接口。

jonas222 发表于 2023-10-8 12:42 | 显示全部楼层
在使用OLED显示器时,需要确保有足够的内存空间来建立显示缓冲区。
timfordlare 发表于 2023-10-8 12:50 | 显示全部楼层
OLED驱动通常需要一个稳定的时钟信号来驱动OLED显示屏,而CW32L031芯片也具有自己的时钟系统。因此需要确保OLED驱动与CW32L031芯片的时钟频率兼容,否则可能会导致OLED显示屏无法正常工作。
iyoum 发表于 2023-10-8 12:57 | 显示全部楼层
CW32L031是一款低功耗、高性能的微控制器,其内部集成了ARM Cortex-M3内核、16KB Flash、4KB SRAM等丰富的资源。
robincotton 发表于 2023-10-8 13:09 | 显示全部楼层
在移植 OLED 驱动时,需要关注功耗优化。
mikewalpole 发表于 2023-10-8 13:29 | 显示全部楼层
根据OLED驱动库的API文档,了解和使用正确的函数和方法来初始化和控制OLED显示屏
jimmhu 发表于 2023-10-8 13:41 | 显示全部楼层
编写OLED驱动程序,包括初始化、清屏、设置显示区域、写入像素数据等。
sanfuzi 发表于 2023-10-8 13:48 | 显示全部楼层
OLED驱动通常需要连接到多个引脚,如数据线、地址线、时钟线等。需要确保OLED驱动的引脚与CW32L031芯片的引脚配置正确,否则可能会导致OLED显示屏无法正常工作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

830

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部