移植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    2048

你可能感兴趣的:(pixhawk学习)