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

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


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

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

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

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

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

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

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

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

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

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

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

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

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