Bootloader starten aus Programm mit freeRTOS, Problem

Gast #5466312
Lesenswert?
• ▲
▼
Guten Tag!

Ich will aus meinem Programm nach empfangen eines Zeichens über UART in 
den Bootloader springen. Ich benutze freeRTOS auf einem STM32L476 µC. 
Dazu habe ich eine Funktion erstellt, die auch funktioniert, solange ich 
sie vor dem Starten des schedulers ausführe, also ganz am Anfang im 
main() Programm. Rufe ich die Funktion innerhalb eines Tasks auf, so 
komme ich in den hard_fault handler. Ich habe alle interrupts 
deaktiviert und weiß wirklich nicht woran es liegen kann. ...

mein Code der bootloaderstart Funktion:

void (*SysMemBootJump)(void);
  volatile uint32_t addr = 0x1FFF0000;


  if(BootLoaderStatus == 1)
  {
    //Shutdown any tasks running

    //vTaskResumeAll();
    /*
    HAL_UART_DeInit(&huart1);
    HAL_UART_DeInit(&huart2);
    HAL_GPIO_DeInit(GPIOA,GPIO_PIN_6);
    HAL_GPIO_DeInit(GPIOD,GPIO_PIN_5);
    HAL_GPIO_DeInit(GPIOD,GPIO_PIN_4);
    */
    HAL_RCC_DeInit();

    //Reset the systick timer
    SysTick->CTRL = 0;
    SysTick->LOAD = 0;
    SysTick->VAL = 0;

    //Disable Interrupts
    //__set_PRIMASK(1);// oder
    __disable_irq();
    portDISABLE_INTERRUPTS();
    vTaskSuspendAll();
    portNVIC_SYSTICK_CTRL_REG &= ~portNVIC_SYSTICK_ENABLE_BIT;

    //Remap system memory
    __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();



    HAL_DeInit();

    //suspend all tasks from freeRTOS
    vTaskSuspendAll();
    //vTaskEndScheduler ();
    //Set jump memory location for system memory (bootloader)
    //Addres + 4 bytes offset which specifies jump location where 
programm starts
    SysMemBootJump = (void(*)(void)) (*((uint32_t *)(addr + 4)));
    //Set the main stack pointer to its default value
    __set_MSP(*(uint32_t *)addr);
    //__set_MSP(0x20001000);

    //Call the function to jump to the set location
    //This will start system memory execution
    SysMemBootJump();

    while(1);
  }


für hilfe wäre ich dankbar, lg benjamin.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.