[APM32F4] APM32系列的RT-Thread外设驱动适配教程(一)—— BSP包的制作教程

1 RT_Thread的BSP框架介绍
 

BSP 框架结构如下图所示:

每一个 APM32 BSP 主要由两部分组成,分别是通用驱动库、特定开发板 BSP,下面的表格以 APM32F1 系列为例介绍这几个部分:

2 知识储备
 

制作一个 BSP 的过程就是构建一个新系统的过程,因此想要制作出好用的 BSP,要对 RT-Thread 系统的构建过程有一定了解,需要的知识准备如下所示:
  • 掌握  APM32 系列 BSP 的使用方法
    了解 BSP 的使用方法,可以阅读 BSP 说明文档 中使用教程表格内的文档。
  • 了解 Scons 工程构建方法
    RT-Thread 使用 Scons 作为系统的构建工具,因此了解 Scons 的常用命令对制作新 BSP 是基本要求。
  • 了解设备驱动框架
    在 RT-Thread 系统中,应用程序通过设备驱动框架来操作硬件,因此了解设备驱动框架,对添加 BSP 驱动是很重要的。
  • 了解 Kconfig 语法
    RT-Thread 系统通过 menuconfig 的方式进行配置,而 menuconfig 中的选项是由 Kconfig 文件决定的,因此想要对 RT-Thread 系统进行配置,需要对 kconfig 语法有一定了解。

3 BSP制作方法
 

下面以制作 APM32E103ZE-EVAL 开发板 BSP 为例,讲解如何为一个新的开发板添加 BSP。
BSP 的制作过程分为如下步骤:
  • 复制基础工程
  • 配置工程模板
  • 修改BSP根目录下的SConstruct构建脚本
  • 修改Kconfig选项
  • 修改board目录下的工程构建和配置文件
  • 重新生成工程

3.1 复制基础工程
 

我们制作一个新的BSP包,不用从零开始一点点的把文件添加进来。我们可以先找到一份和你要制作的MCU BSP内核相似的现有APM32 BSP,然后复制一份即可。比如,我要制作APM32E103-EVAL 板的BSP包,那么我只要复制一份和 APM32E103 内核相近的现有APM32 BSP,如复制一份现有的 apm32f103xe-minibroard 这个BSP包,然后重命名为自己要制作的BSP包,然后再次基础上进行修改即可。

3.2 配置工程模板
 

BSP 根目录下的 template 文件就是生成 MDK/IAR 平台的工程模板,我们制作一个BSP时需要修改这些工程模板,比如使用的芯片型号、下载方式等。

下面介绍 MDK5 工程模板的修改:
  • 双击 template.uvprojx 打开工程模板。

  • 修改芯片型号,根据自己的目标板子的芯片型号进行选择。

  • Output选项配置:修改输出的可执行文件名为 rtthread 。

  • Debug选项配置:修改调试工具为 J-Link.

  • 修改下载算法:

3.3 修改BSP根目录下的SConstruct构建脚本
 

BSP根目录下的 SConstruct 脚本文件,是链接整个工程需要依赖的文件的,并且调用make程序进行编译工程。修改后的内容如下:
复制

  1. import os
  2. import sys
  3. import rtconfig
  4. if os.getenv('RTT_ROOT'):
  5.     RTT_ROOT = os.getenv('RTT_ROOT')
  6. else:
  7.     RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
  8. sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
  9. try:
  10.     from building import *
  11. except:
  12.     print('Cannot found RT-Thread root directory, please check RTT_ROOT')
  13.     print(RTT_ROOT)
  14.     exit(-1)
  15. TARGET = 'rtthread.' + rtconfig.TARGET_EXT
  16. DefaultEnvironment(tools=[])
  17. env = Environment(tools = ['mingw'],
  18.     AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
  19.     CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS,
  20.     AR = rtconfig.AR, ARFLAGS = '-rc',
  21.     CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
  22.     LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
  23. env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
  24. if rtconfig.PLATFORM in ['iccarm']:
  25.     env.Replace(CCCOM = ['$CC $CFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
  26.     env.Replace(ARFLAGS = [''])
  27.     env.Replace(LINKCOM = env["LINKCOM"] + ' --map rtthread.map')
  28. Export('RTT_ROOT')
  29. Export('rtconfig')
  30. SDK_ROOT = os.path.abspath('./')
  31. if os.path.exists(SDK_ROOT + '/libraries'):
  32.     libraries_path_prefix = SDK_ROOT + '/libraries'
  33. else:
  34.     libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries'
  35. SDK_LIB = libraries_path_prefix
  36. Export('SDK_LIB')
  37. # prepare building environment
  38. objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
  39. apm32_library = 'APM32E10x_Library'
  40. rtconfig.BSP_LIBRARY_TYPE = apm32_library
  41. # include libraries
  42. objs.extend(SConscript(os.path.join(libraries_path_prefix, apm32_library, 'SConscript')))
  43. # include drivers
  44. objs.extend(SConscript(os.path.join(libraries_path_prefix, 'Drivers', 'SConscript')))
  45. # make a building
  46. DoBuilding(TARGET, objs)

我们只要修改 apm32_library 这个变量的文件名称即可,也就是该BSP依赖的是哪个固件库。

3.4 修改Kconfig选项
 

在本小节中修改 board/Kconfig 和 libraries/Kconfig 文件的内容有如下两点:
  • 芯片型号和系列
  • BSP 上的外设支持选项
芯片系列的定义在apm32\libraries\Kconfig 中,修改前先确认是否存在添加的芯片系列定义,如果是一个未添加的系列,需要先添加该芯片系列的定义。芯片型号和系列的命名格式如下表所示。

1.添加芯片系列:

2.添加 BSP 上的外设支持选项
关于 BSP 上的外设支持选项,一个初次提交的 BSP 仅仅需要支持 GPIO 驱动和串口驱动即可,因此在配置选项中只需保留这两个驱动配置项,如下图所示:

3.5 修改board目录下的工程构建和配置文件
 

1.修改board/SConscript脚本文件。   
board/SConscript 脚本决定 MDK/IAR 工程的生成以及编译过程中要添加文件。
该文件主要添加board文件夹的.c文件和头文件路径,还有需要修改芯片型号以及芯片启动文件路径,修改内容如下图所示:

2.修改board.h文件
apm32 的 board/board.h 文件,主要是包含了整个工程要用到的固件库头文件,我们要把用到的固件库头文件都写在board.h文件中,还有需要根据BSP所使用的芯片型号修改 FALSH 和 RAM 的大小。
比如本次制作的 BSP 包用的芯片型号是 APM32E103ZE ,那么就要用到的该型号的基本的固件库头文件包含进来,而且还要修改flash大小为512KB,ram大小为128KB,具体内容如下:
复制

  1. #ifndef __BOARD_H__
  2. #define __BOARD_H__
  3. #include <rtthread.h>
  4. #include <apm32e10x.h>
  5. #include "apm32e10x_gpio.h"
  6. #include "apm32e10x_rcm.h"
  7. #include "apm32e10x_misc.h"
  8. #include "apm32e10x_rcm.h"
  9. #include "apm32e10x_eint.h"
  10. #include "apm32e10x_usart.h"
  11. #include "apm32e10x_dma.h"
  12. #if defined(RT_USING_ADC)
  13.     #include "apm32e10x_adc.h"
  14. #endif
  15. #if defined(RT_USING_DAC)
  16.     #include "apm32e10x_dac.h"
  17. #endif
  18. #if defined(RT_USING_RTC)
  19.     #include "apm32e10x_rtc.h"
  20.     #include "apm32e10x_pmu.h"
  21. #endif
  22. #if defined(RT_USING_SPI)
  23.     #include "apm32e10x_spi.h"
  24. #endif
  25. #if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM)
  26.     #include "apm32e10x_tmr.h"
  27. #endif
  28. #if defined(RT_USING_WDT)
  29.     #include "apm32e10x_iwdt.h"
  30.     #include "apm32e10x_wwdt.h"
  31. #endif
  32. #if defined(BSP_USING_SDCARD)
  33.     #include "apm32e10x_sdio.h"
  34. #endif
  35. #if defined(BSP_USING_ON_CHIP_FLASH)
  36.     #include "apm32e10x_fmc.h"
  37. #endif
  38. #if defined(RT_USING_CAN)
  39.     #include "apm32e10x_can.h"
  40. #endif
  41. #if defined(BSP_USING_SDRAM)
  42.     #include "apm32e10x_dmc.h"
  43. #endif
  44. #include "drv_common.h"
  45. #include "drv_gpio.h"
  46. #ifdef __cplusplus
  47. extern "C" {
  48. #endif
  49. #define APM32_FLASH_START_ADRESS     ((uint32_t)0x08000000)
  50. #define APM32_FLASH_SIZE             (512 * 1024)
  51. #define APM32_FLASH_END_ADDRESS      ((uint32_t)(APM32_FLASH_START_ADRESS + APM32_FLASH_SIZE))
  52. /* Internal SRAM memory size[Kbytes] <6-128>, Default: 128 */
  53. #define APM32_SRAM_SIZE      128
  54. #define APM32_SRAM_END       (0x20000000 + APM32_SRAM_SIZE * 1024)
  55. #if defined(__ARMCC_VERSION)
  56. extern int Image$$RW_IRAM1$$ZI$$Limit;
  57. #define HEAP_BEGIN      ((void *)&Image$$RW_IRAM1$$ZI$$Limit)
  58. #elif __ICCARM__
  59. #pragma section="CSTACK"
  60. #define HEAP_BEGIN      (__segment_end("CSTACK"))
  61. #else
  62. extern int __bss_end;
  63. #define HEAP_BEGIN      ((void *)&__bss_end)
  64. #endif
  65. #define HEAP_END        APM32_SRAM_END
  66. void SystemClock_Config(void);
  67. void apm32_usart_init(void);
  68. #ifdef __cplusplus
  69. }
  70. #endif
  71. #endif /* __BOARD_H__ */

3.修改链接脚本
链接脚本文件存放在 board/linker_scripts 目录下,包含了3个平台的链接脚本文件:

  • link.sct 文件
    该文件是Keil平台的链接文件,修改如下:

  • link.icf 文件
    该文件是 IAR 平台的链接文件,修改如下:

  • link.lds
    该文件是 GCC 平台的链接文件,修改如下:

3.6 重新生成工程
 

重新生成工程需要使用 Env 工具。
1.重新生成 rtconfig.h 文件
在 Env 界面输入命令 menuconfig 对工程进行配置,并生成新的 rtconfig.h 文件。如下图所示:

然后打开一个工程所必须的 GPIO 和 UART 外设驱动:

然后保存退出即可。
2.重新生成MDK/IAR工程
下面以重新生成 MDK 工程为例,介绍如何重新生成 BSP 工程。
使用 env 工具输入命令 scons --target=mdk5 重新生成工程,如下图所示:

到这一步为止,新的 BSP 就可以使用了。
如果想要生成IAR平台的还可以使用scons --target=iar 命令来生成 IAR 平台的工程。




 


---------------------
作者:luobeihai
链接:https://bbs.21ic.com/icview-3501389-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值