STM32存儲器知識的相關(guān)應(yīng)用“>STM32存儲器 — STM32存儲器知識的相關(guān)應(yīng)用
本篇文章將重點描述在對存儲器有了比較深入了解之后的一些相關(guān)的操作案例;重點在于STM32啟動設(shè)置和IAP使用,以及bit banding的理解,加上一個簡單的IAP程序設(shè)計。
本文引用地址:http://m.butianyuan.cn/article/201611/322623.htm1 STM32的啟動
根據(jù)參考手冊RM0008中的圖表:
得知STM32的啟動有三種模式,三種模式的選擇在于芯片上的兩個Boot引腳,如RM0008種描述:
在系統(tǒng)復(fù)位之后的四個上升沿后索存BOOT引腳,從而決定啟動方式;用戶對BOOT引腳的設(shè)置決定了系統(tǒng)復(fù)位之后的啟動模式。
三個不同的啟動區(qū)域有著不同的起始地址,STM32這樣規(guī)定:
注意的是:只有當(dāng)從SRAM啟動,只有一個單一的地址0x2000 0000可以訪問;而其他兩種啟動方式除了從各自的地址訪問,還可以從0x0000 0000地址訪問。
不同的啟動方式,決定了程序在設(shè)計過程中的方法,因此必須確認好程序存放空間和系統(tǒng)啟動模式。
所以,通過設(shè)置BOOT0和BOOT1引腳,可以選擇相應(yīng)的啟動模式。
2 STM32的ICP
In Circuit Programming,在電路編程。
ICP能夠通過JTAG、SWD或Boot Loader去下載用戶程序,以達到更新整個Flash的目的;
ICP提供一個快速的、有效的設(shè)計迭代,并消除不必要的包裝處理或設(shè)備套接。
這里對ICP不做過多的論述。
3 STM32的ISP
In System Programming,在系統(tǒng)編程。
STM32在出廠時,已經(jīng)固化了一段程序在System memory(medium-density devices的地址為:0x1FFF F000,大小為2KB)存儲器中。
這段程序就是一個固定好的,并且沒法修改的Boot Loader,如編程手冊PM0042種描述的:
這個固定好的,出廠就有的Boot Loader可以通過USART1進行用戶程序的燒寫、更新;
當(dāng)然,燒寫軟件(燒寫流程)的設(shè)計需要按照其固定好的Boot Loader的燒寫協(xié)議來進行。
因此在特殊的要求燒寫方式的場合,使用ISP是不太方便的,可以采用更為方便的IAP編程方法,以下會詳細介紹。
4 STM32的Bit Banding
Bit Banding功能是相對于以往能夠進行bit操作的單片機而言的。
通過Bit Banding功能可以像51單片機的bit操作一樣。MCS51可以簡單的將P1口的第2位獨立操作:
而現(xiàn)在STM32的位段、位帶別名區(qū)就為了實現(xiàn)這樣的功能。只不過他是為需要操作的地址(1字節(jié))的每一個位(共8位)起個別名,分別對應(yīng)別名區(qū)的一個字(word)。也就是別名區(qū)的大小是Bit Band區(qū)的32倍。這樣,對32MB的別名區(qū)地址的操作,就是對相應(yīng)Bit Band區(qū)的位的操作。
注意:別名字的位[31:1]在bit-band位上不起作用。寫入0x01與寫入0xFF的效果相同。寫入0x00與寫入0x0E的效果相同。
如圖是跟Bit Banding有關(guān)系的存儲器結(jié)構(gòu):
STM32有兩個Bit Band區(qū)域,分別是:
0x2000 0000——0x2010 0000:該地址是STM32的SRAM低1MB的地址區(qū)域;
0x4000 0000——0x4010 0000:該地址是STM32的Peripherals低1MB的地址區(qū)域;
另外,STM32還有兩個對應(yīng)的Bit Band區(qū)域的別名區(qū),分別是:
0x2200 0000——0x23FF FFFF:共32MB的空間,對應(yīng)相應(yīng)1MB的每一個位;
0x4200 0000——0x43FF FFFF:共32MB的空間,對應(yīng)相應(yīng)1MB的每一個位;
接下來的問題是如何確定Bit Band區(qū)字節(jié)的位所對應(yīng)的那個別名區(qū)的字(word)。Bit Band區(qū)和別名區(qū)是一一對應(yīng)的,具體的公式為:
bit_word_addr=bit_band_base+ (byte_offset×32) + (bit_number×4);
bit_band_base:32MB別名區(qū)首地址;
byte_offset:1MB位段區(qū)偏移量,即為bit-band區(qū)中包含目標(biāo)位的字節(jié)的編號;
bit_number:位段中目標(biāo)位的位位置(0-7);
注意:別名字的位[31:1]在bit-band位上不起作用。寫入0x01與寫入0xFF的效果相同。寫入0x00與寫入0x0E的效果相同。
舉個例子(通過別名區(qū)訪問地址):
1、想操作SRAM中Bit Band區(qū)地址為0x2000 0018字節(jié)的第2位
計算別名區(qū)對應(yīng)子地址:0x2200 0000 +(18*32)+(2*4) =0x2200 0248
所以,對0x2200 0248地址的操作,就是對0x2000 0018字節(jié)的第2位進行操作;
評論