OpenEdv-开源电子网

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

iap实验的一个疑问

[复制链接]

24

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2012-12-19
在线时间
3 小时
发表于 2013-4-14 21:30:18 | 显示全部楼层 |阅读模式
u32 cnt;
u8 cntflag;
int main(void)
{  
u8 t;
u8 key;
u16 oldcount=0; //??????????????????
u16 applenth=0; //????????app?ú???¤??
u8 clearflag=0;

uart_init(256000); //????????????256000
delay_init();   //???±?????? 
LCD_Init();
LED_Init();   //????????LED??????????????

  KEY_Init(); //°??ü??????

  POINT_COLOR=RED;//?è??×??????ì?? 
LCD_ShowString(60,50,200,16,16,"Warship STM32");
LCD_ShowString(60,70,200,16,16,"IAP TEST");
LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(60,110,200,16,16,"2012/9/24");  
LCD_ShowString(60,130,200,16,16,"WK_UP:Copy APP2FLASH");
LCD_ShowString(60,150,200,16,16,"KEY1:Erase SRAM APP");
LCD_ShowString(60,170,200,16,16,"KEY0:Run SRAM APP");
LCD_ShowString(60,190,200,16,16,"KEY2:Run FLASH APP");
POINT_COLOR=BLUE;
//?????á??????
POINT_COLOR=BLUE;//?è??×?????????  
while(1)
{
if(cntflag==0)
{
cnt++;
}
cnt++;
if(USART_RX_CNT)
{
if(oldcount==USART_RX_CNT)//????????,????????????????,????±????????????ê??.
{
applenth=USART_RX_CNT;
oldcount=0;
USART_RX_CNT=0;
printf("???§???ò?????ê??!\r\n");
printf("?ú???¤??:%dBytes\r\n",applenth);
}else oldcount=USART_RX_CNT;
}
t++;
delay_ms(10);
if(t==30)
{
LED0=!LED0;
t=0;
if(clearflag)
{
clearflag--;
if(clearflag==0)LCD_Fill(60,210,240,210+16,WHITE);//????????
}
}    
key=KEY_Scan(0);
if(key==KEY_UP)
{
if(applenth)
{
printf("?????ü??????...\r\n");
LCD_ShowString(60,210,200,16,16,"Copying APP2FLASH...");
  if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//??????·???0X08XXXXXX.
{  
iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,applenth);//?ü??FLASH?ú??   
delay_ms(100);
LCD_ShowString(60,210,200,16,16,"Copy APP Successed!!");
printf("?????ü???ê??!\r\n");
}else 
{
LCD_ShowString(60,210,200,16,16,"Illegal FLASH APP!  ");   
printf("·?FLASH???????ò!\r\n");
}
  }else 
{
printf("?????????ü????????!\r\n");
LCD_ShowString(60,210,200,16,16,"No APP!");
}
clearflag=7;//±ê???ü????????,?????è??7*300ms?ó????????  
}
if(key==KEY_DOWN)
{
if(applenth)
{  
printf("?????????ê??!\r\n");    
LCD_ShowString(60,210,200,16,16,"APP Erase Successed!");
applenth=0;
}else 
{
printf("??????????????????!\r\n");
LCD_ShowString(60,210,200,16,16,"No APP!");
}
clearflag=7;//±ê???ü????????,?????è??7*300ms?ó????????  
}
if(key==KEY_LEFT)
{
printf("????????FLASH???§?ú??!!\r\n");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//??????·???0X08XXXXXX.
{  
iap_load_app(FLASH_APP1_ADDR);//????FLASH APP?ú??
}else 
{
printf("·?FLASH???????ò,??·¨????!\r\n");
LCD_ShowString(60,210,200,16,16,"Illegal FLASH APP!");   
}  
clearflag=7;//±ê???ü????????,?????è??7*300ms?ó????????  
}
if(key==KEY_RIGHT)
{
printf("????????SRAM???§?ú??!!\r\n");
if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x20000000)//??????·???0X20XXXXXX.
{  
iap_load_app(0X20001000);//SRAM???·
}else 
{
printf("·?SRAM???????ò,??·¨????!\r\n");
LCD_ShowString(60,210,200,16,16,"Illegal SRAM APP!");   
}  
clearflag=7;//±ê???ü????????,?????è??7*300ms?ó????????  
}

if(cnt==1000)
{
cntflag = 1;
printf("????????FLASH???§?ú??!!\r\n");
if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//??????·???0X08XXXXXX.
{  
iap_load_app(FLASH_APP1_ADDR);//????FLASH APP?ú??
}else 
{
printf("·?FLASH???????ò,??·¨????!\r\n");
LCD_ShowString(60,210,200,16,16,"Illegal FLASH APP!");   
}  
clearflag=7;//±ê???ü????????,?????è??7*300ms?ó????????  
}
 
}     
}




iap实验的一个疑问

我在main函数里面while循环最后加了一个cnt的判断,当cnt自增到1000就执行和左键一样的操作,就是实现从iap到app的跳转,但是奇怪的是程序貌似每隔20秒左右就从iap跳到app,然后在跳到iap,一直反反复复,我的代码不是应该和按左键效果一样吗?






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

使用道具 举报

24

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2012-12-19
在线时间
3 小时
 楼主| 发表于 2013-4-14 21:33:49 | 显示全部楼层
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-14 22:18:53 | 显示全部楼层
回复【2楼】zjtzlqr:
---------------------------------
你可以仿真跟踪一下啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

24

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2012-12-19
在线时间
3 小时
 楼主| 发表于 2013-4-14 22:42:33 | 显示全部楼层
刚才那个问题解决了

#define FLASH_APP1_ADDR 0x08010000 

iap_load_app(FLASH_APP1_ADDR);//????FLASH APP?ú??

void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //?ì?é???????·??·???·¨.

jump2app=(iapfun)*(vu32*)(appxaddr+4); //???§?ú??????????×??????ò???????·(???????·)
MSR_MSP(*(vu32*)appxaddr); //??????APP????????(???§?ú????????????×???????·????????·)
jump2app(); //??×???APP.
}
}  




0x08010000&0x2FFE0000==0x20000000的结果应该是个0把,怎么可以实现代码跳到app的
回复 支持 反对

使用道具 举报

24

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2012-12-19
在线时间
3 小时
 楼主| 发表于 2013-4-16 22:27:43 | 显示全部楼层
上面这个明白了,我发现在跑的时候跑完app会重新跑到iap,然后iap的main函数会连续执行四遍,跑马灯发现的。在main函数最前面做了一个跑马灯
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-21 05:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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