打印
[应用相关]

USB例程实现USB IAP功能

[复制链接]
1699|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
309030|  楼主 | 2016-5-23 22:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
利用ST提供的USB例程实现USB IAP功能

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

253.55 KB

沙发
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 来演示这个功能。
内容很丰富,谢谢

使用特权

评论回复
5
heisexingqisi| | 2016-7-9 16:30 | 只看该作者
原理如果搞清楚了,那都是相通的,很容易弄出来。

使用特权

评论回复
6
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   不过上面的代码就可以跳到自己的程序了

使用特权

评论回复
7
net_hawk| | 2018-11-24 09:08 | 只看该作者
mark

使用特权

评论回复
8
wanduzi| | 2018-11-24 15:18 | 只看该作者
MARK。

使用特权

评论回复
9
643757107| | 2018-11-25 22:55 | 只看该作者
知道怎么操作IAP后,什么接口其实就无所谓了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

109

主题

638

帖子

0

粉丝