用STM32F103C8T6的做IAP时,在跳转时一直进入HardFault_Handler 解决方法
首先是IAP
STM32F103C8T6的flash是64k,每次擦除是1k
1、用串口接收APP的bin文件數(shù)據(jù),然后寫入內部的FLASH
//appxaddr是要跳轉的地址 設置是0x0800500
//appbuf是串口接收到的app的bin文件數(shù)據(jù)
//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);//得到要擦除的頁數(shù)
? ? ? ? printf("\r\n要擦除的數(shù)據(jù)頁數(shù):%d\r\n",page);
? ? ? ? FLASH_Unlock();//解鎖
? ? ? ? for(i = 0;i < page; i++)
? ? ? ? {
? ? ? ? ? ? ? ? CPU_IntDis();//關中斷
? ? ? ? ? ? ? ? FLASH_ErasePage(appxaddr+i*Page_Size);//一次擦除1024字節(jié)
? ? ? ? ? ? ? ? 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();
}
上面是把接收到串口的數(shù)據(jù)寫入flash,寫入的數(shù)據(jù)是沒有錯誤的,通過讀flash和app的bin文件做了比較
2、下面是跳轉函數(shù)
typedef??void (*iapfun)(void);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //定義一個函數(shù)類型的參數(shù).
iapfun jump2app;?
void iap_load_app(u32 appxaddr)//appxaddr是0x08005000
{
? ? ? ? if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)? ? ? ? //檢查棧頂?shù)刂肥欠窈戏?
? ? ? ? {?
? ? ? ? ? ? ? ? jump2app=(iapfun)*(vu32*)(appxaddr+4);? ? ? ? ? ? ? ? //用戶代碼區(qū)第二個字為程序開始地址(復位地址)? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? MSR_MSP(*(vu32*)appxaddr);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //初始化APP堆棧指針(用戶代碼區(qū)的第一個字用于存放棧頂?shù)刂?
? ? ? ? ? ? ? ? jump2app();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //跳轉到APP.
? ? ? ? ? ? ? ??
? ? ? ? }
}
串口接收發(fā)送都是采用中斷
每次在跳轉的時候就會進入HardFault_Handler,不知道錯在什么地方
app的設置如下
1、在魔法棒中設置app的起始地址為0x08005000
2、設置中斷向量表SCB->VTOR = FLASH_BASE | 0x5000;
然后程序里面就是一個很簡單的LED的閃爍,
每次在接收完成,把數(shù)據(jù)寫入到flash之后再進行跳轉就會進入HardFault_Handler,不知道那里有錯,
?
這是之前我發(fā)的帖子
錯誤的原因是:我雖然設置了起始地址,但是沒選擇如下圖,所以map里面的地址一直沒改變,use memory哪里默認的不是勾選,應該把哪里勾選
?
這樣我的問題就解決了 ,有空再把bootloader的整體給寫出來,,,這里個錯誤找了我3天時間 ,,好浪費啊 ?希望可以幫助到其他人
?
?
這樣map就可以看到起始地址的改變了
總結
以上是生活随笔為你收集整理的用STM32F103C8T6的做IAP时,在跳转时一直进入HardFault_Handler 解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32f103C8T6 bootlo
- 下一篇: (转载)关于IAP与APP互相跳转的实现