1、將下載的rt-thread-2.0.1解壓后,得到如下圖所示的文件列表。
在bsp目錄下可以找到stm32f40x文件夾,這文件夾里面包括了庫(kù)函數(shù),其他芯片平臺(tái)的文件夾統(tǒng)統(tǒng)刪掉。在libcpu下,只需要將arm文件夾里面的common和cortex-m4留下來(lái),其他的也都統(tǒng)統(tǒng)刪掉。還有其他一些輔助性的文件,如:documentation、examples、tools什么的我們也統(tǒng)統(tǒng)刪掉,處理完這些后,一個(gè)干凈的RTT就準(zhǔn)備好了。
2、雖然RT-thread將文件分類的很好,但最好還是根據(jù)自己的項(xiàng)目習(xí)慣將整個(gè)項(xiàng)目整理一下。將整個(gè)軟件項(xiàng)目分成四個(gè)部分:app,bsp,mdk,rt-thread-2.0.1。如下圖所示。
app:應(yīng)用層,存放項(xiàng)目開發(fā)時(shí)自己編寫的應(yīng)用文件
bsp:驅(qū)動(dòng)層,里面主要包括了RT-thread在stm32f40x平臺(tái)中的底層驅(qū)動(dòng)(applications,drivers,libraries_1.5.0),以及項(xiàng)目所使用的外設(shè)驅(qū)動(dòng)(peripheral)
mdk:存放keil mdk5.15的相關(guān)工程文件
rt-thread-2.0.1:系統(tǒng)層,存放rt-thread-2.0.1中的components(系統(tǒng)組件),include(系統(tǒng)內(nèi)核頭文件),libcpu(芯片移植)和src(系統(tǒng)內(nèi)核源文件)
3、安裝好keil mdk5.15后,新建項(xiàng)目工程文件并保存在mdk文件夾中。根據(jù)項(xiàng)目文件分類添加源文件,如下圖所示。
然后向工程添加頭文件目錄,如下圖所示。
4、配置stm32f407vgt6系統(tǒng)時(shí)鐘
?。?)在stm32f4xx.h文件中選擇#define STM32F40_41xxx以及#define USE_STDPERIPH_DRIVER;
(2)修改stm32f4xx.h文件中默認(rèn)的系統(tǒng)外部晶振時(shí)鐘#define HSE_VALUE ((uint32_t)8000000)
?。?)修改system_stm32f4xx.c文件中所選器件有關(guān)系統(tǒng)時(shí)鐘的PLL_M,PLL_N的值(PLL_P=2)。對(duì)于stm32f407xx,系統(tǒng)時(shí)鐘為168MHZ,一般只需修改PLL_M,PLL_N。
#if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F401xx)
/* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */
#define PLL_M 8
。。。。。。
#if defined(STM32F40_41xxx) || defined(STM32F427_437xx) || defined(STM32F429_439xx) || defined(STM32F446xx)
#define PLL_N 336
/* SYSCLK = PLL_VCO / PLL_P */
?。?)使用stm32f40_41xxx的FPU,需要在SystemInit函數(shù)開頭添加相關(guān)語(yǔ)句,同時(shí)在keil工程配置中Floating Point Hardware選擇 “Use Single Precision” 。
(在stm32f4xx.h中已默認(rèn)設(shè)置#define __FPU_PRESENT 1,在core_cm4.h中已默認(rèn)設(shè)置__FPU_USED == 1)。
/* FPU settings ------------------------------------------------------------
* If no this settings,it maybe enter HardFault_Handler() interrupt when mdk complier chose “Use Single Precision” to use FPU instruction. */
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB-》CPACR |= ((3UL 《《 10*2)|(3UL 《《 11*2)); /* set CP10 and CP11 Full Access */
#endif
?。?)在stm32f4xx_it.h和stm32f4xx_it.c中將HardFault_Handler,PendSV_Handler以及SysTick_Handler三個(gè)中斷入口函數(shù)注釋掉。
HardFault_Handler,PendSV_Handler在context_rvds.S文件中分別實(shí)現(xiàn)RT-thread系統(tǒng)異常處理和線程切換;
SysTick_Handler在board.c中實(shí)現(xiàn)RT-thread系統(tǒng)時(shí)鐘節(jié)拍計(jì)數(shù)。
?。?)在board.h中確定stm32f407的SRAM大小,以及SRAM結(jié)束地址。stm32f407vg共有192K的SRAM(其中可被訪問(wèn)的只有128k,起始地址為0x20000000)。
// 《o》 Internal SRAM memory size[Kbytes] 《8-64》
// 《i》Default: 64
#define STM32_SRAM_SIZE 128
#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024)
5、若需要在項(xiàng)目中啟用finsh組件以及組件初始化函數(shù),為了保證用戶自行編寫的函數(shù)不會(huì)被keil編譯器優(yōu)化掉,則需要修改MDK設(shè)置,如下:
在Linker-》Misc controls標(biāo)簽下,鍵入”--keep __fsym_* --keep __vsym_* --keep __rt_init_*”這個(gè)命令,該命令會(huì)保留未被函數(shù)主體調(diào)用的函數(shù)。這樣在使用finsh組件調(diào)試時(shí)仍然可以運(yùn)行沒(méi)有被調(diào)用過(guò)的函數(shù)。
6、修改系統(tǒng)配置文件rtconfig.h的相關(guān)系統(tǒng)參數(shù),如下面所示為系統(tǒng)基礎(chǔ)配置:
/* RT-Thread config file */
#ifndef __RTTHREAD_CFG_H__
#define __RTTHREAD_CFG_H__
/* RT_NAME_MAX*///指定了系統(tǒng)內(nèi)核對(duì)象名稱的最大長(zhǎng)度(比如線程,信號(hào)量,互斥鎖,事件等),多余部分會(huì)自動(dòng)裁掉
#define RT_NAME_MAX 8
/* RT_ALIGN_SIZE*///大多數(shù)系統(tǒng)需要對(duì)棧空間地址對(duì)齊(例如ARM體系結(jié)構(gòu)中需要向4字節(jié)地址對(duì)齊),系統(tǒng)默認(rèn)設(shè)置為4字節(jié)對(duì)齊,這里可設(shè)置以8字節(jié)對(duì)齊
#define RT_ALIGN_SIZE 8
/* PRIORITY_MAX *///RT-thread最大可支持256個(gè)線程優(yōu)先級(jí)(0~255,0為最高優(yōu)先級(jí),255分配給空閑線程)。在資源有限情況下,一般設(shè)置為最大支持8個(gè)或32個(gè)優(yōu)先級(jí)。
#define RT_THREAD_PRIORITY_MAX 32
/* Tick per Second *///系統(tǒng)時(shí)鐘每秒節(jié)拍數(shù),1000表示1s內(nèi)rt_tick增加1000,即時(shí)鐘節(jié)拍為1ms;若設(shè)為100,則rt_tick每隔10ms加1,時(shí)鐘節(jié)拍為10ms。
#define RT_TICK_PER_SECOND 1000
/* Using Hook *///使用鉤子(回調(diào))函數(shù)
#define RT_USING_HOOK
/* Idle thread stack *///設(shè)置空閑線程的??臻g大小為1024字節(jié)
#define IDLE_THREAD_STACK_SIZE 1024
/* Using Software Timer *///軟件定時(shí)器線程模式(這里不采用該模式)。RT-thread系統(tǒng)時(shí)鐘一般默認(rèn)采用所選芯片平臺(tái)的硬件定時(shí)器中斷模式
// #define RT_USING_TIMER_SOFT
#define RT_TIMER_THREAD_PRIO 4
#define RT_TIMER_THREAD_STACK_SIZE 512
/* SECTION: RT_DEBUG *///線程調(diào)試以及組件初始化模塊
/* Thread Debug */
#define RT_DEBUG
#define RT_DEBUG_INIT 1 //組件初始化調(diào)試模式(若不需要通過(guò)串口控制臺(tái)向PC端打印初始化信息,則沒(méi)有必要啟用該模式)
#define RT_USING_COMPONENTS_INIT //啟用組件初始化功能
#define RT_USING_OVERFLOW_CHECK //啟用線程棧溢出檢查
/* SECTION: IPC *///進(jìn)程間通信內(nèi)核對(duì)象:信號(hào)量,互斥鎖,事件,郵箱,消息隊(duì)列
/* Using Semaphore*/
#define RT_USING_SEMAPHORE
/* Using Mutex */
#define RT_USING_MUTEX
/* Using Event */
#define RT_USING_EVENT
/* Using MailBox */
#define RT_USING_MAILBOX
/* Using Message Queue */
#define RT_USING_MESSAGEQUEUE
/* SECTION: Memory Management *///RT-thread系統(tǒng)內(nèi)存管理:使用靜態(tài)內(nèi)存池,動(dòng)態(tài)堆(小內(nèi)存管理算法)
/* Using Memory Pool Management*/
#define RT_USING_MEMPOOL/* Using Dynamic Heap Management */
#define RT_USING_HEAP
/* Using Small MM */
#define RT_USING_SMALL_MEM
/* SECTION: Device System *///系統(tǒng)組件之I/O設(shè)備管理:?jiǎn)⒂肐/O設(shè)備以及設(shè)備間通信
/* Using Device System */
#define RT_USING_DEVICE //根據(jù)rtdevice.h中所有設(shè)備的宏定義,在rtconfig.h中打開相應(yīng)宏定義,如以下4類設(shè)備
/* Using GPIO pin framework *///GPIO設(shè)備
#define RT_USING_PIN
/* Using serial framework */ //串口設(shè)備
#define RT_USING_SERIAL
/* Using SPI framework */ //SPI設(shè)備
#define RT_USING_SPI
/* Using I2C framework */ //I2C設(shè)備
#define RT_USING_I2C
#define RT_USING_I2C_BITOPS
/* SECTION: Console options *///系統(tǒng)控制臺(tái):?jiǎn)⒂每刂婆_(tái)以及設(shè)置控制臺(tái)設(shè)備緩存256字節(jié)。若使用rt_kprintf向PC端打印信息,則必須啟用控制臺(tái)并設(shè)置控制臺(tái)設(shè)備(如串口)。
#define RT_USING_CONSOLE
/* the buffer size of console*/
#define RT_CONSOLEBUF_SIZE 256
/* SECTION: finsh, a C-Express shell *///finsh組件(finsh是RT-thread系統(tǒng)的命令行外殼,提供一套供用戶在命令行的接口,主要用于調(diào)試,查看系統(tǒng)信息)
#define RT_USING_FINSH
/* Using symbol table */
#define FINSH_USING_SYMTAB
#define FINSH_USING_DESCRIPTION
/* SECTION: device filesystem *///文件系統(tǒng)
/* Using Device file system */ //在項(xiàng)目中沒(méi)有使用文件系統(tǒng)
// #define RT_USING_DFS
/* the max number of mounted filesystem */
#define DFS_FILESYSTEMS_MAX 2
/* the max number of opened files */
#define DFS_FD_MAX 4
/* Using ELM FATFS *///ELM FATFS文件系統(tǒng)(在項(xiàng)目中沒(méi)有使用)
// #define RT_USING_DFS_ELMFAT
#define RT_DFS_ELM_WORD_ACCESS
/* Reentrancy (thread safe) of the FatFs module. */
#define RT_DFS_ELM_REENTRANT
/* Number of volumes (logical drives) to be used. Each volumes maybe include one primaly partition and some logical partitions.
* If _MULTI_PARTITION is defined to 0 in ffconf.h, each volume can mount only first primaly partition */
#define RT_DFS_ELM_DRIVES 2
/* Long File Name(LFN) with dynamic LFN working buffer on the heap. */
#define RT_DFS_ELM_USE_LFN 3
#define RT_DFS_ELM_MAX_LFN 255
/* The _CODE_PAGE specifies the OEM code page to be used on the target system. 936-Simplified Chinese GBK (DBCS, OEM, Windows); 437 - U.S.(OEM) */
#define RT_DFS_ELM_CODE_PAGE 437
/* Maximum sector size to be handled. It must be the real size(byte) of spiflash sectors. */
#define RT_DFS_ELM_MAX_SECTOR_SIZE 4096
/* Using ROM file system *///ROMFS文件系統(tǒng)(在項(xiàng)目中沒(méi)有使用)
// #define RT_USING_DFS_ROMFS
/* SECTION: lwip, a lighwight TCP/IP protocol stack *///輕型TCP/IP協(xié)議棧(在項(xiàng)目中沒(méi)有使用)
// #define RT_USING_LWIP
/* LwIP uses RT-Thread Memory Management */
#define RT_LWIP_USING_RT_MEM
/* Enable ICMP protocol*/
#define RT_LWIP_ICMP
/* Enable UDP protocol*/
#define RT_LWIP_UDP
/* Enable TCP protocol*/
#define RT_LWIP_TCP
/* Enable DNS */
#define RT_LWIP_DNS
/* the number of simulatenously active TCP connections*/
#define RT_LWIP_TCP_PCB_NUM 5
/* ip address of target*/
#define RT_LWIP_IPADDR0 192
#define RT_LWIP_IPADDR1 168
#define RT_LWIP_IPADDR2 1
#define RT_LWIP_IPADDR3 201
/* gateway address of target*/
#define RT_LWIP_GWADDR0 192
#define RT_LWIP_GWADDR1 168
#define RT_LWIP_GWADDR2 1
#define RT_LWIP_GWADDR3 1
/* mask address of target*/
#define RT_LWIP_MSKADDR0 255
#define RT_LWIP_MSKADDR1 255
#define RT_LWIP_MSKADDR2 255
#define RT_LWIP_MSKADDR3 0
/* tcp thread options */
#define RT_LWIP_TCPTHREAD_PRIORITY 12
#define RT_LWIP_TCPTHREAD_MBOX_SIZE 4
#define RT_LWIP_TCPTHREAD_STACKSIZE 1024
/* ethernet if thread options */
#define RT_LWIP_ETHTHREAD_PRIORITY 15
#define RT_LWIP_ETHTHREAD_MBOX_SIZE 4
#define RT_LWIP_ETHTHREAD_STACKSIZE 512
/* TCP sender buffer space */
#define RT_LWIP_TCP_SND_BUF 8192
/* TCP receive window. */
#define RT_LWIP_TCP_WND 8192
#define CHECKSUM_CHECK_TCP 0
#define CHECKSUM_CHECK_IP 0
#define CHECKSUM_CHECK_UDP 0
#define CHECKSUM_GEN_TCP 0
#define CHECKSUM_GEN_IP 0
#define CHECKSUM_GEN_UDP 0
/* RT_GDB_STUB *///GDB調(diào)試工具(在項(xiàng)目中沒(méi)有使用)
//#define RT_USING_GDB
#endif
評(píng)論