[应用相关] USB例程实现USB IAP功能

[复制链接]
 楼主| 309030 发表于 2016-5-23 22:26 | 显示全部楼层 |阅读模式
利用ST提供的USB例程实现USB IAP功能

利用ST提供的USB例程实现USB IAP功能.pdf

253.55 KB, 下载次数: 184

yinhaix 发表于 2016-7-8 18:24 | 显示全部楼层
看看,谢谢共享
643757107 发表于 2016-7-9 09:11 | 显示全部楼层
自己研究的还是官方提供的,看看咋样
643757107 发表于 2016-7-9 09:16 | 显示全部楼层
我们知道 ST 推出的 Cortex-M3 平台 STM32 内部有两个 Flash 区域,一是 System
Flash,ST 官方保留的一个区域,用于存放 IAP 代码。该区域不对用户开放,仅提供 UART
的通讯接口用于IAP升级; 另一个区域是User Flash, 这一部分是供用户自由使用的。STM32
自带 USB 2.0 Device 接口,如果需要通过 USB 接口来实现 IAP 功能需要如何做呢?这里
介绍如何利用 ST STM32xx USB Development Kit 提供的 DFU 代码来实现上述功能。我用
STM3210EVB 来演示这个功能。
内容很丰富,谢谢
heisexingqisi 发表于 2016-7-9 16:30 | 显示全部楼层
原理如果搞清楚了,那都是相通的,很容易弄出来。
sxcem 发表于 2017-2-18 12:53 | 显示全部楼层
本帖最后由 sxcem 于 2017-2-18 12:58 编辑

app 程序加上这么一句

int main(void)
{
        SCB->VTOR = ((uint32_t)0x08000000) | (0x40000)   //app 0x8040000 开始

...
}

IAP 程序




void main()
{

//先读下 app 位置  得到的地址修改下面  0x20000000的值   我的是0x20020000
printf("APP_ADDRESS : %x == 0x20020000 ?   \r\n",((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ));

// if (((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20000000)  //f746g
if (((*(__IO uint32_t*)USER_FLASH_FIRST_PAGE_ADDRESS) & 0x2FFE0000 ) == 0x20020000)  //f746g
    {
                        printf("enter app ok \r\n");
                        //        LCD_UsrLog ((char *)"  State: enter app ok ...\n");
      /* Jump to user application */
      JumpAddress = *(__IO uint32_t*) (USER_FLASH_FIRST_PAGE_ADDRESS + 4);
      Jump_To_Application = (pFunction) JumpAddress;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) USER_FLASH_FIRST_PAGE_ADDRESS);
      Jump_To_Application();
      /* do nothing */
      while(1);
    }
    else
    {/* Otherwise, do nothing */
      /* LED3 (RED) ON to indicate bad software (when not valid stack address) */
                        printf("enter app Ng \r\n");
                        //LCD_UsrLog ((char *)"  State: enter app NG ...\n");
      BSP_LED_Init(LED1);
      BSP_LED_On(LED1);
      /* do nothing */
      while(1);
    }


while(1);

}

//很奇怪 为什么我设定的是 基地址+40000   应该 是0x20000000 获取的映射地址却是0x20020000   不过上面的代码就可以跳到自己的程序了
net_hawk 发表于 2018-11-24 09:08 来自手机 | 显示全部楼层
wanduzi 发表于 2018-11-24 15:18 | 显示全部楼层
MARK。
643757107 发表于 2018-11-25 22:55 | 显示全部楼层
知道怎么操作IAP后,什么接口其实就无所谓了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

109

主题

638

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部