OpenEdv-开源电子网

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

新手请教IAP问题

[复制链接]

12

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
292
金钱
292
注册时间
2014-3-6
在线时间
31 小时
发表于 2014-4-17 17:04:29 | 显示全部楼层 |阅读模式
我最近在学习STM32,刚学习IAP的时候,用的是原子的《第四十八章 串口IAP实验》程序来实验。我加载APP程序小于55K的时候,即USART_REC_LEN,程序能够运行。现在我想加一个APP大概在150K字节左右的,我想用串口分包接收,边接收边往FLASH里写
u32 LEN=0;  
void USART1_IRQHandler(void)
{
u8 res;
#ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
OSIntEnter();    
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收到数据
{  
    res=USART_ReceiveData(USART1);
       if(USART_RX_CNT<USART_REC_LEN)
    {
    USART_RX_BUF[USART_RX_CNT]=res;
    USART_RX_CNT++;     
    }

    else if(USART_RX_CNT>USART_REC_LEN)
    {
        if(LEN<USART_REC_LEN)
        {
            USART_RX_BUF[LEN]=res;
            LEN++;
        }

    else if((LEN>=USART_REC_LEN)&&(LEN<2*USART_REC_LEN))
    {
        USART_RX_BUF[a-USART_REC_LEN]=res;
        LEN++;
    }

    else 
   {
     USART_RX_BUF[LEN-2*USART_REC_LEN]=res;
     LEN++;
   }
if(LEN==USART_REC_LEN)
{
 iap_write_appbin(FLASH_APP1_ADDR,USART_RX_BUF,USART_REC_LEN);//写入地址FLASH_APP1_ADDR
}
if(LEN==2*USART_REC_LEN)
{
iap_write_appbin(FLASH_APP1_ADDR|USART_REC_LEN,USART_RX_BUF,USART_REC_LEN);//写入地址FLASH_APP1_ADDR + USART_REC_LEN
}

if(LEN==USART_RX_CNT)
{
iap_write_appbin(FLASH_APP1_ADDR|(2*USART_REC_LEN),USART_RX_BUF,USART_RX_CNT-2*USART_REC_LEN);//写入地址FLASH_APP1_ADDR + 2*USART_REC_LEN
LEN=0;

}
}

}
#ifdef OS_CRITICAL_METHOD //如果OS_CRITICAL_METHOD定义了,说明使用ucosII了.
OSIntExit();    
#endif



红色部分是我自己添加的,添加之后没办法运行APP,不知道是错在哪里,该怎么改呢?
希望各位大侠能给予指点
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-4-17 21:32:26 | 显示全部楼层
回复【楼主位】xiaosi204:
---------------------------------
你忽略了:iap_write_appbin,是需要时间的。
一旦卡在iap_write_appbin不出来,串口就无法及时响应接下来的数据,就会导致数据丢失,最后的结果就是IAP失败。

解决的办法:你一定要做协议,要让上位机可以等待的协议。
比如你单片机不发送ACK,上位机就不能发送下一批数据,必须等到单片机的ACK,上位机才可以发送下一次数据。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-4-6
在线时间
0 小时
发表于 2016-4-7 14:27:38 | 显示全部楼层
正点原子 发表于 2014-4-17 21:32
回复【楼主位】xiaosi204:
---------------------------------
你忽略了:iap_write_appbin,是需要时间的 ...

这样自己需要写上位机程序吧?我想着可不可以吧IAP放到RAM里执行,然后写flash的时候,串口中断还是可以在响应的,这样数据就不会丢了!!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 02:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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