OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8783|回复: 6

F103C8T6 OLED上实现STemwin V5.28

[复制链接]

18

主题

238

帖子

3

精华

金牌会员

Rank: 6Rank: 6

积分
1823
金钱
1823
注册时间
2014-8-5
在线时间
211 小时
发表于 2017-4-21 16:11:05 | 显示全部楼层 |阅读模式
一时来兴趣,想在OLED上运行STemwin,手上正好有个OLED板子。移植主要是参考这个帖子    http://bbs.armfly.com/read.php?tid=1678
这个帖子讲的还是非常详细的,我也是通过这个一步步然后自己慢慢测试完成的

移植遇到的问题及解决办法:

1、OLED内部没有显存,需要自己在单片机内部通过SRAM来实现显存

2、STemwin移植主要是实现画点、读点这两个函数,但由于OLED的打点我们是直接写bit 1到单片机内部SRAM显存,所以在显存写1的同时还需要把这个显存对应的数据写入OLED中,
实现单片机内部显存与OLED显示同步。读点函数则通过单片机内部显存返回该坐标数据。
[mw_shl_code=c,true]/*
*********************************************************************************************************
*        函 数 名: OLED_PutPixel
*        功能说明: 画1个像素
*        形    参:
*                        _usX,_usY : 像素坐标
*                        _ucColor  :像素颜色
*        返 回 值: 无
*********************************************************************************************************
*/
void OLED_PutPixel(uint16_t _usX, uint16_t _usY, uint8_t _ucColor)
{
        uint8_t ucValue;
        uint8_t ucPageAddr;
        uint8_t ucColAddr;

        const uint8_t aOrTab[8]  = {0x01, 0x02, 0x04, 0x08,0x10,0x20,0x40,0x80};
        const uint8_t aAndTab[8] = {0xFE, 0xFD, 0xFB, 0xF7,0xEF,0xDF,0xBF,0x7F};

        ucPageAddr = _usY / 8;
        ucColAddr = _usX;

        ucValue = s_ucGRAM[ucPageAddr][ucColAddr];
        if (_ucColor == 0)
        {
                ucValue &= aAndTab[_usY % 8];
        }
        else
        {
                ucValue |= aOrTab[_usY % 8];
        }
        s_ucGRAM[ucPageAddr][ucColAddr] = ucValue;

        if (s_ucUpdateEn == 1)
        {
                OLED_WriteCmd (0xB0 + ucPageAddr);                                        /* 设置页地址(0~7) */
                OLED_WriteCmd (0x00 + (ucColAddr & 0x0F));                        /* 设置列地址的低地址 */
                OLED_WriteCmd (0x10 + ((ucColAddr >> 4) & 0x0F));        /* 设置列地址的高地址 */
                OLED_WriteData(ucValue);
        }
/*
*********************************************************************************************************
*        函 数 名: OLED_GetPixel
*        功能说明: 读取1个像素
*        形    参:
*                        _usX,_usY : 像素坐标
*        返 回 值: 颜色值 (0, 1)
*********************************************************************************************************
*/
uint8_t OLED_GetPixel(uint16_t _usX, uint16_t _usY)
{
        uint8_t ucValue;
        uint8_t ucPageAddr;
        uint8_t ucColAddr;

        ucPageAddr = _usY / 8;
        ucColAddr = _usX;

        ucValue = s_ucGRAM[ucPageAddr][ucColAddr];
        if (ucValue & (_usY % 8))
        {
                return 1;
        }
        else
        {
                return 0;
        }
}
}[/mw_shl_code]
此驱动代码全是参考上面那个帖子里面的工程

3、此函数需要修改,我们采用的单色显示屏
[mw_shl_code=applescript,true]/*********************************************************************
*
*       _GetDevData
*/
static void * _GetDevData(GUI_DEVICE * pDevice, int Index) {
  GUI_USE_PARA(pDevice);
  #if GUI_SUPPORT_MEMDEV
    switch (Index) {
    case LCD_DEVDATA_MEMDEV:
      return (void *)&GUI_MEMDEV_DEVICE_1; // TBD: Has to be adapted to the right memory device depending on the used color depth!
    }
  #else
    GUI_USE_PARA(Index);
  #endif
  return NULL;
}
[/mw_shl_code]
4、最最重要的一点!void LCD_X_Config(void)函数修改


#define XSIZE_PHYS    128               //给定层可见区的X尺寸 (单位:像素)
#define YSIZE_PHYS    64                //给定层可见区的Y尺寸 (单位:像素)
#define VXSIZE_PHYS   128               //给定层虚拟区的X尺寸 (单位:像素)
#define VYSIZE_PHYS    64               //给定层虚拟区的Y尺寸 (单位:像素)


[mw_shl_code=applescript,true]/*********************************************************************
*
*       LCD_X_Config
*
* Function description:
*   Called during the initialization process in order to set up the
*   display driver configuration.
*
*/
void LCD_X_Config(void) {
  // Set display driver and color conversion
  //
//  GUI_DEVICE_CreateAndLink(GUIDRV_FLEXCOLOR, GUICC_1, 0, 0);  //之前因为此语句 进入硬件中断
        GUI_DEVICE_CreateAndLink(GUIDRV_TEMPLATE, GUICC_1, 0, 0);//改成这样成功解决
  LCD_SetSizeEx (0, XSIZE_PHYS , YSIZE_PHYS);
  LCD_SetVSizeEx(0, VXSIZE_PHYS, VYSIZE_PHYS);
}
[/mw_shl_code]

之前就是因为这个没有修改,结果在执行GUI_Init()函数后,进入硬件中断,跟踪发现调用的三个函数都没有出问题。当把这个函数修改好后成功解决,有兴趣的
朋友可以看下宏GUIDRV_FLEXCOLOR宏GUIDRV_TEMPLAT两个的定义。

5、OLED的STemwin不需要太大内存,我这边开10K,暂时测试没有出现因为内存大小的问题
6、成功移植STemwin后,之前测试发现不能显示窗口,通过修改堆栈大小成功解决。大小都设置成0X800。
[mw_shl_code=applescript,true]Stack_Size                EQU     0x800

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


; <h> Heap Configuration
;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>

Heap_Size      EQU     0x800

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3[/mw_shl_code]

7、由于F103C8T6 FLASH太小,当移植完STemwin后本想加入FreeRTOS,但是加入操作系统后,FLASH几乎就满了,所有没有移植。
8、STemwin 从V5.28版本开始,自动开启换肤功能,由于采用单色屏,当使用换肤后就没有层次感,所以需要手动把小工具的皮肤换成经典皮肤。



最后附上工程代码:


默认皮肤显示效果

默认皮肤显示效果

经典皮肤显示效果

经典皮肤显示效果

Car_Study_20170419.zip

7.17 MB, 下载次数: 7629

OLED STemwin V5.28

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

329

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2287
金钱
2287
注册时间
2016-5-21
在线时间
952 小时
发表于 2017-4-21 17:35:29 | 显示全部楼层
回复 支持 反对

使用道具 举报

10

主题

196

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
390
金钱
390
注册时间
2018-3-20
在线时间
80 小时
发表于 2018-5-2 16:42:01 | 显示全部楼层
试过
GUI_CURSOR_Show();
GUI_CURSOR_SetPosition(20,20);
之后原有位置会不会出现鼠标阴影么?
OLED的移植除了刷数字速度比直接刷慢一些以外,只剩下这个鼠标阴影问题了,求助~,读点函数可以读到当前颜色,但是还是拖影
       
回复 支持 反对

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2016-11-29
在线时间
12 小时
发表于 2019-8-1 15:07:55 | 显示全部楼层
请教大神,为何我的显示是反色的呢?显示字母什么的都正常 QQ截图20190801150507.png
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2020-1-15
在线时间
4 小时
发表于 2020-2-22 15:49:47 | 显示全部楼层
厉害了,OLED这么小的显示屏都可以跑STeWIN
回复 支持 反对

使用道具 举报

21

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
165
金钱
165
注册时间
2013-12-1
在线时间
87 小时
发表于 2020-3-1 01:25:41 | 显示全部楼层
我在16x32的LED点阵屏上也移植成功emwin了
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-1-15
在线时间
3 小时
发表于 2020-10-3 19:32:53 | 显示全部楼层
云琴箫龙 发表于 2019-8-1 15:07
请教大神,为何我的显示是反色的呢?显示字母什么的都正常

我的也是反的?这个是哪个设置引起的?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 09:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表