startup_stm32h750xx.s 修改如下

  .section  .text.Reset_Handler
  .weak  Reset_Handler
  .type  Reset_Handler, %function
Reset_Handler:
  ldr   sp, =_estack      /* set stack pointer */

  bl LL_SDRAM_Config    /*  此处跳转到SDRAM初始化,这部分代码不依赖HAL库,纯寄存器实现   */
  /*    现在SDRAM配置好了,可以使用把代码拷贝到SDRAM中了   */
/*      以下是添加的代码        */

  ldr r0 ,=__sdram_code_rom_start     /* 预备放在 SDRAM 的代码 加载 在 FLASH 当中,需要加载到 SDRAM 中数据的起始地址到 R0 */
  ldr r1 ,=_s_sdram_code_data         /* 加载 SDRAM 第一个函数的起始放置位置到 R1 */
  ldr r2 ,=__sdram_code_size          /* 加载 SDRAM 代码总长度 的大小到 R2 */
  add r2 , r1, r2               /* R1 加 R2 的值 放到 R2 */

1:
  cmp r2, r1                    /* 比较 R1 与 R2 */
  beq 2f                        /* 如果上面的比较之后是相等的 则跳转到标签 2  */
  ldr r3 ,[r0],#4               /*  将 R0 寄存器里面存放的地址处的代码,写入到 R3 寄存器里面。然后 R0 + 4 */
  str r3 ,[r1],#4               /* 将R3中的数据写入以R1为地址的存储器中,然后 R1 + 4*/
  b 1b                          /* 调回到标签 1,循环拷贝 */
2:

/*      以上是添加的代码        */


/* Call the ExitRun0Mode function to configure the power supply */
  bl  ExitRun0Mode
/* Call the clock system initialization function.*/
  bl  SystemInit
STM32H750XX_FLASH.ld 修改如下
MEMORY
{
DTCMRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K
RAM (xrw)      : ORIGIN = 0x24000000, LENGTH = 512K
RAM_D2 (xrw)      : ORIGIN = 0x30000000, LENGTH = 288K
RAM_D3 (xrw)      : ORIGIN = 0x38000000, LENGTH = 64K
ITCMRAM (xrw)      : ORIGIN = 0x00000000, LENGTH = 64K
FLASH (rx)      : ORIGIN = 0x90000000, LENGTH = 8M
SDRAM (xrw)     : ORIGIN = 0xC0000000 , LENGTH = 32M
}
.SDRAM_CODE(NOLOAD) :
  {
      . = ALIGN(8);
      _s_sdram_code_data = .;            /* 段起始地址 */
      *(.SDRAM_CODE)              /*    */
      . = ALIGN(8);
      _e_sdram_code_data = .;            /* 段起始地址 */
  } > SDRAM AT>FLASH
  __sdram_code_rom_start = LOADADDR(.SDRAM_CODE);     /*  记录程序烧录在FLASH中的起始地址      */
  __sdram_code_size = SIZEOF(.SDRAM_CODE);            /*  上电运行汇编加载代码的时候加载到ITCM     */

使用如下

__attribute__((section(".SDRAM_CODE"))) __attribute__((align(4))) void test(void* p)
{
    while (1)
    {
        // HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        // HAL_Delay(300);
        //
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
        // HAL_Delay(300);
        HAL_Delay(1000);
        HAL_UART_Transmit(&huart1 , (uint8_t*)"Start\r\n" , 7 , 0x200);
    }
}

编译如下,可以看到代码大小

最后补上MPU配置

void MPU_Config(void)
{
  MPU_Region_InitTypeDef MPU_InitStruct = {0};

  /* Disables the MPU */
  HAL_MPU_Disable();

  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.BaseAddress = 0x0;
  MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
  MPU_InitStruct.SubRegionDisable = 0x0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);

  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER1;
  MPU_InitStruct.BaseAddress = 0x90000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_8MB;
  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);

  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER2;
  MPU_InitStruct.BaseAddress = 0xC0000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_32MB;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);

  /** Initializes and configures the Region and the memory to be protected
  */
  MPU_InitStruct.Number = MPU_REGION_NUMBER3;
  MPU_InitStruct.BaseAddress = 0x24000000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;

  HAL_MPU_ConfigRegion(&MPU_InitStruct);
  /* Enables the MPU */
  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);

}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐