有關STC15X問題

2021-09-28 14:35:37 字數 3797 閱讀 8816

常規上rom是用來儲存固化程式的,ram是用來存放資料的。由於flash rom比普通的rom讀寫速度快,擦寫方便,一般用來儲存使用者程式和需要永久儲存的資料。譬如說,現在家用的電子式電度表,它的核心是一款微控制器,該微控制器的程式就是存放在rom裡的。電度表在工作過程中,是要運算資料的,要採集電壓和電流,並根據電壓和電流計算出電度來。電壓和電流時乙個適時的資料,使用者不關心,它只是用來計算電度用,計算完後該次採集的資料就用完了,然後再採集下一次,因此這些值就沒必要永久儲存,就把它放在ram裡邊。然而計算完的電度,是需要永久儲存的,微控制器會定時或者在停電的瞬間將電度數存入到flash裡。

rom存放指令**和一些固定數值,程式執行後不可改動;ram用於程式執行中資料的隨機訪問,掉電後資料消失

code就是指將資料定義在rom區域,具唯讀屬性,例如一些led顯示的表頭資料就可以定義成code儲存在rom。

rom:(read only memory)程式儲存器

在微控制器中用來儲存程式資料及常量資料或變數資料,凡是c檔案及**件中所有**、全域性變數、區域性變數、「const」限定符定義的常量資料、startup.asm檔案中的**(類似arm中的bootloader或者x86中的bios,一些低端的微控制器是沒有這個的)通通都儲存在rom中。

ram:(random access memory)隨機訪問儲存器

用來儲存程式中用到的變數。凡是整個程式中,所用到的需要被改寫的量,都儲存在ram中,「被改變的量」包括全域性變數、區域性變數、堆疊段。

程式經過編譯、彙編、鏈結後,生成hex檔案。用專用的燒錄軟體,通過燒錄器將hex檔案燒錄到rom中(究竟是怎樣將hex檔案傳輸到mcu內部的rom中的呢?),因此,這個時候的rom中,包含所有的程式內容:無論是一行一行的程式**,函式中用到的區域性變數,標頭檔案中所宣告的全域性變數,const宣告的唯讀常量,都被生成了二進位制資料,包含在hex檔案中,全部燒錄到了rom裡面,此時的rom,包含了程式的所有資訊,正是由於這些資訊,「指導」了cpu的所有動作。

可能有人會有疑問,既然所有的資料在rom中,那ram中的資料從**來?什麼時候cpu將資料載入到ram中?會不會是在燒錄的時候,已經將需要放在ram中資料燒錄到了ram中?

要回答這個問題,首先必須明確一條:rom是唯讀儲存器,cpu只能從裡面讀資料,而不能往裡面寫資料,掉電後資料依然儲存在儲存器中;ram是隨機儲存器,cpu既可以從裡面讀出資料,又可以往裡面寫入資料,掉電後資料不儲存,這是條永恆的真理,始終記掛在心。

清楚了上面的問題,那麼就很容易想到,ram中的資料不是在燒錄的時候寫入的,因為燒錄完畢後,拔掉電源,當再給mcu上電後,cpu能正常執行動作,ram中照樣有資料,這就說明:ram中的資料不是在燒錄的時候寫入的,同時也說明,在cpu執行時,ram中已經寫入了資料。關鍵就在這裡:這個資料不是人為寫入的,cpu寫入的,那cpu又是什麼時候寫入的呢?聽我娓娓道來。

上回說到,rom中包含所有的程式內容,在mcu上電時,cpu開始從第1行**處執行指令。這裡所做的工作是為整個程式的順利執行做好準備,或者說是對ram的初始化(注:rom是唯讀不寫的),工作任務有幾項:

1、為全域性變數分配位址空間----如果全域性變數已賦初值,則將初始值從rom中拷貝到ram中,如果沒有賦初值,則這個全域性變數所對應的位址下的初值為0或者是不確定的。當然,如果已經指定了變數的位址空間,則直接定位到對應的位址就行,那麼這裡分配位址及定位位址的任務由「聯結器」完成。

2、設定堆疊段的長度及位址----用c語言開發的微控制器程式裡面,普遍都沒有涉及到堆疊段長度的設定,但這不意味著不用設定。堆疊段主要是用來在中斷處理時起「儲存現場」及「現場還原」的作用,其重要性不言而喻。而這麼重要的內容,也包含在了編譯器預設的內容裡面,確實省事,可並不一定省心。平時怎麼就沒發現呢?奇怪。

3、分配資料段data,常量段const,**段code的起始位址。**段與常量段的位址可以不管,它們都是固定在rom裡面的,無論它們怎麼排列,都不會對程式產生影響。但是資料段的位址就必須得關心。資料段的資料時要從rom拷貝到ram中去的,而在ram中,既有資料段data,也有堆疊段stack,還有通用的工作暫存器組。通常,工作暫存器組的位址是固定的,這就要求在絕對定址資料段時,不能使資料段覆蓋所有的工作暫存器組的位址。必須引起嚴重關注。

這裡所說的「第一行**處」,並不一定是你自己寫的程式**,絕大部分都是編譯器代勞的,或者是編譯器自帶的demo程式檔案。因為,你自己寫的程式(c語言程式)裡面,並不包含這些內容。高階一點的微控制器,這些內容,都是在startup的檔案裡面。仔細閱讀,有好處的。

通常的做法是:普通的flash mcu是在上電時或復位時,pc指標裡面的存放的是「0000」,表示cpu從rom的0000位址開始執行指令,在該位址處放一條跳轉指令,使程式跳轉到_main函式中,然後根據不同的指令,一條一條的執行,當中斷發生時(中斷數量也很有限,2~5個中斷),按照系統分配的中斷向量表位址,在中斷向量裡面,放置一條跳轉到中斷服務程式的指令,如此如此,整個程式就跑起來了。決定cpu這樣做,是這種rom結構所造成的。

其實,這裡面,c語言編譯器作了很多的工作,只是,你不知道而已。如果你仔細閱讀編譯器自帶的help檔案就會知道很多的事情,這是對編譯器了解最好的途徑。

i/o口暫存器:

也是可以被改變的量,它被安排在乙個特別的ram位址,為系統所訪問,而不能將其他變數定義在這些位置。

中斷向量表:

中斷向量表是被固定在mcu內部的rom位址中,不同的位址對應不同的中斷。每次中斷產生時,直接呼叫對應的中斷服務子程式,將程式的入口位址放在中斷向量表中。

rom的大小問題:

對於flash型別的mcu,rom空間的大小通常都是整位元組的,即為ak bits。這很好理解,一眼就知道,rom的空間為ak。但是,對於stc型別的微控制器,經常看到資料手冊上寫的晶元型號是「stc15f2k60s2」,可能會產生疑惑,這個「rom」認為是2k呢還是60k呢?

stc微控制器型號繁多,下面來分析一下stc微控制器的型號的意義吧。如 stc,15,f,2k,60,s2

stc:使用者不可將使用者程式區的程式flash當eeprom使用,但有專門的eeprom,iap:使用者可將使用者程式區的程式flash當eeprom使用,irc:使用者可將使用者程式區的程式flash當eeprom使用,且使用內部24mhz時鐘或外部晶振。

15:產品大系列,stc微控制器有89、90、10、11、12、15這幾個大系列,每個系列都有自己的特點。89系列是老舊而傳統的微控制器,可以和at89系列完全相容,是12t微控制器。90是基於89系列的改進型產品系列。10和11系列是有著便宜**的1t微控制器,有pwm、4態io介面、eeprom等功能,但都沒有adc這個高階功能。12是增強型功能的1t微控制器,型號後面有「ad」的就有adc功能的微控制器。15:15系列是stc公司最新推出的產品,最大的特別是內部整合了高精度的r/c時鐘,可以完全不需要接外部晶振。

f:這個位置一般是用來表示微控制器工作電壓的,如果是c或f表示這款微控制器是5v電壓下工作的,如果是le或l則表示這款微控制器是工作在3v電壓下的。

2k:這裡表示ram大小

60:這個位置是用來表示微控制器內部flash空間大小的。

s2:2組高速非同步序列通訊埠uart(可同時使用),spi功能,內部eeprim功能,a/d轉換功能(pwn還可當d/a使用),ccp/pwn/pca功能。s字樣:1組高速非同步序列通訊埠uart,spi功能,內部eeprim功能,無a/d轉換功能(pwn還可當d/a使用),無ccp/pwn/pca功能。as字樣:1組高速非同步序列通訊埠uart,spi功能,內部eeprim功能,a/d轉換功能(pwn還可當d/a使用),ccp/pwn/pca功能。

所以, stc15f2k60s2含義為:stc公司生產晶元,使用者不可將使用者程式區的程式flash當eeprom使用,但有專門的eeprom、15系列、ram為2k、工作在5v電壓、60kflash、2組高速非同步序列通訊埠uart(可同時使用),spi功能,內部eeprim功能,a/d轉換功能(pwn還可當d/a使用),ccp/pwn/pca功能

STC15 按鍵中斷

實現功能 通電時亮乙個燈,輸出高電平x分鐘,低電平x分鐘 按一下變成兩個燈,高電平x分鐘,低電平x分鐘 再按一下變成三個燈,高電平x分鐘,低電平x分鐘 再按一下回到乙個燈 核心是通過按鍵改變flag的值,然後在延時中判斷flag值是否和原先的值相同 include reg51.h define on...

STC15微控制器的EEPROM程式設計

在程式中使用 stc15微控制器是乙個8位的微控制器,據說在世界上銷量最大,是國產的品牌。其中也有許多值得稱道的地方,比如不用晶振,不用外部的儲存器,flash可以做記憶體使用等。可以進入休眠狀態,外部中斷就可以喚醒等。在使用者需要保持資料,當掉電可以儲存這些資料,等下次啟動後繼續使用資料。這個功能...

STC15 微控制器 利用 外部中斷 測頻率

中斷測頻率 先來看張圖 圖中標明 itx 0 時 下降沿觸發中斷 itx 1 時 上公升沿,下降沿均可觸發中斷,這裡要注意不是隨便乙個io口有上公升沿或下降沿時都觸發中斷,比如我的int0 對應的埠是p32 所以 只有p32埠有上公升沿 下降沿時才會觸發外部中斷0。include include t...