你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

F4-Discovery连接MPU9250【MD6.12 keil移植】 精华  

[复制链接]
watershade 发布时间:2015-8-8 14:46
阅读主题, 点击返回1楼
1 收藏 12 评论117 发布时间:2015-8-8 14:46
117个回答
watershade 回答时间:2016-3-27 16:24:14
power568 发表于 2016-3-26 16:12' z* k: q0 l' D: z, {% m. h
楼主有没有使用SPI读取过数据,我现在使用SPI就只能读出6轴数据,磁力计读不出来...
8 }( I  l% a3 Z9 c向您学习一下... ...

$ R% i8 z3 h  z) O的确磁力的数据有时能读上来,有时读不上来。我暂时不能做实验找到问题的根源。你找出来可以告诉我。9 t. R' |& z2 u5 u
可能是因为打开了自动排除干扰模式,在检测到干扰很大的时候就把磁力计甩掉。2 F  Z3 s# [: n5 ^2 C
但是这只是我的推测,好久没有玩了。不好意思
watershade 回答时间:2016-3-27 16:34:37
lzm1019 发表于 2016-3-26 18:32; O4 @$ |5 Q/ L" t4 ?2 ?, V" `
您好!对比您之前#1的代码,发现invensense_adv.h文件有变更,具体为:" }; z- b) }; C2 ~) ?& b
---------------------
6 Q4 h- J. b9 F4 s- `调用#incl ...

# `) ~) G3 a+ p( Z是吗,这部分的更改我没有印象。时间有点久了,我暂时试不了。真不好意思
watershade 回答时间:2016-3-27 16:36:59
lzm1019 发表于 2016-3-25 15:45$ @+ F, C/ {; N( O$ F4 S6 @& |
官网下载的;当然需要先注册。
* Y( H" B$ r5 Z2 t0 [- ]$ P因注册并无门槛,所以感觉提交上来也没啥问题。 ...
& M$ g7 s6 P. q: G. v! y8 Z' X! O
你还需要原版吗,给我邮箱我发给你。我抽空又下了一遍
watershade 回答时间:2016-3-27 16:40:40
诸位,很不好意思。很久没有更新这篇文章了,代码也没有再来测试。我本计划用HAL库来改写一个简单的读取传感器的程序,但是最近一段时间在继续学习STM32,因为发觉对很多问题掌握的似是而非。待我有一定的实力,我再来改写。到时再开一贴。谢谢
power568 回答时间:2016-3-27 23:42:27
watershade 发表于 2016-3-27 16:24& u6 |8 l- F( y% M7 ]% B* ?
的确磁力的数据有时能读上来,有时读不上来。我暂时不能做实验找到问题的根源。你找出来可以告诉我。
# i' \8 U; i/ z) [, ?9 Z& E- F4 x+ D可 ...
, \5 [( o. ~5 i  {
你贴的代码是不是偶尔也可以读出磁力计...
lzm1019 回答时间:2016-3-28 11:29:43
watershade 发表于 2016-3-27 16:36
0 ~: N% A1 y1 I1 ]0 t; y- X1 h你还需要原版吗,给我邮箱我发给你。我抽空又下了一遍
- M  k4 e; _/ I9 [7 q. J5 u. w
多谢!我的邮箱 lzm1019@hotmail.com( @8 x; z" V+ ^
====" B" ?0 f4 {& p1 {
题外话,Invensense的代码结构,没有对应的文档说明,读起来极不习惯,颇费周折去厘清其关系。找到您的帖子,方便许多。
5 {) P- N0 \& Z1 j# W! `/ S6 O) t我是新手,刚学习EMD6.12,想移植到STM32F411;无意对比了下,发现invensense_adv.h中的变更,所以请教下。
lzm1019 回答时间:2016-3-28 11:34:57
watershade 发表于 2016-3-27 16:36
1 Z9 A8 g7 \( T* y$ n* E你还需要原版吗,给我邮箱我发给你。我抽空又下了一遍

6 B: I' a# Z' V+ F3 z( U4 X8 xSorry,刚理解错了,以为您有新的代码,提供了邮箱。
# M. B' e. [+ R" d========3 W6 {4 J1 |* L! g/ t/ z
关于emd6.12的源码,我能下载;之前是应#38楼 rushidao 的需要,分享baidupan链接。
watershade 回答时间:2016-3-28 21:58:27
lzm1019 发表于 2016-3-28 11:344 @3 ?& V$ w1 ?2 u& t  [" [3 V1 W
Sorry,刚理解错了,以为您有新的代码,提供了邮箱。3 ^6 k: Y$ ^+ A, y
========( o  x& n% K- a+ g& ]/ y
关于emd6.12的源码,我能下载;之前是应#3 ...
) f7 ^  G* P+ F* A& q; X
ok,很抱歉没能帮到你。祝你成功
watershade 回答时间:2016-3-28 22:00:50
lzm1019 发表于 2016-3-28 11:34
; p$ z8 _4 Z' ^8 |! RSorry,刚理解错了,以为您有新的代码,提供了邮箱。
( z  _7 y( r/ K. P; q6 X========
8 r7 e1 n9 p; i6 i5 Q关于emd6.12的源码,我能下载;之前是应#3 ...
; v8 p5 |) X9 L# u" i/ u, m5 {
另外建议你看一下飞兆半导体的传感器FIS1100,或者ST的iNemo-M1。这两者都有比较好的库。前者的硬件因为电压问题不方便STM32使用。后者的算法似乎有些问题,校准部分不太好。如果你刚好调试过,能否交流一下经验。
lzm1019 回答时间:2016-3-30 13:00:15
watershade 发表于 2016-3-28 22:00& [5 X4 T6 |( ]5 F* O* `1 B4 f2 x
另外建议你看一下飞兆半导体的传感器FIS1100,或者ST的iNemo-M1。这两者都有比较好的库。前者的硬件因为 ...
- n0 m, g! d, w! Z/ Z
Fairchild的没用过;
. y& O/ o6 F! Y) v/ F目前用的是MPU9250和ST的LSM9DS1;原计划同步开展的。但实际因经验不足(或者说全无经验),先从MPU9250开始。" p7 B$ C+ a0 x6 [' x8 j$ B
这两天,基于您共享的移植文件在学习;我用的是STM32F411CEU6,按您的简单移植说明,处理后,编译ok;但是download板子上,串口没有任何输出。# J' ]9 g0 m& A7 q' G0 G$ j
调试情况:
  S/ p3 U% O: h0 j7 u% \1)在板上调试,debug卡在启动文件中的SystemInit,意思是还没有进入main();随后将setsysclk()注释掉,再仿真,最终发现停滞在Gyro的INT_PIN_CFG配置中。. s+ {3 D$ z3 X) k
----------# K8 `( W1 l' t1 a+ A8 {
if (i2c_write(st.hw->addr, st.reg->int_pin_cfg, 1, &tmp))
; Z- ]- f" d7 _% a' l' O( ]        return -1;. m$ n2 p! a" K; ?8 L9 F
-------------( R5 T" Y' S; g2 F

. y7 j. }* V6 Q% g3 }: F$ Q2)模拟仿真,不带板的情况,则停滞在USART的发送循环中;) s5 L% S+ X$ J' H% T" D
-------------------/ C0 l5 n8 Q- j% `9 J4 H
//* Loop until the end of transmission
" T! c  R0 s: Z0 c* N8 B8 @, Gwhile (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET)! c2 g9 T% ]. ?. e; G; y
{}
" a) d* v* o# P  o  v9 C& C% y-----------------+ N: S0 c5 v+ U: }$ P7 N
我的理解,无板时,USART发送接收无效,导致死循环。7 ~& Z1 F  A- y8 H6 K* \, |+ h6 ]

! a8 P, F4 R8 O' a# Y' [, ~$ p" D后面,用最笨的方法,直接以LED来指示,确定代码停滞在mpu_set_bypass()中;但原因不明。, g! {8 _% N& G% H
lzm1019 回答时间:2016-3-30 15:16:51
watershade 发表于 2015-8-25 10:36  ?. C8 s  U4 ~! d% V& ^
最近在尽可能不更改程序的基础上将原始程序迁移到了nucleo411和nucleo401上。因为411的程序在另一台电脑上 ...
8 S% {2 Y/ i1 b; k( E
再麻烦您一下。( n' a! v" C+ @+ P
之前您提到的STM32F411的移植代码,还能找到吗?可否提供我参考下。多谢!
6 ^' l" ]0 |4 Z* g8 w===============6 L  k  r* P' d3 u1 t( T; k* h! b+ {4 D- D
手头没有STM32F4-Discovery的板子,没法验证原始工程是否能正常输出9轴数据。看您之前的记录,移植后是正常输出了的,具体情形如何呢?我之前基于您的F401KeilPorting的代码,编译OK,运行后串口无输出。: {7 |/ @& {% ?  ]' \
----------------) a2 V( l& G" j: q4 K
另,刚尝试安装Invensense的AppNote1,安装Python环境,运行eMPL-Client.py,闪退;报错如下:/ \1 M8 E) G" A( R# q. }
--------------
0 w1 t. z# U, Gc:\Python27>python eMPL612\eMPL-client.py 6
# X: \6 U( a3 ?1 B* J9 JTraceback (most recent call last):
$ G3 _$ B3 Y6 C6 J2 p+ y. j  File "eMPL612\eMPL-client.py", line 273, in <module>" q) ?# z4 [$ P
    def four_bytes(d1, d2, d3, d4):
( H# a: w+ b. D" [, [1 K  File "eMPL612\eMPL-client.py", line 12, in __init__
7 V+ j& [6 m# H2 ?
: _6 t4 h4 T9 ?. d4 E! f7 Y# L  File "c:\Python27\lib\site-packages\serial\serialwin32.py", line 31, in __init__
3 w& o# h: f8 ^) s$ r    SerialBase.__init__(self, *args, **kwargs); O1 ~& w1 c, o1 v; {! \& ~
  File "c:\Python27\lib\site-packages\serial\serialutil.py", line 180, in __init__6 U; F% k$ P% u$ Q2 Q2 k
    self.open()4 ^9 p' V4 r" J3 y
  File "c:\Python27\lib\site-packages\serial\serialwin32.py", line 47, in open1 @: G! L8 b' [9 C: |4 j
    if port.upper().startswith('COM') and int(port[3:]) > 8:
0 p5 c* X$ H: @; _2 P2 {AttributeError: 'int' object has no attribute 'upper'
- K; M& l5 \' O: x0 p) }5 X9 I---------------------5 G  x9 z! C& |: Y& U$ U/ B
watershade 回答时间:2016-3-30 16:29:26
lzm1019 发表于 2016-3-30 15:16
! U& _. h! L$ p+ ~1 a% r5 Y, p再麻烦您一下。* Z2 J" Z$ u* U0 ?# t2 g! `
之前您提到的STM32F411的移植代码,还能找到吗?可否提供我参考下。多谢!
! e8 y5 v6 S5 V2 a8 r. y============= ...
* ~, f* g6 H2 C" o$ ?3 |
请务必注意stack和heap的尺寸。因为库中用到了malloc来分配内存,所以stack用到了很多。除此之外,接线如果用的是杜邦线之类的临时连线,请确保连线稳定。如果有必要的话换一组线,甚至传感器来做相同的实验。411的程序理论上是一致的。但是我最近在外面用一台老笔记本,之前的资料保存在家里的台式机上。但是我尽量基于401的还原一份411的稍后给你。但是这份我不确定是否能用。另外建议你最好从追踪代码开始,如果压根就没有进到main函数里面,这很可能是工程或者硬件的问题。4 E2 Q+ ]+ u: y

  Q5 y4 o  R0 \5 h  d" i关于python的问题,我觉得是串口驱动的问题。如果没记错的话,需要安装pyserial和game两个插件。这样才能正常运行。  H; x8 J- i$ r7 o' O- C8 E
watershade 回答时间:2016-3-30 16:55:56
lzm1019 发表于 2016-3-30 13:00# V8 [9 L7 u0 ]1 m
Fairchild的没用过;
' N& u% \$ ~* l- t1 A目前用的是MPU9250和ST的LSM9DS1;原计划同步开展的。但实际因经验不足(或者说全无 ...

; ~& b1 p2 g2 D* m& N所以我觉得是你硬件连接或者时钟设置的问题,请先确保这里没问题。SystemInit如果都不能正常进入那说明这里你没有修改好。如果你从官方的代码直接移植的话,时钟这个问题必须要注意的。因为F407的最大时钟时168MHZ而401是84M,411是100M。所以这里注意一下。' [) `/ l) o  ?
另外确保你的MPU连线正确,单我估计这里没问题。
lzm1019 回答时间:2016-3-30 21:25:57
watershade 发表于 2016-3-30 16:55
8 ]; o5 z7 x9 Z$ n4 J所以我觉得是你硬件连接或者时钟设置的问题,请先确保这里没问题。SystemInit如果都不能正常进入那说明这 ...

. [. W$ [9 M8 e: e( ~7 p; ?8 T' [多谢!
9 k  C1 p% k0 P- q/ ?6 K  W关于物理连线,确认过多次,应该没有问题。9 \2 b4 w% h) K; b+ o, X& O
昨天调试,发现无法跳转main(),实际应操作失误。但具体是怎么回事,也高不清楚。7 p+ N+ Z; _  I" r$ }( K
将SetSysClock()注释取消后,今天在线调试,可一路运行至最终发现停滞在Gyro的INT_PIN_CFG配置中。
: e- [9 d" f# M/ @7 I----------
1 G1 D! t! |) C( p$ hif (i2c_write(st.hw->addr, st.reg->int_pin_cfg, 1, &tmp))0 @) C# E8 f/ r' A$ ]
        return -1;2 C4 I+ @: V* L# h0 O1 y
-------------
6 Y9 ?& ~0 c6 F& |' e2 r. i* B关于Gyro的int_pin_cfg,查证其对应寄存器,在上述代码前一行,已配置
  q. J8 c: }/ w-----------------------------------
# s; i9 R1 W: F9 R+ S1 j' R! e2 ?, e            tmp |= BIT_LATCH_EN | BIT_ANY_RD_CLR;        7 A; k3 d% v, B' S" {, f. Y9 m! v
-----------------------------------) i- b' b' s. r2 p. v
比较费解为什么配置setup_compass() -> mpu_set_bypass(1)执行到i2c_write()导致跑飞?! ?, G" N" e5 b, E6 W  [) }
至于时钟:/ {3 d: H7 ^. J  p: }' l5 R0 ~
1)您提到的3种芯片的最大时钟的区别,之前已了解;但如何变更,尚不清楚;. z6 d8 G+ _' b2 @% |9 ]$ L
2)查看SystemInit(),其默认就是设置系统时钟为HSI(16MHz);3 g0 b) \. A) o
3)另仔细读了一遍SetSysClock()函数,根据主芯片型号STM32F411CE,其配置代码主要是配置PLL;并未开启HSE_ON,因此我理解,系统时钟依然是HSI(16MHz)。
! ?, l9 b! B6 K- \4 k( m$ ?. d4)SetSysClock()中有两处开启HSE_ON,但分别被条件编译#if defined(xxx)和#if defined(USE_HSE_BYPASS)限定。前者肯定不对;后者,因为我使用的是无源晶体,没有使能USE_HSE_BYPASS。
9 c/ k) o  m3 M0 y若要求配置系统时钟为HSE,是否在别的地方有配置HSE_ON呢?麻烦指点,多谢!2 G0 d% R  O5 U, }- L

% I6 f( j8 i9 V5 d% S
watershade 回答时间:2016-3-31 13:37:28
lzm1019 发表于 2016-3-30 21:25
" [/ f2 s, U% y# |; `5 k. L1 y  K0 k多谢!: `  |6 r: g& f  p! w" m5 j) c/ k3 y
关于物理连线,确认过多次,应该没有问题。
- Q, f2 H8 p, m3 w+ S  R昨天调试,发现无法跳转main(),实际应操作失误。但具 ...
' \- m% n. E$ _4 T
首先你不能选择SetSysClock,这样时钟的配置应该会除了问题。之前你的程序卡在这里,就是因为时钟设置的问题。如果你用的是nucleo,那么主芯片的时钟是从另一个片子的MCO来得,是8MHZ。我记得之前观察程序发现使用的是外部时钟。时钟的配置需要做一些修改,怎么修改呐。在main函数的开头,有boardInit的部分,这里面的开始就是配置了一下系统时钟,然后是systick。你而SystemCoreClock是系统的宏定义,在原始代码中是168000000。而411则不是这个数值,这个数值与你最终配置的有关。但是这里你是直接追踪不到时钟配置的,时钟的配置是在SystemInit里面执行的,起初会使用HSI时钟,然后再通过SetSysClock()来是能PLL时钟。但是这部分的具体工作你最好查一下网络。

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版