pixhawk代码移植到不一样stm32芯片

      本文基于pixhawk1.0.1代码,移植须要的知识不少,一两个文章可说不清楚,里面涉及到编译原理,操做系统,stm32,计算机组成原理等,须要长期积累,我这里只是起到抛砖引玉的做用。先写个大概,往后专门针对单独功能的移植写博客。

1.   pixhawk代码的目录结构
      pixhawk代码分为固件和nuttx操做系统。nuttx操做系统包含两个目录:nuttx和nuttx-config。固件主要在src目录中。

2.   固件和nuttx的不一样职责
      nuttx负责和芯片底层打交道,并为上层固件提供一个友好的接口。传感器的驱动程序不属于nuttx,可是传感器的驱动程序须要调用nuttx提供的总线接口才能读取到传感器数据。stm32的时钟pll也是由nuttx操做系统负责配置,若是配置错了,和时钟有关的功能好比串口波特率就会错误。固件层没法干涉nuttx的配置,只能听天由命。
      固然,我所说的固件层不处理硬件改动指的是芯片层面的硬件改动,好比换了个晶振或者换了个不一样的stm32芯片就不归固件管。可是,若是只是将某个led灯从一个io口移到另外一个io口,或者将gps移到另外一个串口上,这就由固件层进行管理。

3.   影响串口开关们
    用自上而下的方法描述
    好比IO芯片用于和FMU通讯的串口。
    1)首先打开src/drivers/boards/px4io-v2/board_config.h
    看到这几个宏了没?
    #define PX4FMU_SERIAL_BASE    STM32_USART2_BASE
    #define PX4FMU_SERIAL_* …...
    这几个宏代表IO侧与FMU通讯的串口是哪一个。同目录下的serial.c会调用这几个宏和fmu通讯。
    2)打开\nuttx\nuttx\arch\arm\src\stm32\chip\Stm32f10xxx_memorymap.h
    看到上文中STM32_USART2_BASE宏的定义了没?对,没错这是一个地址,文件名 Stm32f10xxx代表USART2的地址只在Stm32f10系列的芯片中才是这样,其余的不必定是这样。也就是说Stm32f10xxx_memorymap.h文件就是摘抄自stm32的芯片手册,是否是感受nuttx操做系统自带一个芯片手册,嘿嘿。
    3)为何编译IO侧代码的时候会包含Stm32f10xxx_memorymap.h?
    打开nuttx/nuttx/arch/arm/src/stm32/chip/stm32_memorymap.h,仔细观察,发现只要定义CONFIG_STM32_STM32F10XX宏,就会include那个文件。
    4)CONFIG_STM32_STM32F10XX宏在哪里定义?
    不用找了,我告诉大家,在nuttx-configs/px4io-v2/nsh/defconfig中定义了宏CONFIG_ARCH_CHIP_STM32F100C8,这个宏在\nuttx\nuttx\arch\arm\include\stm32\chip.h中起做用,因而定义CONFIG_STM32_STM32F10XX宏。
    5)总结
    defconfig中定义了stm32芯片的类型,而后nuttx操做系统根据芯片的类型决定USART2的基地址,最后固件层的board_config.h文件将USART2做为和FMU通讯的串口来使用。若是你要将代码移植到另外一个stm芯片上,只须要在defconfig中改一个宏就好了。

4.   修改存储空间大小
    defconfig文件中的CONFIG_USERMAIN_STACKSIZE是用户主堆栈大小,CONFIG_DRAM_SIZE是内存大小,还要修改同目录中的编译连接文件scripts/ld.script:
MEMORY
{
    flash (rx) : ORIGIN = 0x08001000, LENGTH = 60K//用于存放代码
    sram (rwx) : ORIGIN = 0x20000000, LENGTH = 8K//用于存放变量
}

5.   换了个晶振怎么办?
    别怕,打开nuttx-configs/px4io-v2/include/board.h,这些宏是神码意思本身去查芯片手册吧,另外要提醒你们的是,IO侧的borad.h的配置是默认没有使用pll的,若是要使用pll,就要修改至少四五个宏,可不是改一个数字这么简单。可是值得庆幸的是,io侧的bootloader使用的是stm32内部晶振,因此不用担忧bootloader会因为晶振出问题。

6.   nuttx居然没有包含超高密度flash的stm32芯片配置
      好比stm32f103zgt6就是超高密度的。不过别怕,根据芯片手册本身加上就好了。这里要边看代码边看我写的才能看懂。
      首先 在nuttx-configs/px4io-v2/nsh/defconfig中定义本身板子的芯片宏CONFIG_ARCH_CHIP_“个人STM32型号”。
      这个宏在\nuttx\nuttx\arch\arm\include\stm32\chip.h中起做用,里面根据定义CONFIG_ARCH_CHIP_“个人STM32型号”定义了宏CONFIG_STM32_”个人STM32所属系列”,与此同时定义新的宏 CONFIG_STM32_XLDENSITY表示超高密度flash芯片。
      而后,根据芯片手册在/nuttx/nuttx/arch/arm/src/stm32/chip/stm32_flash.h中增长:
#elif defined(CONFIG_STM32_XLDENSITY)
# define STM32_FLASH_NPAGES        512
# define STM32_FLASH_PAGESIZE    2048spa

相关文章
相关标签/搜索