函数指针类型数据 void (*pFunction)(void)

关于STM32的bootloader,有如下代码,以下做一些理解记录:

    typedef  void (*pFunction)(void);
    pFunction Jump_To_Application;
    uint32_t JumpAddress;

    JumpAddress = *(__IO uint32_t*) (DEF_FLASH_AppStartaddr + 4);

    Jump_To_Application = (pFunction) JumpAddress;

    /* Initialize user application's Stack Pointer */
    __set_MSP(*(__IO uint32_t*) DEF_FLASH_AppStartaddr);

    Jump_To_Application();
  1. 定义一个新的数据类型:void (*)(void);   该类型是一个函数指针,它指向的函数的形参为void,返回值为void

  2. typedef  void (*pFunction)(void);    //用pFunction来代替void (*)(void),以简化后续使用;

  3. Jump_To_Application = (pFunction) JumpAddress;  //将一个32位的地址,强制转换成一个函数指针;

  4. __set_MSP(*(__IO uint32_t*) DEF_FLASH_AppStartaddr);  //设置栈顶指针地址

  5. Jump_To_Application();  //跳转到复位向量入口地址执行程序;

关于STM32栈顶指针和复位向量入口地址的说明