日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

用STM32F103C8T6的做IAP时,在跳转时一直进入HardFault_Handler 解决方法

發(fā)布時(shí)間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用STM32F103C8T6的做IAP时,在跳转时一直进入HardFault_Handler 解决方法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先是IAP
STM32F103C8T6的flash是64k,每次擦除是1k
1、用串口接收APP的bin文件數(shù)據(jù),然后寫入內(nèi)部的FLASH
//appxaddr是要跳轉(zhuǎn)的地址 設(shè)置是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();//關(guān)中斷
? ? ? ? ? ? ? ? FLASH_ErasePage(appxaddr+i*Page_Size);//一次擦除1024字節(jié)
? ? ? ? ? ? ? ? CPU_IntEn();//開中斷
? ? ? ? ? ? ? ? if(Flash_ReadHalfWord(appxaddr+i*Page_Size)!=0xffff)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? printf("\r\n擦除出錯(cuò).................\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寫入錯(cuò)誤\r\n");
? ? ? ? ? ? ? ? ? ? ? ? return ;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? p++;
? ? ? ? }
? ? ? ? FLASH_Lock();
}

上面是把接收到串口的數(shù)據(jù)寫入flash,寫入的數(shù)據(jù)是沒有錯(cuò)誤的,通過讀flash和app的bin文件做了比較

2、下面是跳轉(zhuǎn)函數(shù)

typedef??void (*iapfun)(void);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //定義一個(gè)函數(shù)類型的參數(shù).
iapfun jump2app;?
void iap_load_app(u32 appxaddr)//appxaddr是0x08005000
{
? ? ? ? if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000)? ? ? ? //檢查棧頂?shù)刂肥欠窈戏?
? ? ? ? {?
? ? ? ? ? ? ? ? jump2app=(iapfun)*(vu32*)(appxaddr+4);? ? ? ? ? ? ? ? //用戶代碼區(qū)第二個(gè)字為程序開始地址(復(fù)位地址)? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? MSR_MSP(*(vu32*)appxaddr);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //初始化APP堆棧指針(用戶代碼區(qū)的第一個(gè)字用于存放棧頂?shù)刂?
? ? ? ? ? ? ? ? jump2app();? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //跳轉(zhuǎn)到APP.
? ? ? ? ? ? ? ??
? ? ? ? }
}

串口接收發(fā)送都是采用中斷
每次在跳轉(zhuǎn)的時(shí)候就會進(jìn)入HardFault_Handler,不知道錯(cuò)在什么地方

app的設(shè)置如下
1、在魔法棒中設(shè)置app的起始地址為0x08005000
2、設(shè)置中斷向量表SCB->VTOR = FLASH_BASE | 0x5000;
然后程序里面就是一個(gè)很簡單的LED的閃爍,

每次在接收完成,把數(shù)據(jù)寫入到flash之后再進(jìn)行跳轉(zhuǎn)就會進(jìn)入HardFault_Handler,不知道那里有錯(cuò),

?

這是之前我發(fā)的帖子

錯(cuò)誤的原因是:我雖然設(shè)置了起始地址,但是沒選擇如下圖,所以map里面的地址一直沒改變,use memory哪里默認(rèn)的不是勾選,應(yīng)該把哪里勾選

?

這樣我的問題就解決了 ,有空再把bootloader的整體給寫出來,,,這里個(gè)錯(cuò)誤找了我3天時(shí)間 ,,好浪費(fèi)啊 ?希望可以幫助到其他人

?

?

這樣map就可以看到起始地址的改變了

總結(jié)

以上是生活随笔為你收集整理的用STM32F103C8T6的做IAP时,在跳转时一直进入HardFault_Handler 解决方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。