最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

你不知道的MCU復(fù)位和程序啟動那些事

2022-11-24 16:08 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

MCU通常會在工作之前,先經(jīng)歷復(fù)位和啟動的一個過程,在用戶使用過程中往往在這個階段的工作不是那么的清楚,這里我們就這一話題進(jìn)行一個討論。

一.MCU的復(fù)位問題


一般來說,16位MCU包括dsPIC33的復(fù)位源主要包含以上7種,他們都可以對器件產(chǎn)生復(fù)位的作用,但是細(xì)節(jié)有所不同。


從復(fù)位系統(tǒng)框圖上看,BOR和POR二者是和VDD電源有關(guān)的兩種,看門狗和外部復(fù)位引腳復(fù)位也是比較常見的復(fù)位類型。




復(fù)位寄存器RCON包含了復(fù)位相關(guān)的狀態(tài),當(dāng)發(fā)生復(fù)位時RCON這個寄存器就會更新,以便表征是哪一個復(fù)位源發(fā)生了復(fù)位。除此之外,這個寄存器也包含了WDT及低功耗的特性的狀態(tài)信息,所以用戶可以查看這個寄存器去判斷復(fù)位原因。



從圖示注釋中,我們可以看到用戶在軟件中可以對這些RCON寄存器位置位1,但是這不會導(dǎo)致器件復(fù)位。


二.復(fù)位和中斷的關(guān)系



在XC16編譯器中,當(dāng)用戶沒有提供相應(yīng)中斷源的中斷服務(wù)程序時,會在中斷向量位置放置一個軟件復(fù)位中斷指令SWR,這時如果有一個意外中斷發(fā)生時,便觸發(fā)了軟件復(fù)位使得器件復(fù)位。



規(guī)格書中也有說明,任何未實(shí)施的或者未使用的中斷向量位置都會放一個默認(rèn)中斷處理程序,它包含一條RESET指令。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ? ??


三.復(fù)位和時鐘的關(guān)系

當(dāng)器件復(fù)位時,其時鐘狀態(tài)是什么?一般來說它是由芯片配置位決定的。


當(dāng)器件支持Clock Switch模式時,初始時鐘由OSCCON寄存器中的COSC決定,切換后的時鐘由NOSC決定。



一般來說,從進(jìn)入復(fù)位到執(zhí)行第一條指令之間的時間,取決于所使用的振蕩器,當(dāng)使用Primary和Secondary振蕩器時,由于需要和外部晶振同步,所以需要在RESET時等待時間較長才能穩(wěn)定。如果使用內(nèi)部振蕩器的話,就非常快就可以穩(wěn)定,基于配置位對時鐘的選擇,在復(fù)位時會等待一定的時間,最后在出復(fù)位狀態(tài)前達(dá)到時鐘穩(wěn)定。

雙速啟動的含義就是說,采用FRC振蕩器快速啟動,然后當(dāng)Primary振蕩器達(dá)到穩(wěn)定后再切換為它,這樣可以避免等待外部晶振的同步時間。

四.復(fù)位和寄存器及變量狀態(tài)的關(guān)系


外設(shè)的特殊功能寄存器SFR一般存在RAM中,在復(fù)位時可能會被改變,在規(guī)格書中會規(guī)定各個寄存器SFR在復(fù)位時的值。當(dāng)這個值是u時,就是說它在復(fù)位時是不改變,x就是說它在復(fù)位時的值是不確定的。當(dāng)然,有一些寄存器,在POR和BOR時會有不同的值,這個需要注意一下。

值得注意的各種復(fù)位源中,只有POR會改變data Memory的內(nèi)容,而其它則不會改變。

五.程序啟動代碼的執(zhí)行

一般來說,C編譯器會在執(zhí)行用戶指令前,調(diào)用一段啟動代碼,這段啟動代碼會在結(jié)束復(fù)位時執(zhí)行,這段啟動代碼的目的就是為運(yùn)行用戶C程序而做的系統(tǒng)準(zhǔn)備。典型的啟動代碼由編譯器去提供,他們將改變在復(fù)位后的memory內(nèi)容。

另外,在執(zhí)行啟動代碼時,XC16編譯器會提供一些前導(dǎo)選項(xiàng),比如Persistent,允許用戶在執(zhí)行啟動代碼時不改變某些變量。也有一些編譯器會提供更直接的選項(xiàng),比如在啟動代碼時,不初始化變量,所以,需要注意編譯器的處理方式。


編譯器會把啟動代碼放在0x200的flash地址位置,用戶main程序會放在啟動代碼后,在系統(tǒng)復(fù)位時,程序PC會被芯片硬件強(qiáng)制為0,則程序從0x00開始執(zhí)行,在0x00處會有一個GOTO指令讓代碼執(zhí)行到0x200部分的啟動代碼,這樣就可以跨過中斷向量的地址范圍。



圖12中清楚的說明了代碼的執(zhí)行過程,main函數(shù)執(zhí)行之前會有執(zhí)行Start-up代碼的過程。

六.其它復(fù)位源的討論



當(dāng)系統(tǒng)同時發(fā)生hardTrap和Soft Trap時,則會發(fā)生Trap沖突復(fù)位,HardTrap主要是優(yōu)先級在Level13-15之間的地址錯誤Trap或者振蕩器錯誤Trap等。


諸如DMAC錯誤,或者數(shù)學(xué)錯誤,或者堆棧錯誤等之類的soft Trap發(fā)生時,由于他們的優(yōu)先級會比Hard Trap更高,因此會觸發(fā)Trap沖突復(fù)位。


當(dāng)程序嘗試去執(zhí)行非法指令時,則會觸發(fā)IOPUWR位標(biāo)志位置位,表示嘗試執(zhí)行非法指令。

比如,用戶在Flash中保存常數(shù)值,那么會僅僅用低16位的內(nèi)容去保存數(shù)據(jù),高8位設(shè)置為0x3F,這就是一個非法指令的示例,這樣就可以避免程序去執(zhí)行這個非法指令以避免去執(zhí)行保存的數(shù)據(jù)區(qū)域的指令。

另外,W寄存器在復(fù)位時會清零,直到它再一次寫進(jìn)去數(shù)據(jù),如果使用未進(jìn)行初始化的W寄存器作為地址指針,則會觸發(fā)IOPUWR位置位觸發(fā)復(fù)位。

總結(jié),本文對器件復(fù)位相關(guān)的源進(jìn)行討論,同時討論和復(fù)位相關(guān)的方面,如寄存器狀態(tài),時鐘狀態(tài),并對程序啟動過程做一定介紹。


原文作者:電源漫談



你不知道的MCU復(fù)位和程序啟動那些事的評論 (共 條)

分享到微博請遵守國家法律
浮梁县| 晋中市| 巩义市| 比如县| 中阳县| 义马市| 博野县| 隆安县| 塔城市| 汉川市| 子长县| 淮滨县| 汶上县| 陇南市| 锦州市| 婺源县| 华宁县| 游戏| 南京市| 武川县| 白玉县| 海盐县| 三穗县| 庆城县| 峨眉山市| 那坡县| 锦屏县| 宜春市| SHOW| 龙游县| 高雄县| 库尔勒市| 襄汾县| 宁城县| 航空| 黄石市| 平定县| 甘孜县| 峡江县| 金塔县| 内黄县|