PART.01
引言
本文詳細(xì)介紹了RX MCU從復(fù)位到進(jìn)入main函數(shù)的過程,有助于讀者對RX MCU體系結(jié)構(gòu)的理解,RAM和ROM的初始化,以及bootloader程序的開發(fā)。
PART.02
啟動代碼流程分析
RX MCU啟動代碼主要在resetprg.c文件中,RX的啟動代碼以C語言實(shí)現(xiàn),因此可讀性和可維護(hù)性更高。啟動代碼統(tǒng)一放在PowerON_Reset_PC函數(shù)內(nèi),復(fù)位向量表保存的正是該函數(shù)入口的物理地址。因此當(dāng)芯片發(fā)生復(fù)位后,CPU會從復(fù)位向量取出該地址,并自動跳轉(zhuǎn)到PowerON_Reset_PC函數(shù)執(zhí)行,完成啟動流程并最終進(jìn)入應(yīng)用程序。
具體的啟動流程如下

2.1 從復(fù)位向量到啟動函數(shù)
MCU復(fù)位后,CPU會從復(fù)位向量地址0xFFFFFFFC讀取一個32位入口地址(Reset Vector)。該入口地址會被裝載到PC(程序計數(shù)器)中,隨后CPU跳轉(zhuǎn)到該入口地址開始執(zhí)行啟動代碼,0xFFFFFFFC存放的是復(fù)位入口函數(shù)(PowerON_Reset_PC)的地址。RX的內(nèi)存分區(qū)情況以及跳轉(zhuǎn)過程如下圖所示:


2.2 設(shè)置棧指針
在調(diào)用入口函數(shù)(PowerOn_Reset_PC)之前,需要初始化棧指針,這一步設(shè)計在CC-RX編譯器中。CC?RX編譯器在該函數(shù)開頭自動插入棧指針初始化:

1RX有兩種??梢栽O(shè)置:中斷棧指針I(yè)nterrupt Stack Pointer(ISP)、用戶棧指針User Stack Pointer(USP),其中中斷棧是必須的。
2MVTC是Renesas RX指令集中的一條匯編指令,全稱Move To Control Register,是“把數(shù)據(jù)寫入控制寄存器”。
3TOPOF SU+SIZEOF SU等于SU段起始地址+段大小=段末端(棧頂);SI同理。
4初始化把USP/ISP設(shè)到各自棧區(qū)的棧頂,以便隨后棧向低地址增長。
2.3初始化中斷、異常向量表寄存器:INTB、EXTB
配置中斷和異常的控制寄存器,初始化系統(tǒng)中斷和異常的響應(yīng)。
代碼如下:

2.4 初始化浮點(diǎn)狀態(tài)寄存器:FPSW
FPSW是CPU控制浮點(diǎn)單元的狀態(tài)寄存器,在啟動時需要初始化為預(yù)設(shè)值,以確保浮點(diǎn)計算正確。
代碼如下:

2.5 切換到高速運(yùn)行時鐘
MCU RX上電復(fù)位后,首先使用的是LOCO(Low-speed on-chip oscillator),到這一步后,時鐘源從LOCO切換到用戶選擇的高速運(yùn)行時鐘,如HOCO(High-speed on-chip oscillator)。
代碼如下:

1
切換MCU到高速運(yùn)行模式,調(diào)用operating_frequency_set()來設(shè)置系統(tǒng)時鐘頻率。
2
條件編譯:如果不是Bootloader工程(BSP_CFG_BOOTLOADER_PROJECT == 0),則執(zhí)行l(wèi)pt_clock_source_select(),用于選擇低功耗定時器(LPT)的時鐘源。
2.6 初始化C運(yùn)行環(huán)境
代碼如下:

在該階段,調(diào)用標(biāo)準(zhǔn)庫函數(shù)_INITSCT完成RAM數(shù)據(jù)區(qū)初始化:
1對初始化表BTBL[]指定的B段(.bss段)執(zhí)行清零;對DTBL[]指定的D/R段(.data段),將ROM中D段初始值拷貝到RAM中對應(yīng)的R段。
2DTBL[]與BTBL[]分別存放在C$DSEC 與C$BSEC段,并通過__sectop() / __secend()等段操作符提供各段的邊界地址,供_INITSCT函數(shù)遍歷處理。
2.7 初始化RAM
代碼如下:

“硬件資源鎖(hardware lock)”機(jī)制:用一個全局鎖數(shù)g_bsp_Locks來防止多個模塊/線程/中斷同時訪問同一個外設(shè)資源導(dǎo)致沖突。g_bsp_Locks是RAM變量,必須初始化。BSP_NUM_LOCKS是“枚舉總數(shù)”。
2.8 初始化I/O庫
初始化C標(biāo)準(zhǔn)庫的I/O流(stdin/stdout/stderr),代碼如下:

打開或創(chuàng)建標(biāo)準(zhǔn)輸入(stdin)、標(biāo)準(zhǔn)輸出(stdout)和標(biāo)準(zhǔn)錯誤輸出(stderr)的文件,可以用printf輸出打印信息。
2.9 初始化MCU的中斷回調(diào)
代碼如下:

注
初始化BSP的“中斷回調(diào)函數(shù)表”,把所有中斷源的回調(diào)函數(shù)先設(shè)為“空函數(shù)占位”。避免野指針。
2.10 初始化寄存器保護(hù)功能
代碼如下:

注
為MCU的寄存器寫保護(hù)(Register Write Protection)功能做初始化,并定義受保護(hù)寄存器的分類。
2.11 配置MCU和板級硬件
代碼如下:

1output_ports_configure():用戶可以根據(jù)應(yīng)用需求進(jìn)行輸出端口的配置。
2interrupts_configure():用戶可以根據(jù)應(yīng)用需求進(jìn)行中斷的配置。
3peripheral_modules_enable():啟用和配置MCU的外設(shè)。
4bsp_non_existent_port_init():初始化“芯片封裝上不存在的引腳”。
2.12 使能中斷和選擇棧
(I Stack or U Stack)
代碼如下:

開中斷和選擇使用哪一個棧:
I stack or U stack(即中斷?;蛴脩魲#?。
使用RTOS情況下:進(jìn)入Supervisor(特權(quán))模式,并且在啟動階段保持中斷關(guān)閉。
非RTOS情況:如果用戶只選擇1個棧,則不會設(shè)置“U”位(即用戶棧),CPU將始終使用中斷棧。
2.13 選擇是否使用RTOS并進(jìn)入main函數(shù)
無RTOS或Azure RTOS直接調(diào)用R_BSP_MAIN_FUNCTION()(就是main()),不應(yīng)該返回。

至此,是RXMCU 從上電復(fù)位到進(jìn)入main()的全過程。
需要技術(shù)支持?
如您在使用瑞薩MCU/MPU產(chǎn)品中有任何問題,可識別下方二維碼或復(fù)制網(wǎng)址到瀏覽器中打開,進(jìn)入瑞薩技術(shù)論壇尋找答案或獲取在線技術(shù)支持。
-
mcu
+關(guān)注
關(guān)注
147文章
18914瀏覽量
397829 -
瑞薩
+關(guān)注
關(guān)注
37文章
22481瀏覽量
90823 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4417瀏覽量
67492 -
bootloader
+關(guān)注
關(guān)注
2文章
244瀏覽量
48014 -
啟動文件
+關(guān)注
關(guān)注
0文章
16瀏覽量
2459
原文標(biāo)題:瑞薩RX MCU啟動文件詳解
文章出處:【微信號:瑞薩嵌入式小百科,微信公眾號:瑞薩嵌入式小百科】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
如何使用瑞薩RX26T MCU中的POE功能模塊
瑞薩RX130系列MCU CTSU的基本配置和使用
如何在VS Code中使用瑞薩RX系列MCU
瑞薩電子新推32位RX系列微控制器RX23E-A產(chǎn)品組
瑞薩MCU指紋識別解決方案!
瑞薩電子擴(kuò)大RX63T Group微控制器(MCU)系列產(chǎn)品
瑞薩電子推出低成本目標(biāo)板以支持快速增長的RX系列32位MCU產(chǎn)品線
瑞薩電子32位RX微控制器產(chǎn)品家族交付第10億顆芯片
瑞薩RX MCU啟動文件詳解
評論