
本帖最后由 watershade 于 2015-8-22 12:39 编辑 ) o5 P0 X- W4 q- u. ~1 e( T. C r Motion Driver6.1.2 Demo移植(需要起个大众都知道的名字,改成F4-Discovery连接MPU9250)6 g" D) s6 O+ b1 ^7 h T8 a& g2 b2 l. T 最近下载了Invensense的最新姿态传感器库Motion Driver6.1.2,内含一个F4-Discovery板子的Demo。 就准备了硬件MPU9250的测试板和F4-Disco的板子。 起初以为调试很简单。不想练在连接I2C的硬件时就犯了很大的错误。NCS起初调试的时候浮空了,AD0也是浮空。这就浪费了我不少时间,一时间信心全无。还在我之前用BB-Black运行的linux系统上的I2C-Detect测试过这块传感器板子。又仔细的检查了电路和官方的PS之后就解决了问题。 起初在的测试是在IAR上测试的,但是个人更喜欢keil上的全局搜索功能,就将工程移植到keil,以便后续工程的迁移。( J' |# s+ a$ T" C% { ( a- _! |$ m1 M u 现在将IAR移植到keil的笔记和最终代码发到论坛。期望对人有些帮助。至于后续的迁移项目,视情况而定吧。 下图是利用自导的python测试程序测试的图片截屏。 ![]() 注意在迁移的时候我将工程的标准库更新到了最新的V1.5.1. 调试记录属于随笔记录性质的,所以语言可能不流畅。勉强看吧。原本是txt的文档,因为格式不允许就压缩了。 因为大小有限制,所以分成压缩成两个包。 ![]() |
利用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打开可能是乱码),现在将调试记录的内容粘贴如下:. V9 y" {8 _4 ~5 V# M
在调试的时候发现地址是很有意思的如果连接AD到GND的话,I2C地址是68. AD悬空或者拉高是69.
! W8 Y( O. h" N. A# c5 ]
上面的情况是我出错的一个原因,另一个原因是在I2C连接时将CS浮空,但是事实上在使用I2C的时候务必将其拉高。
2015.08.05 使用官方提供的python测试程序测试通过。解决了困扰已久的硬件问题。本次硬件问题的解决借助了BB-Black来帮忙,使用BBB内置的I2Cdetect来测试。找到了问题。
关于SPI和I2C的接线还要参考demo板和原理图说明。[UEVB]
# @. \- M$ x6 Z. m
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库进行移植。+ b2 s# m: k8 M! Z: ]* i
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
第二阶段:移植到keil工程中+ s' ^# N5 g7 Q) i- T4 @
说明:本次移植不只是简单的复制粘贴,本次移植的目的还有一个是能够将其代码F4在不同的系列上面移植,目标之一就是F401板子。
本次一直是利用官方的标准库结合特定的BSP来进行移植的。在移植之前需要分析工程的代码结构。
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 看代码[]
省略。。。3 B* r+ z* S3 v7 {( |* \6 q, K2 P3 ^7 d
" c+ c& D. y# b" ^0 F! u: M
* h1 D2 ]4 p" p- ^0 y" Q
2 硬件描述:% u2 ?* ~" Q6 A( G2 m
2.1>传感器和开发板之间:+ W% M6 \% ]+ ^( u/ {/ Y+ P* D' u$ m
信号 MPU9250测试板 开发板 描述# G0 k: Y8 J$ T) w
+5V VCC_IN(内含3.3V稳压) +5V 电源+1 O) b0 e" a* L! ]3 E' I; [
GND GND GND 电源-
SCL SCL/SCLK PB10(I2C2-SCL) I2C时钟线+ L0 D/ x) A9 R
SDA SDA/MOSI PB11(I2C2-SDA) I2C数据线5 j, d b8 U; U, d$ c# D5 ?
NONE NCS(无用须拉高) +3V 高电平,MOSI时有用3 s% _8 c; a+ }
sel AD AD/MOSI GND 拉低地址68,拉高69
2.2>UART信号通过USB转TTL(FT232)引入电脑
开发板 FT232板子 描述
PA2(Tx2) RX 开发板信号传出% R. \% y, R. H p# R# ^
PA3(Rx2) TX 开发板信号引入
GND GND GND- q; D' [- q' t
3 文件结构分析
3.1包含目录3 a) j2 S2 d" g/ @ a4 V
@1 STM32F4xx_StdPeriph_Driver Y7 |( y l& Z" U0 s. i
|+inc{}/ }& J u- [+ @
|+src{}
@2 core
|+driver
\+eMPL{}, u6 @5 Q7 [7 A+ a9 O2 R( q X$ U S
\+include{}
\stm32L{}
|eMPL-hal{}# D, d9 Z' U ~
|mllite{}6 ~! I3 H. l% [+ e
|mpl
@3 DeviceSupport
|+inc{}7 a% p, ^( {( l) D9 ?# t# R
|+src{}, I, o- j! d7 q* P5 D. c8 R
@4 Peripheral2 K. k E7 x6 L; l0 I' K
|+inc{}
|+src{}
@5 User% m3 y; ?; z: R/ U0 |+ m; _' q
|+inc{}5 t: s2 p( r. }& m+ ~1 C' p
|+src{} * W9 d2 D( i7 E4 @' i) g- x" x
下面列出SRC U, J* c9 \& y v
$PROJ_DIR$\..\User\inc
$PROJ_DIR$\..\User\src
$PROJ_DIR$\..\Peripheral\inc
$PROJ_DIR$\..\Peripheral\src
$PROJ_DIR$\..\STM32F4xx_StdPeriph_Driver\inc: ^1 W4 U' b# Y9 U) n7 b* ~
$PROJ_DIR$\..\STM32F4xx_StdPeriph_Driver\src
$PROJ_DIR$\..\DeviceSupport\inc+ N( l2 i2 o7 G0 M9 B
$PROJ_DIR$\..\DeviceSupport\src
$PROJ_DIR$\..\core\driver\include, U) i4 k2 L( M' o
$PROJ_DIR$\..\core\driver\eMPL* p5 H+ `5 C: b6 ?5 [( y
$PROJ_DIR$\..\core\driver\stm32l* p2 Y, W6 F+ B" l
$PROJ_DIR$\..\core\mllite8 d( h9 |) j" G+ w" I( l
$PROJ_DIR$\..\core\mpl" h3 P/ Q5 E9 _8 h
$PROJ_DIR$\..\core\eMPL-hal: \7 D$ @ v; V
转换到keil是(keil目录在):
..\User\inc
..\User\src+ H' a9 G1 s5 x$ E- i
..\Peripheral\inc
..\Peripheral\src
..\STM32F4xx_StdPeriph_Driver\inc
..\STM32F4xx_StdPeriph_Driver\src3 w; J8 `+ v3 x* V' b _9 X; g4 f5 {
..\DeviceSupport\inc4 g) z% i/ u9 G! ]& B
..\DeviceSupport\src, v u3 P+ `; v& a% `& E: R% H
..\core\driver\include
..\core\driver\eMPL
..\core\driver\stm32l
..\core\mllite3 i' [2 P% f% Q4 P6 W
..\core\mpl. L+ D; S' {6 a) W" Q. w; L
..\core\eMPL-hal
keil工程位于新建的MDK-ARM文件夹内5 u; Y0 c7 T5 D' ^% j* X
@6 MDK-ARM7 U* j, G, M) u6 c9 S: m
也新建下面目录存储二进制文件6 f1 q; g5 _3 ^$ R; ]: g
@7 Binary) }+ A7 L5 |0 _2 r* ^
3.2预处理命令:
USE_STDPERIPH_DRIVER/ m- J& D, v+ }8 I8 j
USE_DMP
MPL_LOG_NDEBUG=1+ E+ V) r" _( S) b
EMPL
MPU9250" a8 q% l; `- g8 a7 y
EMPL_TARGET_STM32F4$ X1 Q; V$ {; ^& o* u
迁移到keil:( X Z0 K. C H, h
USE_STDPERIPH_DRIVER,USE_DMP,MPL_LOG_NDEBUG=1,EMPL,MPU9250,,EMPL_TARGET_STM32F42 @+ Z$ a( z* p9 p5 {5 ~
在keil的标准库中还需要添加设备名称F407的名称对应STM32F40_41xxx
这部分可参考文件stm32f4xx.h+ U& G3 m2 H# u m
/* #define STM32F40_41xxx */ /*!< STM32F405RG, STM32F405VG, STM32F405ZG, STM32F415RG, STM32F415VG, STM32F415ZG,
STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG, STM32F407IE, . t6 d3 V* u1 \. {0 n$ l4 `# x
STM32F417VG, STM32F417VE, STM32F417ZG, STM32F417ZE, STM32F417IG and STM32F417IE Devices */
/* #define STM32F427_437xx */ /*!< STM32F427VG, STM32F427VI, STM32F427ZG, STM32F427ZI, STM32F427IG, STM32F427II, 2 v9 |; s8 W |7 K
STM32F437VG, STM32F437VI, STM32F437ZG, STM32F437ZI, STM32F437IG, STM32F437II Devices */3 J; Y+ a' d7 a, h
/* #define STM32F429_439xx */ /*!< STM32F429VG, STM32F429VI, STM32F429ZG, STM32F429ZI, STM32F429BG, STM32F429BI, 6 Y' C0 I' ?7 N4 {
STM32F429NG, STM32F439NI, STM32F429IG, STM32F429II, STM32F439VG, STM32F439VI, 1 Z2 }. ]2 [, g; p% }7 h; c4 y
STM32F439ZG, STM32F439ZI, STM32F439BG, STM32F439BI, STM32F439NG, STM32F439NI,
STM32F439IG and STM32F439II Devices */5 [( N f1 W) P! d" m
% @9 A. s( F2 {' u8 H
/* #define STM32F401xx */ /*!< STM32F401CB, STM32F401CC, STM32F401RB, STM32F401RC, STM32F401VB, STM32F401VC
STM32F401CD, STM32F401RD, STM32F401VD, STM32F401CExx, STM32F401RE and STM32F401VE Devices */- D- j+ \( H4 [
2 k% J( F2 a1 ]
/* #define STM32F411xE */ /*!< STM32F411CD, STM32F411RD, STM32F411VD, STM32F411CE, STM32F411RE and STM32F411VE Devices */0 }4 K3 B4 r8 t6 Z4 Q% o
) y+ W0 @9 ?+ T- d* n9 ?
/* #define STM32F446xx */ /*!< STM32F446MC, STM32F446ME, STM32F446RC, STM32F446RE, STM32F446VC, STM32F446VE, STM32F446ZC ' _: V2 Z [' q6 j3 D+ B
and STM32F446ZE Devices */: C( I# @$ k T8 e5 x
+ @4 E ^; C' W% q+ P
$ Q$ o0 n& Y3 ?) i0 T
3.3浮点运算% O5 s$ ? l( {
IAR:Genaeral Options>FPU>VFPv4
keil: Target>Roating Point Hardware>Usr Single Precision! v0 v( r/ o* _/ Y8 J" h
! y, U' S, K& k2 X
3.4堆栈大小: a3 q; J, g6 C
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文件处修改(稍后修改)。( D! v% h Y1 S! `, k$ ~
3.5项目目录结构, N3 X' f% p4 Q- T; {
参照3.1中的描述建立但是因为keil不支持多级目录所以用符号代替,同时只用包含C和s文件就足够了( q ]% M) P6 Y9 |) f8 I
3.6替换.s和.a文件
这两个文件分别位于core/mpl和DeviceSupport下面。( l3 x3 }4 [8 ?7 W Q4 W( M
其中.a文件换成了.lib文件,因为keil不支持.a,而支持lib
在更换.s文件时也配套更换了对应的.h文件" t+ a) y$ M/ G: h6 {9 P
添加CMSIS目录" W* p# O6 w8 i) J# ~( ]5 s% v3 f
@8 CMSIS
内部包含Include和lib目录
////////////////////////////////
编译不通过3 t, b! r+ A9 u- \0 R' D$ s
% D! ?& S3 C7 Y6 F
//////////////////////////////////////////////" a( ]+ z4 T) H0 f0 j! D
继续修改) _$ e# b: g! d, y% S& N4 C
编译模式修改为c99模式,并包含micro lib之后去掉了多数错误
目前主要的警告包含两类:
一类是without a new line,另一类是void参数省略提醒。
几个小的警告:
还有几个警告是单精度转换成双精度类型。9 u9 c9 h& x: V+ s+ W6 {2 v! M& I
__no_operation();没有定义2 ^ h |$ [: v( ]
5 H& ?- |, _+ N
]' w2 d2 V) ^/ L% W" ~) F; b
9 U1 a' Q5 x8 {; Y+ W: Z7 i* N; J. \7 A
目前还剩余的三处错误。但实际上是一个错误,这个错误是:& {6 R4 c8 e8 b5 B; S* M
1 fputs错误:IAR的fputs原型是fputc(int ch),keil的fputs原型是fputc(int ch, FILE *f)
* \6 A1 j# o/ r! W6 J" N, Y! v+ T
这三个错误排出之后新增一个__no_operation()的错误,在IAR中,这一项在intrinsics.h中定义。6 L% {' R8 L: {) b1 t8 I
在keil中使用nop函数来替代,这个函数在intrins.h。但是这个语法不能用在ARM上。
MDK上的替代语句是:__nop()语句
. k) L' `* m2 w7 ^& j
3.7测试: s* B2 z, y9 J
忘记连接INT到PA1上,串口连线松动。修整好之后,测试通过。
) k7 S& {; u9 Y, P+ s" a" W% |* i& n) t
n1 s2 D9 C7 K) T+ K H9 c2 s
" W5 V% m- y. u; m/ s0 V
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
9 k% J, ~. d4 f" w' s" _