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

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
. U3 L9 R6 J. o5 o; _7 S楼主有没有使用SPI读取过数据,我现在使用SPI就只能读出6轴数据,磁力计读不出来...
/ y, ~/ w/ Y" [  o% ~3 ~向您学习一下... ...
4 z- }! k) Q1 k1 y
的确磁力的数据有时能读上来,有时读不上来。我暂时不能做实验找到问题的根源。你找出来可以告诉我。
9 l& L% A# ^+ ]1 t9 g0 O1 R: @- N9 Z可能是因为打开了自动排除干扰模式,在检测到干扰很大的时候就把磁力计甩掉。
% G2 e7 A  x. P. ~; v2 ~0 N, }3 ^但是这只是我的推测,好久没有玩了。不好意思
watershade 回答时间:2016-3-27 16:34:37
lzm1019 发表于 2016-3-26 18:32
& C. I7 Q; }( O6 z3 e您好!对比您之前#1的代码,发现invensense_adv.h文件有变更,具体为:
% u7 O+ O0 R! Z5 h---------------------
2 U0 ?) r, a  x1 b调用#incl ...

! m; F- y: U/ t' o4 H3 S6 r/ F/ q是吗,这部分的更改我没有印象。时间有点久了,我暂时试不了。真不好意思
watershade 回答时间:2016-3-27 16:36:59
lzm1019 发表于 2016-3-25 15:45% T9 i# S3 L% I4 ^* F0 {0 [2 m8 C% X* o
官网下载的;当然需要先注册。
3 j6 `" Z: Y. d$ h* k因注册并无门槛,所以感觉提交上来也没啥问题。 ...
( N* s- |3 q# H" }
你还需要原版吗,给我邮箱我发给你。我抽空又下了一遍
watershade 回答时间:2016-3-27 16:40:40
诸位,很不好意思。很久没有更新这篇文章了,代码也没有再来测试。我本计划用HAL库来改写一个简单的读取传感器的程序,但是最近一段时间在继续学习STM32,因为发觉对很多问题掌握的似是而非。待我有一定的实力,我再来改写。到时再开一贴。谢谢
power568 回答时间:2016-3-27 23:42:27
watershade 发表于 2016-3-27 16:24' O$ M# o7 Z8 }* r1 @, P1 L
的确磁力的数据有时能读上来,有时读不上来。我暂时不能做实验找到问题的根源。你找出来可以告诉我。& a8 w% F5 Z9 K/ _8 v
可 ...

" \! E5 x( ~) ]5 s: w( y4 ~你贴的代码是不是偶尔也可以读出磁力计...
lzm1019 回答时间:2016-3-28 11:29:43
watershade 发表于 2016-3-27 16:36
, Z0 U" d/ o9 \, N. `6 ]3 A% a你还需要原版吗,给我邮箱我发给你。我抽空又下了一遍
2 A; k: P7 S3 u6 Y7 k6 {
多谢!我的邮箱 lzm1019@hotmail.com
; x& K( D( l- Q: W5 T====
$ ~( F, E- n; H' l' \题外话,Invensense的代码结构,没有对应的文档说明,读起来极不习惯,颇费周折去厘清其关系。找到您的帖子,方便许多。
% z- _5 P( }# k/ M! ^我是新手,刚学习EMD6.12,想移植到STM32F411;无意对比了下,发现invensense_adv.h中的变更,所以请教下。
lzm1019 回答时间:2016-3-28 11:34:57
watershade 发表于 2016-3-27 16:36/ t! @* |( f& n. R3 N
你还需要原版吗,给我邮箱我发给你。我抽空又下了一遍

- v. c( |7 g2 X) y  P4 aSorry,刚理解错了,以为您有新的代码,提供了邮箱。+ E6 [, M1 N. }5 n
========5 ^) P+ U6 x% Z+ J7 Y; P
关于emd6.12的源码,我能下载;之前是应#38楼 rushidao 的需要,分享baidupan链接。
watershade 回答时间:2016-3-28 21:58:27
lzm1019 发表于 2016-3-28 11:344 e! z: Z, `0 C/ D" F, t
Sorry,刚理解错了,以为您有新的代码,提供了邮箱。
' [/ v$ u5 u4 s( j========1 `- x. E/ j+ j; }0 D; k0 Z1 C
关于emd6.12的源码,我能下载;之前是应#3 ...
7 f& w% S9 X) Q( y2 }1 u
ok,很抱歉没能帮到你。祝你成功
watershade 回答时间:2016-3-28 22:00:50
lzm1019 发表于 2016-3-28 11:347 [" }- f6 |1 {5 h0 j
Sorry,刚理解错了,以为您有新的代码,提供了邮箱。3 f( `$ w' @. m7 ~2 Q7 v
========
# B* L4 G9 `1 J2 q) |. ]! F关于emd6.12的源码,我能下载;之前是应#3 ...
# W* v" ~: `' `
另外建议你看一下飞兆半导体的传感器FIS1100,或者ST的iNemo-M1。这两者都有比较好的库。前者的硬件因为电压问题不方便STM32使用。后者的算法似乎有些问题,校准部分不太好。如果你刚好调试过,能否交流一下经验。
lzm1019 回答时间:2016-3-30 13:00:15
watershade 发表于 2016-3-28 22:00
! |( b7 k& Z2 ^- U( p' f8 y另外建议你看一下飞兆半导体的传感器FIS1100,或者ST的iNemo-M1。这两者都有比较好的库。前者的硬件因为 ...
6 G8 b* U4 J9 k/ }+ {7 ]
Fairchild的没用过;# z+ ~# D* G" F$ f, D
目前用的是MPU9250和ST的LSM9DS1;原计划同步开展的。但实际因经验不足(或者说全无经验),先从MPU9250开始。1 w1 s: t& ?* B$ u$ _
这两天,基于您共享的移植文件在学习;我用的是STM32F411CEU6,按您的简单移植说明,处理后,编译ok;但是download板子上,串口没有任何输出。
6 F+ ~7 x$ X! G6 a8 @/ G调试情况:: g6 L% z9 v4 B( s, d8 x1 L
1)在板上调试,debug卡在启动文件中的SystemInit,意思是还没有进入main();随后将setsysclk()注释掉,再仿真,最终发现停滞在Gyro的INT_PIN_CFG配置中。* F+ g9 q8 s! Z! e7 B
----------
: F5 {, v  s* e1 `9 G if (i2c_write(st.hw->addr, st.reg->int_pin_cfg, 1, &tmp))
; f% w" e( r) O" v- L- G8 X        return -1;% w4 V6 A- T( f& _" u
-------------( s4 A: ^) E: W, U

9 u' u% F# h  [5 g2)模拟仿真,不带板的情况,则停滞在USART的发送循环中;
& [0 g# d! s) ]; l1 K& B-------------------! }7 `* C( }- H: h: E6 V
//* Loop until the end of transmission
" U  U9 c3 O% b: @' r- Rwhile (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET)9 K7 R5 e" T3 g+ M: o
{}
# K! C. n& _% S2 E-----------------
: ^* U3 `8 ?6 C$ l6 L, S' I7 e8 b我的理解,无板时,USART发送接收无效,导致死循环。
. e' F- l5 a# f7 ~' e% o, Y9 o1 c! ?; e# `4 v% X# ?$ _: T
后面,用最笨的方法,直接以LED来指示,确定代码停滞在mpu_set_bypass()中;但原因不明。
$ ?6 L: t4 T1 a* l4 w7 Q
lzm1019 回答时间:2016-3-30 15:16:51
watershade 发表于 2015-8-25 10:36+ R* @* C7 b5 Q
最近在尽可能不更改程序的基础上将原始程序迁移到了nucleo411和nucleo401上。因为411的程序在另一台电脑上 ...
( J0 b4 J: w7 T% R
再麻烦您一下。1 C  l% C. p; ~) @9 d1 c# x
之前您提到的STM32F411的移植代码,还能找到吗?可否提供我参考下。多谢!
" H/ Q% G* J. E' ]# u===============
/ R: ?' r0 @2 I7 J4 ]) t手头没有STM32F4-Discovery的板子,没法验证原始工程是否能正常输出9轴数据。看您之前的记录,移植后是正常输出了的,具体情形如何呢?我之前基于您的F401KeilPorting的代码,编译OK,运行后串口无输出。
1 |) X9 b$ T; r# C. a----------------
/ x# R3 d9 n, m# H1 I% b另,刚尝试安装Invensense的AppNote1,安装Python环境,运行eMPL-Client.py,闪退;报错如下:, E4 v' `! _/ O5 R: s6 G) n
--------------+ A8 H; m* o' x8 A% |5 F$ t
c:\Python27>python eMPL612\eMPL-client.py 6
$ s  r% V7 G$ X& D4 F& x3 ?5 O+ ATraceback (most recent call last):
5 n' [# o5 t, O" x6 J! |0 {  File "eMPL612\eMPL-client.py", line 273, in <module>/ i9 L* Q8 ]7 y3 X2 g
    def four_bytes(d1, d2, d3, d4):$ D# n2 g# N7 e8 X% T
  File "eMPL612\eMPL-client.py", line 12, in __init__, k% Z( t+ b# W, d
8 s: V/ j+ z* h* u( `3 C
  File "c:\Python27\lib\site-packages\serial\serialwin32.py", line 31, in __init__
$ a5 _' v- J; ~$ V2 ^; e    SerialBase.__init__(self, *args, **kwargs)) X# L" u! V# |5 u
  File "c:\Python27\lib\site-packages\serial\serialutil.py", line 180, in __init__
6 v5 |6 Y2 P" M6 B* u, C/ H: r    self.open(); ^% }7 @# {3 a- ]. C5 C6 b
  File "c:\Python27\lib\site-packages\serial\serialwin32.py", line 47, in open% R( Z2 F' _. [* y2 Z7 \
    if port.upper().startswith('COM') and int(port[3:]) > 8:
) _. D% A  f5 B6 t9 s0 `( C5 CAttributeError: 'int' object has no attribute 'upper'
+ B1 z6 m5 D! B. R+ @---------------------) h9 C  F, A4 w% h. x: D1 O
watershade 回答时间:2016-3-30 16:29:26
lzm1019 发表于 2016-3-30 15:16
% J* z4 e6 R% B2 ]4 c& s8 o5 h再麻烦您一下。
; g' i+ d, I9 G4 }% z9 ?6 y) T5 [之前您提到的STM32F411的移植代码,还能找到吗?可否提供我参考下。多谢!4 l/ b; b: M2 W" q
============= ...

& q  n0 N$ W6 ^请务必注意stack和heap的尺寸。因为库中用到了malloc来分配内存,所以stack用到了很多。除此之外,接线如果用的是杜邦线之类的临时连线,请确保连线稳定。如果有必要的话换一组线,甚至传感器来做相同的实验。411的程序理论上是一致的。但是我最近在外面用一台老笔记本,之前的资料保存在家里的台式机上。但是我尽量基于401的还原一份411的稍后给你。但是这份我不确定是否能用。另外建议你最好从追踪代码开始,如果压根就没有进到main函数里面,这很可能是工程或者硬件的问题。5 d6 j9 R7 E5 i

( Z% C  U  O1 b9 P  M关于python的问题,我觉得是串口驱动的问题。如果没记错的话,需要安装pyserial和game两个插件。这样才能正常运行。
4 y0 u1 j3 L9 Q
watershade 回答时间:2016-3-30 16:55:56
lzm1019 发表于 2016-3-30 13:00
, n8 k6 |% Q9 R# A0 Q: ^Fairchild的没用过;
: p( [4 ^* U) n, ]- n目前用的是MPU9250和ST的LSM9DS1;原计划同步开展的。但实际因经验不足(或者说全无 ...

3 p- n+ z) _% `& k9 U- l3 _! [所以我觉得是你硬件连接或者时钟设置的问题,请先确保这里没问题。SystemInit如果都不能正常进入那说明这里你没有修改好。如果你从官方的代码直接移植的话,时钟这个问题必须要注意的。因为F407的最大时钟时168MHZ而401是84M,411是100M。所以这里注意一下。1 Q& z' y$ i1 R* ]: [' Q2 A$ n7 b# I
另外确保你的MPU连线正确,单我估计这里没问题。
lzm1019 回答时间:2016-3-30 21:25:57
watershade 发表于 2016-3-30 16:55% O0 w5 n6 _+ d4 {# T( V
所以我觉得是你硬件连接或者时钟设置的问题,请先确保这里没问题。SystemInit如果都不能正常进入那说明这 ...

7 L) C* v3 F$ R8 e- v- d* U8 O多谢!
: ^# |  Y7 F$ k5 e关于物理连线,确认过多次,应该没有问题。
) n) q( ~& l0 F昨天调试,发现无法跳转main(),实际应操作失误。但具体是怎么回事,也高不清楚。0 _! }, _5 s3 k! f
将SetSysClock()注释取消后,今天在线调试,可一路运行至最终发现停滞在Gyro的INT_PIN_CFG配置中。+ k( e  E- y' P9 Q! V0 i6 W
----------+ U8 C0 k- m. y4 g( l
if (i2c_write(st.hw->addr, st.reg->int_pin_cfg, 1, &tmp))
  |6 v1 y0 `% w. |. e' D7 F        return -1;
! q! h2 i5 q- x5 v/ ]; n! K7 L, i9 |-------------9 W3 D9 k2 P1 A& C; ]( [; K6 c
关于Gyro的int_pin_cfg,查证其对应寄存器,在上述代码前一行,已配置
; I& |6 l2 s. h( T! h2 s-----------------------------------7 v6 l! U0 Z( ?8 `3 }
            tmp |= BIT_LATCH_EN | BIT_ANY_RD_CLR;        - U0 x9 y! Q- X+ e' g; f4 X6 I# R
-----------------------------------" z+ m8 M4 I* S- Q, w) l
比较费解为什么配置setup_compass() -> mpu_set_bypass(1)执行到i2c_write()导致跑飞?
& a0 I! d) I; a$ L" f( {至于时钟:
5 R/ M* b: r$ U% H1)您提到的3种芯片的最大时钟的区别,之前已了解;但如何变更,尚不清楚;% y4 L! k% J8 o1 `5 k0 t* V7 U
2)查看SystemInit(),其默认就是设置系统时钟为HSI(16MHz);- C3 |" ~4 e& y. l' h; `$ i
3)另仔细读了一遍SetSysClock()函数,根据主芯片型号STM32F411CE,其配置代码主要是配置PLL;并未开启HSE_ON,因此我理解,系统时钟依然是HSI(16MHz)。
" }/ x& i5 [9 w  F$ A* F" X! K4)SetSysClock()中有两处开启HSE_ON,但分别被条件编译#if defined(xxx)和#if defined(USE_HSE_BYPASS)限定。前者肯定不对;后者,因为我使用的是无源晶体,没有使能USE_HSE_BYPASS。# s( x; y  a! l7 \3 C1 D
若要求配置系统时钟为HSE,是否在别的地方有配置HSE_ON呢?麻烦指点,多谢!
0 ^# E6 ]3 [9 x/ l- H" W( H
, G  d4 L5 B, y$ ~' V' o
watershade 回答时间:2016-3-31 13:37:28
lzm1019 发表于 2016-3-30 21:255 t  x5 Q. Q5 F3 L9 W  E
多谢!
' R) W' v# h+ p7 |) G8 q/ A关于物理连线,确认过多次,应该没有问题。
! l7 z$ o2 T# |) ^- m# g昨天调试,发现无法跳转main(),实际应操作失误。但具 ...

/ `" W3 N9 Z! ?( N首先你不能选择SetSysClock,这样时钟的配置应该会除了问题。之前你的程序卡在这里,就是因为时钟设置的问题。如果你用的是nucleo,那么主芯片的时钟是从另一个片子的MCO来得,是8MHZ。我记得之前观察程序发现使用的是外部时钟。时钟的配置需要做一些修改,怎么修改呐。在main函数的开头,有boardInit的部分,这里面的开始就是配置了一下系统时钟,然后是systick。你而SystemCoreClock是系统的宏定义,在原始代码中是168000000。而411则不是这个数值,这个数值与你最终配置的有关。但是这里你是直接追踪不到时钟配置的,时钟的配置是在SystemInit里面执行的,起初会使用HSI时钟,然后再通过SetSysClock()来是能PLL时钟。但是这部分的具体工作你最好查一下网络。

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版