打印
[STM32F7]

有关STM32F746NG-DISCO 开发IAP的问题!!

[复制链接]
3233|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhengyy12345|  楼主 | 2016-4-13 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在研究用STM32F746NG-DISCO 开发IAP程序,目前用户程序的接收和写入都没有问题,但在跳转的时候怎么都无法执行用户程序,跳转代码是根据官方例程写的
         if (((*(__IO uint32_t*)App_address) & 0x2FFE0000 ) == 0x20000000){
      temp_address = *(__IO uint32_t*) (App_address + 4);
      ADDRESS=(function_pointer)temp_address;
      __set_MSP(*(__IO uint32_t*) App_address);
      ADDRESS();
    }
后来到网上查了资料,试了各种方法,比如关中断__disable_irq();,关外设等等,都没办法执行,最后看官方readme.txt中说要用NVIC_SetVectorTable()重新设置中断向量表,但是我在HAL库里面翻了半天都没能找到这个函数。
求问大神:
1、HAL库中重设中断向量表的函数是什么
2、我这个IAP程序跳转后不执行还有可能是什么问题?
沙发
lusson| | 2016-5-18 15:34 | 只看该作者
F7中和F4的做法是一样的。
APP工程中直接设置flash起始地址,以及设置VECTOR地址。
boot中直接跳到flash地址

void Jump_To_APP(void)
{
          void (*pUserApp)(void);
                                         INT32U JumpAddress;  
                                         __asm("CPSID  I");
                                       
                                        JumpAddress = *(volatile uint32_t*) (APP_START_ADDR+4);
                                        pUserApp = (void (*)(void)) JumpAddress;
                                        /* Initialize user application's Stack Pointer */
                                        __set_PSP(*(volatile uint32_t*) APP_START_ADDR);
                                        __set_CONTROL(0);
                                        __set_MSP(*(volatile uint32_t*) APP_START_ADDR);
                                        pUserApp();
}

以上是我的jump程序,注意app程序最开始要重新开中断。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
jobaek + 1 很给力!
板凳
xmshao| | 2016-5-19 17:52 | 只看该作者
你参考下。在IAP里可以直接给出下次启动地址。

STM32F7与STM32F4的复位序列比较.pdf

258.38 KB

使用特权

评论回复
地板
yinhaix| | 2016-7-8 18:26 | 只看该作者
把源码共享看看,,,,

使用特权

评论回复
5
643757107| | 2016-7-9 11:14 | 只看该作者

使用特权

评论回复
6
zchong| | 2017-1-19 14:43 | 只看该作者
楼主搞定没有,有一个疑问还希望解惑。
STM32F7与以往的芯片不同,上电启动的时候,由boot管脚和BOOT_ADD[15..0]共同决定取址地址,这里仅讨论boot管脚为0,BOOT_ADD0[15..0]=0x00200000的情况,
这种情况下0x00200000地址就是内部flash的起始地址(从ITCM-FLASH方向看),也就是0x08000000(从AXIM接口看),而且ST已经做好了,程序中并不需要对中断向量表进行偏移,
我的问题是,如果使用了IAP,那么我的APP如果位于0x00300000,即偏移了0x00100000,那么我的中断向量表是不是设置成偏移量为0x00100000即可,还是要设置成0x00300000?

使用特权

评论回复
7
huangcunxiake| | 2017-1-19 18:10 | 只看该作者
不错,这个板凳的资料还挺好的。

使用特权

评论回复
8
xmshao| | 2017-1-19 23:14 | 只看该作者
zchong 发表于 2017-1-19 14:43
楼主搞定没有,有一个疑问还希望解惑。
STM32F7与以往的芯片不同,上电启动的时候,由boot管脚和BOOT_ADD[1 ...

既然只偏移0x0010000,偏移量就是它。 基地址是0x00200000.
VTOR=BASE ADDRESS | OFFSET

使用特权

评论回复
9
sxcem| | 2017-2-18 12:57 | 只看该作者
本帖最后由 sxcem 于 2017-2-18 13:28 编辑

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   不过上面的代码就可以跳到自己的程序了
//完整demo如下
1 官网下载  f7 代码库  en.stm32cubef7.zip   :(    21ic  不让我发链接 权限不足  其他兄弟补上

2 将下述源代码 放置到
XX盘\en.stm32cubef7\Projects\STM32746G-Discovery\Applications\LwIP 目录下面   一定要放在这里  很头文件再STM32746G-Discovery 目录下
keil 5 编译
3 源代码见附件
4 使用方法
1)f746 discovery 按住蓝色按键 再按黑色复位按钮 启动 进入IAP 模式  电脑设置 192.168.1.XXX    登录192.168.1.234 可以打开下载iap bin文件  无密码
2)烧写完 bin文件后  重启即可

LwIP_HTTP_Server_Netconn_RTOS_xcModify.rar

198.36 KB

en.stm32cubef7链接地址.rar

391 Bytes

挡不住我

使用特权

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

本版积分规则

2

主题

4

帖子

0

粉丝