stm32f103c8 跳转到应用程序不起作用

Posted

技术标签:

【中文标题】stm32f103c8 跳转到应用程序不起作用【英文标题】:stm32f103c8 jump to application doesn't work 【发布时间】:2021-07-25 06:29:23 【问题描述】:

我编写了一个通过 uart 启动 stm32f103c8 的编程器 当通过MCS bootloader(media uart) 提交 app.bin 文件并输入到 stm32f103c8 时,会给出成功的数据,然后通过 jumpToApp() 函数运行 app.bin。但是 jumpToApp() 不能正常工作。

引导加载程序代码(写入闪存):

#define APP1_START (0x08005000)         //Origin + Bootloader size (20kB)
#define FLASH_BANK_SIZE (0XB000)        //44kB
#define FLASH_PAGE_SIZE_USER (0x400)    //1kB

     unlockFlashAndEraseMemory();
    for(iloop=0 ; iloop < 128; iloop+=4)
    
      if(Buf[iloop]!=0x1a)
       
        flashWord((Buf[iloop+3]<<24)|(Buf[iloop+2]<<16)|(Buf[iloop+1]<<8)|(Buf[iloop]));
      
    

bootloader代码(跳转到app功能):

typedef struct

    uint32_t        stack_addr;     // Stack Pointer
    application_t*  func_p;        // Program Counter
 JumpStruct;

    void jumpToApp(const uint32_t address)
    
        //application_t jump_to_app;
        const JumpStruct* vector_p = (JumpStruct*)address;
        deinitEverything();
      __set_MSP(*(volatile uint32_t*)vector_p->stack_addr);
      vector_p->func_p();
    
应用代码:

  MX_GPIO_Init();
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_9, GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5|GPIO_PIN_7, GPIO_PIN_SET);
  while (1)
  
      HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_9);
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_5|GPIO_PIN_7);
        HAL_Delay(500);
  
应用设置

#if defined(VECT_TAB_SRAM)
#define VECT_TAB_BASE_ADDRESS   SRAM_BASE       
#define VECT_TAB_OFFSET         0x00000000U                                                      
#else
#define VECT_TAB_BASE_ADDRESS   FLASH_BASE      
#define VECT_TAB_OFFSET         0x00005000U   

  

#define FLASH_BASE 0x08005000

app.bin 文件在 flash micro 上正确获取和写入,但它没有运行。 我在this link 中使用了一些代码并使用 keil ide

【问题讨论】:

【参考方案1】:

一个可能的问题是,在 jumpToApp 中,您设置了堆栈指针,然后将重置处理程序作为 C 中的函数调用。

从 C 中调用函数几乎总是涉及调整堆栈指针,这将使其不正确。你需要原子地设置堆栈指针,然后跳转到函数,中间不能做任何事情。

使用这样的函数从汇编中执行:

标题:

void __attribute__((noreturn)) jumpToApp(uint32_t vector);

来源:

jumpToApp:
  ldr r1, [r0]
  ldr r2, [r0, 4]
  msr msp, r1
  mov lr, r2
  bx lr

我假设您的VECT_TAB_OFFSET 设置会导致目标应用程序将其自己的向量表设置为SCB-VTOR。如果没有,那么 jumpToApp 也需要这样做。

【讨论】:

以上是关于stm32f103c8 跳转到应用程序不起作用的主要内容,如果未能解决你的问题,请参考以下文章

STM32F103ZET6外部中断不起作用,不知道程序哪里错了?

问题编程和运行STM32F103C8

基于STM32F103C8Tx芯片实现的应答式串口数据管理器逻辑分析与程序实现

STM32F103C8芯片流水灯

stm32f407H库和stm32f103H库有区别吗

跳转到应用程序时中断不起作用(STM32)