步驟1:什么是保險絲?
當我們開始了解保險絲設置時,我們腦海中浮現(xiàn)出的根本問題是:保險絲到底是什么?為什么我們需要花時間去學習它們?
我希望這本指南對找到問題的答案有所幫助。
首先,AVR MCU通常具有三個存儲區(qū)域:1)FLASH,專用于程序代碼。
2)SRAM,用于運行時變量。
3)EEPROM,可由用戶代碼用來存儲在MCU關閉時必須保留的數據。
4)現(xiàn)在,保險絲形成了可用于編程的第四個存儲區(qū)。它包含一些包含這些位的字節(jié)。
簡單地說,保險絲是微控制器存儲器的一部分,為某些功能保留,這些功能決定了微控制器的工作方式。準確地說,保險絲是保留的。微控制器中EEPROM存儲器的一部分。 EEPROM代表電可擦可編程只讀存儲器。 EEPROM是非易失性存儲器。非易失性是指一旦存儲,即使關閉電源也可以保留存儲器。保險絲是控制低電平功能和引腳分配的EEPROM位。保險絲不能通過程序訪問,只能由芯片程序員進行更改。我將在后面解釋我的低級功能。如我所說,程序一旦完成就無法使用熔絲設置,這意味著微控制器芯片中運行的程序無法更改熔絲設置。即使您使用的是“自編程”微控制器,即允許其上運行的引導加載程序軟件將程序上傳到其閃存的微控制器,您也無法更改熔絲位。
盡管我簡要瀏覽了整個主題,但我主要打算展示如何為avr微控制器設置保險絲,以便使用外部時鐘運行它。
步驟2:為什么需要編程保險絲?
保險絲控制著微控制器的工作方式,因此更改保險絲設置可以使我們根據自己的要求來更改和修改微控制器。在芯片可以用于外部環(huán)境之前,該芯片中很少有用于配置它的參數。這些參數通過保險絲位設置。換句話說,保險絲位決定芯片的性能,是否具有引導加載程序,運行的速度和電壓,看門狗定時器條件,存儲器保護模式,啟動選項,時鐘源和分頻器,編程選項,斷電檢測等。
保險絲位的主要優(yōu)點非常明顯,可以根據情況配置微控制器。無法通過程序代碼更改時鐘行為。不同的AVR型號之間的保險絲位差異很大。
步驟3:如何編程保險絲?
在開始之前,我們需要查看Atmega8的保險絲位和的初始值。他們。由于即時通訊使我可以通過移動設備進行操作,因此我制作了包含所需詳細信息的表格。我使用Google Sheet Android應用程序創(chuàng)建了它。我找不到將它們轉換為圖片的方法。因此,我在這里發(fā)布了鏈接。
Atmega 8的保險絲位(本教程中使用的那個im)
https://docs.google.com/spreadsheets/d/1haE2Sprdsa-NgKYsOQlwI99WHfGqCItJutG4h-MnOus/edit?usp = docslist_api
現(xiàn)在,我們將繼續(xù)介紹如何根據所使用的特定編程器對AVR中的熔絲位進行編程的詳細信息。首先,我們應該查閱程序員的手冊以了解詳細信息。例如,如果您將STK600與AVR Studio一起使用,則STK600窗口具有標簽為Fuses的選項卡,您可以在其中設置不同的位,并可以在其中編程,驗證或讀取保險絲位。
(例如,我使用的是Atmega8。我主要使用Atmega 8,因為它便宜并且可以容納大多數項目的內存)。
大多數人對此主題感到困惑。簡而言之,只有兩種類型的保險絲:高保險絲(hfuse)和低保險絲(lfuse),某些微控制器還有一個額外的保險絲字節(jié),稱為擴展保險絲(efuse)。
最令人困惑的部分是這里。熔絲位的未編程狀態(tài)為邏輯高或1,對任何熔絲位進行編程都會將其電平更改為邏輯低或0。
“要記住的一個例外是-與引導加載程序相關的熔絲位不能從軟件,但是可以使用并行/串行編程工具以編程模式進行訪問。“
如上圖所示,顯示了保險絲及其位值和位數。上面提到的保險絲的一些功能是:-(我在發(fā)布的圖中使用了Atmega 8數據表)。
高保險絲字節(jié)(hfuse)
1)第一位是BOOTRST,即默認情況下未編程(1)。如果將該位編程為(0),則在加電或器件復位后,它將從引導加載程序存儲器部分開始執(zhí)行程序。簡而言之,如果使用引導程序來閃存MCU,則必須使能該位。如果僅使用ISP編程器上載固件,則不要更改此位。如果使用引導加載程序,則BOOTSZ0和BOOTSZ1也很重要。這些位允許選擇引導加載程序節(jié)的大小。
2)下一位是EESAVE。如果對此熔絲進行了編程(通過寫入0),則在芯片擦除過程中EEPROM存儲器保持不變。有時,這種保險絲可能會有所幫助。例如,如果您將一些重要數據(例如校準值)保留在EEPROM存儲器中,并且需要在不丟失數據的情況下更新程序,則可以對該位置進行編程。但是,如果要在擦除后始終保持干凈的芯片,則不要更改該位(設置為1)。
3)WDTON位用于初始設置看門狗定時器。如果對此進行編程,則在不特別注意的情況下,將強制您的看門狗定時器始終處于打開狀態(tài),并保持周期性地重置芯片。如果不需要看門狗,則不要對其編程。
4)SPIEN位用于禁用串行編程模式ISP。實際上,不可能從串行模式禁用該位。必須通過高壓編程來完成。
5)RSTDSBL位的情況與此相同。它用于禁用將RESET引腳轉換為I/O的復位功能。通常不建議這樣做。并且當在ISP模式下對器件進行編程時,不能將其禁用。
6)CKOPT位用于選擇振蕩器選項。
低熔絲(熔絲)
讓我們看一下熔絲的低字節(jié)。
1 )一組四個相似的位(CKSEL0至CKSEL3)用于選擇時鐘選項。默認情況下,CKSEL0至CKSEL3保險絲被設置為選擇內部8MHz RC振蕩器。但是我們知道AVR可以用更多不同的方式計時:
*校準的內部RC振蕩器(默認8MHz)
*外部RC振蕩器
*外部晶體或晶體諧振器
*外部低頻晶體
*外部時鐘信號源
我將在下一步中說明有關SUT(啟動時間)的內容。
稍后,我將在本指南中介紹如何自行計算這些值。
2)BODEN或掉電檢測使能位使能掉電檢測。通常禁用掉電檢測(1)。將該位編程為低(0)使能進行掉電檢測。此功能的原因是-當電源電壓低于微控制器所需的電壓時,它開始出現(xiàn)異常行為。它可能會開始擦除自己的內存,也可能會從其閃存中運行隨機部分。為避免這種情況,提供了掉電檢測功能。一旦電源電壓低于設定的BOD電平,芯片將安全切換。當電源電壓再次恢復正常時,芯片將重新啟動。
BODLEVEL-通過此位,我們可以設置掉電檢測電平。例如-如果微控制器以3.3伏特運行,我們可以將掉電檢測電平設置為2.7伏特,這樣,如果電源電壓低于此電壓,則微控制器將安全關閉。
此處要注意的有趣功能是的,像Atmega 32這樣的其他AVR微控制器也有一些不同的熔斷器,例如在高熔斷器字節(jié)中有OCDEN和JTAGEN,在Atmega 328p中有DWEN等。
我為低質量的圖片表示歉意,因為我根據我的要求對此進行了說明機器人。
第4步:對時鐘和振蕩器的了解。
是的,確實有很多保險絲計算器應用可用互聯(lián)網。但是我個人在徹底學習該主題之前不喜歡使用它?,F(xiàn)在是時候了解我們自己對熔絲位進行編程的方式了。我將撰寫如何根據我們的需求選擇和更改不同的時鐘功能。在開始編程之前,我們需要學習與該主題相關的一些術語。
什么是時鐘?
時鐘只是一種可以跟蹤時間的設備,它可以帶給您節(jié)拍的感覺搬去。例如,墻上的時鐘以秒為單位遞增。節(jié)拍器的節(jié)拍器可能每半秒或整秒給您一個節(jié)拍。時鐘滴答(每秒周期)的次數稱為其頻率,以赫茲(Hz或周期/秒)為單位。同樣,Atmega內部也有一個時鐘,其速度直接與其每秒(在時鐘的每個滴答/周期內)可以執(zhí)行多少條指令有關。大多數AVR附帶的默認時鐘速度為1 MHz(每秒1百萬個周期)。
內部振蕩器的唯一缺點是其頻率隨施加的電壓和溫度而變化,而其他時鐘則沒有這種情況。源。
如何設置時鐘速度?
我們有兩個選擇:
使用內部時鐘或外部時鐘。如果我們編寫的代碼可以執(zhí)行基本操作,并且不需要精確計時,則內部時鐘就足夠了。在任何其他情況下,尤其是對于通信(例如,使用UART),時序至關重要。在這種情況下,我們需要一種替代方法,因此我們使用諸如晶體,諧振器,振蕩器和時鐘之類的東西。它們都適合以我們想要的頻率產生我們想要的節(jié)拍,但是在業(yè)余愛好者中最常見的是晶體和諧振器。在本教程中,我們將使用一個晶體。
要使用該晶體,我們還需要兩個18-22 pF陶瓷電容器。另一方面,諧振器將電容器和晶體內置于一個封裝中,因此使其更加緊湊。這幾乎只是差異,但是如果使用諧振器,則在設置熔絲位方面可能會有細微的差異。振蕩器需要一個外部電源來工作,并且通常具有四個引腳。
啟動時間(SUT)
時鐘源通常需要一點時間進行預熱,并在微控制器啟動時向我們提供可靠的信號已開啟。這稱為啟動時間。
步驟5:自行編程時鐘保險絲!
您已經對保險絲字節(jié)及其工作原理以及在微控制器(此處為Atmega 8)中的功能有一個大概的基本了解。現(xiàn)在,我們正在進入編程階段。我主要是出于這個目的使用Winavr,所以我無法告訴您如何使用極限刻錄機和其他工具來實現(xiàn)。
我們現(xiàn)在知道我們必須從高熔絲字節(jié)更改CKOPT(第4位)并進行更改低熔絲字節(jié)中的CKSEL0,CKSEL1,CKSEL2,CKSEL3和SUT0,SUT1的值,因為它們是控制時鐘設置的位。由于我們僅配置時鐘設置,因此其他保險絲設置將保持不變。如果甚至錯誤地更改了其他保險絲的位值,微控制器也會變磚。
此電子表格包含低保險絲位CKSEL3,CKSEL2,CKSEL1和CKSEL0的選項。這將幫助我們選擇需要用于微控制器的時鐘源。我已經從Atmega8的數據表中制作了這個Google工作表,請與教程保持打開狀態(tài)
鏈接在這里-
https://docs.google.com/spreadsheets/d/11IjfDRkWHNW0dj0FEKCDzZMcXTvDuv1Q4jMPNpIYck0/edit ?usp = docslist_api
因此,由于我使用外部晶體運行微控制器,因此我將使用與該選項相對應的值CKSEL3-CKSEL0。但是我們看到,這些值在1111-1010范圍內。要選擇準確的值,我們需要查看另一個表,該表包含了我們希望微控制器獲得的頻率值。這是一張根據頻率包含CKOPT值和CKSEL3-1值的表。選擇編程的CKOPT值(0)。編程的CKOPT值用于高頻操作。我還將CKSEL3-1的值選擇為111。現(xiàn)在,我們需要從中選擇CKSEL0,SUT1和SUT0值的選項。這是鏈接-https://docs.google.com/spreadsheets/d/1028hW05QgAiBQzUzOMjDfJ1VCY8tcOMtgQAsnH5xOWw/edit?usp=docslist_api
如果您查找表格,則會找到啟動時間及其對應選項的列表位值。我選擇具有65毫秒啟動延遲時間的晶體振蕩器,因為我在這里使用了晶體振蕩器。因此,根據表,CKSEL0值為1,SUT1值為1,SUT0值為1。由于我們使用的是晶體振蕩器,并且啟動時間與晶體振蕩器相對應,因此我們的CKSEL3-CKSEL0值將變?yōu)?111.
這完成了我們的選擇選項。
第6步:總結。
上一步可能看起來很混亂,命令,但此步驟將清楚地顯示整個過程。
那么,我們實際上要做什么?
我們有一個微控制器(這里是Atmega 8)。它以出廠時的默認頻率運行。我們想在16Mhz外部晶體上運行它。
那到底該怎么做?僅查看和更改熔絲位值。我們也不要忘記,1表示未編程,0表示已編程?,F(xiàn)在,芯片處于默認的熔絲字節(jié)配置。首先,我們需要決定如何運行微控制器?為簡單起見,讓我們假設只有三個選項-外部晶體,外部諧振器或內部振蕩器。
我們發(fā)現(xiàn)晶體振蕩器是一種可靠的計時源,我們不介意為兩個22pf電容器花一點錢。現(xiàn)在,我們的選擇很明確,我們希望使用外部晶體來運行AVR芯片。
但是從哪里可以得到選擇外部晶體振蕩器的選項?
在熔絲低位字節(jié)中的CKSEL3至CKSEL0中提供了這些選項。
我們查看了微控制器數據表中提供的表格,發(fā)現(xiàn)有一個稱為陶瓷諧振器或晶振的選件。我們當然希望如此,因此我們記下與之關聯(lián)的CKSEL3-CKSEL0的位值。
Hmm,但該范圍的值范圍為1111-1010。具體要選哪一個?以及如何指定晶體振蕩器的頻率?顯然,晶體有很多可用頻率,我們只想在16Mhz上運行。為此,我們查看另一個表,其中包含頻率和與之配合使用的推薦電容器范圍。
在此表中,我們發(fā)現(xiàn)16Mhz大于1 Mhz,因此我們選擇該選項。與我們選擇的CKOPT相關的位的值為0,與此同時,我們?yōu)镃KSEL3-CKSEL1的值選擇了111。
現(xiàn)在我們可以確定我們正在運行帶有16Mhz外部晶振的avr芯片。
我們剛剛閱讀了有關熔絲位的說明,并談到了一些晶振需要預熱并啟動的啟動時間資料發(fā)出可靠的信號。
我們如何找到它?
我們再次在同一指令提供的表格中找到它。現(xiàn)在此表包含CKSEL0值以及SUT1和SUT0值。我們選擇65毫秒的啟動時間選項,因此我們的相應位值為CKSEL0 -1,SUT1-1,SUT0-1-1。
因此,我們成功完成了低熔絲字節(jié)組的選擇。高熔絲字節(jié)設置為-
7)RSTDISBL- 1
6)WDTON-1
5)SPIEN -0
4)CKOPT -1 《3》 EESAVE -1
2 )BOOTSZ1 -0
1)BOOTSZ0 -0
0)BOOTRST -1
現(xiàn)在我們必須將它們更改為-
7)RSTDISBL -1
6)WDTON -1
5)SPIEN -0
4)CKOPT -0
3)EESAVE -1
2)BOOTSZ1 -0
1)BOOTSZ0 -0
0)BOOTRST -1
11001001(二進制)或C9(十六進制)。我們只是將CKOPT從1更改為0,其他所有都保持不變。
現(xiàn)在是低熔絲字節(jié),最初是-
7)BODLEVEL -1
6)BODEN -1
5 )SUT1 -1
4)SUT0 -0
3)CKSEL3 -0
2)CKSEL2 -0
1)CKSEL1 -0
0)CKSEL0 -1
我們正在改變-7)BODLEVEL -1
6)BODEN -1
5)SUT1 -1
4)SUT0 -1 《3》 CKSEL3 -1 《2》 CKSEL2- 1
1)CKSEL1 -1 《0》 0)CKSEL0 -1
二進制為11111111,十六進制為FF。
現(xiàn)在,既然完成了evrything,我們只需要在微控制器中刻錄這些新設置即可。
使用avrdude語法,它應該是-
avrdude -c usbasp -p m8 -U lfuse:w: 0b11111111:m -U hfuse:w:0b11001001:m
但是最好以十六進制形式編寫,例如-
avrdude -c usbasp -p m8 -U lfuse:w:0xff:m -U hfuse: w:0xC9:m
Atmega8內部1Mhz振蕩器的默認值為-
avrdude -p atmega8 -c usbasp -U lfuse:w:0xE1:m -U hfuse:w:0xD9:m
最后,整個過程到此結束。盡管這并不能完全解釋保險絲及其編程方法,但對于初學者來說,這絕對是一個大概的主意。
責任編輯:wv
-
保險絲
+關注
關注
4文章
577瀏覽量
44023 -
編程
+關注
關注
88文章
3574瀏覽量
93545
發(fā)布評論請先 登錄
相關推薦
評論