polmon
August 12, 2019, 10:27am
1
Description
stm32f746_discovery_no_os demo program hard faults when i try to rotate the display.
What MCU/Processor/Board and compiler are you using?
STM32 F746 discovery board + SW4STM32 IDE
What do you want to achieve?
I want to rotate the display clock wise by 90 Deg.
What have you tried so far?
I tested this feature in the simulator and it works fine. I changed the following things in the simulator.
in win_drv.c
disp_drv.rotated = 1;
in lv_drv_conf.h
define WINDOW_HOR_RES 272
define WINDOW_VER_RES 480
in lv_conf.h
#define LV_HOR_RES_MAX (272)
#define LV_VER_RES_MAX (480)
When i make similar changes in the STM32 program, i get a hard fault.
What could be the issue?
Thanks
2 Likes
LV_HOR_RES_MAX is used as size of a line buffer. After rotation the line length is 480, so either use landscape as default orientation or use 480 for both HOR and RES
The rotated
option requires additional logic in the driver which I haven’t implemented yet, so it’s not going to work at the moment. Sorry about that.
@beppone : @polmon already mentioned that he has changed the appropriate define
s to the correct values.
polmon
August 12, 2019, 12:24pm
5
Can i rotate the buf_to_flush array while copying to my_fb?
You can, just read buf_to_flush
column-by-column instead of it’s row-by-row.
polmon
August 14, 2019, 12:23pm
7
I have tried the following code to read col by col. But i cant seem to find the issue.
I made the screen into a 272 x 272 square.
for (x_fill_act = x1_flush ; x_fill_act <= x2_flush; x_fill_act++)
{
for(y_fill_act = act_y1; y_fill_act <= y2_fill; y_fill_act ++)
{
memcpy((uint32_t)&my_fb[(271 - x_fill_act) * 272 + y_fill_act], (uint32_t)(buf_to_flush + (272*y_fill_act + x_fill_act)),2);
}
}
polmon
August 14, 2019, 6:58pm
8
I managed to get it ALMOST working with the following code.
for (x_fill_act = x2_flush ; x_fill_act >= x1_flush; x_fill_act--)
{
for(y_fill_act = act_y1; y_fill_act <= y2_fill; y_fill_act ++)
{
memcpy((uint32_t)&my_fb[(271 - x_fill_act) * (272) + y_fill_act], (uint32_t)(buf_to_flush + x_fill_act + (y_fill_act - act_y1)*(x2_flush - x1_flush + 1)),2);
}
}
However there is still some issue with the copying algorithm. I get the following issue in the attached picture.
Later today I’ll create an an example rotate function.
1 Like
Here is the code which worked me in the simulator:
void get_col(const lv_color_t * src, const lv_area_t * area, lv_coord_t y, lv_color_t * dest)
{
lv_coord_t w = lv_area_get_width(area);
lv_coord_t h = lv_area_get_height(area);
lv_coord_t i;
for(i = 0; i < h; i++) {
dest[i].full = src[y].full;
src += w ;
}
}
void monitor_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
{
lv_coord_t x2 = area->x2;
if(x2 >= disp_drv->ver_res) x2 = MONITOR_VER_RES - 1;
lv_color_t * dest = (lv_color_t *)monitor.tft_fb;
dest += MONITOR_HOR_RES * (MONITOR_VER_RES - 1);
dest -= MONITOR_HOR_RES * area->x1;
lv_coord_t x;
for(x = area->x1; x <= x2; x++) {
get_col(color_p, area, (x - area->x1), dest + area->y1);
dest -= MONITOR_HOR_RES;
}
}
1 Like
polmon
August 15, 2019, 5:35pm
11
Works like a charm! Thank you!
Great!
It was already asked a lot times. Good to know that there is a working reference code now.
polmon can you post your results?
what is monitor.tft_fb and how to define it?
It’s the target frame buffer.
However now display rotation is available as built-in feature too. See Display interface — LVGL documentation
1 Like
Hi,
What is this “monitor.tft_fb” buffer, And where should I get its location in LVGL 9.1.1
It’s an old topic. Please open a new topic one to describe what you are trying to achieve and with which LVGL version.
New thread created, Please follow below link
opened 10:21PM - 14 Mar 24 UTC
closed 05:39AM - 30 Mar 24 UTC
stale
### LVGL version
v9.0.0
### What happened?
emoji_F617 is defined in more than… one source file:
`test_img_emoji_F617.c`
`lv_example_imgfont_1.c`
So, by calling` LV_IMAGE_DECLARE(emoji_F617); `you will encounter a "multiple definition" linker error.
### How to reproduce?
_No response_
yes in rk3566 i meet the same problem