引言
本文詳細介紹了RL78 MCU從復位到進入main函數的過程,有助于讀者對RL78 MCU體系結構的理解,RAM和ROM的初始化,以及bootloader程序的開發。
1. RL78復位源
RL78 MCU有以下7種復位源:
外部復位:
RESET復位引腳
內部復位:
上電復位(POR)
看門狗復位
低電壓復位
非法指令復位
RAM奇偶校驗錯誤復位
存取非法寄存器復位
復位功能框圖如下:
2. MCU運行模式
RL78 MCU有正常運行和閃存編程兩種運行模式,在復位信號解除時,通過采樣TOOL0引腳上的電平,進入對應的運行模式。
3. 啟動代碼分析
RL78 MCU啟動代碼主要在cstart.asm文件中,流程如下:
3.1 啟動代碼入口
代碼如下:
MCU復位后,PC指針指向地址0,定義復位向量在地址0。
3.2 寄存器組選擇
代碼如下:
RL78-S2有4組通用寄存器,通過SEL RBn指令選擇使用的寄存器組。
RL78通用寄存器組結構:
3.3 鏡像區設置
代碼如下:
3.3.1鏡像區
RL78支持存取1MB的地址空間,能通過16位地址進行存取的數據區是F0000H~FFFFFH的64K字節空間,但是如果附加“ES:”,就能擴展到00000H~FFFFFH的1M字節空間。
代碼閃存從地址0開始存儲,一般需要使用20位地址訪問該區域。為了加快對代碼閃存的訪問,可以將代碼閃存的部分區域鏡像到F0000H~FFFFFH中未使用的區域。
鏡像示例如下:
3.3.2鏡像區選擇
復位后,MAA位默認為0,鏡像00000H~0FFFF區域到F0000H~FFFFFH區域,對于閃存大于96KB的產品,可以通過設置MAA位,選擇需要鏡像的區域,詳細請參考PMC控制寄存器。
3.4 棧初始化
代碼如下:
3.4.1 設置SP
將棧頂地址 __STACK_ADDR_START設置到SP寄存器。
其中__STACK_ADDR_START是由鏈接器產生。
3.4.2 初始化棧
將棧底地址參數賦值給AX寄存器,然后調用棧初始化函數stkinit,將棧區域清0。
stkinit函數在stkinit.asm文件中,代碼如下:
大致流程為:先按照32字節進行清0,剩余部分,按字節進行清0。
3.5 外設初始化
代碼如下:
其中R_Systeminit函數是由代碼生成器,通過圖形界面配置生成。
注意:盡量不要修改該部分代碼。
如需修改,禁止執行讀取RAM的操作。(訪問未初始化的RAM,可能觸發RAM奇偶校驗錯誤,產生奇偶校驗復位。)
錯誤代碼示例:
錯誤原因:g_dbgMode全局變量將在data段的初始化過程中賦值1,但此時data段還未初始化,dbgMode指向的RAM地址未寫入奇偶校驗位,if(g_dbgMode==0)語句,將執行讀操作,可能觸發RAM奇偶校驗錯誤,產生奇偶校驗復位。
3.6 初始化BSS,DATA段
BSS初始化代碼如下:
DATA段初始化代碼如下:
其中HIGH/LOW/STARTOF/SIZEOF等表達式,請參考編譯器手冊文檔”CC-RL user’s manual”。
3.7 進入main函數
3.8 堆
CC-RL V1.02以上版本支持堆的操作
如需使用堆的相關操作,需要先初始化_REL_sysheap和_REL_sizeof_sysheap,詳細內如請參考以下示例:
來源:瑞薩MCU小百科
審核編輯:湯梓紅
-
mcu
+關注
關注
146文章
17123瀏覽量
350992 -
寄存器
+關注
關注
31文章
5336瀏覽量
120230 -
函數
+關注
關注
3文章
4327瀏覽量
62573 -
RL78
+關注
關注
2文章
119瀏覽量
21648
發布評論請先 登錄
相關推薦
評論