RT-thread-2.0.1移植(基于STM32F4xx)

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系统时钟节拍计数。

时间: 2024-10-17 22:44:30

RT-thread-2.0.1移植(基于STM32F4xx)的相关文章

emWin 移植 - 基于红牛开发板

一直想利用所学的东西自己设计一个精致一些的作品,手头正好有一块红牛开发板,就先用它来写一些软件,熟悉一下过程和一些想法的可行性.首先当然是选择一个操作系统了,对比了几种之后选择了emWin.那就移植一下吧. 这里首先要感谢一下http://www.openedv.com/posts/list/0/27697.htm 这篇帖子.我的思路基本是照着这个帖子做的.感谢楼主把辛苦的研究成果贡献出来,让我这个菜鸟能够快些入门. STemWin下载地址: http://www.st.com/web/en/c

Qt5.5.0编译移植到Linux-Arm-A9

这篇是我的第二篇博客,呵呵.上次那篇发牢骚是我第一次写博客.我选择在开源中国社区写博客,是因为这个上面平常有很多关于科技领域和程序员的资讯(新闻),而且有很多技术资料和开源软件唾手可得,下载也方便.最重要的是我喜欢看这个上面的评论,不管是喷子还是喷喷子的喷子,都很又意思.额...我不是打广告,我只是表示一下自己的真是感受,言归正传吧. Qt4到5有很多变化的,首先元对象系统变了,Qt5的信号和槽基于模板了,而不是以前的字符串.这样的话信号和槽的性能应该会提高很多.其实以前信号和槽的也不慢,只是很

惯性导航之程序(OpenShoe)移植从avr32移植到stm32f4xx

惯性导航程序(OpenShoe)移植 任务:惯性导航程序从avr32(开发工具AtmelStudio6)移植到stm32f4xx(开发工具keil5_11). 分析:将程序移植到不同微控制器,将源程序分成硬件相关和硬件不相关(算法.控制方式等)两部分. 以惯性导航源码为例: 1. 惯性导航硬件不相关代码移植 Step1:将去掉微控制器相关驱动后的惯性导航源码加入到keil5工程序中,从main函数中开始,然后注示掉硬件相关的函数. Step2: 惯性导航源码中使用了inline等C++关键字(开

asp.net core 2.0 web api基于JWT自定义策略授权

JWT(json web token)是一种基于json的身份验证机制,流程如下: 通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端验证通过即可能获取想要访问的资源.关于JWT的技术,可参考网络上文章,这里不作详细说明, 这篇博文,主要说明在asp.net core 2.0中,基于jwt的web api的权限设置,即在asp.net core中怎么用JWT,再次就是不同用户或角色因为权限问题,即使援用Token,也不能访问不该访

RT Thread学习历程(1):串口乱码问题

因为学习实时系统,最近接触到RT Thread. 把RT Thread官网上的示例代码烧录到STM32的板子上之后,在串口软件上接收到的全是乱码,一开始以为是串口软件的问题,换了2个软件之后情况都一样,最后发现是晶振的问题,我用的是STM32F407VGT6,晶振要设为8MHz,代码相应的设置晶振的部分也要修改.

Thread.sleep(0)的作用

我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会 不会被唤醒?某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) .既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么?我们先回顾一下操作系统原理. 操作

说说Thread.Sleep(0)的那些奇怪的事

写在前面 最近在弄一个传输组件,用到很多多线程的知识,其中有个问题,困扰我很久,不知道是什么原因,脑子一热,在传输过程中,添加了一句代码Thread.Sleep(0).那个问题竟然解决了,耗费我一上午的时间,一点一点的排查是不是代码逻辑有问题.到最后一句话解决了,兴奋归兴奋,但是为什么这句话就能解决我的问题呢?而且还是睡个0,是不是你也遇到过这种情况?不妨一起讨论下这句神奇的代码! Thread.Sleep(0)妙解 这里收集了网上的一篇文章,解释的非常有趣,转载在博客中,也推荐给大家一起看看.

[转载]Thread.Sleep(0)妙用

原文地址:http://blog.csdn.net/lgstudyvc/article/details/9337063 来自本论坛: 我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会 不会被唤醒?某人的代码中用了一句看似莫明其妙的话:T

Thread系列——Thread.Sleep(0)

转载自:http://www.cnblogs.com/ATually/archive/2010/10/21/1857261.html 线程这一概念,可以理解成进程中的一个小单元.这个单元是一个独立的执行单元,但是与进程中的其他线程共享进程中的内存单元. 由于Cpu资源是有限的,所以进程中的多个线程要抢占Cpu,这也导致进程中的多个线程交替执行. Thread.Sleep() 本身的含义是当前线程挂起一定时间. Thread.Sleep(0) MSDN上的解释是挂起此线程能使其他等待线程执行.这样

Thread.sleep(0)的意义&amp; 多线程

我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间.那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题: 假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会 不会被唤醒? 某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) .既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么? 我们先回顾一下操作系统原理.