打印
[STM32F1]

用STM32F103C8T6的做IAP时,在跳转时一直进入HardFault_Handler

[复制链接]
2754|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
天奕|  楼主 | 2016-4-30 22:48 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
首先是IAP
STM32F103C8T6的flash是64k,每次擦除是1k
1、用串口接收APP的bin文件数据,然后写入内部的FLASH
//appxaddr是要跳转的地址 设置是0x0800500
//appbuf是串口接收到的app的bin文件数据
//appsize是bin的大小
void iap_write_appbin(u32 appxaddr,u8 *appbuf,u32 appsize)
{
        u8 page = 0;
        u32 i =0;
        u16 *p = (u16 *)appbuf;
        page = FLASH_PagesMask(appsize);//得到要擦除的页数
        printf("\r\n要擦除的数据页数:%d\r\n",page);
        FLASH_Unlock();//解锁
        for(i = 0;i < page; i++)
        {
                CPU_IntDis();//关中断
                FLASH_ErasePage(appxaddr+i*Page_Size);//一次擦除1024字节
                CPU_IntEn();//开中断
                if(Flash_ReadHalfWord(appxaddr+i*Page_Size)!=0xffff)
                {
                        printf("\r\n擦除出错.................\r\n");
                }
        }
        for(i = 0;i < appsize;i=i+2)
        {
                FLASH_ProgramHalfWord(appxaddr + i,*p);//半字写入
                if((Flash_ReadHalfWord(appxaddr +i) & 0xff)!=appbuf[i])//判断写入的是否正确
                {
                        FLASH_Lock();
                        printf("\r\n写入错误\r\n");
                        return ;
                }
                p++;
        }
        FLASH_Lock();
}

上面是把接收到串口的数据写入flash,写入的数据是没有错误的,通过读flash和app的bin文件做了比较

2、下面是跳转函数

typedef  void (*iapfun)(void);                                //定义一个函数类型的参数.
iapfun jump2app;
void iap_load_app(u32 appxaddr)//appxaddr是0x08005000
{
        if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)        //检查栈顶地址是否合法.
        {
                jump2app=(iapfun)*(vu32*)(appxaddr+4);                //用户代码区第二个字为程序开始地址(复位地址)               
                MSR_MSP(*(vu32*)appxaddr);                                        //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
                jump2app();                                                                        //跳转到APP.
               
        }
}

串口接收发送都是采用中断
每次在跳转的时候就会进入HardFault_Handler,不知道错在什么地方

app的设置如下
1、在魔法棒中设置app的起始地址为0x08005000
2、设置中断向量表SCB->VTOR = FLASH_BASE | 0x5000;
然后程序里面就是一个很简单的LED的闪烁,
每次在接收完成,把数据写入到flash之后再进行跳转就会进入HardFault_Handler,不知道那里有错,

11.png (11.88 KB )

设置appd的起始地址为0x08005000

设置appd的起始地址为0x08005000
沙发
xyz549040622| | 2016-5-1 09:02 | 只看该作者
这个没做过,但是网上有好多人做过,可以参考别人的例程看看。

使用特权

评论回复
板凳
vilan| | 2016-5-1 13:19 | 只看该作者
你需要设置中断向量表地址为:0x08005000
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x5000);

使用特权

评论回复
地板
天奕|  楼主 | 2016-5-1 13:50 | 只看该作者
已经解决,是keil里面有个地方要设置一下,要不虽然修改了起始地址,但map里面根本不改变,把那个选择就可以了

使用特权

评论回复
5
icefox225| | 2016-5-1 17:12 | 只看该作者
板凳正解,KEIL也设置不对5000+5000都A000明显超过8000了

使用特权

评论回复
6
maimeide| | 2016-5-1 21:49 | 只看该作者
天奕 发表于 2016-5-1 13:50
已经解决,是keil里面有个地方要设置一下,要不虽然修改了起始地址,但map里面根本不改变,把那个选择就可 ...

是设置那个地方,让我们也了解一下,我现在只是IAR上面实现了IAP

使用特权

评论回复
7
天奕|  楼主 | 2016-5-2 15:09 | 只看该作者
icefox225 发表于 2016-5-1 17:12
板凳正解,KEIL也设置不对5000+5000都A000明显超过8000了

STM32F103C8T6是64k,不就到10000了啊

使用特权

评论回复
8
ticomi| | 2016-5-3 08:15 | 只看该作者
关键是中断向量和代码的起始地址不能错!!

使用特权

评论回复
9
天奕|  楼主 | 2016-5-3 10:50 | 只看该作者
本来想每人给10分 可以试了几次 说不符合 50分 分5个人没人10分他都不可以,所以就试了下给一个 然后就全给版主了,尽然可以,,谢谢各位

使用特权

评论回复
10
icefox225| | 2016-5-4 10:47 | 只看该作者
天奕 发表于 2016-5-2 15:09
STM32F103C8T6是64k,不就到10000了啊

对对对,我看成C6T6了哈哈哈

使用特权

评论回复
11
cnb12345| | 2016-5-4 11:43 | 只看该作者

使用特权

评论回复
12
cowboy2014| | 2016-5-4 22:11 | 只看该作者
你的擦除的位置设置的好像不太准确造成的吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

127

帖子

1

粉丝