您的位置 首页 系统

TM32F4 RT-thread移植

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

  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

  /* 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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/xitong/348044.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部