stm32f429 移植RT_Thread
當(dāng)然現(xiàn)在用的很火的STM32也不例外;RTT最大的特點就是線程數(shù)不限,支持以線程為基本調(diào)度單位的多任務(wù)系統(tǒng)。調(diào)度算法是基于優(yōu)先級的全搶占式線程調(diào)度,支持256個線程優(yōu)先級(亦可配置成32個線程優(yōu)先級),0優(yōu)先級代表 最高優(yōu)先級,255優(yōu)先級留給空閑線程使用;相同優(yōu)先級上支持多個線程,這些相同優(yōu)先級的線程采用可設(shè)置時間片長度的時間片輪轉(zhuǎn)調(diào)度;調(diào)度器尋找下一個最 高優(yōu)先級就緒線程的時間是恒定的(O(1))。系統(tǒng)不限制線程數(shù)量的多少,只與物理平臺的具體內(nèi)存相關(guān)。
現(xiàn)在2014.2月,RTT已經(jīng)更新到1.2.0版本,當(dāng)然現(xiàn)在STM32也出了最新的429/439,但是RTT里只支持了40X;但是40X與429/439在硬件上區(qū)別不是很大這樣我們就可以用40X作為模板進行移植了。
在移植之前大家要知道,RTT是靠scons來編譯和生成keil或者IAR的工程文件的,所以用scons這個工具在移植時比較方便,不必自己去找那些文件。
在此之前確保自己電腦上已經(jīng)安裝了Python和scons:下載的地址 Python:http://www.python.org/download/ (在此我用的是Python2.7)
scons: http://www.scons.org/download.php 選擇適合自己系統(tǒng)版本
先安裝Python;再把Python的安裝路徑添加到系統(tǒng)的PATH中;再安裝scons一路next;會自動安裝到:XXXPython27Scripts目錄下,再把這路徑添加到系統(tǒng)PATH中;弄好了后分別在cmd下運行一下Python -v,scons -v看安裝是否成功。
接下來去RTT官網(wǎng)下載源碼,一般首頁的右上角就會有下載鏈接:下載下來后解壓到一個盤的根目錄:改名為RT_Thread,比如D:RT_Thread;在系統(tǒng)的系統(tǒng)變量中添加一個RTT_ROOT 變量,把自己剛剛那個路徑填進去,運行一下set RTT_ROOT,看是否成功。
再把stm32f429的庫函數(shù)下載下來。
現(xiàn)在回到剛剛放RT_thread文件的中去:
bsp里就是可以支持芯片的工程模板;里面有一個stm32f40x目錄,把它拷貝出來,為了不破壞原來的文件;之前說了RT_Thread是靠scons來編譯或者建立keil工程的,和linux的Makefile有些相似之處,在這個目錄下有幾個比較重要的文件:
一個是rtconfig.h,就是通過這個文件添加和刪減系統(tǒng)組件的;還有一個是template.uvproj這是生成的keil工程的模板,可不要刪了。接下來用寫字板打開 rtconfig.py 文件,他就是定義編譯器這些的巨像Makefile,我們用的是keil,修改一下 keil 的安裝路徑,看看自己keil裝到哪了,如果一致就不用改了。實打開每個文件夾下面都一個SConscript文件,這個就是讓文件關(guān)聯(lián)起來的文件,大家仔細看看就知道它是如何工作的了;
大家可以看看rtconfig.h文件,看了就知道是怎么注冊一個組件,刪減一個組件;默認(rèn)就開了一個finsh,我們就先移植這個簡單的。
打開命令行cmd ,切換到stm32f40x目錄下,執(zhí)行 scons --target=mdk4 –s ,這下就把keil工程建建好了,keil打開工程;大家會發(fā)現(xiàn)keil的設(shè)置有些問題,我們手動改一下,就是芯片選型,還有就是外部晶振。這兩個改好后;我們看看工程文件:
比較整潔吧,比自己手動移植干凈的多,打開Drivers里面的board.c/ board.h就是初始化板子,看看board.h中會發(fā)現(xiàn)板子用的是USART2,而且內(nèi)存也不對,下邊紅的就要改的(如果你用的是usart就不用改),如果用的不是默認(rèn)引腳,那再打開usart.c把引腳一改。
// Internal SRAM memory size[Kbytes] <8-64>
// Default: 64
#define STM32_SRAM_SIZE 192 //stm32f429 是 256K 在0x20000000后有192K 在0x10000000還有64k
#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024)
#define RT_USING_UART1
//#define RT_USING_UART2
//#define RT_USING_UART3
// Console on USART: <0=> no console <1=>USART 1 <2=>USART 2 <3=> USART 3
// Default: 1
#define STM32_CONSOLE_USART 1
下一個文件夾STM32_Stperiph:這個文件改的多一點,因為和STM32F429的庫文件有些不合,先把這個目錄下的文件都移除;看看最后的那個startup匯編文件也不對,之前不是下載了stm32f429的庫文件嘛,把429要的庫文件替換STM32_Stperiph下的文件,把里面的startup_stm32f429_439xx.s替換原來的startup_stm32f4xx.s,分別在在剛剛拷貝出來的文件里stm32f40xLibrariesSTM32F4xx_StdPeriph_Driverinc src和
stm32f40xLibrariesCMSISSTSTM32F4xxSourceTemplatesarm目錄下。再把這文件的文件添加到STM32_Stperiph下。
那么我們先編譯一下,會發(fā)現(xiàn)有錯誤,為什么呢?因為我們忘了還有一個文件忘改了,那就是stm32f4xx_conf.h;它在stm32f4xxdrivers目錄下,把新下的庫文件里面的stm32f4xx_conf.h拷貝過來。
在編譯一次,應(yīng)該就可以通過了,下載下去就可以看見串口打印出信息了。
再次要確定自己的晶振是不是25MHz,如果是8MHz就必須在stm32f4xx_conf.h中加上:(這是在readme.txt有說)
#if defined (HSE_VALUE)
/* Redefine the HSE value; its equal to 8 MHz on the STM32F4-DISCOVERY Kit */
#undef HSE_VALUE
#define HSE_VALUE ((uint32_t)8000000)
#endif /* HSE_VALUE */
評論