本文基於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