
本帖最后由 watershade 于 2015-8-22 12:39 编辑 - @7 X/ J4 g; ~; y' H+ z" ?0 } ; ]5 E: D u' `; ?5 t Motion Driver6.1.2 Demo移植(需要起个大众都知道的名字,改成F4-Discovery连接MPU9250) % f0 W% p4 w% I4 X$ h$ P ) S+ Y# k$ u" M4 l) f# C 最近下载了Invensense的最新姿态传感器库Motion Driver6.1.2,内含一个F4-Discovery板子的Demo。 就准备了硬件MPU9250的测试板和F4-Disco的板子。 起初以为调试很简单。不想练在连接I2C的硬件时就犯了很大的错误。NCS起初调试的时候浮空了,AD0也是浮空。这就浪费了我不少时间,一时间信心全无。还在我之前用BB-Black运行的linux系统上的I2C-Detect测试过这块传感器板子。又仔细的检查了电路和官方的PS之后就解决了问题。, Z9 e/ S' O" Z2 g9 ~2 v 起初在的测试是在IAR上测试的,但是个人更喜欢keil上的全局搜索功能,就将工程移植到keil,以便后续工程的迁移。: o( C. f. D& Z/ a 5 N& D% ^. I3 D a, Q( X3 D( J4 ? 现在将IAR移植到keil的笔记和最终代码发到论坛。期望对人有些帮助。至于后续的迁移项目,视情况而定吧。4 ]3 O# g& g9 Y: ~ 下图是利用自导的python测试程序测试的图片截屏。 ![]() 注意在迁移的时候我将工程的标准库更新到了最新的V1.5.1.9 F% H9 `- @) B7 T" E 调试记录属于随笔记录性质的,所以语言可能不流畅。勉强看吧。原本是txt的文档,因为格式不允许就压缩了。( l4 u7 ^$ W- x3 ~ 因为大小有限制,所以分成压缩成两个包。 ![]() |
利用STM32MP1和STM32MP2为嵌入式Linux提供有效的安全措施:供当今决策者参考的3条宝贵经验
有奖直播 | STM32MP2x 资源隔离架构 (RIF) 介绍与使用
白皮书下载|边缘 AI 变革:MCU集成 NPU 的破局与领航
OpenSTLinux:为STM32 MPU生态系统带来超强助力
【STM32MP257】轻松搭建A35 Linux编译及调试环境
【STM32MP257】🥳STM32MP257-DK-开发板开箱体验
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【STM32MPU 安全启动】 TF-A BL2 TrustedBoot原理学习
《STM32MPU安全启动》学**结
《STM32MPU安全启动》学习心得
因为只贴附件不够直观(因为文件是用sublime编写的,用notepad打开可能是乱码),现在将调试记录的内容粘贴如下:
在调试的时候发现地址是很有意思的如果连接AD到GND的话,I2C地址是68. AD悬空或者拉高是69.
0 d1 L/ k$ ^8 m7 F; s+ }6 W4 Z f4 j
上面的情况是我出错的一个原因,另一个原因是在I2C连接时将CS浮空,但是事实上在使用I2C的时候务必将其拉高。
2015.08.05 使用官方提供的python测试程序测试通过。解决了困扰已久的硬件问题。本次硬件问题的解决借助了BB-Black来帮忙,使用BBB内置的I2Cdetect来测试。找到了问题。
关于SPI和I2C的接线还要参考demo板和原理图说明。[UEVB]! B8 o* Q8 \. e( s! B/ w: `
PS-MPU-9250A-01.pdf文件第12页给出了I2C地址的描述。AD0 = 0时,地址1101000, AO0 =1时地址是1101001.在实际应用中这个字节的最低位会添加0或1.表示写或者读。所以读地址是11010001或11010011(D1或D3),写地址是11010000或11010010(D0或者D2)。. F9 j; N/ ^$ Z) ^+ v
测试的下一个阶段是将项目移植到keil上面,进行测试。另一个阶段的工作是使用cube库进行移植。
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||1 H; ^) Y, S' n4 k8 A0 K9 `; x( p
第二阶段:移植到keil工程中2 U+ ^* \: y/ z- I. S1 |
说明:本次移植不只是简单的复制粘贴,本次移植的目的还有一个是能够将其代码F4在不同的系列上面移植,目标之一就是F401板子。; D+ D" Q6 P' o) Z2 E
本次一直是利用官方的标准库结合特定的BSP来进行移植的。在移植之前需要分析工程的代码结构。; i7 w+ l* ^* h/ ^* p5 `3 R3 {
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||9 |! g6 t h/ c! v- v0 ^
1 看代码[]6 z( i0 z* d# ^" I' Z1 q1 b' g' i/ Q
省略。。。
) C8 O7 c/ u* J! F
* D" r" A3 F { \7 S! `' `8 X
2 硬件描述:6 G! K* c" ~$ Z* Z
2.1>传感器和开发板之间:& o) Y+ l; V1 ?: H. B
信号 MPU9250测试板 开发板 描述8 V) }. A7 b; x7 D& k
+5V VCC_IN(内含3.3V稳压) +5V 电源+
GND GND GND 电源-7 V& l: Q2 W: k" B& m7 ?' E
SCL SCL/SCLK PB10(I2C2-SCL) I2C时钟线3 B* a4 X( m; M+ H$ U" L
SDA SDA/MOSI PB11(I2C2-SDA) I2C数据线
NONE NCS(无用须拉高) +3V 高电平,MOSI时有用$ e5 G* Z: h7 F( b' e G
sel AD AD/MOSI GND 拉低地址68,拉高69
* P3 m: x" M7 R
2.2>UART信号通过USB转TTL(FT232)引入电脑
开发板 FT232板子 描述
PA2(Tx2) RX 开发板信号传出) r$ p- E/ U% v1 ^
PA3(Rx2) TX 开发板信号引入 b/ ]3 @! h1 k
GND GND GND( t' ?8 K; f$ j! c
3 文件结构分析
3.1包含目录4 n7 I5 `$ E6 m7 T
@1 STM32F4xx_StdPeriph_Driver
|+inc{}
|+src{}
@2 core
|+driver
\+eMPL{} _* _" y" D5 ~6 V9 d9 F$ K
\+include{}
\stm32L{} m! h5 Y) c Q' ?
|eMPL-hal{}0 _3 ]9 t. J8 |2 c5 Y2 n. N$ C
|mllite{}/ G l. n5 T- I
|mpl
@3 DeviceSupport) Z2 m2 z) r- K; r5 p. C
|+inc{}
|+src{}
@4 Peripheral
|+inc{}5 r) A" q+ g: ^" M; v
|+src{}
@5 User$ n4 @. g, ^. {6 g
|+inc{}
|+src{} ; v9 B% ]5 U w5 v
下面列出SRC! y2 h. C2 R* u) x4 U
$PROJ_DIR$\..\User\inc
$PROJ_DIR$\..\User\src& S3 w9 p d) ? \* ]+ k2 k) B- M+ H
$PROJ_DIR$\..\Peripheral\inc$ ~3 O3 }7 m& F. ~- c$ K
$PROJ_DIR$\..\Peripheral\src5 g8 O( a. I: D, ?# z0 N6 ?
$PROJ_DIR$\..\STM32F4xx_StdPeriph_Driver\inc! W2 o) |3 r+ g# Z; E+ B
$PROJ_DIR$\..\STM32F4xx_StdPeriph_Driver\src
$PROJ_DIR$\..\DeviceSupport\inc
$PROJ_DIR$\..\DeviceSupport\src! y+ s% {0 Y% } B4 _! T
$PROJ_DIR$\..\core\driver\include0 Z U' S, Y$ M* c* A
$PROJ_DIR$\..\core\driver\eMPL* o9 C3 J2 }2 a) ^
$PROJ_DIR$\..\core\driver\stm32l
$PROJ_DIR$\..\core\mllite
$PROJ_DIR$\..\core\mpl
$PROJ_DIR$\..\core\eMPL-hal
转换到keil是(keil目录在):2 }# r! f& X" O6 M7 t
..\User\inc6 P' R( d! p1 Z# _
..\User\src
..\Peripheral\inc
..\Peripheral\src
..\STM32F4xx_StdPeriph_Driver\inc3 e1 v( _8 H& R; X: u$ l% ~+ T {
..\STM32F4xx_StdPeriph_Driver\src
..\DeviceSupport\inc
..\DeviceSupport\src
..\core\driver\include2 P k% L. F4 u9 M' ]
..\core\driver\eMPL8 W. f- u% [) w7 i, ^# Z, n
..\core\driver\stm32l+ w6 L/ o+ w T/ i+ C- ^& w. q
..\core\mllite
..\core\mpl+ i' E& p# ^; ~. v; _, @
..\core\eMPL-hal. w" I7 {% R, W- w$ b7 o/ o
keil工程位于新建的MDK-ARM文件夹内 F# l' Z- E# B: R3 r
@6 MDK-ARM
也新建下面目录存储二进制文件, C: W( `( A; P
@7 Binary
- B$ h. @( j) [! }1 K; W
3.2预处理命令:# G9 ~* r8 H: D
USE_STDPERIPH_DRIVER( A d O5 X; L' T( y5 U' }; z
USE_DMP6 o7 r$ F+ F- m( D
MPL_LOG_NDEBUG=1
EMPL
MPU9250 ?5 Y3 r9 c( J: r3 }. \
EMPL_TARGET_STM32F4- `* P6 g% q3 e$ B
迁移到keil:8 X; r& r7 A, `3 Q
USE_STDPERIPH_DRIVER,USE_DMP,MPL_LOG_NDEBUG=1,EMPL,MPU9250,,EMPL_TARGET_STM32F4
在keil的标准库中还需要添加设备名称F407的名称对应STM32F40_41xxx7 Z! w- X/ j: M, h2 W, t5 D1 Z5 n
这部分可参考文件stm32f4xx.h& a; {8 l1 |% H @( C& {" g" G, K+ f
/* #define STM32F40_41xxx */ /*!< STM32F405RG, STM32F405VG, STM32F405ZG, STM32F415RG, STM32F415VG, STM32F415ZG,
STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG, STM32F407IE, 8 \0 \' L6 v4 f+ r- j' p; F9 L
STM32F417VG, STM32F417VE, STM32F417ZG, STM32F417ZE, STM32F417IG and STM32F417IE Devices */
. l/ _6 b" G G" p% v! V, x* ] o* v
/* #define STM32F427_437xx */ /*!< STM32F427VG, STM32F427VI, STM32F427ZG, STM32F427ZI, STM32F427IG, STM32F427II, + x Q1 w- f5 p) z/ ~
STM32F437VG, STM32F437VI, STM32F437ZG, STM32F437ZI, STM32F437IG, STM32F437II Devices */
, I4 Y' b9 m. |" `
/* #define STM32F429_439xx */ /*!< STM32F429VG, STM32F429VI, STM32F429ZG, STM32F429ZI, STM32F429BG, STM32F429BI,
STM32F429NG, STM32F439NI, STM32F429IG, STM32F429II, STM32F439VG, STM32F439VI, : ~. n- p# F. b' m9 b
STM32F439ZG, STM32F439ZI, STM32F439BG, STM32F439BI, STM32F439NG, STM32F439NI,
STM32F439IG and STM32F439II Devices */+ W5 x! `3 H# ~3 K6 P: ?) P2 I
c2 J' V. H! v9 ~7 S' D
/* #define STM32F401xx */ /*!< STM32F401CB, STM32F401CC, STM32F401RB, STM32F401RC, STM32F401VB, STM32F401VC 3 @+ |( S8 M5 Q
STM32F401CD, STM32F401RD, STM32F401VD, STM32F401CExx, STM32F401RE and STM32F401VE Devices */5 S, _' z: P0 \* P9 \9 G/ z
. i; p$ ?7 w5 J; r
/* #define STM32F411xE */ /*!< STM32F411CD, STM32F411RD, STM32F411VD, STM32F411CE, STM32F411RE and STM32F411VE Devices */* T$ X- z6 u4 T3 g: n8 m
V1 f+ A' A T e9 `: R, u
/* #define STM32F446xx */ /*!< STM32F446MC, STM32F446ME, STM32F446RC, STM32F446RE, STM32F446VC, STM32F446VE, STM32F446ZC
and STM32F446ZE Devices */" B$ L* `/ J- P7 t7 J
3 K( y/ z$ U) [9 D# P
3.3浮点运算1 \* M4 T1 ~3 E1 q: \2 w; _
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 c& `7 \4 B8 l* U
3.5项目目录结构
参照3.1中的描述建立但是因为keil不支持多级目录所以用符号代替,同时只用包含C和s文件就足够了9 X: [' |8 s6 U: r
7 g! x: O" U; g6 D0 U" F3 B
3.6替换.s和.a文件% F# P+ p) k$ J
这两个文件分别位于core/mpl和DeviceSupport下面。# X- x H1 b- T! |. f6 ~4 k- W
其中.a文件换成了.lib文件,因为keil不支持.a,而支持lib
在更换.s文件时也配套更换了对应的.h文件
添加CMSIS目录
@8 CMSIS4 c# V1 d2 [) p6 ?2 U9 X
内部包含Include和lib目录' w/ o4 \* i& w6 b8 h' ^) }# I4 Z4 c
! z- I5 T; U& U, ]- |4 V
////////////////////////////////
编译不通过
//////////////////////////////////////////////
继续修改
编译模式修改为c99模式,并包含micro lib之后去掉了多数错误6 e4 z' z# T4 U6 G5 x
目前主要的警告包含两类:9 h, D; {4 \! y0 x. N0 B( J0 K; N
一类是without a new line,另一类是void参数省略提醒。. r4 V1 P0 ]; _! g3 \
几个小的警告:5 F2 C2 Z+ K* }* c, z8 v- _; |+ C
还有几个警告是单精度转换成双精度类型。8 C y" m h% w6 [& ~
__no_operation();没有定义
3 @8 q9 o4 i8 G4 }4 |3 p) e7 `! N# P2 d7 w
) a. s5 K8 p8 X8 w/ h% h
目前还剩余的三处错误。但实际上是一个错误,这个错误是:4 [; j& e- L# V- s
1 fputs错误:IAR的fputs原型是fputc(int ch),keil的fputs原型是fputc(int ch, FILE *f), k+ T: K! M/ H
5 L- K, {8 n! @6 ~ y
这三个错误排出之后新增一个__no_operation()的错误,在IAR中,这一项在intrinsics.h中定义。! w* m. ]- h( K/ l' `
在keil中使用nop函数来替代,这个函数在intrins.h。但是这个语法不能用在ARM上。/ |5 ~6 m$ D9 A! o1 W/ N* ?% q, M. z
MDK上的替代语句是:__nop()语句
8 |0 i" r3 {5 N; j% n, j0 v
3.7测试' s& t h% Z" P, u4 \
忘记连接INT到PA1上,串口连线松动。修整好之后,测试通过。 K; O0 s! [- {$ U
) b2 v; o4 v4 y, Y+ q" U! P6 Y
* R: ` G+ |0 k Q- O8 _ S
invensense_adv.h文件中,包含了两个mag_disturb.h 但是落下了inv_math.h没有include进去,所以楼主更改了其中一个!
嗯,问题是这样的。MPU9250这个芯片的磁力计AK8963只有I2C接口,而加速度计陀螺仪MPU6500模块是I2C接口与SPI都有的,
评分
查看全部评分
刚开始移植,回头搞完了,没准发个教程。
自己在移植时的笔记,只是简单的记录。如果又需要,凑合看吧。看不懂问我。
有,我待会上传一下。你记得下载
App Note 1 - Motion Driver 6.12 Getting Started.pdf
2015-8-21 22:11 上传
点击文件名下载附件
1.02 MB, 下载次数: 585
App Note 2- Motion Driver 6.12 Features Guide.pdf
2015-8-21 22:11 上传
点击文件名下载附件
347.33 KB, 下载次数: 127
App Note 3- Motion Driver 6.12 Porting Guide.pdf
2015-8-21 22:11 上传
点击文件名下载附件
684.45 KB, 下载次数: 118
MPU HW Offset Registers 1.2.pdf
2015-8-21 22:11 上传
点击文件名下载附件
309.28 KB, 下载次数: 122
Orientation Matrix Transformation chart.pdf
2015-8-21 22:11 上传
点击文件名下载附件
184.32 KB, 下载次数: 120
/ O8 s. C0 X+ w0 l$ x4 c+ ?+ F9 o; a