Stm32的bootloader和App的編寫注意事項(xiàng) 1、 怎么分配bootloader和app的空間 2、 怎么得到數(shù)據(jù)和寫入flash 3、 怎么從bootloader跳轉(zhuǎn)到app 4、 怎么設(shè)置App的中斷向量 5、 App中怎么生成bin文件 6、程序執(zhí)行的流程
1、怎么分配bootloader和app的空間
因?yàn)槲矣玫氖莝tm32f103c8t6,它的flash的大小是64k,所以把它分成如上所示 0x08000000 ---0x0800 33FF分配給bootloader使用,大小是13k 0x0800 3400----0x080097FF分配給第一個(gè)APP的使用,大小是25k 0x08009800----0x0800 FBFF分配給第二個(gè)APP的使用,大小是25k 0x0800FC00----0x0800 FFFF 分配給user_flag和其它標(biāo)志使用,大小是1k
在keil中設(shè)置rom的大小 A、bootloader中rom大小的設(shè)置
B、APP1中rom大小的設(shè)置
C、APP2中rom大小的設(shè)置
Rom設(shè)置好了就可以在map中看見地址的改變,這里拿bootloader和app1來說。 Bootloader的map
App1的map
這里就可以看到RESET的地址改變了 但是要想我們改變的rom在map中也改變keil里面必須要設(shè)置如下圖,
這里必須要打勾,默認(rèn)新建的工程是沒有選擇的
2、怎么得到數(shù)據(jù)和寫入flash 在我的程序是通過串口接收數(shù)據(jù),然后調(diào)用app_bin_handler(&timer);函數(shù)來在里面完成寫flash(函數(shù)iap_write_appbin(Flash_Current_Write_addr(),g_RxBuf1,length))、和校驗(yàn)寫入的數(shù)據(jù)是否正確(函數(shù)flag =read_flash_ECC(Flash_Current_Write_addr(),length);)、校驗(yàn)通過就可以跳轉(zhuǎn)到app中(函數(shù)JumpToApp(Flash_Current_Write_addr(),1);)
3、怎么從bootloader跳轉(zhuǎn)到app voidJumpToApp(u32 ApplicationAddress,u8 flag) { u32 temp; if (((*(vu32*)ApplicationAddress) &0x2FFE0000 ) == 0x20000000) { if(flag == 1) { User_write_Flash_falg(); } temp = (*(vu32*)(ApplicationAddress + 4)); JumpToApplication =(FunVoidType)temp; MSR_MSP(*(vu32*)ApplicationAddress); JumpToApplication(); } } 程序中就是利用上面的函數(shù)實(shí)現(xiàn)跳轉(zhuǎn),中間有個(gè)User_write_Flash_falg()函數(shù)是用來設(shè)置app的標(biāo)志的,如果當(dāng)前正在使用的是app1,那么就設(shè)置標(biāo)志位為2,好在下次啟動(dòng)的時(shí)候跳轉(zhuǎn)到app2,如果當(dāng)前正在使用的是app2,那么就設(shè)置標(biāo)志位為1,好在下次啟動(dòng)的時(shí)候跳轉(zhuǎn)到app1 至于上面函數(shù)的詳解可以百度。
4、怎么設(shè)置App的中斷向量 Stm32的中斷重定向比較簡單,因?yàn)樗幸粋€(gè)專用的寄存器 NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x9800); 這個(gè)函數(shù)就是重定向了app2的中斷向量,實(shí)現(xiàn)起來簡單
6、 App中怎么生成bin文件 因?yàn)槲业某绦蚴峭ㄟ^串口下載app的所以必須要生成bin文件,才方便下載, 在工程里面進(jìn)行如下設(shè)置就可以生成bin文件 其中主要是路徑要對,不然找不到.axf文件,也就生成不了bin文件
總結(jié): Bootloader里面主要是 1、設(shè)置bootloader和app的空間 2、接收編譯好的app的bin文件,寫入flash 3、實(shí)現(xiàn)跳轉(zhuǎn) App里面主要修改的地方是 1、 ROM起始地址和分配的空間大小 2、 重定向中斷向量 3、 生成bin文件 這里就是整個(gè)程序執(zhí)行的流程
|
|