TM32F4 RT-thread移植

发布者:Radiant777最新更新时间:2024-07-01 来源: elecfans关键字:RT-thread  移植 手机看文章 扫描二维码
随时随地手机看文章

  1、将下载的rt-thread-2.0.1解压后,得到如下图所示的文件列表。

TM32F4 RT-thread移植

  在bsp目录下可以找到stm32f40x文件夹,这文件夹里面包括了库函数,其他芯片平台的文件夹统统删掉。在libcpu下,只需要将arm文件夹里面的common和cortex-m4留下来,其他的也都统统删掉。还有其他一些辅助性的文件,如:documentation、examples、tools什么的我们也统统删掉,处理完这些后,一个干净的RTT就准备好了。

  2、虽然RT-thread将文件分类的很好,但最好还是根据自己的项目习惯将整个项目整理一下。将整个软件项目分成四个部分:app,bsp,mdk,rt-thread-2.0.1。如下图所示。

TM32F4 RT-thread移植

  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文件夹中。根据项目文件分类添加源文件,如下图所示。

TM32F4 RT-thread移植

  然后向工程添加头文件目录,如下图所示。

TM32F4 RT-thread移植

  4、配置stm32f407vgt6系统时钟

  (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工程配置中Floating Point Hardware选择 “Use Single Precision” 。

  (在stm32f4xx.h中已默认设置#define __FPU_PRESENT 1,在core_cm4.h中已默认设置__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

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

  (6)在board.h中确定stm32f407的SRAM大小,以及SRAM结束地址。stm32f407vg共有192K的SRAM(其中可被访问的只有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、若需要在项目中启用finsh组件以及组件初始化函数,为了保证用户自行编写的函数不会被keil编译器优化掉,则需要修改MDK设置,如下:

TM32F4 RT-thread移植

  在Linker-》Misc controls标签下,键入”--keep __fsym_* --keep __vsym_* --keep __rt_init_*”这个命令,该命令会保留未被函数主体调用的函数。这样在使用finsh组件调试时仍然可以运行没有被调用过的函数。

  6、修改系统配置文件rtconfig.h的相关系统参数,如下面所示为系统基础配置:

  /* RT-Thread config file */

  #ifndef __RTTHREAD_CFG_H__

  #define __RTTHREAD_CFG_H__

  /* RT_NAME_MAX*///指定了系统内核对象名称的最大长度(比如线程,信号量,互斥锁,事件等),多余部分会自动裁掉

  #define RT_NAME_MAX 8

  /* RT_ALIGN_SIZE*///大多数系统需要对栈空间地址对齐(例如ARM体系结构中需要向4字节地址对齐),系统默认设置为4字节对齐,这里可设置以8字节对齐

  #define RT_ALIGN_SIZE 8

  /* PRIORITY_MAX *///RT-thread最大可支持256个线程优先级(0~255,0为最高优先级,255分配给空闲线程)。在资源有限情况下,一般设置为最大支持8个或32个优先级。

  #define RT_THREAD_PRIORITY_MAX 32

  /* Tick per Second *///系统时钟每秒节拍数,1000表示1s内rt_tick增加1000,即时钟节拍为1ms;若设为100,则rt_tick每隔10ms加1,时钟节拍为10ms。

  #define RT_TICK_PER_SECOND 1000

  /* Using Hook *///使用钩子(回调)函数

  #define RT_USING_HOOK

  /* Idle thread stack *///设置空闲线程的栈空间大小为1024字节

  #define IDLE_THREAD_STACK_SIZE 1024

  /* Using Software Timer *///软件定时器线程模式(这里不采用该模式)。RT-thread系统时钟一般默认采用所选芯片平台的硬件定时器中断模式

  // #define RT_USING_TIMER_SOFT

  #define RT_TIMER_THREAD_PRIO 4

  #define RT_TIMER_THREAD_STACK_SIZE 512

  /* SECTION: RT_DEBUG *///线程调试以及组件初始化模块

  /* Thread Debug */

  #define RT_DEBUG

  #define RT_DEBUG_INIT 1 //组件初始化调试模式(若不需要通过串口控制台向PC端打印初始化信息,则没有必要启用该模式)

  #define RT_USING_COMPONENTS_INIT //启用组件初始化功能

  #define RT_USING_OVERFLOW_CHECK //启用线程栈溢出检查

  /* SECTION: IPC *///进程间通信内核对象:信号量,互斥锁,事件,邮箱,消息队列

  /* 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系统内存管理:使用静态内存池,动态堆(小内存管理算法)

  /* 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 *///系统组件之I/O设备管理:启用I/O设备以及设备间通信

  /* Using Device System */

  #define RT_USING_DEVICE //根据rtdevice.h中所有设备的宏定义,在rtconfig.h中打开相应宏定义,如以下4类设备

  /* Using GPIO pin framework *///GPIO设备

  #define RT_USING_PIN

  /* Using serial framework */ //串口设备

  #define RT_USING_SERIAL

  /* Using SPI framework */ //SPI设备

  #define RT_USING_SPI

  /* Using I2C framework */ //I2C设备

  #define RT_USING_I2C

  #define RT_USING_I2C_BITOPS

  /* SECTION: Console options *///系统控制台:启用控制台以及设置控制台设备缓存256字节。若使用rt_kprintf向PC端打印信息,则必须启用控制台并设置控制台设备(如串口)。

  #define RT_USING_CONSOLE

  /* the buffer size of console*/

  #define RT_CONSOLEBUF_SIZE 256

  /* SECTION: finsh, a C-Express shell *///finsh组件(finsh是RT-thread系统的命令行外壳,提供一套供用户在命令行的接口,主要用于调试,查看系统信息)

  #define RT_USING_FINSH

  /* Using symbol table */

  #define FINSH_USING_SYMTAB

  #define FINSH_USING_DESCRIPTION

  /* SECTION: device filesystem *///文件系统

  /* Using Device file system */ //在项目中没有使用文件系统

  // #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文件系统(在项目中没有使用)

  // #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文件系统(在项目中没有使用)

  // #define RT_USING_DFS_ROMFS

  /* SECTION: lwip, a lighwight TCP/IP protocol stack *///轻型TCP/IP协议栈(在项目中没有使用)

  // #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调试工具(在项目中没有使用)

  //#define RT_USING_GDB

  #endif


关键字:RT-thread  移植 引用地址:TM32F4 RT-thread移植

上一篇:基于μC/OS—III和CC1120的短距离窄带无线数传系统方案浅析
下一篇:MPU6050的四元数解算姿态方法

推荐阅读最新更新时间:2024-11-11 10:09

tcpdump 移植
一、环境介绍 1.1 宿主机 Ubuntu 1404 32 位 1.2 嵌入式平台 ATMEL AT91SAM9X25 1.3 交叉工具链 arm-none-linux-gnueabi tcpdump-4.8.1移植所需源码包下载地址 二、交叉编译 2.1 先编译 tcpdump-4.8.1 依赖的模块 tar xvf libpcap-1.8.1.tar.gz cd libpcap-1.8.1/ ./configure --prefix=$PWD/tmp --host=arm-none-linux-gnueabi --build=i686-linux --with-pcap=linux CC=arm-none-li
[单片机]
移植yaffs2 文件系统
1.下载yaffs2 源代码 利用Git 工具下载yaffs2 源代码: cd ~/S3C6410_dir git clone git://www.aleph1.co.uk/yaffs2 将下载yaffs2 源代码到当前目录的/yaffs2 文件夹中。 由于我的RHEL5 不能使用Git工具,所以使用window下的Git工具下载好后,在共享到RHEL5 。 2. 移植yaffs2 yaffs2 文件系统的移植比较简单,利用源代码中自带的脚本为内核打上yaffs2 补丁即可: cd yaffs2 ./patch-ker.sh c m ../linux-2.6-samsung // ../ 这里是指全部路径,应补全
[单片机]
<font color='red'>移植</font>yaffs2 文件系统
STM32-不同芯片的移植
在实际项目中,我们根据项目需求选用最合适的芯片型号,有时会涉及到一个工程代码在不同芯片上的使用,不同型号的芯片如何移植呢?通过本文,您将了解基本的移植过程。 1.准备工作 1.1 根据芯片的命名规则确定要移植的型号的flash大小 其中用到的是芯片类型的flash的大小,比如STM32F103VBT6,表示flash大小的位为“B”,对应的是128k字节,由此可以该型号的flash大小。 1.2 根据flash大小选择合适的启动文件 ST官方提供了3个启动文件,分别适用于不同flash容量的STM32芯片,跟别为: startup_stm32f10x_ld.s 适用于小容量 产品 startu
[单片机]
STM32-不同芯片的<font color='red'>移植</font>
U-BOOT移植心得
最近跑完裸机之后,便开始跑系统,但想着裸机与系统之间隔着个Bootloader,反正以前也没怎么深入研究,便说花一到两周时间来搞搞U-BOOT。 参考了fzb和赵春江两位大牛的,也研究了2010.06版本的和2011.06版本两个经典版本,也对比了TQ(我买的板是天嵌的)自己写的U-BOOT,学到了不少,也发现了很多东西,以下便记录以下自己的心得吧,以便以后可以自己参考下。 U-BOOT的两个阶段启动过程:(2010.06经典版来说) 第一阶段:start.S的路径位于archarmcpuarm920t这段汇编代码一般被称作第一阶段初始化代码。主要作用是初始化运行环境;初始化内存;重新放置UBOOT代码到内存中;跳入到
[单片机]
u-boot-2016.09移植(2)-uboot启动简易分析
注:此文与下面关于uboot的移植都参考了《嵌入式linux学习笔记(基于s5pv210、tq210)》 不管什么版本的uboot都是在arch/arm/cpu/u-boot-spl.lds和arch/arm/cpu/u-boot.lds中制定了入口函数ENTRY(_start),u-boot-2016.09也不例外,搜索发现_start在arch/arm/lib/vectors.S中实现: _start首先执行reset,然后定义异常向量表,reset在arch/arm/cpu/armv7/start.S中实现 在reset中只执行了一条跳转指令,save_boot_params的功能是跳转到save_boot_pa
[单片机]
u-boot-2016.09<font color='red'>移植</font>(2)-uboot启动简易分析
mini2440一线总线移植tslib1.4
最近在学习中接触到了触摸库tslib,自己试着移植的时候发现网上分为两种方案,一种是使用2440自带AD的方案,另一种是友善的一线总线方案。我的液晶型号是TD35,默认的连接方案是一线总线,所以这里移植的是一线总线方案。 上网搜索的过程中发现网上可用的一线总线tslib并不是1.4版本的,但是编译后使用是没有问题的,抱着试一试的心态决定移植一下1.4版本的tslib到MINI2440,经过实验,成功将tslib的1.4版本移植到了mini2440. 移植主要是将友善提供的one_wire_ts_input.c文件添加到对应位置,修改配置文件就可以了。 下面列出补丁文件 diff -ru tslib/configur
[单片机]
支持S3C6410处理器SD卡启动模式的U-Boot-2011.06移植修改方案
通用Bootloader(Universal Bootloader,U-Boot)是系统上电后执行的第一段代码,其作用主要包括初始化硬件环境以及加载执行操作系统内核。在进行系统安装时,U-Boot通常需要使用专用工具烧写到FLASH中,内核及文件系统则通过U-Boot命令进行烧写,该过程操作繁琐,并且容易出错,不适宜系统的大量安装。 S3C6410是三星公司生产的一款基于ARM11架构的通用嵌入式处理器,其启动方式除了传统的Flash启动模式外,还支持从SD 卡中启动系统。本文基于S3C6410处理器,分析了从SD卡启动系统的原理,并对U-Boot源码进行修改以支持该启动方式,在此基础上进一步扩展了U-Boot的功能,使其支持
[单片机]
支持S3C6410处理器SD卡启动模式的U-Boot-2011.06<font color='red'>移植</font>修改方案
Uboot在S3C2440上的移植详解(三)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 5)准备进入u-boot的第二阶段(在u-boot中添加对我们开发板上Nand Flash的支持)。 目前u-boot中还没有对2440上Nand Flash的支持,也就是说要想u-boot从Nand Flash上启动得自己去实现了。 首先,在include/configs/my2440.h头文件中定义Nand要用到的宏和寄存器,如下:
[单片机]
Uboot在S3C2440上的<font color='red'>移植</font>详解(三)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved