基于RTEMS的阿波罗STM32F429开发板(正点原子)适配
最近忙着出差也没写什么文档,先把前段时间做的一个简单的RTEMS适配过程文档发上来供大家参考。
1、文档概述
本文档主要为描述基于正点原子的阿波罗STM32F429开发板,开展RTEMS适配的过程,以及过程中常见工具的使用方法,过程中遇到的问题及解决问题的方法。以下内容有部分(很多截图)是直接复制《STM32F429开发指南》、《ARM Cortex-M3与Cortex-M4权威指南》等文档。
2、开发板介绍
本章主要描述正点原子的阿波罗STM32F429开发板的基本硬件资源以及基本的使用调试方法。
2.1 硬件资源
关于开发板硬件资源具体可以参考《STM32F429开发指南》,这里放两张截图,分别为开发板核心资源及开发板外部接口。
2.1.1 核心板资源
图 1 STM32F429核心板资源
首先根据图 1可以看到,开发板上提供的核心资源是很多的,但想用起来这些外部资源还需要经过一系列的初始化,比如SPI RAM的使用可以参考《STM32F429开发指南 ——SDRAM 实验》。我们最关注除了CORTEX-M4核之外就是存储资源了,目前我们核心需要知道的是CPU内部存储资源及地址空间映射情况如图 2(图片来自《STM32F429xx CPU手册》p86):
图 2 CPU内存空间映射
图 3 STM32F42x和 STM32F43x FLASH资源
根据图 2、图 3可以知道CPU内部可用的存储空间主要有:
地址段 |
大小 |
类型 |
描述 |
|
1 |
0x8000000-0x81FFFFF |
2MB |
FLASH |
大小根据处理器型号不同,其中STM32F42x和STM32F43x的FLASH资源如图 3(来自《STM32F4XX中文参考手册》P60),也就是有两组1MB的空间,我们通常只配置其中的1MB。 |
2 |
0x1000 0000-0x1000FFFF |
64KB |
SRAM |
只能供CPU通过数据总线访问 |
3 |
0x2000 0000-0x2001BFFF |
112KB |
SRAM |
可供所有AHB主控总线访问,AHB主总线支持并发SRAM访问。即可以在CPU对112KB或64KB访问时,以太网MAC同时对16KB SRAM进行读写(也就是可以用于外设DMA读写?)(《STM32F4XX中文参考手册》P55) |
4 |
0x2001 C000-0x2001FFFF |
16KB |
SRAM |
|
5 |
0x2002 0000-0x2002 FFFF |
64KB |
SRAM |
下面我们可以再看一下正点原子提供的示例工程中关于存储空间的配置(keil开发环境,project options for target ‘xx’)如图 4,因此后续使用RTEMS时,链接脚本中相关地址信息可以参考该配置。
OpenOCD——开放式片上调试器旨在为嵌入式目标器件提供调试,系统内编程和边界扫描测试,官方网站为http://openocd.org/。
关于OpenOCD的原理目前也没有看到帖子描述的很清楚,不过根据官方文档该工具支持各种基于USB JTAG、USB STLINK、USB CMSIS DAP的目标板调试,工作原理如下图(盗图):
对于openocd详细使用方法可以参考官方的《OpenOCD User’s Guide》。
这三个环境其实都能够完成在Windows上的交叉工具链、RTEMS内核的编译,目前我用的比较多的还是CYGWIN。
序号 |
名称 |
版本 |
说明 |
1 |
Cygwin |
version 2.850 |
工具链及内核编译环境 |
2 |
autoconf |
2.69 |
根据配置文件xxx.ac、yyy.am自动生成Makefile的工具 |
3 |
automake |
1.12.6 |
|
4 |
binutils |
2.26 |
GNU二进制工具集,汇编器、链接器等 |
5 |
gmp |
6.0.0 |
编译GCC需要使用的依赖库,且分别向上依赖 |
6 |
mpfr |
3.1.2 |
|
7 |
mpc |
1.0.3 |
|
8 |
gcc |
4.9.3 |
GNU编译工具 |
9 |
gdb |
7.9 |
GNU调试工具 |
修改的GCC编译配置文件为gcc-4.9.3\gcc\config\arm\t-rtems-eabi,注释掉下面两行(新版本GCC中用的是MULTILIB_REQUIRED道理差不多):
# MULTILIB_EXCEPTIONS += mthumb/march=armv7-m/mfpu=fpv4-sp-d16/mfloat-abi=hard # MULTILIB_EXCEPTIONS += mthumb/march=armv7-m |
根据CPU手册,STM32F429处理器应该使用fpv4-sp-d16的硬件浮点,不过RTEMS内核源码中stm32f4板级支持包编译选项中并未设置硬件浮点,也就是默认使用的是第二行的配置,因此这里两个都编译一下,后续可以根据需要选择配置。 |
基于CYGWIN/MSYS2的工具链编译过程是一样的,整个编译流程如下表,当然实际上以下编译过程可以直接通过脚本实现(可以查看build.sh)。
流程 |
主要工作 |
|
1 |
Autoconf、Automake配置、编译、安装 ./configure make –j4 (本人机器为4核,所以用4线程编译) make install |
|
2 |
Binutils配置、编译、安装 cat ../binutils-2.26-gas-reloc.patch |patch -p1 ../binutils-2.26/configure --target=arm-rtems4.11 --prefix=/Rtems/host-arm --verbose --disable-nls --without-included-gettext --disable-win32-registry --disable-werror make -j4 make install |
|
3 |
GMP配置、编译、安装 ../gmp-6.0.0/configure --prefix=/Rtems/host-arm make -j4 make install |
|
MPFR配置、编译、安装 ../../../mpfr-3.1.2/configure --prefix=/Rtems/host-arm --with-gmp=/Rtems/ host-arm make -j4 make install |
||
MPC配置、编译、安装 ../../../mpc-1.0.3/configure --prefix=/Rtems/host-arm --with-gmp=/Rtems/host-arm --with-mpfr=/Rtems/host-arm --enable-static --disable-shared make -j4 make install |
||
export PATH=/Rtems/host-arm/bin:$PATH |
||
4 |
GCC+NEWLIB配置、编译、安装 cd ../newlib-2.2.0.20150423/ cat ../newlib-ARM-Optimize-IEEE-754-sqrt-implementation.patch |patch -p1 cat ../newlib-cygwin-git-f70d9ae6adc6ed7952806056349ba9f8ba3c65c8.patch|patch -p1 cd ../gcc-4.9.3/ cat ../gcc-4.9.3-20170404-1.patch |patch -p1 cat ../gcc-4.9.3-or1k.patch |patch -p1 ln -s ../newlib-2.2.0.20150423/newlib/ cd ../b-gcc ../gcc-4.9.3/configure --prefix=/Rtems/host-arm --target=arm-rtems4.11 --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --verbose --with-newlib --disable-nls --without-included-gettext --disable-win32-registry --enable-version-specific-runtime-libs --disable-lto --enable-newlib-io-c99-formats -enable-newlib-iconv --enable-newlib-iconv-encodings=big5,cp775,cp850,cp852,cp855,cp866,euc_jp,euc_kr,euc_tw,iso_8859_1,iso_8859_10,iso_8859_11,iso_8859_13,iso_8859_14,iso_8859_15,iso_8859_2,iso_8859_3,iso_8859_4,iso_8859_5,iso_8859_6,iso_8859_7,iso_8859_8,iso_8859_9,iso_ir_111,koi8_r,koi8_ru,koi8_u,koi8_uni,ucs_2,ucs_2_internal,ucs_2be,ucs_2le, ucs_4,ucs_4_internal,ucs_4be,ucs_4le,us_ascii,utf_16,utf_16be,utf_16le,utf_8,win_1250,win_1251,win_1252,win_1253,win_1254,win_1255,win_1256,win_1257,win_1258 --enable-libgomp --disable-lto --enable-threads --disable-plugin --enable-languages=c,c++ --with-gmp=/Rtems/host-arm --with-mpfr=/Rtems/host-arm --with-mpc=/Rtems/host-arm make -j4 make install |
|
5 |
GDB配置、编译、安装 ../gdb-7.9/configure --target=arm-rtems4.11 --prefix=/Rtems/host-arm |
工具链编译完就要开始编译内核了,内核源码选择RTEMS-4.11.3版本。
序号 |
文件名 |
内容 |
1 |
stm32f4.cfg |
CPU_CFLAGS = -march=armv7-m -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 |
2 |
configure.ac 主要是修改时钟,使能UART1、UART3 |
AC_PREREQ([2.69]) AC_INIT([rtems-c-src-lib-libbsp-arm-stm32f4],[_RTEMS_VERSION],[https://devel.rtems.org/newticket]) AC_CONFIG_SRCDIR([bsp_specs]) RTEMS_TOP(../../../../../..) RTEMS_CANONICAL_TARGET_CPU AM_INIT_AUTOMAKE([no-define nostdinc foreign 1.12.2]) RTEMS_BSP_CONFIGURE RTEMS_PROG_CC_FOR_TARGET RTEMS_CANONICALIZE_TOOLS RTEMS_PROG_CCAS RTEMS_CHECK_NETWORKING AM_CONDITIONAL(HAS_NETWORKING,test "$HAS_NETWORKING" = "yes") RTEMS_BSPOPTS_SET([STM32F4_FAMILY_F4XXXX],[stm32f4*],[1]) RTEMS_BSPOPTS_HELP([STM32F4_FAMILY_F4XXXX],[Chip belongs to the STM32F4XXXX family.]) RTEMS_BSPOPTS_SET([STM32F4_HSE_OSCILLATOR],[*],[25000000]) RTEMS_BSPOPTS_HELP([STM32F4_HSE_OSCILLATOR],[HSE oscillator frequency in Hz]) RTEMS_BSPOPTS_SET([STM32F4_SYSCLK],[*],[ 180000000]) RTEMS_BSPOPTS_HELP([STM32F4_SYSCLK],[SYSCLK frequency in Hz]) RTEMS_BSPOPTS_SET([STM32F4_HCLK],[*],[ 180000000]) RTEMS_BSPOPTS_HELP([STM32F4_HCLK],[HCLK frequency in Hz]) RTEMS_BSPOPTS_SET([STM32F4_PCLK1],[*],[ 45000000]) RTEMS_BSPOPTS_HELP([STM32F4_PCLK1],[PCLK1 frequency in Hz]) RTEMS_BSPOPTS_SET([STM32F4_PCLK2],[*],[ 90000000]) RTEMS_BSPOPTS_HELP([STM32F4_PCLK2],[PCLK2 frequency in Hz]) RTEMS_BSPOPTS_SET([STM32F4_USART_BAUD],[*],[115200]) RTEMS_BSPOPTS_HELP([STM32F4_USART_BAUD],[baud for USARTs]) RTEMS_BSPOPTS_SET([STM32F4_ENABLE_USART_1],[*],[1]) RTEMS_BSPOPTS_HELP([STM32F4_ENABLE_USART_1],[enable USART 1]) RTEMS_BSPOPTS_SET([STM32F4_ENABLE_USART_2],[*],[]) RTEMS_BSPOPTS_HELP([STM32F4_ENABLE_USART_2],[enable USART 2]) RTEMS_BSPOPTS_SET([STM32F4_ENABLE_USART_3],[*],[1]) RTEMS_BSPOPTS_HELP([STM32F4_ENABLE_USART_3],[enable USART 3]) RTEMS_BSPOPTS_SET([STM32F4_ENABLE_UART_4],[*],[]) RTEMS_BSPOPTS_HELP([STM32F4_ENABLE_UART_4],[enable UART 4]) RTEMS_BSPOPTS_SET([STM32F4_ENABLE_UART_5],[*],[]) RTEMS_BSPOPTS_HELP([STM32F4_ENABLE_UART_5],[enable UART 5]) RTEMS_BSPOPTS_SET([STM32F4_ENABLE_USART_6],[*],[]) RTEMS_BSPOPTS_HELP([STM32F4_ENABLE_USART_6],[enable USART 6]) RTEMS_BSPOPTS_SET([STM32F4_ENABLE_I2C1],[*],[]) RTEMS_BSPOPTS_HELP([STM32F4_ENABLE_I2C1],[enable I2C 1]) RTEMS_BSPOPTS_SET([STM32F4_ENABLE_I2C2],[*],[]) RTEMS_BSPOPTS_HELP([STM32F4_ENABLE_I2C2],[enable I2C 2]) RTEMS_BSP_CLEANUP_OPTIONS(0, 0) RTEMS_BSP_LINKCMDS AC_CONFIG_FILES([Makefile]) AC_OUTPUT |
3 |
bspstart.c |
/* APB1 prescaler, APB1 clock must be < 45MHz */ apbpre1 = ( sys_clk * 100 ) / 45; if ( apbpre1 <= 100 ) { apbpre1 = RCC_CFGR_PPRE1_BY_1; } else if ( apbpre1 <= 200 ) { apbpre1 = RCC_CFGR_PPRE1_BY_2; } else if ( apbpre1 <= 400 ) { apbpre1 = RCC_CFGR_PPRE1_BY_4; } else if ( apbpre1 <= 800 ) { apbpre1 = RCC_CFGR_PPRE1_BY_8; } else if ( apbpre1 ) { apbpre1 = RCC_CFGR_PPRE1_BY_16; } /* APB2 prescaler, APB2 clock must be < 90MHz */ apbpre2 = ( sys_clk * 100 ) / 90; if ( apbpre2 <= 100 ) { apbpre2 = RCC_CFGR_PPRE2_BY_1; } else if ( apbpre2 <= 200 ) { apbpre2 = RCC_CFGR_PPRE2_BY_2; } else if ( apbpre2 <= 400 ) { apbpre2 = RCC_CFGR_PPRE2_BY_4; } else if ( apbpre2 <= 800 ) { apbpre2 = RCC_CFGR_PPRE2_BY_8; } else { apbpre2 = RCC_CFGR_PPRE2_BY_16; } rcc->cr |= RCC_CR_HSION; /* turn on HSI */ while ( ( !( rcc->cr & RCC_CR_HSIRDY ) ) ) ; |
cd rtems-4.11.3 ./bootstrap –c ./bootstrap cd ../b-rtems ../rtems-4.11.3/configure --target=arm-rtems4.11 --enable-rtemsbsp=stm32f4 --disable-posix --disable-tests --enable-networking --enable-libchip --prefix=/Rtems_tools/host-arm/rtems_stm32 make –j4 make install |
基于RTEMS的阿波罗STM32F429开发板(正点原子)适配相关推荐
- 正点原子阿波罗STM32F429开发板资料发布,采用底板+核心板
正点原子阿波罗STM32F429开发板资料发布,采用底板+核心板.... https://www.amobbs.com/thread-5654611-1-1.html 正点原子STM32开发板 htt ...
- 阿波罗STM32F429开发板关于USART3的应用(WIFI/蓝牙/GPS)
其实在开发板使用的WIFI(ESP8266模块).蓝牙.GPS都是封装好的模块,根据一些特定指令就即可进行相关操作.如使用AT指令就可以操作WIFI模块.至于具体的wifi模块的AT指令如何使用这里就 ...
- 细数STM32开发板有哪些,官方板/正点原子/野火/安富莱等
首先列举ST官方开发板.这些开发板功能由简到繁,价格也是.Nucleo板最便宜,而且自带ST-LINK/V2-1.评估板带有更多外设模块,比较方便开发.STM32中文官网上有很多开发板资源. STM3 ...
- 判断按键值_ALIENTEK 阿波罗 STM32F767 开发板资料连载第七章 按键输入实验
1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第七章 按键输入实验 上 ...
- stm32f767中文手册_ALIENTEK 阿波罗 STM32F767 开发板资料连载第五章 SYSTEM 文件夹
1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第五章 SYSTEM 文 ...
- cc2530定时器和捕获比较_ALIENTEK 阿波罗 STM32F767 开发板资料连载十四章 输入捕获实验...
1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weixi ...
- fastreport masterdata每页都显示_ALIENTEK 阿波罗 STM32F767 开发板资料连载十六章 OLED 显示实验...
1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weixi ...
- c语言头文件格式图片_阿波罗 STM32F767 开发板资料连载第四十九章 图片显示实验...
1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第四十九章 图片显示实验 ...
- 【STM32F429开发板用户手册】第34章 STM32F429的SPI总线应用之驱动DAC8501(双路输出,16bit分辨率,0-5V)
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第34章 STM32F429的SPI总线应用之驱动DA ...
最新文章
- PHP Ueditor 富文本编辑器
- SAP UI5应用Opportunity S5 formatter issue
- 第 4 章(表达式和运算符)(4.1~ 4.7)
- Eclipse R语言插件 statET 安装
- 【转】SQLServer2005中的增强数据类型VARCHAR(MAX)
- lpx寒假作业案例1
- Tomcat多层容器的设计
- N沟道MOSFET所需的高于电池的电源电压
- 什么是云主机?有什么用途?
- 学java双十一电脑推荐_双十一,有什么值得学生购买的电脑吗?
- 运算放大器基本原理与参数解读
- 2022-02-16 工作记录--Swiper-实现跑马灯效果:鼠标经过时停止滑动,鼠标离开后继续滑动
- LJJ爱数数(莫比乌斯反演)
- 神秘的西夏王朝和西夏王陵(上)
- nch photopad mac支持哪些文件格式?
- yaf 修改php.ini,Yaf的配置
- 第七代英特尔处理器安装Windows7提示“不支持的硬件”的解决方法
- Could not acquire hardware tool communications resources: ICD3PlatformTool SN#
- 数字集成电路_4.MOS管寄生电容
- PolSARpro v6.0.2 处理Sentinel-1A数据
热门文章
- 中国移动、联动、电信
- 最新版(2019.3.23)荣耀paly真机调试(Android stdio)
- C语言:记录在主线程中停止子线程
- 【Qt开发】QThread中的互斥、读写锁、信号量、条件变量
- 基于AHK的键盘映射——高效利用CapsLock键
- python进行整数计算_零基础学python_05_数字(整数+浮点数)
- java 域账户登录失败_域用户登陆,错误:无法登录到你的账户,通常可以通过从你的账户注销,然后重新登录来解决此问题...
- 数据挖掘技术-主键合并数据准备数据
- C++中在堆区用new开辟空间
- 第一代GCN: Spectral Networks and Locally Connected Networks on Graphs