This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Watchdog

When a watchdog timeout occurs, it could be the result of many causes. The code could be 'out in space' due to a bad pointer corrupting anything it wants to. It could be due to a fault condition that did not affect data space. Who knows?

Since the watchdog reset is considered a 'hard reset' we know where it will then start execution from.

If I want to save existing data ram into flash prior to executing __main() I would think the place to do this would be here:

; Reset Handler
Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                LDR     R0, =__main
                BX      R0
                ENDP

I could jump into a routine which calls an IAP command to save RAM to flash and then return to finish the startup.

I would have to EXPORT the routine I want to jump to as well as load the LR with the return value. Is there anything else that I am missing?

BTW: the processor is a Cortex M3 core.

Thanks.

Parents
  • This seems to do what I want (albeit crude .asm code).

    But a side effect is that when I do an SVC call I get a hard fault (still working on it - is probably related as I was not getting them before).

    ; Reset Handler
    Reset_Handler   PROC
                    EXPORT  Reset_Handler             [WEAK]
                    IMPORT  __main
                    IMPORT  GoFlash
    
                    LDR     R0, =0x400FC180 ; load RSID
                    LDR     R0, [R0]        ; load value at RSID
                    TST     R0,#0x02        ; Is W/D timeout?
                    BNE     __GoBoot        ; No, skip next
                    BL      GoFlash         ; Go Save Flash
    
    __GoBoot        LDR     LR, =0          ; Boot
                    LDR     R0, =__main
                    BX      R0
                    ENDP
    

    Tamir, I need to look into this $Super$$ - what it is about.

    Thanks.

Reply
  • This seems to do what I want (albeit crude .asm code).

    But a side effect is that when I do an SVC call I get a hard fault (still working on it - is probably related as I was not getting them before).

    ; Reset Handler
    Reset_Handler   PROC
                    EXPORT  Reset_Handler             [WEAK]
                    IMPORT  __main
                    IMPORT  GoFlash
    
                    LDR     R0, =0x400FC180 ; load RSID
                    LDR     R0, [R0]        ; load value at RSID
                    TST     R0,#0x02        ; Is W/D timeout?
                    BNE     __GoBoot        ; No, skip next
                    BL      GoFlash         ; Go Save Flash
    
    __GoBoot        LDR     LR, =0          ; Boot
                    LDR     R0, =__main
                    BX      R0
                    ENDP
    

    Tamir, I need to look into this $Super$$ - what it is about.

    Thanks.

Children