关闭

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

标签: stm32stm32ispstm32串口升级程序
557人阅读 评论(1) 收藏 举报

概述:本程序上电等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;
 };
      
}

LED 按键 串口代码请自行查阅相关资料
代码下载地址  http://download.csdn.net/detail/linis_yes/9615283

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1415次
    • 积分:27
    • 等级:
    • 排名:千里之外
    • 原创:1篇
    • 转载:1篇
    • 译文:0篇
    • 评论:2条
    文章存档
    最新评论