stm32f429 移植RT_Thread
當(dāng)然現(xiàn)在用的很火的STM32也不例外;RTT最大的特點(diǎn)就是線程數(shù)不限,支持以線程為基本調(diào)度單位的多任務(wù)系統(tǒng)。調(diào)度算法是基于優(yōu)先級(jí)的全搶占式線程調(diào)度,支持256個(gè)線程優(yōu)先級(jí)(亦可配置成32個(gè)線程優(yōu)先級(jí)),0優(yōu)先級(jí)代表 最高優(yōu)先級(jí),255優(yōu)先級(jí)留給空閑線程使用;相同優(yōu)先級(jí)上支持多個(gè)線程,這些相同優(yōu)先級(jí)的線程采用可設(shè)置時(shí)間片長(zhǎng)度的時(shí)間片輪轉(zhuǎn)調(diào)度;調(diào)度器尋找下一個(gè)最 高優(yōu)先級(jí)就緒線程的時(shí)間是恒定的(O(1))。系統(tǒng)不限制線程數(shù)量的多少,只與物理平臺(tái)的具體內(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作為模板進(jìn)行移植了。
在移植之前大家要知道,RTT是靠scons來編譯和生成keil或者IAR的工程文件的,所以用scons這個(gè)工具在移植時(shí)比較方便,不必自己去找那些文件。
在此之前確保自己電腦上已經(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;會(huì)自動(dòng)安裝到:XXXPython27Scripts目錄下,再把這路徑添加到系統(tǒng)PATH中;弄好了后分別在cmd下運(yùn)行一下Python -v,scons -v看安裝是否成功。
接下來去RTT官網(wǎng)下載源碼,一般首頁的右上角就會(huì)有下載鏈接:下載下來后解壓到一個(gè)盤的根目錄:改名為RT_Thread,比如D:RT_Thread;在系統(tǒng)的系統(tǒng)變量中添加一個(gè)RTT_ROOT 變量,把自己剛剛那個(gè)路徑填進(jìn)去,運(yùn)行一下set RTT_ROOT,看是否成功。
再把stm32f429的庫(kù)函數(shù)下載下來。
現(xiàn)在回到剛剛放RT_thread文件的中去:
bsp里就是可以支持芯片的工程模板;里面有一個(gè)stm32f40x目錄,把它拷貝出來,為了不破壞原來的文件;之前說了RT_Thread是靠scons來編譯或者建立keil工程的,和linux的Makefile有些相似之處,在這個(gè)目錄下有幾個(gè)比較重要的文件:
一個(gè)是rtconfig.h,就是通過這個(gè)文件添加和刪減系統(tǒng)組件的;還有一個(gè)是template.uvproj這是生成的keil工程的模板,可不要?jiǎng)h了。接下來用寫字板打開 rtconfig.py 文件,他就是定義編譯器這些的巨像Makefile,我們用的是keil,修改一下 keil 的安裝路徑,看看自己keil裝到哪了,如果一致就不用改了。實(shí)打開每個(gè)文件夾下面都一個(gè)SConscript文件,這個(gè)就是讓文件關(guān)聯(lián)起來的文件,大家仔細(xì)看看就知道它是如何工作的了;
大家可以看看rtconfig.h文件,看了就知道是怎么注冊(cè)一個(gè)組件,刪減一個(gè)組件;默認(rèn)就開了一個(gè)finsh,我們就先移植這個(gè)簡(jiǎn)單的。
打開命令行cmd ,切換到stm32f40x目錄下,執(zhí)行 scons --target=mdk4 –s ,這下就把keil工程建建好了,keil打開工程;大家會(huì)發(fā)現(xiàn)keil的設(shè)置有些問題,我們手動(dòng)改一下,就是芯片選型,還有就是外部晶振。這兩個(gè)改好后;我們看看工程文件:
比較整潔吧,比自己手動(dòng)移植干凈的多,打開Drivers里面的board.c/ board.h就是初始化板子,看看board.h中會(huì)發(fā)現(xiàn)板子用的是USART2,而且內(nèi)存也不對(duì),下邊紅的就要改的(如果你用的是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
下一個(gè)文件夾STM32_Stperiph:這個(gè)文件改的多一點(diǎn),因?yàn)楹蚐TM32F429的庫(kù)文件有些不合,先把這個(gè)目錄下的文件都移除;看看最后的那個(gè)startup匯編文件也不對(duì),之前不是下載了stm32f429的庫(kù)文件嘛,把429要的庫(kù)文件替換STM32_Stperiph下的文件,把里面的startup_stm32f429_439xx.s替換原來的startup_stm32f4xx.s,分別在在剛剛拷貝出來的文件里stm32f40xLibrariesSTM32F4xx_StdPeriph_Driverinc src和
stm32f40xLibrariesCMSISSTSTM32F4xxSourceTemplatesarm目錄下。再把這文件的文件添加到STM32_Stperiph下。
那么我們先編譯一下,會(huì)發(fā)現(xiàn)有錯(cuò)誤,為什么呢?因?yàn)槲覀兺诉€有一個(gè)文件忘改了,那就是stm32f4xx_conf.h;它在stm32f4xxdrivers目錄下,把新下的庫(kù)文件里面的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 */
評(píng)論