cancel
Showing results for 
Search instead for 
Did you mean: 

STM32H7 Dual Core MCU CM4 FLASH 0x081E0000

snnzdmr1
Associate III

Hello ,
I am working with stm32h747.

M4 .ld File

FLASH (rx) : ORIGIN = 0x08100000, LENGTH = 1024K

M7 .ld File

FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K

With the above settings I can run Core M7 and M4 properly.
I need more flash on the m7 side and I want to separate the flash as follows

M4 .ld File

FLASH (rx) : ORIGIN = 0x081E0000, LENGTH = 128K

M7 .ld File

FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1896K
I also make adjustments with cube programer as in the picture.b.pnga.png

Core m7 works but m4 doesn't seem to work.I think I'm missing something or doing something wrong. Can you help me?
Codes are as follows

CM4 Main  Code : 

int main(void)
{
  MPU_Config();
  __HAL_RCC_HSEM_CLK_ENABLE();
  HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_0));
  HAL_PWREx_ClearPendingEvent();
  HAL_PWREx_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFE, PWR_D2_DOMAIN);
  __HAL_HSEM_CLEAR_FLAG(__HAL_HSEM_SEMID_TO_MASK(HSEM_ID_0));

  HAL_Init();
  MX_MDMA_Init();
  MX_DMA_Init();
  MX_GPIO_Init();
  MX_SPI1_Init();
  while (1)
  {
  HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);
  HAL_Delay(100);
  }
}
​

CM7 Main  Code :
int main(void)
{

  int32_t timeout;
  MPU_Config();
  SCB_EnableICache();
  SCB_EnableDCache();
   timeout = 0xFFFF;
   while((__HAL_RCC_GET_FLAG(RCC_FLAG_D2CKRDY) == RESET) && (timeout-- > 0));

  HAL_Init();
  SystemClock_Config();
  PeriphCommonClock_Config();
__HAL_RCC_HSEM_CLK_ENABLE();
HAL_HSEM_FastTake(HSEM_ID_0);
HAL_HSEM_Release(HSEM_ID_0,0);
timeout = 0xFFFF;
while((__HAL_RCC_GET_FLAG(RCC_FLAG_D2CKRDY) == RESET) && (timeout-- > 0));
if ( timeout < 0 )
{
Error_Handler();
}


  MX_GPIO_Init();
  while (1)
  {
  HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_1);
  HAL_Delay(100);
  }
}
13 REPLIES 13

I think you can also get the CM7 to start the CM4 side.

Or create a unified image, where say the startup code can detect which core it's running on, and fork to the code/vector space each uses, with the SystemInit() code then establishing where the SCB->VTOR lives.

ST has an annoying habit of using #defines for this independently of the Linker Script, but you can use symbols, ie g_pfnVectors to establish this on-the-fly. Look at your SystemInit() code in system_stm32xyz.c

Tips, Buy me a coffee, or three.. PayPal Venmo
Up vote any posts that you find helpful, it shows what's working..

You can use the project as is ... you need just to check the power config SMPS or LDO.

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.

My configs

- 400 MHz M7

- 200 MHz M4

HSE : Crystal/Ceramic Resonator.

Supply source : PWR_DIRECT_SMPS_SUPPLY

Power Regulator Voltage Scale : Power Regulator Voltage Scale 1. (Scale 2 and 3 inactive )

No matter your clock config is the example I shared should work as I used the internal clock. The only think to take care of is the power config. As your project is setting SMPS power config you can use the project as is without any modification. The idea is to check two things: your MCU is OK and also to confim what I've explained previously from linker standpoint.

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.