1、将下载的rt-thread-2.0.1解压后,得到如下图所示的文件列表。
在bsp目录下可以找到stm32f40x文件夹,这文件夹里面包括了库函数,其他芯片平台的文件夹统统删掉。在libcpu下,只需要将arm文件夹里面的common和cortex-m4留下来,其他的也都统统删掉。还有其他一些辅助性的文件,如:documentation、examples、tools什么的我们也统统删掉,处理完这些后,一个干净的RTT就准备好了。
2、虽然RT-thread将文件分类的很好,但最好还是根据自己的项目习惯将整个项目整理一下。将整个软件项目分成四个部分:app,bsp,mdk,rt-thread-2.0.1。如下图所示。
app:应用层,存放项目开发时自己编写的应用文件
bsp:驱动层,里面主要包括了RT-thread在stm32f40x平台中的底层驱动(applications,drivers,libraries_1.5.0),以及项目所使用的外部设备驱动(peripheral)
mdk:存放keil mdk5.15的工程文件
rt-thread-2.0.1:系统层,存放rt-thread-2.0.1中的components(系统组件),include(系统头文件),libcpu(芯片移植)和src(系统内核)
3、安装好keil mdk5.15后,新建项目工程文件并保存在mdk文件夹中。根据项目文件分类添加源文件,如下图所示。
然后向工程添加头文件目录,如下图所示。
4、配置stm32f407系统时钟
(1)在stm32f4xx.h文件中选择#define STM32F40_41xxx以及#define USE_STDPERIPH_DRIVER;
(2)修改stm32f4xx.h文件中默认的系统外部晶振时钟#define HSE_VALUE ((uint32_t)8000000)
(3)修改system_stm32f4xx.c文件中所选器件有关系统时钟的PLL_M,PLL_N的值(PLL_P=2)。对于stm32f407xx,系统时钟为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 */
(4)使用stm32f40_41xxx的FPU,需要在SystemInit函数开头添加相关语句,同时在keil工程配置中选择使用FPU(在stm32f4xx.h中有#define __FPU_PRESENT 1)。
/* FPU settings ------------------------------------------------------------
* If no this settings,it maybe enter HardFault_Handler() interrupt when mdk complier chose "Use FPU" 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
(5)在stm32f4xx_it.h和stm32f4xx_it.c中将HardFault_Handler,PendSV_Handler以及SysTick_Handler三个中断入口函数注释掉。HardFault_Handler,PendSV_Handler在context_rvds.S文件中分别实现RT-thread系统异常处理和线程切换,而SysTick_Handler在board.c中实现RT-thread系统时钟节拍计数。