本帖最后由 watershade 于 2015-8-22 12:39 编辑 6 J7 W9 |! ]' P: v Motion Driver6.1.2 Demo移植(需要起个大众都知道的名字,改成F4-Discovery连接MPU9250) ' o# K; V7 C( o 最近下载了Invensense的最新姿态传感器库Motion Driver6.1.2,内含一个F4-Discovery板子的Demo。8 `5 M3 x7 y) ~7 s, d 就准备了硬件MPU9250的测试板和F4-Disco的板子。- u3 k. g) C: k y: U$ p* K/ b 起初以为调试很简单。不想练在连接I2C的硬件时就犯了很大的错误。NCS起初调试的时候浮空了,AD0也是浮空。这就浪费了我不少时间,一时间信心全无。还在我之前用BB-Black运行的linux系统上的I2C-Detect测试过这块传感器板子。又仔细的检查了电路和官方的PS之后就解决了问题。; ~) w( H8 {0 S' y 起初在的测试是在IAR上测试的,但是个人更喜欢keil上的全局搜索功能,就将工程移植到keil,以便后续工程的迁移。 现在将IAR移植到keil的笔记和最终代码发到论坛。期望对人有些帮助。至于后续的迁移项目,视情况而定吧。 下图是利用自导的python测试程序测试的图片截屏。 注意在迁移的时候我将工程的标准库更新到了最新的V1.5.1. s; [0 h5 o/ N e) B1 v$ W 调试记录属于随笔记录性质的,所以语言可能不流畅。勉强看吧。原本是txt的文档,因为格式不允许就压缩了。 因为大小有限制,所以分成压缩成两个包。 |
意法半导体最具性价比、速度最快的单核MPU STM32MP13现已支持运行RTOS
【STM32MP135-DK】裸机移植shell
【STM32MP13DK】 在Linux主机上交叉编译一个Hello Word应用
STM32MP135F-DK 开箱&开发环境搭建&硬件设计分析
意法半导体在意大利建SiC整合制造厂
轻松地实现ClassB在STM32CubeIDE上的移植
ST历史小知识(6)- 与世界共同塑造美好明天
ST历史小知识(5)- SiC衬底进一步发展
ST历史小知识(4)- 投资未来
ST历史小知识(3) - 布局新兴半导体工艺
# v0 j! B; H" ~- |
因为只贴附件不够直观(因为文件是用sublime编写的,用notepad打开可能是乱码),现在将调试记录的内容粘贴如下:
在调试的时候发现地址是很有意思的如果连接AD到GND的话,I2C地址是68. AD悬空或者拉高是69.# |0 V2 e# P- C- V- e2 d
上面的情况是我出错的一个原因,另一个原因是在I2C连接时将CS浮空,但是事实上在使用I2C的时候务必将其拉高。/ Z- @, ]0 B0 x, b. `* ^
2015.08.05 使用官方提供的python测试程序测试通过。解决了困扰已久的硬件问题。本次硬件问题的解决借助了BB-Black来帮忙,使用BBB内置的I2Cdetect来测试。找到了问题。
关于SPI和I2C的接线还要参考demo板和原理图说明。[UEVB]
; a; @1 d. x' \1 e4 E; T
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库进行移植。
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||, p* C' Q3 ~ B* V3 ~0 X1 B7 y9 L g
第二阶段:移植到keil工程中2 C4 @7 q* s7 b4 E0 i! E- i
说明:本次移植不只是简单的复制粘贴,本次移植的目的还有一个是能够将其代码F4在不同的系列上面移植,目标之一就是F401板子。
本次一直是利用官方的标准库结合特定的BSP来进行移植的。在移植之前需要分析工程的代码结构。6 D. x, I2 B+ t- J4 A
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 看代码[]% \& R; l8 H+ u( s; s, O* ?9 t
省略。。。
8 k# a6 g3 O2 ~, f+ }8 s3 {
. t+ l& G" j6 p$ s; A' y
2 硬件描述:' N- e, F% R3 T* g0 W* j; c' {4 r
2.1>传感器和开发板之间:( G6 R ^! H! y- F6 Y+ X3 F
信号 MPU9250测试板 开发板 描述
+5V VCC_IN(内含3.3V稳压) +5V 电源+) w' r+ x% g- u/ q, \, j
GND GND GND 电源-9 Z0 R, l4 Q; w2 Y6 F3 b
SCL SCL/SCLK PB10(I2C2-SCL) I2C时钟线4 q1 S' D, G3 d5 ?# \- E
SDA SDA/MOSI PB11(I2C2-SDA) I2C数据线
NONE NCS(无用须拉高) +3V 高电平,MOSI时有用2 ^/ [. ?1 t6 B" F: o5 U) @
sel AD AD/MOSI GND 拉低地址68,拉高69
8 m$ y4 @4 P- l& _( b
2.2>UART信号通过USB转TTL(FT232)引入电脑3 p. i: F- [- Z! f: H: Z+ j2 g
开发板 FT232板子 描述
PA2(Tx2) RX 开发板信号传出( r, S# C# M- v- b& @
PA3(Rx2) TX 开发板信号引入) U9 [2 a2 e/ F I& b# X# R3 O
GND GND GND4 @( A k# y) m# N' ?
8 C0 [" K# o! Y6 d5 S b# }
3 文件结构分析
3.1包含目录' t4 h; S; Z, V% N7 w
@1 STM32F4xx_StdPeriph_Driver" f0 d+ ~$ Z- U- O
|+inc{}/ l8 n o4 u3 y% x+ r1 _
|+src{}
@2 core
|+driver
\+eMPL{}6 Y( ~. l5 n) E# W
\+include{}0 V4 j3 Q t: h! R* D4 @6 e
\stm32L{}
|eMPL-hal{}: e4 @8 R6 Y; E+ S' }* u
|mllite{}
|mpl
@3 DeviceSupport5 N! ^. ?( S, L, {6 G* I
|+inc{}
|+src{}
@4 Peripheral
|+inc{}8 [2 c7 A4 C% L; v# }; U
|+src{}4 S3 h3 F. L- h9 w; u% m7 \, |
@5 User, c6 K! x; m* \) O# K
|+inc{}2 w' a+ F4 h! K/ ?, d: y
|+src{}
下面列出SRC
$PROJ_DIR$\..\User\inc# C8 d3 L: t/ b& `
$PROJ_DIR$\..\User\src
$PROJ_DIR$\..\Peripheral\inc0 L! ^; e" L% V
$PROJ_DIR$\..\Peripheral\src5 t) e: Z; j5 T3 x2 v
$PROJ_DIR$\..\STM32F4xx_StdPeriph_Driver\inc- Z# K( o/ L) {: o6 [% e" F+ U; ?
$PROJ_DIR$\..\STM32F4xx_StdPeriph_Driver\src
$PROJ_DIR$\..\DeviceSupport\inc, b+ `: R) ]! P% t& U; h* M
$PROJ_DIR$\..\DeviceSupport\src' u6 A( ^0 I1 ]4 Y9 ?' @0 x; h! z
$PROJ_DIR$\..\core\driver\include0 j0 ]( e+ b4 N Z
$PROJ_DIR$\..\core\driver\eMPL9 H: {# p' X4 H0 }' B1 M
$PROJ_DIR$\..\core\driver\stm32l& w) B' e a: N
$PROJ_DIR$\..\core\mllite8 i2 A) Q% v' Q6 `* a0 { X! F$ O, ^
$PROJ_DIR$\..\core\mpl) o9 O& X/ y/ D) h" p6 @6 ]5 I8 D
$PROJ_DIR$\..\core\eMPL-hal
转换到keil是(keil目录在):
..\User\inc1 g3 Q* l6 r4 [0 T7 h/ a
..\User\src* t+ o7 ?7 }% T5 V+ {5 s: e
..\Peripheral\inc
..\Peripheral\src
..\STM32F4xx_StdPeriph_Driver\inc
..\STM32F4xx_StdPeriph_Driver\src
..\DeviceSupport\inc
..\DeviceSupport\src' K/ Q/ A/ y" O* x* B) m7 R
..\core\driver\include
..\core\driver\eMPL
..\core\driver\stm32l
..\core\mllite% \5 K" G! Y3 W0 n% R4 G) n( ?
..\core\mpl. E) B" c6 B4 F
..\core\eMPL-hal
keil工程位于新建的MDK-ARM文件夹内0 {$ q4 I5 ^* |6 X4 g( L
@6 MDK-ARM
也新建下面目录存储二进制文件7 i F0 o' c3 e
@7 Binary) c( U0 G6 M5 R( A- X
+ |7 `% r( W) m' e
3.2预处理命令:
USE_STDPERIPH_DRIVER
USE_DMP D) e: R7 [) W+ _1 p! y4 T
MPL_LOG_NDEBUG=1
EMPL* I9 l* t* W1 j4 z g. \
MPU9250' B$ P: L M/ o% e* L
EMPL_TARGET_STM32F41 F9 J. F9 C2 ?3 I" F
迁移到keil:5 w. d8 R6 R1 N$ v; D
USE_STDPERIPH_DRIVER,USE_DMP,MPL_LOG_NDEBUG=1,EMPL,MPU9250,,EMPL_TARGET_STM32F46 J& t& {: S4 K$ O; v. K) V
在keil的标准库中还需要添加设备名称F407的名称对应STM32F40_41xxx4 X; R/ o/ B$ P
这部分可参考文件stm32f4xx.h9 I+ F R. o$ r2 Z! j: j
/* #define STM32F40_41xxx */ /*!< STM32F405RG, STM32F405VG, STM32F405ZG, STM32F415RG, STM32F415VG, STM32F415ZG,
STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG, STM32F407IE,
STM32F417VG, STM32F417VE, STM32F417ZG, STM32F417ZE, STM32F417IG and STM32F417IE Devices */
( ~$ x J8 ]( M8 `9 ~4 f" ?- u
/* #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, 3 C" r7 e$ Z# [$ U3 I m) E! m6 v
STM32F439ZG, STM32F439ZI, STM32F439BG, STM32F439BI, STM32F439NG, STM32F439NI,& q0 I' |% j, G7 X2 d2 f
STM32F439IG and STM32F439II Devices */* M1 {2 v+ a" ^5 x
/* #define STM32F401xx */ /*!< STM32F401CB, STM32F401CC, STM32F401RB, STM32F401RC, STM32F401VB, STM32F401VC . y' A: F; s1 i5 n# B
STM32F401CD, STM32F401RD, STM32F401VD, STM32F401CExx, STM32F401RE and STM32F401VE Devices */
/ p+ o! ]% ?, q2 G- Q0 A5 A
/* #define STM32F411xE */ /*!< STM32F411CD, STM32F411RD, STM32F411VD, STM32F411CE, STM32F411RE and STM32F411VE Devices */9 H% x3 P8 z0 ?0 h& b2 ?
/* #define STM32F446xx */ /*!< STM32F446MC, STM32F446ME, STM32F446RC, STM32F446RE, STM32F446VC, STM32F446VE, STM32F446ZC , X* `. I6 c7 Y+ }
and STM32F446ZE Devices */
; B( Q3 v6 d% v% J$ ]
6 D2 K5 z- S( Z+ F# W
3.3浮点运算. U% a! b' D# V7 y
IAR:Genaeral Options>FPU>VFPv4
keil: Target>Roating Point Hardware>Usr Single Precision
: H9 ~0 \3 c$ h# W" P
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]3 L+ \: N2 ]+ R% x7 V4 _3 ~4 \/ t
Keil分别在Target>IROM1/IRAM1(保持默认),和.s文件处修改(稍后修改)。
9 S/ M$ K! B5 j% a
3.5项目目录结构
参照3.1中的描述建立但是因为keil不支持多级目录所以用符号代替,同时只用包含C和s文件就足够了" I! l" ~" m3 q% r2 w- r+ ?/ M; w
3 h5 u$ ^% X4 T6 t" d) {
3.6替换.s和.a文件
这两个文件分别位于core/mpl和DeviceSupport下面。) Q0 A3 ?1 i9 D
其中.a文件换成了.lib文件,因为keil不支持.a,而支持lib G+ x$ T9 x1 D- {4 F
在更换.s文件时也配套更换了对应的.h文件" I$ ~. s4 p5 j" y, ~" V4 d
添加CMSIS目录
@8 CMSIS
内部包含Include和lib目录6 U! r Z s" _1 v3 {9 Y5 W
////////////////////////////////3 E% Z% E: J; B2 J9 O' P' F
编译不通过
+ U) I) y# X! U2 a) o2 U
//////////////////////////////////////////////' @1 A8 T% I) [/ E2 m. g9 b9 F
继续修改8 I) [ c& U- J; ]* d3 R! k! r
编译模式修改为c99模式,并包含micro lib之后去掉了多数错误
目前主要的警告包含两类:
一类是without a new line,另一类是void参数省略提醒。
几个小的警告:
还有几个警告是单精度转换成双精度类型。' A; S. j0 O; K$ B% {" z( u
__no_operation();没有定义
Z4 E2 }% \" t5 z3 z3 W/ j
6 n' y/ B# x/ `0 }% P2 ]
目前还剩余的三处错误。但实际上是一个错误,这个错误是:
1 fputs错误:IAR的fputs原型是fputc(int ch),keil的fputs原型是fputc(int ch, FILE *f)
5 [# `' Q9 K8 Q9 p. {6 [! X# ^/ G
这三个错误排出之后新增一个__no_operation()的错误,在IAR中,这一项在intrinsics.h中定义。8 q6 D( w( [# j6 H; ]9 e6 G
在keil中使用nop函数来替代,这个函数在intrins.h。但是这个语法不能用在ARM上。& u" y; _, X3 U4 `) w9 ]
MDK上的替代语句是:__nop()语句" Z0 l% E. F, o9 _- h7 `) R: e
3.7测试
忘记连接INT到PA1上,串口连线松动。修整好之后,测试通过。( h g4 V) c; j2 j
0 F+ \2 Z5 H( f- d& H$ c: l
0 t. t( D2 ^1 z+ L L6 E+ l% c
4 B* L+ R$ f! _# O1 J5 J
Y5 @, S- Q! H' t! }
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