STM32H750 将代码加载到外部SDRAM中执行
·
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);
}
更多推荐
所有评论(0)