1—10章节,我称之为stm32移植ecos系列的第一篇章:让Redboot和eCos跑起来。从中可以看到,借助eCos本身带的ST STM3210E EVAL board模板和examples,几乎不需要做什么修改就让eCos在STM32板子上跑起来了。这一方面得意于我的板子与该模板对应的ST官方板子在存储器设计上大同小异,另一方面则是得意于eCos良好的架构设计,使系统移植变得轻而易举。
在展开ecos裁减、配置和驱动编写移植之前,我来说下如何创建和使用自己的模板(Template)。这里可能会有人问了:官方都提供了模板,还需要创建自己板子的模板吗?这不是多此一举吗?
是的,表面上看有点多余,但实际上更符合系统移植方法与步骤。
- ecos自带的模板一般是基于芯片厂家的评估板而创建的。而我们使用的目标板或多或少与这些板有差异,甚至有比较大的差异,有时,目标板的CPU在ecos中没有相应的模板,这时候只能借鉴相近的模板展开移植,以降低难度和减少工作量;这就使我们有必要根据目标板创建自己的模板;
- 使用自己的模板可尽量少的去修改ecos本身的代码,这样便于与ecos cvs服务器代码保持同步,而不至于引起代码冲突;
- 创建自己的模板,更深入了解ecos的模板、package、component、cdl脚本、HAL的概念;
由于ecos优秀的架构设计,所以创建自己的模板也变得很容易。
1. 拷贝模板
在移植系统时,一般都会借鉴使用系统中板子硬件配置尽量相近的模板,linux如此,ecos亦如此。对于使用stm32f10xxx系列CPU的板子,ecos自带有ST STM3210E EVAL board这个模板。因此,移植ecos到stm32开发板时,我们可借鉴使用这个模板。
ecos源码packages\hal\cortexm\stm32\stm3210e_eval对应STM3210E EVAL board,复制stm3210e_eval文件夹,重新命名为:stm32f10xxx(名称自己取)。
2. 修改stm32f10xxx模板中文件名、内容等
拷贝并重命名后,修改其中的CDL及源码、LDI等文件,包括文件名及内容,我修改的时候,凡是遇到与stm3210e_eva相关的单词都替换成了stm32f10xxx。我把几个要修改的地方说明如下。
2.1 修改cdl文件名称及其内容
把cdl文件名称从hal_cortexm_stm32_stm3210e_eval.cdl改为hal_cortexm_stm32_stm32f10xxx.cdl。
修改CDL文件内容。修改之前,最好了解下CDL脚本的语法,不过,也容易,一看便知其意。在这个文件中,凡是STM3210E EVAL都替换成STM32F10XXX,凡是stm3210e_eval都替换成stm32f10xxx,凡是stm3210e eval都替换成stm32f10xxx platform,同时,去掉了CYGHWR_HAL_CORTEXM_STM32_SPIETH_CONTROLLER这个组件,修改了debug串口默认波特率为115200。修改后的CDL文件见下面。
2.2 修改stm32f10xxx\current\include\pkgconf目录下的文件名
把该目录下所有文件名称中的stm3210e_eval都替换成stm32f10xxx。
2.3 修改stm32f10xxx\current\include下plf_arch.h、plf_intr.h、plf_io.h文件中的头文件
这3个文件中,都包含了hal_cortexm_stm32_stm3210e_eval.h这个头文件,这个头文件的名称是在2.1中的CDL中定义的。
2.4 修改stm32f10xxx\current\src目录下的文件名
同样,把该目录下所有文件名称中的stm3210e_eval都替换成stm32f10xxx。同时,该目录下的源文件同样包含了hal_cortexm_stm32_stm3210e_eval.h这个头文件,这个头文件的名称是在2.1中的CDL中定义的。
3. 修改ecos.db,在文件的最后添加:
# added start by gyr 2013.02.22 package CYGPKG_HAL_CORTEXM_STM32_STM32F10XXX { alias { "ST STM32F10XXX HAL" hal_cortexm_stm32f10xxx } directory hal/cortexm/stm32/stm32f10xxx script hal_cortexm_stm32_stm32f10xxx.cdl hardware description " The stm32f10xxx HAL package provides the support needed to run eCos on the ST stm32f10xxx platform board." } target stm32f10xxx { alias { "ST STM32F10XXX platform board" stm32f10xxx } packages { CYGPKG_HAL_CORTEXM CYGPKG_HAL_CORTEXM_STM32 CYGPKG_HAL_CORTEXM_STM32_STM32F10XXX CYGPKG_DEVS_FLASH_AMD_AM29XXXXX_V2 CYGPKG_DEVS_FLASH_STM32 CYGPKG_DEVS_FLASH_SPI_M25PXX CYGPKG_IO_SERIAL_CORTEXM_STM32 CYGPKG_DEVS_WALLCLOCK_STM32 CYGPKG_IO_SPI CYGPKG_DEVS_SPI_CORTEXM_STM32 CYGPKG_DEVS_ADC_CORTEXM_STM32 CYGPKG_IO_USB CYGPKG_IO_USB_SLAVE CYGPKG_DEVS_USB_CORTEXM_STM32 CYGPKG_IO_FLASH } description "The stm32f10xxx target provides the packages needed to run eCos on the STM32F10XXX platform board." } # added end by gyr 2013.02.22
上述添加的东西是拷贝STM3210E EVAL board模板的(可用STM3210E作为关键字在ecos.db中搜索到这个target),并在此基础上修改了相应名称和描述,以及多加了flash包:CYGPKG_IO_FLASH。
到此,完成了模板的创建。重新打开ecos图形配置工具,则看到我们创建的模板“ST STM32F10XXX platform board”了。重新生成redboot.ecc和ecos.ecc(注意生成redboot时,不能使用misc目录下的redboot_ROM.ecm配置文件了,否则图形配置工具会闪退,原因不知)。
对这个模板进行了验证,生成的redboot(ROM启动),helloworld程序(ROM启动)都可正常启动,但helloworld程序配成RAM启动后,不能用redboot引导内存中的helloworld程序。
附上我修改的CDL文件内容:
##========================================================================== ## ## hal_cortexm_stm32_stm32f10xxx.cdl ## ## Cortex-M STM32F10XXX platform HAL configuration data ## ##========================================================================== ## ####ECOSGPLCOPYRIGHTBEGIN#### ## ------------------------------------------- ## This file is part of eCos, the Embedded Configurable Operating System. ## Copyright (C) 2008, 2012 Free Software Foundation, Inc. ## ## eCos is free software; you can redistribute it and/or modify it under ## the terms of the GNU General Public License as published by the Free ## Software Foundation; either version 2 or (at your option) any later ## version. ## ## eCos is distributed in the hope that it will be useful, but WITHOUT ## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or ## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License ## for more details. ## ## You should have received a copy of the GNU General Public License ## along with eCos; if not, write to the Free Software Foundation, Inc., ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ## ## As a special exception, if other files instantiate templates or use ## macros or inline functions from this file, or you compile this file ## and link it with other works to produce a work based on this file, ## this file does not by itself cause the resulting work to be covered by ## the GNU General Public License. However the source code for this file ## must still be made available in accordance with section (3) of the GNU ## General Public License v2. ## ## This exception does not invalidate any other reasons why a work based ## on this file might be covered by the GNU General Public License. ## ------------------------------------------- ## ####ECOSGPLCOPYRIGHTEND#### ##========================================================================== #######DESCRIPTIONBEGIN#### ## ## Author(s): reille ## Date: 2013-02-22 ## ######DESCRIPTIONEND#### ## ##========================================================================== cdl_package CYGPKG_HAL_CORTEXM_STM32_STM32F10XXX { display "ST STM32F10XXX Development Board HAL" parent CYGPKG_HAL_CORTEXM_STM32 requires { CYGHWR_HAL_CORTEXM_STM32_FAMILY == "F1" } requires { CYGHWR_HAL_CORTEXM_STM32_F1 == "F103ZE" } define_header hal_cortexm_stm32_stm32f10xxx.h include_dir cyg/hal hardware description " The STM32F10XXX HAL package provides the support needed to run eCos on the ST stm32f10xxx platform board." compile stm32f10xxx_misc.c define_proc { puts $::cdl_system_header "#define CYGBLD_HAL_TARGET_H <pkgconf/hal_cortexm.h>" puts $::cdl_system_header "#define CYGBLD_HAL_VARIANT_H <pkgconf/hal_cortexm_stm32.h>" puts $::cdl_system_header "#define CYGBLD_HAL_PLATFORM_H <pkgconf/hal_cortexm_stm32_stm32f10xxx.h>" puts $::cdl_header "#define HAL_PLATFORM_CPU \"Cortex-M3\"" puts $::cdl_header "#define HAL_PLATFORM_BOARD \"ST STM32F10XXX\"" puts $::cdl_header "#define HAL_PLATFORM_EXTRA \"\"" } cdl_component CYG_HAL_STARTUP { display "Startup type" flavor data default_value {"RAM"} legal_values {"RAM" "SRAM" "ROM" "JTAG"} no_define define -file system.h CYG_HAL_STARTUP description " When targetting the ST STM32F10XXX platform board it is possible to build the system for either RAM bootstrap or ROM bootstrap. Select 'RAM' when building programs to load into RAM using onboard debug software such as RedBoot or eCos GDB stubs. Select 'ROM' when building a stand-alone application which will be put into ROM. The 'JTAG' type allows programs to be downloaded using a JTAG debugger such as a BDI3000 or PEEDI. The 'SRAM' type allows programs to be downloaded via a JTAG debugger into on-chip SRAM." } cdl_component CYGHWR_MEMORY_LAYOUT { display "Memory layout" flavor data no_define calculated { (CYG_HAL_STARTUP == "RAM" ) ? (CYGMEM_HAL_CORTEXM_STM32_STM32F10XXX_EXTRA_BASE_RAM ? "cortexm_stm32f10xxx_extrabaseram" : "cortexm_stm32f10xxx_ram") : (CYG_HAL_STARTUP == "SRAM") ? "cortexm_stm32f10xxx_sram" : (CYG_HAL_STARTUP == "ROM" ) ? "cortexm_stm32f10xxx_rom" : (CYG_HAL_STARTUP == "JTAG") ? "cortexm_stm32f10xxx_jtag" : "undefined" } cdl_option CYGMEM_HAL_CORTEXM_STM32_STM32F10XXX_EXTRA_BASE_RAM { display "Additional reserved space at base of RAM" flavor booldata default_value 0 active_if {CYG_HAL_STARTUP == "RAM"} legal_values 0 to 0x80000 description " If you are using a RedBoot with additional components enabled, such as networking, RedBoot may be occupying additional RAM. In such cases, an eCos application loaded by RedBoot must reserve additional space at the base of RAM to accommodate RedBoot's extra RAM requirements. This option, specified in bytes, allows the amount of extra reserved space to be increased beyond the default." } cdl_option CYGHWR_MEMORY_LAYOUT_LDI { display "Memory layout linker script fragment" flavor data no_define define -file system.h CYGHWR_MEMORY_LAYOUT_LDI calculated { "<pkgconf/mlt_" . CYGHWR_MEMORY_LAYOUT . ".ldi>" } } cdl_option CYGHWR_MEMORY_LAYOUT_H { display "Memory layout header file" flavor data no_define define -file system.h CYGHWR_MEMORY_LAYOUT_H calculated { "<pkgconf/mlt_" . CYGHWR_MEMORY_LAYOUT . ".h>" } } } cdl_option CYGARC_HAL_CORTEXM_STM32_INPUT_CLOCK { display "Input Clock frequency" flavor data default_value 8000000 legal_values 0 to 1000000000 description "Main clock input." } cdl_component CYGHWR_HAL_CORTEXM_STM32_FLASH { display "Flash support" parent CYGPKG_IO_FLASH active_if CYGPKG_IO_FLASH compile -library=libextras.a stm32f10xxx_flash.c default_value 1 description "Control flash device support for stm32f10xxx platform board." cdl_option CYGHWR_HAL_CORTEXM_STM32_FLASH_INTERNAL { display "Internal flash support" default_value 1 description "This option enables support for the internal flash device." } cdl_option CYGHWR_HAL_CORTEXM_STM32_FLASH_NOR { display "External NOR flash support" default_value 1 description "This option enables support for the external NOR flash device." } } # Both UARTs 0 and 1 are available for diagnostic/debug use. implements CYGINT_HAL_STM32_UART0 implements CYGINT_HAL_STM32_UART1 implements CYGINT_IO_SERIAL_FLOW_CONTROL_HW implements CYGINT_IO_SERIAL_LINE_STATUS_HW cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS { display "Number of communication channels on the board" flavor data calculated 2 } cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL { display "Debug serial port" active_if CYGPRI_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0 description " The ST STM32F10XXX platform board has two serial ports. This option chooses which port will be used to connect to a host running GDB." } cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL { display "Diagnostic serial port" active_if CYGPRI_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_CONFIGURABLE flavor data legal_values 0 to CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS-1 default_value 0 description " The ST STM32F10XXX has two serial ports. This option chooses which port will be used for diagnostic output." } cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD { display "Console serial port baud rate" flavor data legal_values 9600 19200 38400 57600 115200 default_value 115200 description " This option controls the default baud rate used for the console connection. RedBoot usess polling to transfer data over this port and might not be able to keep up with baud rates above the default, particularly when doing XYZmodem downloads. The interrupt-driven device driver is able to handle these baud rates, so any high speed application transfers should use that instead. Note: this should match the value chosen for the GDB port if the diagnostic and GDB port are the same." } cdl_option CYGNUM_HAL_VIRTUAL_VECTOR_DEBUG_CHANNEL_BAUD { display "GDB serial port baud rate" flavor data legal_values 9600 19200 38400 57600 115200 default_value 115200 description " This option controls the default baud rate used for the GDB connection. RedBoot usess polling to transfer data over this port and might not be able to keep up with baud rates above the default, particularly when doing XYZmodem downloads. The interrupt-driven device driver is able to handle these baud rates, so any high speed application transfers should use that instead. Note: this should match the value chosen for the console port if the console and GDB port are the same." } cdl_component CYGBLD_GLOBAL_OPTIONS { display "Global build options" flavor none parent CYGPKG_NONE description " Global build options including control over compiler flags, linker flags and choice of toolchain." cdl_option CYGBLD_GLOBAL_COMMAND_PREFIX { display "Global command prefix" flavor data no_define default_value { "arm-eabi" } description " This option specifies the command prefix used when invoking the build tools." } cdl_option CYGBLD_GLOBAL_CFLAGS { display "Global compiler flags" flavor data no_define default_value { CYGBLD_GLOBAL_WARNFLAGS . "-mcpu=cortex-m3 -mthumb -g -O2 -ffunction-sections -fdata-sections -fno-rtti -fno-exceptions" } description " This option controls the global compiler flags which are used to compile all packages by default. Individual packages may define options which override these global flags." } cdl_option CYGBLD_GLOBAL_LDFLAGS { display "Global linker flags" flavor data no_define default_value { "-mcpu=cortex-m3 -mthumb -Wl,--gc-sections -Wl,-static -Wl,-n -g -nostdlib" } description " This option controls the global linker flags. Individual packages may define options which override these global flags." } } cdl_component CYGPKG_HAL_CORTEXM_STM32_STM32F10XXX_OPTIONS { display "stm32f10xxx HAL build options" flavor none description " Package specific build options including control over compiler flags used only in building this HAL." cdl_option CYGPKG_HAL_CORTEXM_STM32_STM32F10XXX_CFLAGS_ADD { display "Additional compiler flags" flavor data no_define default_value { "-Werror" } description " This option modifies the set of compiler flags for building this HAL. These flags are used in addition to the set of global flags." } cdl_option CYGPKG_HAL_CORTEXM_STM32_STM32F10XXX_CFLAGS_REMOVE { display "Suppressed compiler flags" flavor data no_define default_value { "" } description " This option modifies the set of compiler flags for building this HAL. These flags are removed from the set of global flags if present." } } cdl_option CYGSEM_HAL_ROM_MONITOR { display "Behave as a ROM monitor" flavor bool default_value 0 parent CYGPKG_HAL_ROM_MONITOR requires { CYG_HAL_STARTUP == "ROM" || CYG_HAL_STARTUP == "JTAG" } requires { CYGDBG_HAL_CRCTABLE_LOCATION == "ROM" } description " Enable this option if this program is to be used as a ROM monitor, i.e. applications will be loaded into RAM on the board, and this ROM monitor may process exceptions or interrupts generated from the application. This enables features such as utilizing a separate interrupt stack when exceptions are generated." } cdl_option CYGSEM_HAL_USE_ROM_MONITOR { display "Work with a ROM monitor" flavor booldata legal_values { "Generic" "GDB_stubs" } default_value { CYG_HAL_STARTUP == "RAM" ? "GDB_stubs" : 0 } parent CYGPKG_HAL_ROM_MONITOR requires { CYG_HAL_STARTUP == "RAM" } description " Support can be enabled for different varieties of ROM monitor. This support changes various eCos semantics such as the encoding of diagnostic output, or the overriding of hardware interrupt vectors. Firstly there is \"Generic\" support which prevents the HAL from overriding the hardware vectors that it does not use, to instead allow an installed ROM monitor to handle them. This is the most basic support which is likely to be common to most implementations of ROM monitor. \"GDB_stubs\" provides support when GDB stubs are included in the ROM monitor or boot ROM." } cdl_component CYGPKG_REDBOOT_HAL_OPTIONS { display "Redboot HAL options" flavor none no_define parent CYGPKG_REDBOOT active_if CYGPKG_REDBOOT description " This option lists the target's requirements for a valid Redboot configuration." requires { CYGNUM_REDBOOT_FLASH_BASE == 0x64000000 } requires { CYGBLD_REDBOOT_MAX_MEM_SEGMENTS == 2 } cdl_option CYGBLD_BUILD_REDBOOT_BIN { display "Build Redboot ROM binary images" active_if CYGBLD_BUILD_REDBOOT default_value 1 no_define description "This option enables the conversion of the Redboot ELF image to binary image formats suitable for ROM programming." make -priority 325 { <PREFIX>/bin/redboot.bin : <PREFIX>/bin/redboot.elf $(OBJCOPY) --strip-debug $< $(@:.bin=.img) $(OBJCOPY) -O srec $< $(@:.bin=.srec) $(OBJCOPY) -O binary $< $@ } } } cdl_component CYGBLD_HAL_CORTEXM_STM32F10XXX_GDB_STUBS { display "Create StubROM SREC and binary files" active_if CYGBLD_BUILD_COMMON_GDB_STUBS no_define calculated 1 requires { CYG_HAL_STARTUP == "ROM" } make -priority 325 { <PREFIX>/bin/stubrom.srec : <PREFIX>/bin/gdb_module.img $(OBJCOPY) -O srec $< $@ } make -priority 325 { <PREFIX>/bin/stubrom.bin : <PREFIX>/bin/gdb_module.img $(OBJCOPY) -O binary $< $@ } description "This component causes the ELF image generated by the build process to be converted to S-Record and binary files." } }
推荐阅读相关文章:
- stm32移植ecos系列文章归档
- stm32移植ecos #8,移植ecos并成功运行helloworld程序,编译链接生成helloworld程序
- stm32移植ecos #7,移植ecos并成功运行helloworld程序,配置编译生成静态链接库文件
- stm32移植ecos #21,触摸屏tsc2046驱动移植
- stm32移植ecos #13,redboot引导启动flash中的应用程序映像文件(下)
- stm32移植ecos #12,redboot引导启动flash中的应用程序映像文件(上)
- stm32移植ecos #10,移植ecos并成功运行helloworld程序,烧写到内部flash直接运行helloworld程序
- stm32移植ecos #9,移植ecos并成功运行helloworld程序,使用redboot引导运行内存中的helloworld程序
请问那些中断怎样配置?谢谢
期待你弄个不用外部存储器的STM32配置。我已经在linux系统上搭好环境了,不过只能选一种stm32配置,而且必须有外部nor sram的。
等我,可不知什么时候呀,如果你有兴趣,不妨自己试试如何移植,岂不更好?
OK,我周末试试,