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")));