MCU復位和程序啟動那些事
掃描二維碼
隨時隨地手機看文章
MCU通常會在工作之前,先經歷復位和啟動的一個過程,在用戶使用過程中往往在這個階段的工作不是那么的清楚,這里我們就這一話題進行一個討論。
一.MCU的復位問題
圖1 16bit MCU和dsPIC33復位源的種類
一般來說,16位MCU包括dsPIC33的復位源主要包含以上7種,他們都可以對器件產生復位的作用,但是細節(jié)有所不同。
圖2 復位系統(tǒng)框圖
從復位系統(tǒng)框圖上看,BOR和POR二者是和VDD電源有關的兩種,看門狗和外部復位引腳復位也是比較常見的復位類型。
圖3 復位寄存器RCON
復位寄存器RCON包含了復位相關的狀態(tài),當發(fā)生復位時RCON這個寄存器就會更新,以便表征是哪一個復位源發(fā)生了復位。除此之外,這個寄存器也包含了WDT及低功耗的特性的狀態(tài)信息,所以用戶可以查看這個寄存器去判斷復位原因。
圖4 復位寄存器內容1
圖5 復位寄存器的內容2
從圖示注釋中,我們可以看到用戶在軟件中可以對這些RCON寄存器位置位1,但是這不會導致器件復位。
二.復位和中斷的關系
圖6 默認中斷的復位
在XC16編譯器中,當用戶沒有提供相應中斷源的中斷服務程序時,會在中斷向量位置放置一個軟件復位中斷指令SWR,這時如果有一個意外中斷發(fā)生時,便觸發(fā)了軟件復位使得器件復位。
圖7 默認中斷軟件復位指令說明
規(guī)格書中也有說明,任何未實施的或者未使用的中斷向量位置都會放一個默認中斷處理程序,它包含一條RESET指令。
三.復位和時鐘的關系
當器件復位時,其時鐘狀態(tài)是什么?一般來說它是由芯片配置位決定的。
圖8 配置位中的初始復位時鐘選擇
圖9 時鐘Clock Switch模式
當器件支持Clock Switch模式時,初始時鐘由OSCCON寄存器中的COSC決定,切換后的時鐘由NOSC決定。
圖9 雙速啟動的模式
一般來說,從進入復位到執(zhí)行第一條指令之間的時間,取決于所使用的振蕩器,當使用Primary和Secondary振蕩器時,由于需要和外部晶振同步,所以需要在RESET時等待時間較長才能穩(wěn)定。如果使用內部振蕩器的話,就非??炀涂梢苑€(wěn)定,基于配置位對時鐘的選擇,在復位時會等待一定的時間,最后在出復位狀態(tài)前達到時鐘穩(wěn)定。
雙速啟動的含義就是說,采用FRC振蕩器快速啟動,然后當Primary振蕩器達到穩(wěn)定后再切換為它,這樣可以避免等待外部晶振的同步時間。
四.復位和寄存器及變量狀態(tài)的關系
圖10 復位時的寄存器狀態(tài)
外設的特殊功能寄存器SFR一般存在RAM中,在復位時可能會被改變,在規(guī)格書中會規(guī)定各個寄存器SFR在復位時的值。當這個值是u時,就是說它在復位時是不改變,x就是說它在復位時的值是不確定的。當然,有一些寄存器,在POR和BOR時會有不同的值,這個需要注意一下。
值得注意的各種復位源中,只有POR會改變data Memory的內容,而其它則不會改變。
五.程序啟動代碼的執(zhí)行
一般來說,C編譯器會在執(zhí)行用戶指令前,調用一段啟動代碼,這段啟動代碼會在結束復位時執(zhí)行,這段啟動代碼的目的就是為運行用戶C程序而做的系統(tǒng)準備。典型的啟動代碼由編譯器去提供,他們將改變在復位后的memory內容。
另外,在執(zhí)行啟動代碼時,XC16編譯器會提供一些前導選項,比如Persistent,允許用戶在執(zhí)行啟動代碼時不改變某些變量。也有一些編譯器會提供更直接的選項,比如在啟動代碼時,不初始化變量,所以,需要注意編譯器的處理方式。
圖11 程序執(zhí)行過程
編譯器會把啟動代碼放在0x200的flash地址位置,用戶main程序會放在啟動代碼后,在系統(tǒng)復位時,程序PC會被芯片硬件強制為0,則程序從0x00開始執(zhí)行,在0x00處會有一個GOTO指令讓代碼執(zhí)行到0x200部分的啟動代碼,這樣就可以跨過中斷向量的地址范圍。
圖12 程序執(zhí)行過程說明
圖12中清楚的說明了代碼的執(zhí)行過程,main函數執(zhí)行之前會有執(zhí)行Start-up代碼的過程。
六.其它復位源的討論
圖13 Trap沖突復位說明
當系統(tǒng)同時發(fā)生hardTrap和Soft Trap時,則會發(fā)生Trap沖突復位,HardTrap主要是優(yōu)先級在Level13-15之間的地址錯誤Trap或者振蕩器錯誤Trap等。
圖14 Soft Trap的類別說明
諸如DMAC錯誤,或者數學錯誤,或者堆棧錯誤等之類的soft Trap發(fā)生時,由于他們的優(yōu)先級會比Hard Trap更高,因此會觸發(fā)Trap沖突復位。
圖15 非法指令執(zhí)行復位
當程序嘗試去執(zhí)行非法指令時,則會觸發(fā)IOPUWR位標志位置位,表示嘗試執(zhí)行非法指令。
比如,用戶在Flash中保存常數值,那么會僅僅用低16位的內容去保存數據,高8位設置為0x3F,這就是一個非法指令的示例,這樣就可以避免程序去執(zhí)行這個非法指令以避免去執(zhí)行保存的數據區(qū)域的指令。
另外,W寄存器在復位時會清零,直到它再一次寫進去數據,如果使用未進行初始化的W寄存器作為地址指針,則會觸發(fā)IOPUWR位置位觸發(fā)復位。
總結,本文對器件復位相關的源進行討論,同時討論和復位相關的方面,如寄存器狀態(tài),時鐘狀態(tài),并對程序啟動過程做一定介紹。





