×
单片机 > 单片机程序设计 > 详情

stm32 iap跳转isp实现上电isp下载

发布时间:2020-08-26 发布时间:
|

概述:本程序上电等3秒种,期间每隔10ms检测一次串口是否收到握手指令(0x7F),若收到则跳转到isp程序执行。可以用mcuisp软件通过串口1直接升级程序。是一种简单的iap程序。初次下载需要手动让mcu进入isp模式。


1先看看最终效果:成功!


2.实现isp跳转


stm32的isp程序在系统存储区,可以通过boot0,boot1引脚选择,也可以通过程序直接跳转,isp程序的入口地址为 0x1FFFF000


跳转函数如下:


#define ISP_ADDR        0x1FFFF000


void IspProgramRun(void)

{


    u32  IspSpInitVal;           //IAP程序的SP初值.


    u32  IspJumpAddr;            //IAP程序的跳转地址.即,IAP程序的入口.


    void    (*pIspFun)(void);       //定义一个函数指针.用于指向APP程序入口.


  //  NVIC_DeInit ();                                 //恢复NVIC为复位状态.使中断不再发生.

    

    IspSpInitVal = *(u32 *)ISP_ADDR;             //取APP的SP初值.


    IspJumpAddr = *(u32 *)(ISP_ADDR + 4);        //取程序入口.


 __set_MSP(IspSpInitVal);     //设置SP.

                    

    pIspFun = (void (*)(void))IspJumpAddr;              //生成跳转函数.


    (*pIspFun) ();                                  //跳转.不再返回.

}

3.主函数代码如下:

int main(void)

 

 SystemInit();//初始化RCC 设置系统主频为72MHZ

  

 delay_init(72);      //延时初始化

 

 Usart_Init(115200);

 

 for(bootcount = 0;bootcount < 300;bootcount++)

 {

  if(USART1_RX_BUF[0] == 0x7F) IspProgramRun();

  delay_ms(10);

 } 

 

 LED_Init();

 KEY_Init();

 

 while(1)

 {

  keynum = KEY_Scan();

  if(keynum == 1)

  {

   if(RESET == GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8))   LED0_OFF();

   else LED0_ON();

  }

  if(keynum == 2)

  {

   if(RESET == GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_2))   LED1_OFF();

   else LED1_ON();

  }

  keynum = 0;

 };

      

}




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32中断向量表的位置.重定向