GD32F303闪存flash

GD32f303 FLASH

在这里插入图片描述

芯片 RAM总容量 FLASH大小 启动文件
GD32F303RCT6 GD32F30x_HD 48K (256K) 属于高密度产品(256K~512K) startup_gd32f30x_hd.s
GD32F303RET6 GD32F30x_HD 64K (256K+256K) 属于高密度产品(256K~512K) startup_gd32f30x_hd.s
GD32f303RGT6 GD32F30x_XD 96K (256K+768K) 0 ~ 127、256 ~ 448页 属于超高密度产品(大于512K) startup_gd32f30x_xd.s
GD32F305xx GD32F307xx GD32F30x_CL 属于互联性产品 startup_gd32f30x_cl.s
  • 对于GD32F30x_CL和GD32F30x_XD,使用了两片闪存,前512KB容量在第一片闪存(bank0)中,后续的容量在第二片闪存(bank1)中;
  • 在闪存的前256K字节空间内,CPU执行指令零等待,在此范围外,CPU读取指令存在较长延时;
  • 对于主存储闪存容量不多于512KB的GD32F30x_CL和GD32F30x_HD,只使用了bank0。
  • 对于GD32F30x_CL和- GD32F30x_HD,GD32F30x_XD,bank0的闪存页大小为2KB,bank1的闪存页大小为4KB;

FLASH读写操作

视频链接

将图片数据与字库存放在指定flash地址

使用芯片GD32f303RGT6

在这里插入图片描述
FLASH地址分布
在这里插入图片描述

针对GD32这种,后面有1片慢速FLASH的情况,都把静态资源放到blank1上。

使用分散加载

方法1(定义时指定地址)

将LVGL图片image_comp_map(存储符号的图像)数组定义到0X8040000上

const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_IMAGE_COMP uint8_t image_comp_map[] __attribute__((at(0X8040000))) = {
    
    
}

将LVGL图片image_language_map(存储符号的图像)数组定义到0X8042000上

const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_IMAGE_LANGUAGE uint8_t image_language_map[] __attribute__((at(0X8042000))) = {
    
    
}

将LVGL图片image_laser_map(存储符号的图像)数组定义到0X8044000上

const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_IMAGE_LASER uint8_t image_laser_map[] __attribute__((at(0X8044000))) = {
    
    
}

将LVGL图片image_rotate_map(存储符号的图像)数组定义到0X8046000上

const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_IMAGE_ROTATE uint8_t image_rotate_map[] __attribute__((at(0X8046000))) = {
    
    
}

将LVGL图片image_touch_map(存储符号的图像)数组定义到0X8048000上

const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_IMAGE_TOUCH uint8_t image_touch_map[] __attribute__((at(0X8048000))) = {
    
    
}

将LVGL字库(存储符号的图像)数组定义到0X804A000上

static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] __attribute__((at(0X8040000))) = {
    
    
  /* U+20 " " */
    0x0,

    /* U+2b "+" */
    0x0, 0x1, 0xe5, 0x0, 0x0, 0x0, 0x1e, 0x50,
    0x0, 0x0, 0x1, 0xe5, 0x0, 0x7, 0xaa, 0xbf,
    0xca, 0xa7, 0x7a, 0xab, 0xfc, 0xaa, 0x70, 0x0,
    0x1e, 0x50, 0x0, 0x0, 0x1, 0xe5, 0x0, 0x0,
    0x0, 0x1e, 0x50, 0x0,

    /* U+2d "-" */
    0x7a, 0xaa, 0xaa, 0xaa, 0x77, 0xaa, 0xaa, 0xaa,
    0xa7,
};

查看map文件,字库数组(全局变量区)与图片数组(静态局部变量)均存放在了指定地址
在这里插入图片描述
在这里插入图片描述

方法2(使用分散加载文件)

在这里插入图片描述

LR_IROM1 0x08000000 0x00040000  {
    
        ; load region size_region
  ER_IROM1 0x08000000 0x00040000  {
    
      ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00018000  {
    
      ; RW data
   .ANY (+RW +ZI)
  }
}

LR_IROM2 0x08040000 0x000c0000   {
    
                  ;load region size_region
  ER_IROM2 0x08040000 0x000c0000 {
    
                  ;load address = execution address
    lcd.O (LCD_Clear) 						
    ili9320.O(ili9320_Initializtion)        ; ili9320.O 表示函数所在的文件生成的.O 文件
    ili9320.O(ili9320_Clear)                ;ili9320_Clear 表示需要分散加载的目标,名字可以随,
  }                                           ;为了方便区分,我们都按照原本的函数名或者是数组名命名。
} 

给函数添加 section 申明,在函数定义之外添加如下代码。

void LCD_Clear(void) __attribute__((section ("LCD_Clear")));
void ili9320_Initializtion(void) __attribute__((section ("ili9320_Initializtion")));
void ili9320_Clear(void) __attribute__((section ("ili9320_Clear")));

猜你喜欢

转载自blog.csdn.net/m0_37187962/article/details/125788614