初级会员

- 积分
- 86
- 金钱
- 86
- 注册时间
- 2019-5-21
- 在线时间
- 21 小时
|
本帖最后由 Papertiger 于 2019-7-28 15:32 编辑
本人第一次做32的IAP升级,app中不使用ucos操作系统时app可以正常运行,当app使用操作系统后跑飞了,下面是我程序中的一关键代码,求大神帮我看下是哪里的问题!- if(state==1)
- {
- if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
- {
- iap_write_appbin(FLASH_APP1_ADDR,IAPBuffer,RevDataNum);//更新FLASH代码
- state=2;
- }
- }
- if(state==2)
- {
- if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
- {
- iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
- }
- }
-
-
- if(tick%5==0)//半秒钟
- {
- ARMLED=!ARMLED;
- // IWDG_Feed();
- }
- if((tick%20==0)&&(flag_tick==0))//两秒钟
- {
- if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
- {
- Uart1_SendByte(0x23);
-
- iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码,FLASH_APP1_ADDR为0x08008000
- }
- Uart1_SendByte(0x24);
- }
- delay_ms(100);
- tick++;
复制代码 上面时引导程序中app程序的写入和跳转部分,借鉴的原子例程中的代码。其中预留32K给引导程序,app程序从0x08008000开始,跳转之前用__set_PRIMASK(1)关中断。下面时app中的代码- void SystemInit(void)
- {
- /* FPU settings ------------------------------------------------------------*/
- #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
- SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
- #endif
- /* Reset the RCC clock configuration to the default reset state ------------*/
- /* Set HSION bit */
- RCC->CR |= (uint32_t)0x00000001;
- /* Reset CFGR register */
- RCC->CFGR = 0x00000000;
- /* Reset HSEON, CSSON and PLLON bits */
- RCC->CR &= (uint32_t)0xFEF6FFFF;
- /* Reset PLLCFGR register */
- RCC->PLLCFGR = 0x24003010;
- /* Reset HSEBYP bit */
- RCC->CR &= (uint32_t)0xFFFBFFFF;
- /* Disable all interrupts */
- RCC->CIR = 0x00000000;
- #if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
- SystemInit_ExtMemCtl();
- #endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
-
- /* Configure the System clock source, PLL Multiplier and Divider factors,
- AHB/APBx prescalers and Flash settings ----------------------------------*/
- SetSysClock();
- /* Configure the Vector Table location add offset address ------------------*/
- #ifdef VECT_TAB_SRAM
- SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
- #else
- // SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */
- SCB->VTOR = FLASH_BASE | 0x00008000;
- #endif
- }
复制代码 我把系统初始化函数的向量偏移设置为SCB->VTOR = FLASH_BASE | 0x00008000;,其中FLASH_BASE 为0x8000000,下面是带ucos系统的main函数,
- int main(void)
- {
- // uint32 temp=6400;
- //
- // LED_Init();
- // while(1)
- // {
- // ARMLED=0;
- // }
- MY_NVIC_SetVectorTable(0x8000000,0x8000);//中断向量便宜
- __set_PRIMASK(0);//开中断
- Stm32_Clock_Init(336,8,2,7);
- delay_init(168); //延时初始化
- OSInit(); //UCOS初始化
- OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO); //创建开始任务
- OSStart(); //开始任务
- }
复制代码 进入main函数,又执行了一次中断向量偏移,注销了Stm32_Clock_Init中的向量偏移,并且打开中断开关,
@正点原子 ,哥哥帮帮忙
|
-
|