Motion Driver6.1.2 Demo移植(需要起個大眾都知道的名字,改成F4-Discovery連接MPU9250)
最近下載了Invensense的最新姿態傳感器庫Motion Driver6.1.2,內含一個F4-Discovery板子的Demo。
就準備了硬件MPU9250的測試板和F4-Disco的板子。
起初以為調試很簡單。不想練在連接I2C的硬件時就犯了很大的錯誤。NCS起初調試的時候浮空了,AD0也是浮空。這就浪費了我不少時間,一時間信心全無。還在我之前用BB-Black運行的linux系統上的I2C-Detect測試過這塊傳感器板子。又仔細的檢查了電路和官方的PS之后就解決了問題。
起初在的測試是在IAR上測試的,但是個人更喜歡keil上的全局搜索功能,就將工程移植到keil,以便后續工程的遷移。
現在將IAR移植到keil的筆記和最終代碼發到論壇。期望對人有些幫助。至于后續的遷移項目,視情況而定吧。
下圖是利用自導的python測試程序測試的圖片截屏。
143845nsj0a7v7ojwayyd3.png (316.75 KB, 下載次數: 68)
下載附件
2016-6-17 16:18 上傳
注意在遷移的時候我將工程的標準庫更新到了最新的V1.5.1.
調試記錄屬于隨筆記錄性質的,所以語言可能不流暢。勉強看吧。原本是txt的文檔,因為格式不允許就壓縮了。
因為大小有限制,所以分成壓縮成兩個包。
因為只貼附件不夠直觀(因為文件是用sublime編寫的,用notepad打開可能是亂碼),現在將調試記錄的內容粘貼如下:
在調試的時候發現地址是很有意思的如果連接AD到GND的話,I2C地址是68. AD懸空或者拉高是69.
上面的情況是我出錯的一個原因,另一個原因是在I2C連接時將CS浮空,但是事實上在使用I2C的時候務必將其拉高。
2015.08.05 使用官方提供的python測試程序測試通過。解決了困擾已久的硬件問題。本次硬件問題的解決借助了BB-Black來幫忙,使用BBB內置的I2Cdetect來測試。找到了問題。
關于SPI和I2C的接線還要參考demo板和原理圖說明。[UEVB]
PS-MPU-9250A-01.pdf文件第12頁給出了I2C地址的描述。AD0 = 0時,地址1101000, AO0 =1時地址是1101001.在實際應用中這個字節的最低位會添加0或1.表示寫或者讀。所以讀地址是11010001或11010011(D1或D3),寫地址是11010000或11010010(D0或者D2)。
測試的下一個階段是將項目移植到keil上面,進行測試。另一個階段的工作是使用cube庫進行移植。
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
第二階段:移植到keil工程中
說明:本次移植不只是簡單的復制粘貼,本次移植的目的還有一個是能夠將其代碼F4在不同的系列上面移植,目標之一就是F401板子。
本次一直是利用官方的標準庫結合特定的BSP來進行移植的。在移植之前需要分析工程的代碼結構。
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 看代碼[]
省略。。。
2 硬件描述:
2.1>傳感器和開發板之間:
信號 MPU9250測試板 開發板 描述
+5V VCC_IN(內含3.3V穩壓) +5V 電源+
GND GND GND 電源-
SCL SCL/SCLK PB10(I2C2-SCL) I2C時鐘線
SDA SDA/MOSI PB11(I2C2-SDA) I2C數據線
NONE NCS(無用須拉高) +3V 高電平,MOSI時有用
sel AD AD/MOSI GND 拉低地址68,拉高69
2.2>UART信號通過USB轉TTL(FT232)引入電腦
開發板 FT232板子 描述
PA2(Tx2) RX 開發板信號傳出
PA3(Rx2) TX 開發板信號引入
GND GND GND
3 文件結構分析
3.1包含目錄
@1 STM32F4xx_StdPeriph_Driver
|+inc{}
|+src{}
@2 core
|+driver
+eMPL{}
+include{}
stm32L{}
|eMPL-hal{}
|mllite{}
|mpl
@3 DeviceSupport
|+inc{}
|+src{}
@4 Peripheral
|+inc{}
|+src{}
@5 User
|+inc{}
|+src{}
下面列出SRC
$PROJ_DIR$..Userinc
$PROJ_DIR$..Usersrc
$PROJ_DIR$..Peripheralinc
$PROJ_DIR$..Peripheralsrc
$PROJ_DIR$..STM32F4xx_StdPeriph_Driverinc
$PROJ_DIR$..STM32F4xx_StdPeriph_Driversrc
$PROJ_DIR$..DeviceSupportinc
$PROJ_DIR$..DeviceSupportsrc
$PROJ_DIR$..coredriverinclude
$PROJ_DIR$..coredrivereMPL
$PROJ_DIR$..coredriverstm32l
$PROJ_DIR$..coremllite
$PROJ_DIR$..corempl
$PROJ_DIR$..coreeMPL-hal
轉換到keil是(keil目錄在):
..Userinc
..Usersrc
..Peripheralinc
..Peripheralsrc
..STM32F4xx_StdPeriph_Driverinc
..STM32F4xx_StdPeriph_Driversrc
..DeviceSupportinc
..DeviceSupportsrc
..coredriverinclude
..coredrivereMPL
..coredriverstm32l
..coremllite
..corempl
..coreeMPL-hal
keil工程位于新建的MDK-ARM文件夾內
@6 MDK-ARM
也新建下面目錄存儲二進制文件
@7 Binary
3.2預處理命令:
USE_STDPERIPH_DRIVER
USE_DMP
MPL_LOG_NDEBUG=1
EMPL
MPU9250
EMPL_TARGET_STM32F4
遷移到keil:
USE_STDPERIPH_DRIVER,USE_DMP,MPL_LOG_NDEBUG=1,EMPL,MPU9250,,EMPL_TARGET_STM32F4
在keil的標準庫中還需要添加設備名稱F407的名稱對應STM32F40_41xxx
這部分可參考文件stm32f4xx.h
/* #define STM32F40_41xxx */ /*!< STM32F405RG, STM32F405VG, STM32F405ZG, STM32F415RG, STM32F415VG, STM32F415ZG,
STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG, STM32F407IE,
STM32F417VG, STM32F417VE, STM32F417ZG, STM32F417ZE, STM32F417IG and STM32F417IE Devices */
/* #define STM32F427_437xx */ /*!< STM32F427VG, STM32F427VI, STM32F427ZG, STM32F427ZI, STM32F427IG, STM32F427II,
STM32F437VG, STM32F437VI, STM32F437ZG, STM32F437ZI, STM32F437IG, STM32F437II Devices */
/* #define STM32F429_439xx */ /*!< STM32F429VG, STM32F429VI, STM32F429ZG, STM32F429ZI, STM32F429BG, STM32F429BI,
STM32F429NG, STM32F439NI, STM32F429IG, STM32F429II, STM32F439VG, STM32F439VI,
STM32F439ZG, STM32F439ZI, STM32F439BG, STM32F439BI, STM32F439NG, STM32F439NI,
STM32F439IG and STM32F439II Devices */
/* #define STM32F401xx */ /*!< STM32F401CB, STM32F401CC, STM32F401RB, STM32F401RC, STM32F401VB, STM32F401VC
STM32F401CD, STM32F401RD, STM32F401VD, STM32F401CExx, STM32F401RE and STM32F401VE Devices */
/* #define STM32F411xE */ /*!< STM32F411CD, STM32F411RD, STM32F411VD, STM32F411CE, STM32F411RE and STM32F411VE Devices */
/* #define STM32F446xx */ /*!< STM32F446MC, STM32F446ME, STM32F446RC, STM32F446RE, STM32F446VC, STM32F446VE, STM32F446ZC
and STM32F446ZE Devices */
3.3浮點運算
IAR:Genaeral Options>FPU>VFPv4
keil: Target>Roating Point Hardware>Usr Single Precision
3.4堆棧大小
IAR:Linker>Config>Override default>$PROJ_DIR$stm32f40x_flash.icf>[.intec=0x08000000,ROM{S=0x8000000,E=0x080FFFFF},RAM{S=0x20000000,E=0x2001BFFF},CSTACK=0x1000,HEAP=0x800]
Keil分別在Target>IROM1/IRAM1(保持默認),和.s文件處修改(稍后修改)。
3.5項目目錄結構
參照3.1中的描述建立但是因為keil不支持多級目錄所以用符號代替,同時只用包含C和s文件就足夠了
3.6替換.s和.a文件
這兩個文件分別位于core/mpl和DeviceSupport下面。
其中.a文件換成了.lib文件,因為keil不支持.a,而支持lib
在更換.s文件時也配套更換了對應的.h文件
添加CMSIS目錄
@8 CMSIS
內部包含Include和lib目錄
////////////////////////////////
編譯不通過
//////////////////////////////////////////////
繼續修改
編譯模式修改為c99模式,并包含micro lib之后去掉了多數錯誤
目前主要的警告包含兩類:
一類是without a new line,另一類是void參數省略提醒。
幾個小的警告:
還有幾個警告是單精度轉換成雙精度類型。
__no_operation();沒有定義
目前還剩余的三處錯誤。但實際上是一個錯誤,這個錯誤是:
1 fputs錯誤:IAR的fputs原型是fputc(int ch),keil的fputs原型是fputc(int ch, FILE *f)
這三個錯誤排出之后新增一個__no_operation()的錯誤,在IAR中,這一項在intrinsics.h中定義。
在keil中使用nop函數來替代,這個函數在intrins.h。但是這個語法不能用在ARM上。
MDK上的替代語句是:__nop()語句
3.7測試
忘記連接INT到PA1上,串口連線松動。修整好之后,測試通過。
MPU9250這個芯片的磁力計AK8963只有I2C接口,而加速度計陀螺儀MPU6500模塊是I2C接口與SPI都有的,
095721yjj7da8z0t8kjqjt.png (128.22 KB, 下載次數: 87)
下載附件
2016-6-17 16:18 上傳
看他手冊的block diagram描述應該就是這樣,所以如果使用SPI接口,我們只能通過配置內部的I2C master模塊,讓i2c matster通過內部的i2c總線來讀取磁力計數據。。。所以總結我遇到的問題就是,當使用SPI接口時,我用i2c master碰到問題了,無論如何嘗試都不能通過i2c master讀取磁力計,只能讀到加速度和陀螺儀數據。而我使用i2c的bypass模式可以讀取所有的9軸數據。他的程序我以前也試過了,初始化的時候就是失敗的,所以已經放棄SPI讀取地磁很久了。。不過看到你發帖,突然很激動。。希望多多交流
F4DiscKeil-MD612.part01.rar
(9 MB, 下載次數: 65)
2016-6-17 15:01 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
F4DiscKeil-MD612.part02.rar
(6.57 MB, 下載次數: 33)
2016-6-17 15:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|