Loading...
 

SW4STM32 and SW4Linux fully supports the STM32MP1 asymmetric multicore Cortex/A7+M4 MPUs

   With System Workbench for Linux, Embedded Linux on the STM32MP1 family of MPUs from ST was never as simple to build and maintain, even for newcomers in the Linux world. And, if you install System Workbench for Linux in System Workbench for STM32 you can seamlessly develop and debug asymmetric applications running partly on Linux, partly on the Cortex-M4.
You can get more information from the ac6-tools website and download (registration required) various documents highlighting:

System Workbench for STM32


You are viewing a reply to Bootloader and Application Code  

Bootloader and Application Code

Thank you for your answers

Sadly I still can’t figure it out.
I included before the jump is executed:
SCB->VTOR = memoryAddress;

When I step through the jump_to function everything seems to be fine.
Just before the SysMemBootJump() it looks like this:

MSP: 0x20010000
PSP: 0x4ef1c2ac
PRIMASK: 1
CONTROL: 0
SCB->VTOR: 0x8012000
SysMemBootJump(): 0x0801C509

And the memory at address 0x0812000:

0x08012000:0x200100000x0801C509


The application should flash an led after the jump is completed but it doesn’t.
It does not lock up but it is stuck in an infinite loop. I disassembled the instructions and it looks like this:

0x8012dfc: mov sp, r7
0x8012dfe: pop {r7}
0x8012e00: bx lr
0x801a1f0: mov r3, r0
0x801a1f2: and.w r3, r3, #512  ; 0x200
0x801a1f6: cmp r3, #0
0x801a1f8: beq.n 0x801a1ea
0x801a1ea: ldr r0, pc, #20  ; (0x801a200)
0x801a1ec: bl 0x8012dec
0x8012dec: push {r7}
0x8012dee: sub sp, #12
0x8012df0: add r7, sp, #0
0x8012df2: str r0, r7, #4
0x8012df4: ldr r3, r7, #4
0x8012df6: ldr r3, r3, #40  ; 0x28
0x8012df8: mov r0, r3
0x8012dfa: adds r7, #12
0x8012dfc: mov sp, r7
...

Notice that the last command is also the first.
I’m not sure if this helps.

I am using an STM32F107, I don’t know if and how I can disable the data and instruction caches.

Thanks again for your help

France

Hi,

I don’t know exactly what washappening, but th ecode you are looping in seems to be that you are looking at an I/O device (its address seems to be in memory at address 0x801a200) waiting for bit 9 (0x200) of register at offset 40 (0x28) in this device to be set and, as this bit is never set, you loop indefinitly.

Now without more information, nobody can help you...

Anyway, does your application works correctly if started through the debugger?

Bernard (Ac6)