S32K312 jumping to application but callbacks not working

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

S32K312 jumping to application but callbacks not working

ソリューションへジャンプ
1,930件の閲覧回数
Vishnu3
Contributor III

Hi All,

I was able to use the code provided in the link(thanks a ton for that) and my bootloader is jumping to the application address (0x00500000). In the application I am blinking an LED in a while loop and it is executing properly. However, now there is a new issue:

 

When I added UART callback in my application code, along with the blinking LED, it works fine when I am testing it by flashing it into my board using Design Studio. However when I flash it through my bootloader and jump to the application, the LED blinks, however, the UART callback is not triggered. I suspect that the IVT is not being initialized properly and thus the UART callback is not working.

Following is my jump to application code: [Using RTD 2.0.0]

void Jump(uint32 address_location){

 

  uint32 ADDR_APP = address_location;
  Intrrupt_DeInit();
  __asm("cpsid i");
  S32_SCB->VTOR =ADDR_APP;

 

  __asm("ldr  r0, =0x00500000");
  __asm("msr msp, r0");

 

  func = *(uint32 volatile *)(ADDR_APP + 0xC);
  func = *(uint32 volatile *)(((uint32)func) + 0x4);
  func = (((uint32)func) & 0xFFFFFFFEU | 1U);
  (* (void (*) (void)) func)();
}

 

My application linker file is set to start at 0x00500000. This is the only change I have made in the application project (the one with LED and UART). I have not made any changes to the startup code. 

Any pointers will be really appreciated. Been at it for almost a week now. This is the only blocking point in my application  @VaneB created this new post considering that it is a new topic.

0 件の賞賛
返信
1 解決策
1,669件の閲覧回数
Vishnu3
Contributor III

Closing this thread. It has been solved:

The issue was that the Interrupt vector pending register (0xE000D004) did not get reset. This is because the jump to application was executing from the callback, thus, the program was not exiting the callback. For some reason a Interrupt clear pending API does not clear this interrupt pending register until and unless the program completely exits from the ISR callback.

Instead of jumping from the callback, I set a flag in there and then de-initailized the interrupt and only after exiting the callback (the interrupt vector pending register is cleared thenceforth) I jump to my application code. Thank you  VaneB for all the support and information.

 

Best,

Vishnu

元の投稿で解決策を見る

0 件の賞賛
返信
12 返答(返信)
1,805件の閲覧回数
Vishnu3
Contributor III

Hi VaneB,

 

Some update on this issue. This problem is not particular to bootloader. I took a simple application and added a CAN callback. In the callback I am using the same jump to application code to jump back to the start of the application (like a reset). Once the application starts again, the callbacks do not work. I am not reconfiguring the stack pointer in my jump to application code and I think that is causing the issue. How can I reinitialize my stack pointer before the jump?

Best,

Vishnu

0 件の賞賛
返信
1,797件の閲覧回数
Vishnu3
Contributor III

Okay, I reconfigured my stack pointer and checked it. But no improvement, the callback does not trigger. Is there any interrupt registers that I maybe overlooking and it needs to be reset?

 

Best,

 

0 件の賞賛
返信
1,795件の閲覧回数
Vishnu3
Contributor III

okay, latest update: The interrupts don't work at all when the debugger is not connected. I have been running my application and bootloader code always with the debugger connected. 

0 件の賞賛
返信
1,790件の閲覧回数
Vishnu3
Contributor III
working now, moved to RTD 2.0.0
0 件の賞賛
返信
1,789件の閲覧回数
Vishnu3
Contributor III
The interrupt callback still not working in RTD 2.0.0.
0 件の賞賛
返信
1,752件の閲覧回数
VaneB
NXP TechSupport
NXP TechSupport

Hi @Vishnu3 

Could you please verify with the registers if the interrupts are correctly set? 

If the application code sets the S32_SCB->VTOR properly, also, check that the startup function is correctly placed. This is done in your linker file.

0 件の賞賛
返信
1,741件の閲覧回数
Vishnu3
Contributor III

Hi Vane,

I have checked the interrupt registers and they are being set the same as when the application starts. S32_SCB->VTOR is set to 0x20000000 in the startup file. The vector table is copied to this location from 0x00500800 where it is defined in the program flash memory in the linker file. I have also checked that the address of the ISR is also defined correctly in the vector table.

 

Best,

Vishnu 

0 件の賞賛
返信
1,670件の閲覧回数
Vishnu3
Contributor III

Closing this thread. It has been solved:

The issue was that the Interrupt vector pending register (0xE000D004) did not get reset. This is because the jump to application was executing from the callback, thus, the program was not exiting the callback. For some reason a Interrupt clear pending API does not clear this interrupt pending register until and unless the program completely exits from the ISR callback.

Instead of jumping from the callback, I set a flag in there and then de-initailized the interrupt and only after exiting the callback (the interrupt vector pending register is cleared thenceforth) I jump to my application code. Thank you  VaneB for all the support and information.

 

Best,

Vishnu

0 件の賞賛
返信
1,900件の閲覧回数
VaneB
NXP TechSupport
NXP TechSupport

Hi @Vishnu3 

Please try by starting your debugger, running the bootloader, and letting it call your app. When the app fails, pause the debugger and see where you are. Then, try to figure out how you got there. 

Hint: What steps does the CPU take when it gets an interrupt? And from where does it fetch whatever data it needs to do that? And what data is there? It is just a guess of how you generate your code, but this may help you find the answer.

Also, ensure the application code sets the S32_SCB->VTOR properly.

 

B.R.

VaneB

0 件の賞賛
返信
1,896件の閲覧回数
Vishnu3
Contributor III

Hi Vane,

The application is not failing per se. It is able to execute LED toggle in a loop. The callbacks are not getting triggered however.

 

If I pause the debugger, it is just in midst of executing the while loop. I suspect that the application startup code is copying the VTOR to the same RAM address where the bootloader interrupts are executing from. 

 

But I'll try your suggestion of understanding how the CPU fetches the data during the interrupt. Thanks for the hint.

 

Best,

Vishnu 

0 件の賞賛
返信
1,895件の閲覧回数
Vishnu3
Contributor III
Also, isn't the application startup code already setting the VTOR. Should I change that in the startup?
0 件の賞賛
返信
1,873件の閲覧回数
VaneB
NXP TechSupport
NXP TechSupport

Hi @Vishnu3 

Check the following posts. It has information related to the topic that you might find useful. 

Interrupt can’t work in application

s32k148 bootloader to app can't work interrupt

0 件の賞賛
返信