GD32H7 内部 ram 使用 分散加载 配置 详述

1.对ram使用自己编辑的 链接文件重新配置

由于官网没有完全分配出所有的ram,这里自己编辑个全部的,方便自己区分与调用。

 1 ; *************************************************************
 2 ; *** Scatter-Loading Description File generated by uVision ***
 3 ; *************************************************************
 4 ; 参考链接: https://www.armbbs.cn/forum.php?mod=viewthread&tid=98697&extra=&page=1
 5 
 6 LR_IROM1 0x08040000 0x000C0000  {    ; load region size_region
 7   ER_IROM1 0x08040000 0x000C0000  {  ; load address = execution address
 8    *.o (RESET, +First)
 9    *(InRoot$$Sections)
10    .ANY (+RO)
11    .ANY (+XO)
12   }
13   
14   ;数据DTCM(128K),来自共享 RAM,其起始地址 0x24080000
15   RW_RAM1 0x20000000 0x00020000  {  ; RW data
16    .ANY (+RW +ZI)
17    ;*(.dtcm_sram)
18   }
19   
20   ;网络接收描述符使用 16k + 16k
21   RW_RAM2 0x30000000 0x00004000  {    ; SRAM0
22    .ANY (+RW +ZI)
23    *(.sram0_nocache)    ;自定义 section 的执行域 放入 ram 中
24   }
25   
26   RW_RAM3 0x30004000 0x00004000  {    ; SRAM1
27    .ANY (+RW +ZI)
28    *(.sram1_nocache)    
29   }
30   
31   ;备份域BKPRAM(4K)
32   RW_RAM4 0x38800000 0x00001000  {    ; BKPRAM
33    .ANY (+RW +ZI)
34    ;*(.backup_sram)
35   } 
36   
37   ;共享 RAM(总512KB-ITCM(64k)-DTCM(128k)=320k),
38   ;其实际为(ITCM+DTCM+AXI SRAM)共享,地址顺序ITCM->DTCM->AXI SRAM,起始地址 0x24080000
39   RW_RAM5 0x240B0000 0x00050000  {    ; SHARE RAM
40    .ANY (+RW +ZI)
41    ;*(.share_sram)
42   }
43   
44   ;AXI SRAM(512KB)
45   RW_IRAM1 0x24000000 0x00080000  {    ; AXI SRAM
46    .ANY (+RW +ZI)
47    ;*(.axi_sram)
48   }
49   
50   ;指令ITCM(64k),来自共享 RAM,其起始地址 0x24080000
51   RW_IRAM2 0x00000000 0x00010000  {    ; ITCM
52    .ANY (+RW +ZI)
53    ;*(.itcm_sram)
54   }
55 }

对网络的修改使用的 32k cache配置为透传模式;

    /* 保护整个SRAM0,共16K字节 */
    /* Configure the DMA descriptors and Rx/Tx buffer*/
    mpu_set_protection( 0x30000000,                 /* 基地址 */
                                            MPU_REGION_SIZE_16KB,       /* 长度 */
                                            MPU_REGION_NUMBER3, MPU_INSTRUCTION_EXEC_PERMIT,      /* NUMER3,允许指令访问 */
                                            MPU_AP_FULL_ACCESS,         /* 全访问 */
                                            MPU_TEX_TYPE0,              /* 类型扩展域0 */  
                                            MPU_ACCESS_NON_SHAREABLE,   /* 禁止共用 */
                                            MPU_ACCESS_NON_CACHEABLE,   /* 禁止cache */
                                            MPU_ACCESS_BUFFERABLE);     /* 允许缓冲 */
                                            
    /* 保护整个SRAM1,共16K字节 */
    /* 没有使用系统时,作为LwIP RAM heap,在 LWIP_RAM_HEAP_POINTER 处定义*/
    mpu_set_protection( 0x30004000,                 /* 基地址 */
                                            MPU_REGION_SIZE_16KB,       /* 长度 */
                                            MPU_REGION_NUMBER4, MPU_INSTRUCTION_EXEC_PERMIT,      /* NUMER4,允许指令访问 */
                                            MPU_AP_FULL_ACCESS,         /* 全访问 */
                                            MPU_TEX_TYPE1,              /* 类型扩展域1 */  
                                            MPU_ACCESS_NON_SHAREABLE,   /* 禁止共用 */
                                            MPU_ACCESS_NON_CACHEABLE,   /* 禁止cache */
                                            MPU_ACCESS_BUFFERABLE);     /* 允许缓冲 */

自定义该部分后,对网络描述符 可以方便的按照字符定义,在配置时不用手动计算其大小。注意: ac5和ac6编译器有所区别,且总体大小不能超过16k

#if defined(GD32H7XX)

#if defined   (__CC_ARM)                                    /*!< ARM compiler */
//__attribute__((section(".ARM.__at_0x30000000")))  enet_descriptors_struct  rxdesc_tab[ENET_RXBUF_NUM];        /*!< ENET RxDMA descriptor */
//__attribute__((section(".ARM.__at_0x30000160")))  enet_descriptors_struct  txdesc_tab[ENET_TXBUF_NUM];        /*!< ENET TxDMA descriptor */
//__attribute__((section(".ARM.__at_0x30000300")))  uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE];           /*!< ENET receive buffer */
//__attribute__((section(".ARM.__at_0x30002100")))  uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE];           /*!< ENET transmit buffer */

__attribute__((section(".sram0_nocache"),zero_init));  enet_descriptors_struct  rxdesc_tab[ENET_RXBUF_NUM];        /*!< ENET RxDMA descriptor */
__attribute__((section(".sram0_nocache"),zero_init));  enet_descriptors_struct  txdesc_tab[ENET_TXBUF_NUM];        /*!< ENET TxDMA descriptor */
__attribute__((section(".sram0_nocache"),zero_init));  uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE];           /*!< ENET receive buffer */
__attribute__((section(".sram0_nocache"),zero_init));  uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE];           /*!< ENET transmit buffer */

#elif defined ( __ICCARM__ )                                /*!< IAR compiler */
#pragma location=0x30000000
enet_descriptors_struct  rxdesc_tab[ENET_RXBUF_NUM];        /*!< ENET RxDMA descriptor */
#pragma location=0x30000160
enet_descriptors_struct  txdesc_tab[ENET_TXBUF_NUM];        /*!< ENET TxDMA descriptor */
#pragma location=0x30000300
uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE];           /*!< ENET receive buffer */
#pragma location=0x30002100
uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE];           /*!< ENET transmit buffer */

#elif defined (__GNUC__)        /* GNU Compiler */
//enet_descriptors_struct  rxdesc_tab[ENET_RXBUF_NUM] __attribute__((section(".ARM.__at_0x30000000")));          /*!< ENET RxDMA descriptor */
//enet_descriptors_struct  txdesc_tab[ENET_TXBUF_NUM] __attribute__((section(".ARM.__at_0x30000160")));          /*!< ENET TxDMA descriptor */
//uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE]    __attribute__((section(".ARM.__at_0x30000300")));          /*!< ENET receive buffer */
//uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE]    __attribute__((section(".ARM.__at_0x30002100")));          /*!< ENET transmit buffer */

enet_descriptors_struct  rxdesc_tab[ENET_RXBUF_NUM] __attribute__((section(".sram0_nocache")));          /*!< ENET RxDMA descriptor */
enet_descriptors_struct  txdesc_tab[ENET_TXBUF_NUM] __attribute__((section(".sram0_nocache")));          /*!< ENET TxDMA descriptor */
uint8_t rx_buff[ENET_RXBUF_NUM][ENET_RXBUF_SIZE]    __attribute__((section(".sram0_nocache")));          /*!< ENET receive buffer */
uint8_t tx_buff[ENET_TXBUF_NUM][ENET_TXBUF_SIZE]    __attribute__((section(".sram0_nocache")));          /*!< ENET transmit buffer */

#endif /* __CC_ARM */

编译后查看 map 分配文件:

确实分配到了 RW_RAM2  区域。这样使用芯片的另外一个mac 就可以分配到 RW_RAM3 ,或者也可将其他不需要cache的变量分配到该区域。

2.其片上 SRAM 存储器配置详述:
  GD32H7xx系列的设备包含高达512KB的片上SRAMAXI SRAM)、 4KB的备份SRAM和高达512KBITCM/DTCM/AXI SRAM共享RAM

所有AHB SRAM都支持字节、半字(16位)和字(32位)访问。片上SRAMAXI SRAM)支持字节、半字(16位)、字(32位)和双字(64位)访问。

几乎所有AHB主机都可以访问SRAM0SRAM1。备份SRAMBKPRAM)在备份域中实现,即使VDD电源关闭,它也可以保留其内容。

 

查看该部分选项字默认参数:

可知该MCU默认 ITCM为64k,DTCM为128k。

2.1 其内部分配的详细地址分配如下:

2.1.1 外部 RAM:

2.1.1 内部 RAM:

该部分包括SRAM0,SRAM1。这两个地址联系,可以直接当作一款连续的内存使用;

共享RAM,为 ITCM+DTCM共享使用,和地址0x2000 0000 映射DTCM与 0x0000 0000 映射ITCM相关;

AXI SRAM 为独立RAM.

最后一部分为ITCM 来自上述的共享RAM。

posted @ 2023-12-13 15:47  求隐  阅读(639)  评论(1编辑  收藏  举报