結(jié)合Keil描述如何編寫ARM處理器的Bootloader
1
關(guān)于BootloaderBootloader顧名思義就是引導(dǎo)加載程序,是在操作系統(tǒng)或應(yīng)用程序運(yùn)行之前的一段程序,是在系統(tǒng)上電后執(zhí)行的一段程序代碼。
BootLoader是嚴(yán)重地依賴于硬件而實(shí)現(xiàn)的,特別是在嵌入式平臺(tái)。因此,在嵌入式平臺(tái)里建立一個(gè)通用的BootLoader幾乎是不可能的。盡管如此,我們?nèi)匀豢梢詫?duì)bootloader歸納出一些通用的概念來,以指導(dǎo)用戶特定的BootLoader設(shè)計(jì)與實(shí)現(xiàn)。
---來源百度百科
Bootloader在手機(jī)、電腦、眾多嵌入式系統(tǒng)中都存在,它的作用有很多,比如:初始化底層應(yīng)用驅(qū)動(dòng)、加載應(yīng)用程序、更新應(yīng)用程序等。
不同的設(shè)備,Bootloader可能差異很大,通常來說Bootloader比較依賴底層硬件和實(shí)際項(xiàng)目需求。
2
如何編寫bootloaderstatic?void?BootJump(uint32_t?*Address)
{
//1.確保CPU處于特權(quán)模式。
??if(?CONTROL_nPRIV_Msk?&?__get_CONTROL())
{ /* not in privileged mode */
????EnablePrivilegedMode()?;
}
//2.禁用NVIC中所有啟用的中斷。
Disable_All_Peripherals();
//3.禁用所有可能產(chǎn)生中斷請(qǐng)求的使能外設(shè),并清除這些外設(shè)中的所有未使用中斷標(biāo)志。
NVIC->ICER[ 0 ] = 0xFFFFFFFF;
NVIC->ICER[ 1 ] = 0xFFFFFFFF;
NVIC->ICER[ 2 ] = 0xFFFFFFFF;
NVIC->ICER[ 3 ] = 0xFFFFFFFF;
NVIC->ICER[ 4 ] = 0xFFFFFFFF;
NVIC->ICER[ 5 ] = 0xFFFFFFFF;
NVIC->ICER[ 6 ] = 0xFFFFFFFF;
NVIC->ICER[ 7 ] = 0xFFFFFFFF;
//4.清除NVIC中所有未使用的中斷請(qǐng)求。
NVIC->ICPR[ 0 ] = 0xFFFFFFFF;
NVIC->ICPR[ 1 ] = 0xFFFFFFFF;
NVIC->ICPR[ 2 ] = 0xFFFFFFFF;
NVIC->ICPR[ 3 ] = 0xFFFFFFFF;
NVIC->ICPR[ 4 ] = 0xFFFFFFFF;
NVIC->ICPR[ 5 ] = 0xFFFFFFFF;
NVIC->ICPR[ 6 ] = 0xFFFFFFFF;
NVIC->ICPR[ 7 ] = 0xFFFFFFFF;
//5.禁用SysTick并清除其異常掛起位。
SysTick->CTRL = 0;
SCB->ICSR |= SCB_ICSR_PENDSTCLR_Msk;
//6.如果引導(dǎo)加載程序使用了單個(gè)故障處理程序,請(qǐng)禁用它們。
SCB->SHCSR &= ~( SCB_SHCSR_USGFAULTENA_Msk | \
SCB_SHCSR_BUSFAULTENA_Msk | \
SCB_SHCSR_MEMFAULTENA_Msk ) ;
//7.如果發(fā)現(xiàn)內(nèi)核當(dāng)前與PSP一起運(yùn)行,則激活MSP
??if(?CONTROL_SPSEL_Msk?&?__get_CONTROL())
{ /* MSP is not active */
????__set_MSP(?__get_PSP())?;
????__set_CONTROL(?__get_CONTROL()?&?~CONTROL_SPSEL_Msk);
}
//8.將用戶應(yīng)用程序的向量表地址加載到SCB-> VTOR寄存器中。
SCB->VTOR = ( uint32_t )Address ;
//9.跳轉(zhuǎn)
??BootJumpASM(?Address[?0?],?Address[?1?]);
}
再次說明bootloader與底層硬件和實(shí)際需求有關(guān),以上代碼僅供參考,主要是提供思路,方便大家理解。
如果還不能理解,建議結(jié)合bootloader實(shí)際項(xiàng)目進(jìn)行理解,比如之前給大家分享過的:STM32 + IAP + Ymodem完美結(jié)合
程序猿如何選擇開源協(xié)議?
線程、進(jìn)程、多線程、多進(jìn)程 和 多任務(wù)?
幾款優(yōu)秀的支持C、C++等多種語(yǔ)言的在線編譯器
長(zhǎng)按前往圖中包含的公眾號(hào)關(guān)注
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!