129、FLASH編程時(shí),寫入必須為半字(16位)。并且在寫入的時(shí)候必須保證所寫區(qū)域的數(shù)據(jù)必須為0xFFFF。
130、STM32的FSMC有HADDR[27:0],其中[27:26]用來(lái)選擇BANK區(qū)域的4個(gè)不同塊。剩下的[25:0]則用來(lái)連接外部存儲(chǔ)區(qū)域的地址線FSMC_A[25:0]。如果數(shù)據(jù)寬度是8bit,此時(shí)的HADDR[25:0]和FSMC_A[25:0]是完全對(duì)應(yīng)的。如果數(shù)據(jù)寬度是16bit,此時(shí)的HADDR[25:1]和FSMC_A[24:0]是對(duì)應(yīng)起來(lái)的。需要注意:無(wú)論數(shù)據(jù)寬度是多少,外部的FSMC_A[0]和A[0]總是對(duì)應(yīng)的。
131、關(guān)于LB和UB的信號(hào)控制是由硬件自動(dòng)控制的,當(dāng)AHB的數(shù)據(jù)寬度小于外部存儲(chǔ)器的數(shù)據(jù)寬度時(shí),此時(shí)LB和UB的控制信號(hào)自動(dòng)產(chǎn)生(比如字節(jié)讀取/寫入16bit的外部存儲(chǔ)器)
132、 __attribute__ (函數(shù)屬性、變量屬性、類型屬性等)。如果在使用SRAM時(shí),可以采用u32 sram_array[xx] __attribute__ ((at(0x68000000))代表將外部SRAM的空間全部給了sram_array這個(gè)變量,他具有在at0x68000000這個(gè)地址的屬性。往里面寫值就直接在SRAM里面寫值。
133、
內(nèi)存管理有一種方式叫做分塊式內(nèi)存管理。
注意表中的分配方向,從頂?shù)降住C恳豁?xiàng)對(duì)應(yīng)一個(gè)內(nèi)存塊。里面的數(shù)值代表了內(nèi)存池的狀態(tài):如果為0,表示該內(nèi)存沒(méi)有被分配;如果非0,那么數(shù)值的大小就表示了該塊內(nèi)存被連續(xù)占用的內(nèi)存數(shù)。比如說(shuō)數(shù)值為20,意思是包括該項(xiàng)在內(nèi)的內(nèi)存塊被連續(xù)占用了20塊分給了指針。
134、SD卡的分類:
一般的SD卡支持兩種傳輸模式:SD卡模式(SDIO)、SPI模式。顯然前面一種是專用模式,所以速度比較快。
135、常用的漢字內(nèi)碼系統(tǒng)有GB2313、GB13000、GBK、BIG5(繁體)。其中GB2313只有幾千個(gè)漢字,而GBK則有2萬(wàn)多漢字。
136、 要顯示漢字,采用的方式如果用點(diǎn)陣的形式是不可取的,因?yàn)檫@無(wú)法查找漢字。采用的方式就是內(nèi)碼系統(tǒng)。GBK標(biāo)準(zhǔn)中,一個(gè)漢字對(duì)應(yīng)2個(gè)字節(jié):前者稱為區(qū)(0x81~0xFE)后者為(0x40~0x7E)和(0x80~0xFE)。前者有126個(gè)區(qū),后者有190,那么可以顯示的漢字?jǐn)?shù)量有126*190=23940個(gè)。根據(jù)這兩個(gè)值用來(lái)查找字庫(kù),字庫(kù)中存放的還是每個(gè)漢字的點(diǎn)陣數(shù)據(jù)。這個(gè)字庫(kù)非常大,如果是16*16的字體,那么一個(gè)字體就需要32個(gè)字節(jié),如此說(shuō)來(lái)需要23940*32=748K的空間,可見(jiàn)非常大,所以需要外部的Flash來(lái)存儲(chǔ)這個(gè)字庫(kù)。
137、由于漢字內(nèi)碼系統(tǒng)不具有國(guó)際通用性,但是Unicode幾乎把所有的語(yǔ)言都放置進(jìn)來(lái),這樣在單片機(jī)中操作漢字時(shí),就需要將GBK和Unicode轉(zhuǎn)化。尤其是在FATFS中,創(chuàng)建中文文件名和讀取中文文件信息時(shí)需要將Unicode換轉(zhuǎn)為GBK后再進(jìn)行修改操作,再反轉(zhuǎn)換成Unicode保存修改。這么說(shuō),兩者的存在是由于標(biāo)準(zhǔn)的不統(tǒng)一,并且Unicode中只有6064個(gè)漢字,而GBK顯然是一種漢字?jǐn)U展。
138、BMP圖片編碼的順序是從左到右,從下到上。
139、VS1053是一款高性能的數(shù)字音頻解碼芯片,從SD卡中將mp3等音樂(lè)音頻文件通過(guò)SPI送給VS1053后,由其進(jìn)行音頻解碼,輸出音樂(lè)給耳機(jī)。耳機(jī)驅(qū)動(dòng)可以采用TDA1308芯片,這款芯片為AB類耳機(jī)驅(qū)動(dòng)器。
140、
141、IAP(In Application Programming)在應(yīng)用編程是為了后期開(kāi)發(fā)更新程序方便而提出的概念。具體的實(shí)現(xiàn)方法如下圖所示:
在普通編程中,flash中的code是通過(guò)JTAG和ISP等工具下載到單片機(jī)中。而在IAP編程中,flash被分區(qū)為A和B兩個(gè)區(qū)域,A區(qū)域只允許用USB/USART等方式下載,此區(qū)域作為更新B區(qū)域的代碼用,相關(guān)文章:詳解STM32在線IAP升級(jí)。B區(qū)域則是用戶的code區(qū)域,真正的代碼在這里被執(zhí)行,放置的就是app。
上圖表示STM32正常運(yùn)行的流程圖,可以看到上電復(fù)位后系統(tǒng)從0x80000004處開(kāi)始運(yùn)行程序,這里放置的是復(fù)位中斷向量,然后跳轉(zhuǎn)至復(fù)位中斷程序入口后再跳轉(zhuǎn)至main函數(shù)運(yùn)行用戶的程序。
上圖表示加入IAP后的STM32程序運(yùn)行流程圖。可以看到上電復(fù)位后跳到IAP程序的main函數(shù)處運(yùn)行IAP過(guò)程(這個(gè)過(guò)程就是把下面灰底色塊的程序代碼燒進(jìn)B區(qū)域à代碼更新)。后面的過(guò)程和STM32正常運(yùn)行一樣,如果出現(xiàn)中斷請(qǐng)求,還是跳轉(zhuǎn)到A區(qū)域中的中斷向量表中,然后再跳轉(zhuǎn)到B區(qū)域的中斷服務(wù)入口。
142、 USB有四根線,VCC、GND、D+、D-。在USB主機(jī)上,D+和D-均通過(guò)一個(gè)15K的電阻接地,這樣兩條線均為低電平。在USB設(shè)備中,對(duì)于高速設(shè)備會(huì)在D+通過(guò)一個(gè)1.5K的電阻接到VCC,而低俗設(shè)備會(huì)在D-通過(guò)一個(gè)1.5K的電阻接到VCC。這樣主機(jī)就可以通過(guò)D+和D-的高電平的到來(lái)來(lái)檢測(cè)是否有設(shè)備接入,并且識(shí)別高低速設(shè)備。