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、配置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设置,如下:
在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
如何在OpticStudio中建模和设计真实波片
keysight DSOX6004A示波器
单片机定时器延时程序的软件设计方法解析
苹果计划2019年发布中国定制版5G iPhone
oracle如何一次添加多行数据
TM32F4 RT-thread移植
印度首发!Infinix重磅推出全新GT系列
PDF417条码特点及应用
单向可控硅型号
能源 | 本田与美国电力公司合作开发废旧电动汽车电池的电网集成技术
基于太阳能电力系统的微型逆变器的介绍
频谱监测和记录中SDR的高数据速率考虑因素
RISC-V vector intrinsic编程入门指南
中国钻出亚洲最深井记录,比珠穆朗玛峰高29.97米
瑞萨电子推出5V高性能RX660 32位MCU, 为家电和工业应用提供卓越的噪声容限
提升充电效率新选择!22.5W快充方案
矩形连接器是什么,它有什么优势
3C行业工业机器人将迎来一轮新的爆发
拓维信息联合湘江实验室发起成立全国首个开源鸿蒙创新研究院
LTC3202充电泵提高了为白光LED供电的效率