OpenEdv-开源电子网

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

关于战舰开发板串口IAP实验的疑问, 求解

[复制链接]

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
发表于 2015-1-5 21:39:11 | 显示全部楼层 |阅读模式
5金钱
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_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后清除显示  
}

上边是战舰开发板的串口IAP实验的部分代码,   红色标注的部分怎么理解?
((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000  为什么会成立呢
((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000   呢

IAR_Bootloader.zip

4.44 MB, 下载次数: 57

IAR_APP.zip

3.29 MB, 下载次数: 69

最佳答案

查看完整内容[请看2#楼]

请回答3个问题: 1,stm32正常运行的 flash代码存放在哪里? 2,编译后的代码(bin文件),第一个4个字节存放什么? 3,问题2之后,第二个4个字节,存放什么? 如果能回答了,楼主位的问题也就解答了。 如果不能,那么请阅读我们教程。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-5 21:39:12 | 显示全部楼层
请回答3个问题:
1,stm32正常运行的 flash代码存放在哪里?
2,编译后的代码(bin文件),第一个4个字节存放什么?
3,问题2之后,第二个4个字节,存放什么?

如果能回答了,楼主位的问题也就解答了。
如果不能,那么请阅读我们教程。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
 楼主| 发表于 2015-1-6 10:38:02 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
问题1  存放在0X08000000处  0X08000004 处存放复位向量(中断向量表起始地址)
问题2:编译后的BIN文件存放地址是0X08010000
问题3:第二个四个字节是0X08010004  存放的是APP程序的复位向量(中断向量表起始地址)

我认为是这样的,
其中   if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
为什么是0X20001000  我认为是代码里将接收缓存地址是固定地址
u8 USART_RX_BUF[USART_REC_LEN] __attribute__ ((at(0X20001000)));

我把相关的程序移植到STM32F100C6T6上  总是不成功   已将我现在的程序上传


部分代码如下
   if(g_USART1.RXOverFlag)//  解释了完成后处理
   {
    g_USART1.RXOverFlag = 0;
  //if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.  我的不是固定地址
 if(1)
    {  
iap_write_appbin(FLASH_APP1_ADDR,(g_USART1.RXbuf),g_USART1.RXCountBuf);//更新FLASH代码   
delay_ms(100);
}else 
{


   
  if(((*(vu32*)(FLASH_APP1_ADDR+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
{  
iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
}
   
}


我是在IAR 下移植的 
几个汇编函数改成如下函数
void WFI_SET(void)
{
__asm("WFI\n");   
}
//关闭所有中断
 void INTX_DISABLE(void)
{
// CPSID I;
  __asm("CPSID I\n");
}
//开启所有中断
 void INTX_ENABLE(void)
{
// CPSIE I;
   __asm("CPSID I\n");
}

//设置栈顶地址
//addr:栈顶地址
void MSR_MSP(u32 addr) 
{
   // MSR MSP, r0  //set Main Stack value
   // BX r14
      
   __asm("MSR MSP, r0 \n");
   __asm("BX r14\n");    
   
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-1-6 23:30:10 | 显示全部楼层
回复【3楼】wang12zhe:
---------------------------------
第二个问题回答有误。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-27 06:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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