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

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" b" M! B$ T, C/ x
楼主有没有使用SPI读取过数据,我现在使用SPI就只能读出6轴数据,磁力计读不出来...
7 U1 z  T8 n2 u5 k- H) L向您学习一下... ...

/ \0 ~' W( [1 H" I$ g6 A7 r. }. ~的确磁力的数据有时能读上来,有时读不上来。我暂时不能做实验找到问题的根源。你找出来可以告诉我。
$ W3 Y1 p' D( B4 |( `) t+ [可能是因为打开了自动排除干扰模式,在检测到干扰很大的时候就把磁力计甩掉。
  o* ?0 s2 p2 ~; I但是这只是我的推测,好久没有玩了。不好意思
watershade 回答时间:2016-3-27 16:34:37
lzm1019 发表于 2016-3-26 18:32
8 V6 }& t6 r* h. u! `您好!对比您之前#1的代码,发现invensense_adv.h文件有变更,具体为:" `1 ?& k# b1 `4 P" c8 q! W% A
---------------------) n$ K! {$ b- H# b( y7 x
调用#incl ...
/ f4 t: U2 N! R, b! V6 {; b
是吗,这部分的更改我没有印象。时间有点久了,我暂时试不了。真不好意思
watershade 回答时间:2016-3-27 16:36:59
lzm1019 发表于 2016-3-25 15:45
; Z6 v3 W+ [1 @官网下载的;当然需要先注册。; U7 B9 `! {; r% r' t
因注册并无门槛,所以感觉提交上来也没啥问题。 ...

1 K- F/ j: E8 a% h% v3 @) R# K( }你还需要原版吗,给我邮箱我发给你。我抽空又下了一遍
watershade 回答时间:2016-3-27 16:40:40
诸位,很不好意思。很久没有更新这篇文章了,代码也没有再来测试。我本计划用HAL库来改写一个简单的读取传感器的程序,但是最近一段时间在继续学习STM32,因为发觉对很多问题掌握的似是而非。待我有一定的实力,我再来改写。到时再开一贴。谢谢
power568 回答时间:2016-3-27 23:42:27
watershade 发表于 2016-3-27 16:24
" g2 a, K% ^  M5 s2 E& Y* Y! K的确磁力的数据有时能读上来,有时读不上来。我暂时不能做实验找到问题的根源。你找出来可以告诉我。# e- D! I  n1 a" N; _) |% N
可 ...
& |! N9 p" i/ g" H0 \5 \0 j
你贴的代码是不是偶尔也可以读出磁力计...
lzm1019 回答时间:2016-3-28 11:29:43
watershade 发表于 2016-3-27 16:36: H. n/ j! J* F" j$ B
你还需要原版吗,给我邮箱我发给你。我抽空又下了一遍

% |+ s, q: Z  z3 }5 @, j7 ]" J多谢!我的邮箱 lzm1019@hotmail.com
# M, T4 k" x8 b2 I& X====
- V, c" X, ~8 m" [题外话,Invensense的代码结构,没有对应的文档说明,读起来极不习惯,颇费周折去厘清其关系。找到您的帖子,方便许多。$ P( `; R" a, l7 Y4 R  {0 D
我是新手,刚学习EMD6.12,想移植到STM32F411;无意对比了下,发现invensense_adv.h中的变更,所以请教下。
lzm1019 回答时间:2016-3-28 11:34:57
watershade 发表于 2016-3-27 16:368 [' J0 |7 f' w
你还需要原版吗,给我邮箱我发给你。我抽空又下了一遍

' [4 H4 n# p! M1 p1 {7 Y0 kSorry,刚理解错了,以为您有新的代码,提供了邮箱。
" N. o, F' ^4 ~- {0 R+ c3 b========0 @8 j4 G/ k, e& ~( R
关于emd6.12的源码,我能下载;之前是应#38楼 rushidao 的需要,分享baidupan链接。
watershade 回答时间:2016-3-28 21:58:27
lzm1019 发表于 2016-3-28 11:34
9 l7 i7 h4 V6 m; p/ pSorry,刚理解错了,以为您有新的代码,提供了邮箱。  H( T1 K- z# h" h( F
========: b0 U) ?) s2 L) S9 g
关于emd6.12的源码,我能下载;之前是应#3 ...
! J: }& ~' h3 h" i
ok,很抱歉没能帮到你。祝你成功
watershade 回答时间:2016-3-28 22:00:50
lzm1019 发表于 2016-3-28 11:34
  e6 _9 b9 Z1 F0 P% Z+ RSorry,刚理解错了,以为您有新的代码,提供了邮箱。
9 j1 ]* u  ~$ k) _4 v========2 ?0 c" W) U+ d
关于emd6.12的源码,我能下载;之前是应#3 ...

0 m) r/ L! v/ e! s另外建议你看一下飞兆半导体的传感器FIS1100,或者ST的iNemo-M1。这两者都有比较好的库。前者的硬件因为电压问题不方便STM32使用。后者的算法似乎有些问题,校准部分不太好。如果你刚好调试过,能否交流一下经验。
lzm1019 回答时间:2016-3-30 13:00:15
watershade 发表于 2016-3-28 22:00+ r1 R. Q( g( R# J0 Z; ]/ K
另外建议你看一下飞兆半导体的传感器FIS1100,或者ST的iNemo-M1。这两者都有比较好的库。前者的硬件因为 ...

( j4 g* j2 K2 m" ZFairchild的没用过;
+ l1 ~7 _$ ^, {$ k4 A& C' P( S目前用的是MPU9250和ST的LSM9DS1;原计划同步开展的。但实际因经验不足(或者说全无经验),先从MPU9250开始。
' W4 K( ]5 n( o. t1 p& j9 a这两天,基于您共享的移植文件在学习;我用的是STM32F411CEU6,按您的简单移植说明,处理后,编译ok;但是download板子上,串口没有任何输出。
0 v; w# q+ y% n) k调试情况:
0 k6 p) @% Z! F' ?+ C! ?+ K: V1)在板上调试,debug卡在启动文件中的SystemInit,意思是还没有进入main();随后将setsysclk()注释掉,再仿真,最终发现停滞在Gyro的INT_PIN_CFG配置中。% M7 H9 t0 x* c+ H( R
----------
0 S7 j' I6 _: m! Q; t+ l. a if (i2c_write(st.hw->addr, st.reg->int_pin_cfg, 1, &tmp))1 ?- ]; `- c. q6 Z- F
        return -1;2 w! R& N! F7 @- V: o
-------------
( j$ N0 }& T$ q4 A7 W2 a, W9 R: }5 I* l" v8 K* [  z
2)模拟仿真,不带板的情况,则停滞在USART的发送循环中;0 `) Z# M' A% c: t0 ^
-------------------
$ D8 Z# P- {/ Q//* Loop until the end of transmission
6 o9 Y" r. g7 y4 {- Nwhile (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET)
: b; t( @2 Y1 o% L: e/ U! \{}4 V  R$ e' I9 l& A2 h0 X. W
-----------------1 O: D( X- c0 k: L5 E6 y; x2 k; b5 z
我的理解,无板时,USART发送接收无效,导致死循环。( c! i6 r3 J" m
# `, ]9 L3 B3 z6 i, H
后面,用最笨的方法,直接以LED来指示,确定代码停滞在mpu_set_bypass()中;但原因不明。: Z! F7 ^0 f5 Y
lzm1019 回答时间:2016-3-30 15:16:51
watershade 发表于 2015-8-25 10:36
" ^1 Z  W6 w: T最近在尽可能不更改程序的基础上将原始程序迁移到了nucleo411和nucleo401上。因为411的程序在另一台电脑上 ...
+ p6 J6 G" }: w1 A& |1 m8 Q
再麻烦您一下。
% a1 N  A" m6 p/ }" |之前您提到的STM32F411的移植代码,还能找到吗?可否提供我参考下。多谢!0 {/ M8 W, |( S' v; D2 ^5 D  x" ?
===============: R+ [+ r$ t9 u  D7 g
手头没有STM32F4-Discovery的板子,没法验证原始工程是否能正常输出9轴数据。看您之前的记录,移植后是正常输出了的,具体情形如何呢?我之前基于您的F401KeilPorting的代码,编译OK,运行后串口无输出。# n1 X# A! U- F* i+ X
----------------
5 h/ F! P9 `9 Z- u+ i0 p! ]1 n另,刚尝试安装Invensense的AppNote1,安装Python环境,运行eMPL-Client.py,闪退;报错如下:
8 c0 A" b" |) U+ P$ e--------------
. o" q8 d/ o, V! g) k, Oc:\Python27>python eMPL612\eMPL-client.py 6
# P! J  K+ c( ]' ]) c! \Traceback (most recent call last):
8 n; \- J8 E  C6 L+ N# q( `  File "eMPL612\eMPL-client.py", line 273, in <module>
4 X) K8 o/ P) Q- C) t5 u2 M# q    def four_bytes(d1, d2, d3, d4):
- x& p/ \) L8 K5 p0 p3 q1 R9 o  File "eMPL612\eMPL-client.py", line 12, in __init__
( j: w* K: M7 Z- Q! s
% l- T& q$ c7 J5 r- \! N4 _  File "c:\Python27\lib\site-packages\serial\serialwin32.py", line 31, in __init__. `; A+ {4 h( w+ U) T3 I7 }7 V
    SerialBase.__init__(self, *args, **kwargs)# d  T6 R' C! ]9 F2 ]& R
  File "c:\Python27\lib\site-packages\serial\serialutil.py", line 180, in __init__
& v% U2 y: W* i. F* \; A    self.open()1 S8 T+ K* A& W/ W; b- I9 c7 q, K
  File "c:\Python27\lib\site-packages\serial\serialwin32.py", line 47, in open
% l9 @2 i7 O* F/ U# i    if port.upper().startswith('COM') and int(port[3:]) > 8:# w, |1 G8 Q8 \3 d
AttributeError: 'int' object has no attribute 'upper'4 t2 l! k  q( d# I: I' [
---------------------
7 ~5 P" ^4 p6 G' U
watershade 回答时间:2016-3-30 16:29:26
lzm1019 发表于 2016-3-30 15:16
, {1 j& S0 Q% c# [1 [再麻烦您一下。- N8 @* a0 q$ B3 k' D7 J! ~) u& D
之前您提到的STM32F411的移植代码,还能找到吗?可否提供我参考下。多谢!
# }9 K, Q0 G: U============= ...
# w& g# J0 a9 j% g6 ^% _* L
请务必注意stack和heap的尺寸。因为库中用到了malloc来分配内存,所以stack用到了很多。除此之外,接线如果用的是杜邦线之类的临时连线,请确保连线稳定。如果有必要的话换一组线,甚至传感器来做相同的实验。411的程序理论上是一致的。但是我最近在外面用一台老笔记本,之前的资料保存在家里的台式机上。但是我尽量基于401的还原一份411的稍后给你。但是这份我不确定是否能用。另外建议你最好从追踪代码开始,如果压根就没有进到main函数里面,这很可能是工程或者硬件的问题。
6 G# P; \. G+ W, ^/ Z5 Z+ ^9 T, Y
. u' k4 {7 P5 w! v; _% D+ _% O关于python的问题,我觉得是串口驱动的问题。如果没记错的话,需要安装pyserial和game两个插件。这样才能正常运行。
" |( }8 |' F- A( \/ C2 {1 s
watershade 回答时间:2016-3-30 16:55:56
lzm1019 发表于 2016-3-30 13:00' m1 f  N( ~. S$ }: G
Fairchild的没用过;
2 x3 `4 B( v8 v目前用的是MPU9250和ST的LSM9DS1;原计划同步开展的。但实际因经验不足(或者说全无 ...

9 |! M1 A- z$ ~9 X. J4 T所以我觉得是你硬件连接或者时钟设置的问题,请先确保这里没问题。SystemInit如果都不能正常进入那说明这里你没有修改好。如果你从官方的代码直接移植的话,时钟这个问题必须要注意的。因为F407的最大时钟时168MHZ而401是84M,411是100M。所以这里注意一下。" `- O6 G+ D2 `# H
另外确保你的MPU连线正确,单我估计这里没问题。
lzm1019 回答时间:2016-3-30 21:25:57
watershade 发表于 2016-3-30 16:558 w) A8 v$ t% V0 W
所以我觉得是你硬件连接或者时钟设置的问题,请先确保这里没问题。SystemInit如果都不能正常进入那说明这 ...

7 \+ ]! a; S; C. g% ?- y多谢!
( k' K3 G: c! \1 O/ A关于物理连线,确认过多次,应该没有问题。
1 E+ _/ c$ E/ y* [昨天调试,发现无法跳转main(),实际应操作失误。但具体是怎么回事,也高不清楚。
+ J6 Y; t4 ?+ r* w# p将SetSysClock()注释取消后,今天在线调试,可一路运行至最终发现停滞在Gyro的INT_PIN_CFG配置中。
* c2 V# Z# S$ e, Y# c----------
* |4 G9 W* V% _4 Gif (i2c_write(st.hw->addr, st.reg->int_pin_cfg, 1, &tmp))
" M, E+ b& v+ w2 U4 W% D        return -1;# V9 V) C  c# [! J
-------------
4 x5 V( t( L  b9 ]  f5 Q, Q6 ]$ X7 g关于Gyro的int_pin_cfg,查证其对应寄存器,在上述代码前一行,已配置
; s3 x/ W; @; `# I-----------------------------------( A9 g  w8 e1 d* f% x
            tmp |= BIT_LATCH_EN | BIT_ANY_RD_CLR;        8 ~. t+ r5 H6 x  Z4 x) f
-----------------------------------
7 ?% o: ]; O' B比较费解为什么配置setup_compass() -> mpu_set_bypass(1)执行到i2c_write()导致跑飞?
3 f. Y8 y+ A$ j7 x  |; _3 W1 N7 q  y至于时钟:4 i& [( v0 s9 ~, P+ F+ N
1)您提到的3种芯片的最大时钟的区别,之前已了解;但如何变更,尚不清楚;+ Q# s0 X$ L7 S# t. o5 y+ v
2)查看SystemInit(),其默认就是设置系统时钟为HSI(16MHz);4 D) W# N* a, k+ j
3)另仔细读了一遍SetSysClock()函数,根据主芯片型号STM32F411CE,其配置代码主要是配置PLL;并未开启HSE_ON,因此我理解,系统时钟依然是HSI(16MHz)。
. A2 X, U; B8 O; w4)SetSysClock()中有两处开启HSE_ON,但分别被条件编译#if defined(xxx)和#if defined(USE_HSE_BYPASS)限定。前者肯定不对;后者,因为我使用的是无源晶体,没有使能USE_HSE_BYPASS。0 ^8 z; j; u* T, m. X9 F) h
若要求配置系统时钟为HSE,是否在别的地方有配置HSE_ON呢?麻烦指点,多谢!
2 W. u8 x0 n0 s5 ], L, M" e# j2 t% v; y( S  g* R- A6 \, l  a, p
watershade 回答时间:2016-3-31 13:37:28
lzm1019 发表于 2016-3-30 21:25
2 y- U2 M4 t0 S% T! o% e& y多谢!& |! y& ]- S9 k
关于物理连线,确认过多次,应该没有问题。7 t9 U' p/ C/ \& U
昨天调试,发现无法跳转main(),实际应操作失误。但具 ...

; q5 _& Q" \/ 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 手机版