OpenEdv-开源电子网

 找回密码
 立即注册
查看: 1476|回复: 4

F407最新Hal库LVGL综合例程开启SRAM报错

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2020-7-9
在线时间
4 小时
发表于 2023-8-24 19:14:57 | 显示全部楼层 |阅读模式
3金钱
大家好,F407最新Hal库LVGL综合例程开启SRAM报错,说这个内存分配函数没有返回值,大佬们,这里我想用SRAM该怎么修改啊,万分感谢

Snipaste_2023-08-24_19-12-02.jpg
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2021-2-6
在线时间
3 小时
发表于 2024-8-20 21:31:26 | 显示全部楼层
蹲,这个LVGL扩展SRAM有历程吗?
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1476
金钱
1476
注册时间
2014-5-21
在线时间
342 小时
发表于 2025-1-17 10:44:34 | 显示全部楼层
是的,这个代码原子根本就没实现外部SDRAM ,改成
  1.     static lv_disp_draw_buf_t draw_buf_dsc_1;
  2. #if USE_SRAM
  3.     static lv_color_t *buf_1;
  4.      buf_1                = mymalloc(SRAMEX, MY_DISP_HOR_RES * MY_DISP_VER_RES);              /* 设置缓冲区的大小为屏幕的全尺寸大小 */
  5.     lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_HOR_RES * MY_DISP_VER_RES);     /* 初始化显示缓冲区 */
  6. #else
  7.     static lv_color_t buf_1[MY_DISP_HOR_RES * 10];                                              /* 设置缓冲区的大小为 10 行屏幕的大小 */
  8.     lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_HOR_RES * 10);                  /* 初始化显示缓冲区 */
  9. #endif
复制代码
还是会花屏
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1476
金钱
1476
注册时间
2014-5-21
在线时间
342 小时
发表于 2025-1-17 10:49:28 | 显示全部楼层
  1. /**
  2. * [url=home.php?mod=space&uid=175224]@file[/url] lv_port_disp_templ.c
  3. *
  4. */

  5. /*Copy this file as "lv_port_disp.c" and set this value to "1" to enable content*/
  6. #if 1

  7. /*********************
  8. *      INCLUDES
  9. *********************/
  10. #include "lv_port_disp_template.h"
  11. #include "../../lvgl.h"
  12. #include "./BSP/LCD/lcd.h"

  13. /*********************
  14. *      DEFINES
  15. *********************/
  16. #define USE_SRAM        1       /* 使用外部sram为1,否则为0 */
  17. #ifdef USE_SRAM
  18. #include "./MALLOC/malloc.h"
  19. #endif

  20. #define MY_DISP_HOR_RES (480)   /* 屏幕宽度 */
  21. #define MY_DISP_VER_RES (272)   /* 屏幕高度 */

  22. /**********************
  23. *      TYPEDEFS
  24. **********************/

  25. /**********************
  26. *  STATIC PROTOTYPES
  27. **********************/
  28. /* 显示设备初始化函数 */
  29. static void disp_init(void);

  30. /* 显示设备刷新函数 */
  31. static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p);
  32. /* GPU 填充函数(使用GPU时,需要实现) */
  33. //static void gpu_fill(lv_disp_drv_t * disp_drv, lv_color_t * dest_buf, lv_coord_t dest_width,
  34. //        const lv_area_t * fill_area, lv_color_t color);

  35. /**********************
  36. *  STATIC VARIABLES
  37. **********************/
  38. static lv_color_t buf_1[480 * 272] __attribute__((at(0XC0000000 + 1280*800*2 + 10*1024 + 160*4)));
  39. static lv_color_t buf_2[480 * 272] __attribute__((at(0XC0000000 + 1280*800*2 + 480*272*2 + 10*1024 + 160*4)));
  40. /**********************
  41. *      MACROS
  42. **********************/
  43. /**
  44. * @brief       初始化并注册显示设备
  45. * [url=home.php?mod=space&uid=271674]@param[/url]       无
  46. * @retval      无
  47. */
  48. void lv_port_disp_init(void)
  49. {
  50.     /*-------------------------
  51.      * 初始化显示设备
  52.      * -----------------------*/
  53.     disp_init();

  54.     /*-----------------------------
  55.      * 创建一个绘图缓冲区
  56.      *----------------------------*/

  57.     /**
  58.      * LVGL 需要一个缓冲区用来绘制小部件
  59.      * 随后,这个缓冲区的内容会通过显示设备的 `flush_cb`(显示设备刷新函数) 复制到显示设备上
  60.      * 这个缓冲区的大小需要大于显示设备一行的大小
  61.      *
  62.      * 这里有3中缓冲配置:
  63.      * 1. 单缓冲区:
  64.      *      LVGL 会将显示设备的内容绘制到这里,并将他写入显示设备。
  65.      *
  66.      * 2. 双缓冲区:
  67.      *      LVGL 会将显示设备的内容绘制到其中一个缓冲区,并将他写入显示设备。
  68.      *      需要使用 DMA 将要显示在显示设备的内容写入缓冲区。
  69.      *      当数据从第一个缓冲区发送时,它将使 LVGL 能够将屏幕的下一部分绘制到另一个缓冲区。
  70.      *      这样使得渲染和刷新可以并行执行。
  71.      *
  72.      * 3. 全尺寸双缓冲区
  73.      *      设置两个屏幕大小的全尺寸缓冲区,并且设置 disp_drv.full_refresh = 1。
  74.      *      这样,LVGL将始终以 'flush_cb' 的形式提供整个渲染屏幕,您只需更改帧缓冲区的地址。
  75.      */

  76.     /* 单缓冲区示例) */
  77.     static lv_disp_draw_buf_t draw_buf_dsc_1;
  78. #if USE_SRAM
  79. //    static lv_color_t buf_1 = mymalloc(SRAMEX, MY_DISP_HOR_RES * MY_DISP_VER_RES);              /* 设置缓冲区的大小为屏幕的全尺寸大小 */
  80.     lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_HOR_RES * MY_DISP_VER_RES);     /* 初始化显示缓冲区 */
  81. #else
  82.     static lv_color_t buf_1[MY_DISP_HOR_RES * 10];                                              /* 设置缓冲区的大小为 10 行屏幕的大小 */
  83.     lv_disp_draw_buf_init(&draw_buf_dsc_1, buf_1, NULL, MY_DISP_HOR_RES * 10);                  /* 初始化显示缓冲区 */
  84. #endif

  85.     /* 双缓冲区示例) */
  86. //    static lv_disp_draw_buf_t draw_buf_dsc_2;
  87. //    static lv_color_t buf_2_1[MY_DISP_HOR_RES * 10];                                            /* 设置缓冲区的大小为 10 行屏幕的大小 */
  88. //    static lv_color_t buf_2_2[MY_DISP_HOR_RES * 10];                                            /* 设置另一个缓冲区的大小为 10 行屏幕的大小 */
  89. //    lv_disp_draw_buf_init(&draw_buf_dsc_2, buf_2_1, buf_2_2, MY_DISP_HOR_RES * 10);             /* 初始化显示缓冲区 */

  90.     /* 全尺寸双缓冲区示例) 并且在下面设置 disp_drv.full_refresh = 1 */
  91. //    static lv_disp_draw_buf_t draw_buf_dsc_3;
  92. //    static lv_color_t buf_3_1[MY_DISP_HOR_RES * MY_DISP_VER_RES];                               /* 设置一个全尺寸的缓冲区 */
  93. //    static lv_color_t buf_3_2[MY_DISP_HOR_RES * MY_DISP_VER_RES];                               /* 设置另一个全尺寸的缓冲区 */
  94. //    lv_disp_draw_buf_init(&draw_buf_dsc_3, buf_3_1, buf_3_2, MY_DISP_HOR_RES * MY_DISP_VER_RES);/* 初始化显示缓冲区 */

  95.     /*-----------------------------------
  96.      * 在 LVGL 中注册显示设备
  97.      *----------------------------------*/

  98.     static lv_disp_drv_t disp_drv;                  /* 显示设备的描述符 */
  99.     lv_disp_drv_init(&disp_drv);                    /* 初始化为默认值 */

  100.     /* 建立访问显示设备的函数  */

  101.     /* 设置显示设备的分辨率
  102.      * 这里为了适配正点原子的多款屏幕,采用了动态获取的方式,
  103.      * 在实际项目中,通常所使用的屏幕大小是固定的,因此可以直接设置为屏幕的大小 */
  104.     disp_drv.hor_res = lcddev.width;
  105.     disp_drv.ver_res = lcddev.height;

  106.     /* 用来将缓冲区的内容复制到显示设备 */
  107.     disp_drv.flush_cb = disp_flush;

  108.     /* 设置显示缓冲区 */
  109.     disp_drv.draw_buf = &draw_buf_dsc_1;

  110.     /* 全尺寸双缓冲区示例)*/
  111.     //disp_drv.full_refresh = 1

  112.     /* 如果您有GPU,请使用颜色填充内存阵列
  113.      * 注意,你可以在 lv_conf.h 中使能 LVGL 内置支持的 GPUs
  114.      * 但如果你有不同的 GPU,那么可以使用这个回调函数。 */
  115.     //disp_drv.gpu_fill_cb = gpu_fill;

  116.     /* 注册显示设备 */
  117.     lv_disp_drv_register(&disp_drv);
  118. }

  119. /**********************
  120. *   STATIC FUNCTIONS
  121. **********************/

  122. /**
  123. * @brief       初始化显示设备和必要的外围设备
  124. * @param       无
  125. * @retval      无
  126. */
  127. static void disp_init(void)
  128. {
  129.     /*You code here*/
  130.     lcd_init();         /* 初始化LCD */
  131.     lcd_display_dir(1); /* 设置横屏 */
  132. }

  133. /**
  134. * @brief       将内部缓冲区的内容刷新到显示屏上的特定区域
  135. *   [url=home.php?mod=space&uid=60778]@note[/url]      可以使用 DMA 或者任何硬件在后台加速执行这个操作
  136. *              但是,需要在刷新完成后调用函数 'lv_disp_flush_ready()'
  137. *
  138. * @param       disp_drv    : 显示设备
  139. *   @arg       area        : 要刷新的区域,包含了填充矩形的对角坐标
  140. *   @arg       color_p     : 颜色数组
  141. *
  142. * @retval      无
  143. */
  144. static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
  145. {
  146.     /* LVGL 官方给出的一个打点刷新屏幕的例子,但这个效率是最低效的 */

  147. //    int32_t x;
  148. //    int32_t y;
  149. //    for(y = area->y1; y <= area->y2; y++) {
  150. //        for(x = area->x1; x <= area->x2; x++) {
  151. //            /*Put a pixel to the display. For example:*/
  152. //            /*put_px(x, y, *color_p)*/
  153. //            color_p++;
  154. //        }
  155. //    }

  156. //    /* 在指定区域内填充指定颜色块 */
  157.     lcd_color_fill(area->x1, area->y1, area->x2, area->y2, (uint16_t *)color_p);
  158. //    lcd_draw_fast_rgb_color(area->x1,area->y1,area->x2,area->y2,(uint16_t*)color_p);

  159.     /* 重要!!!
  160.      * 通知图形库,已经刷新完毕了 */
  161.     lv_disp_flush_ready(disp_drv);
  162. }

  163. /* 可选: GPU 接口 */

  164. /* 如果你的 MCU 有硬件加速器 (GPU) 那么你可以使用它来为内存填充颜色 */
  165. /**
  166. * @brief       使用 GPU 进行颜色填充
  167. *   @note      如有 MCU 有硬件加速器 (GPU),那么可以用它来为内存进行颜色填充
  168. *
  169. * @param       disp_drv    : 显示设备
  170. *   @arg       dest_buf    : 目标缓冲区
  171. *   @arg       dest_width  : 目标缓冲区的宽度
  172. *   @arg       fill_area   : 填充的区域
  173. *   @arg       color       : 颜色数组
  174. *
  175. * @retval      无
  176. */
  177. //static void gpu_fill(lv_disp_drv_t * disp_drv, lv_color_t * dest_buf, lv_coord_t dest_width,
  178. //                    const lv_area_t * fill_area, lv_color_t color)
  179. //{
  180. //    /*It's an example code which should be done by your GPU*/
  181. //    int32_t x, y;
  182. //    dest_buf += dest_width * fill_area->y1; /*Go to the first line*/

  183. //    for(y = fill_area->y1; y <= fill_area->y2; y++) {
  184. //        for(x = fill_area->x1; x <= fill_area->x2; x++) {
  185. //            dest_buf[x] = color;
  186. //        }
  187. //        dest_buf+=dest_width;    /*Go to the next line*/
  188. //    }
  189. //}


  190. #else /*Enable this file at the top*/

  191. /*This dummy typedef exists purely to silence -Wpedantic.*/
  192. typedef int keep_pedantic_happy;
  193. #endif

  194. 改成这个样强制地址可以使用正常显示,但是用mymalloc就出问题,很明显这原子官方代码这地方问题很大
复制代码
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

39

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
380
金钱
380
注册时间
2012-7-23
在线时间
24 小时
发表于 2025-1-23 16:26:03 | 显示全部楼层
以前在论坛就说过,他们提供的程序用sram报错,自己改过来了。但是界面切换还是卷帘。用他们的综合示例也是如此。
回复

使用道具 举报

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

本版积分规则

关闭

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

正点原子公众号

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

GMT+8, 2025-1-31 14:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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