OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3232|回复: 0

关于stm32f407的IAP升级,app中加入usoc时不能正常运行的问题求助!!!

[复制链接]

4

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2019-5-21
在线时间
21 小时
发表于 2019-7-28 15:26:07 | 显示全部楼层 |阅读模式
本帖最后由 Papertiger 于 2019-7-28 15:32 编辑

本人第一次做32的IAP升级,app中不使用ucos操作系统时app可以正常运行,当app使用操作系统后跑飞了,下面是我程序中的一关键代码,求大神帮我看下是哪里的问题!
  1.   if(state==1)        
  2.                 {
  3.                         if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
  4.                         {         
  5.                                 iap_write_appbin(FLASH_APP1_ADDR,IAPBuffer,RevDataNum);//更新FLASH代码
  6.                                 state=2;                                       
  7.                         }
  8.                 }
  9.                 if(state==2)
  10.                 {
  11.                         if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
  12.                         {
  13.                                 iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
  14.                         }
  15.                 }
  16.                
  17.                
  18.                 if(tick%5==0)//半秒钟
  19.                 {
  20.                         ARMLED=!ARMLED;
  21. //                        IWDG_Feed();
  22.                 }
  23.                 if((tick%20==0)&&(flag_tick==0))//两秒钟
  24.                 {
  25.                         if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
  26.                         {        
  27.                                 Uart1_SendByte(0x23);
  28.                                 
  29.                                 iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码,FLASH_APP1_ADDR为0x08008000                                                
  30.                         }
  31.                         Uart1_SendByte(0x24);
  32.                 }               

  33.                 delay_ms(100);
  34.                 tick++;
复制代码
上面时引导程序中app程序的写入和跳转部分,借鉴的原子例程中的代码。其中预留32K给引导程序,app程序从0x08008000开始,跳转之前用__set_PRIMASK(1)关中断。下面时app中的代码
  1. void SystemInit(void)
  2. {
  3.   /* FPU settings ------------------------------------------------------------*/
  4.   #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
  5.     SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  6.   #endif
  7.   /* Reset the RCC clock configuration to the default reset state ------------*/
  8.   /* Set HSION bit */
  9.   RCC->CR |= (uint32_t)0x00000001;

  10.   /* Reset CFGR register */
  11.   RCC->CFGR = 0x00000000;

  12.   /* Reset HSEON, CSSON and PLLON bits */
  13.   RCC->CR &= (uint32_t)0xFEF6FFFF;

  14.   /* Reset PLLCFGR register */
  15.   RCC->PLLCFGR = 0x24003010;

  16.   /* Reset HSEBYP bit */
  17.   RCC->CR &= (uint32_t)0xFFFBFFFF;

  18.   /* Disable all interrupts */
  19.   RCC->CIR = 0x00000000;

  20. #if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
  21.   SystemInit_ExtMemCtl();
  22. #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
  23.          
  24.   /* Configure the System clock source, PLL Multiplier and Divider factors,
  25.      AHB/APBx prescalers and Flash settings ----------------------------------*/
  26.   SetSysClock();

  27.   /* Configure the Vector Table location add offset address ------------------*/
  28. #ifdef VECT_TAB_SRAM
  29.   SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
  30. #else
  31. //  SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
  32.         SCB->VTOR = FLASH_BASE | 0x00008000;
  33. #endif
  34. }
复制代码
我把系统初始化函数的向量偏移设置为SCB->VTOR = FLASH_BASE | 0x00008000;,其中FLASH_BASE 为0x8000000,下面是带ucos系统的main函数,
  1. int main(void)
  2. {
  3. //        uint32 temp=6400;
  4. //        
  5. //        LED_Init();
  6. //        while(1)
  7. //        {
  8. //                ARMLED=0;
  9. //        }
  10.         MY_NVIC_SetVectorTable(0x8000000,0x8000);//中断向量便宜
  11.         __set_PRIMASK(0);//开中断

  12.         Stm32_Clock_Init(336,8,2,7);
  13.         delay_init(168);       //延时初始化

  14.         OSInit();  //UCOS初始化
  15.         OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); //创建开始任务
  16.         OSStart(); //开始任务
  17. }
复制代码
进入main函数,又执行了一次中断向量偏移,注销了Stm32_Clock_Init中的向量偏移,并且打开中断开关,


@正点原子 ,哥哥帮帮忙

2.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-2 20:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表