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

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

[复制链接]
watershade 发布时间:2015-8-8 14:46
阅读主题, 点击返回1楼
赞 1 收藏 12 评论117 发布时间:2015-8-8 14:46
117个回答
lzm1019 回答时间:2016-3-26 18:32:43
watershade 发表于 2015-8-25 10:36% ]' f1 q2 W. L' t1 ~
最近在尽可能不更改程序的基础上将原始程序迁移到了nucleo411和nucleo401上。因为411的程序在另一台电脑上 ...
! V# z# J$ v. a6 a
您好!对比您之前#1的代码,发现invensense_adv.h文件有变更,具体为:+ b3 Z& q+ G* U' i! v
---------------------/ T+ u& ?1 T( Z/ r
调用#include “mag_disturb.h” 变更为 #include “inv_math.h"
$ M; R% ~# `  y% k4 y8 A+ ]0 @. H, h2 W---------------------' k" ~9 p$ Y! C1 W# A
其他内容暂时未发现。9 X) U' B8 V/ m  X: ~3 I

) j5 h1 R5 j* I& \! k想请教下,此处变更的作用?屏蔽到mag_disturb.h中的多个inv_set/enable/init/disable_***函数,进而调用系统的math.h吗?4 m' p* l- k/ h3 `
我的理解是,上述mag_disturb.h中的函数实现应该已封装在libmpllib.lib中了。实际不需使用吗?/ r1 q/ u% ]: z8 t8 g  R( E# M
多谢!
watershade 回答时间:2016-3-27 16:24:14
power568 发表于 2016-3-26 16:124 t5 u( f! M/ y
楼主有没有使用SPI读取过数据,我现在使用SPI就只能读出6轴数据,磁力计读不出来...
/ d( [# M8 z5 O  Z) O& t$ s& \向您学习一下... ...
5 R) y5 B4 ~- d1 Q: \
的确磁力的数据有时能读上来,有时读不上来。我暂时不能做实验找到问题的根源。你找出来可以告诉我。
/ j# E5 ]( c2 {) I可能是因为打开了自动排除干扰模式,在检测到干扰很大的时候就把磁力计甩掉。
: a2 @+ D2 I/ b但是这只是我的推测,好久没有玩了。不好意思
watershade 回答时间:2016-3-27 16:34:37
lzm1019 发表于 2016-3-26 18:325 r8 ?* }( x7 p" b6 W
您好!对比您之前#1的代码,发现invensense_adv.h文件有变更,具体为:
& o: H3 _+ [1 O. J! z---------------------
+ _# S3 |: |) L; ]) z调用#incl ...
; R( p3 ~7 A! f5 l9 Q% H& Z
是吗,这部分的更改我没有印象。时间有点久了,我暂时试不了。真不好意思
watershade 回答时间:2016-3-27 16:36:59
lzm1019 发表于 2016-3-25 15:45
( P9 V# |2 E; U: d9 `7 @* u& A* y官网下载的;当然需要先注册。
8 X5 r% h0 Z9 K, U# b因注册并无门槛,所以感觉提交上来也没啥问题。 ...

. n1 M+ l6 p8 M; R, U你还需要原版吗,给我邮箱我发给你。我抽空又下了一遍
watershade 回答时间:2016-3-27 16:40:40
诸位,很不好意思。很久没有更新这篇文章了,代码也没有再来测试。我本计划用HAL库来改写一个简单的读取传感器的程序,但是最近一段时间在继续学习STM32,因为发觉对很多问题掌握的似是而非。待我有一定的实力,我再来改写。到时再开一贴。谢谢
power568 回答时间:2016-3-27 23:42:27
watershade 发表于 2016-3-27 16:24  F; t; {! m7 ^8 z; K2 }9 |4 R
的确磁力的数据有时能读上来,有时读不上来。我暂时不能做实验找到问题的根源。你找出来可以告诉我。
  ]5 m8 U# {; d$ X! [可 ...
2 u. i1 Y8 b0 _
你贴的代码是不是偶尔也可以读出磁力计...
lzm1019 回答时间:2016-3-28 11:29:43
watershade 发表于 2016-3-27 16:36
8 }8 X3 W8 Y3 d  B. l& _' v你还需要原版吗,给我邮箱我发给你。我抽空又下了一遍
: g5 X, |3 K8 T! I& i! ^8 b. o
多谢!我的邮箱 lzm1019@hotmail.com+ T/ e7 q0 g& v$ c1 A# @/ d
====- [6 G7 r* U& O6 x
题外话,Invensense的代码结构,没有对应的文档说明,读起来极不习惯,颇费周折去厘清其关系。找到您的帖子,方便许多。4 \/ k) |* A7 P8 u1 X, s$ d3 Y2 @! a6 y
我是新手,刚学习EMD6.12,想移植到STM32F411;无意对比了下,发现invensense_adv.h中的变更,所以请教下。
lzm1019 回答时间:2016-3-28 11:34:57
watershade 发表于 2016-3-27 16:36
# O3 n5 L  i: e/ h2 t$ T5 Y2 C3 w' z你还需要原版吗,给我邮箱我发给你。我抽空又下了一遍
* T+ c" t# z, r" O& B0 v, F5 ~
Sorry,刚理解错了,以为您有新的代码,提供了邮箱。
# X  o& a; z2 y: T( ~========- i& z; _. b5 K2 Y
关于emd6.12的源码,我能下载;之前是应#38楼 rushidao 的需要,分享baidupan链接。
watershade 回答时间:2016-3-28 21:58:27
lzm1019 发表于 2016-3-28 11:34! J! V- f* P6 S! W: y( ?+ p; b
Sorry,刚理解错了,以为您有新的代码,提供了邮箱。
8 Y4 s* u. e4 S7 c/ z========
- L) _6 N! s* I* k( G关于emd6.12的源码,我能下载;之前是应#3 ...
7 N( ?3 p6 e  I9 T- X5 I! M
ok,很抱歉没能帮到你。祝你成功
watershade 回答时间:2016-3-28 22:00:50
lzm1019 发表于 2016-3-28 11:34
) T- ~& b; I8 R/ }) O  dSorry,刚理解错了,以为您有新的代码,提供了邮箱。% J+ M( h, O( ^
========
  d4 U2 P; Z7 X: ~; ~. @关于emd6.12的源码,我能下载;之前是应#3 ...
3 E$ ~, M2 |' w- p  C/ k: F
另外建议你看一下飞兆半导体的传感器FIS1100,或者ST的iNemo-M1。这两者都有比较好的库。前者的硬件因为电压问题不方便STM32使用。后者的算法似乎有些问题,校准部分不太好。如果你刚好调试过,能否交流一下经验。
lzm1019 回答时间:2016-3-30 13:00:15
watershade 发表于 2016-3-28 22:00( {- Z% |0 L0 A- K; p+ F- D
另外建议你看一下飞兆半导体的传感器FIS1100,或者ST的iNemo-M1。这两者都有比较好的库。前者的硬件因为 ...
0 D1 V7 C& \6 N' {
Fairchild的没用过;
6 h9 w, l: x. w1 x目前用的是MPU9250和ST的LSM9DS1;原计划同步开展的。但实际因经验不足(或者说全无经验),先从MPU9250开始。, _, t+ p8 o7 R+ I
这两天,基于您共享的移植文件在学习;我用的是STM32F411CEU6,按您的简单移植说明,处理后,编译ok;但是download板子上,串口没有任何输出。
+ ~( L  E7 U6 ~$ s调试情况:3 T& i- s9 n: W* m
1)在板上调试,debug卡在启动文件中的SystemInit,意思是还没有进入main();随后将setsysclk()注释掉,再仿真,最终发现停滞在Gyro的INT_PIN_CFG配置中。
5 J" B/ E1 q, V; ~, T4 o----------6 {7 d3 C( B  C1 S
if (i2c_write(st.hw->addr, st.reg->int_pin_cfg, 1, &tmp))3 i6 f3 g9 N* ^+ U* A8 [* W
        return -1;
# e& }8 m/ ?# a2 V  x" Z3 U- H1 N- ^1 t-------------
, b. g3 P- ~8 {# a! G$ e! J" Y( n/ b( c' Z9 u0 |
2)模拟仿真,不带板的情况,则停滞在USART的发送循环中;" A! F2 [' e  y2 K+ d% T& E5 P
-------------------. A& x+ z4 G$ W+ j
//* Loop until the end of transmission
( m: K& B0 H2 b5 R: n5 A* kwhile (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET)
4 {! g0 i7 O( o9 A2 N6 [{}6 k. J- I& H$ C1 _+ a. ~1 z: R% X
-----------------
% \/ P- \$ J. F' U0 K( R1 u我的理解,无板时,USART发送接收无效,导致死循环。
' I+ v9 r4 }! o* S( S2 a
0 b2 R, U1 q7 L9 m9 u2 M8 t7 r) G后面,用最笨的方法,直接以LED来指示,确定代码停滞在mpu_set_bypass()中;但原因不明。1 Z5 n# l9 i2 k6 |3 J; _
lzm1019 回答时间:2016-3-30 15:16:51
watershade 发表于 2015-8-25 10:36
. Z% L4 @# G1 A* `* h* }- N9 x最近在尽可能不更改程序的基础上将原始程序迁移到了nucleo411和nucleo401上。因为411的程序在另一台电脑上 ...

; l5 U! }& m8 J1 f- U+ Z1 D再麻烦您一下。. Z# q; g" e! V7 o
之前您提到的STM32F411的移植代码,还能找到吗?可否提供我参考下。多谢!0 F2 s1 [) W, p, g+ q
===============
/ P/ f  c& v' `% }2 ~0 R手头没有STM32F4-Discovery的板子,没法验证原始工程是否能正常输出9轴数据。看您之前的记录,移植后是正常输出了的,具体情形如何呢?我之前基于您的F401KeilPorting的代码,编译OK,运行后串口无输出。* \' w# x6 N! n$ ^* F
----------------9 O1 `' v7 y6 ^& h! T
另,刚尝试安装Invensense的AppNote1,安装Python环境,运行eMPL-Client.py,闪退;报错如下:
" w7 _( q) d7 i' P" S--------------' D- v- W3 ?: l0 s
c:\Python27>python eMPL612\eMPL-client.py 6+ q' w/ L0 g* V! m/ |6 `. t
Traceback (most recent call last):+ n$ R6 f" a8 p- f$ g: ~& ^
  File "eMPL612\eMPL-client.py", line 273, in <module>" R2 z/ @4 `# z* S1 p
    def four_bytes(d1, d2, d3, d4):
5 |: Q, l2 p; P" J  @3 {  File "eMPL612\eMPL-client.py", line 12, in __init__9 R  W' m) {3 w5 O
) v3 Y) T3 }) z/ A$ S1 l
  File "c:\Python27\lib\site-packages\serial\serialwin32.py", line 31, in __init__
& R; Q. L  k0 P* ?& e    SerialBase.__init__(self, *args, **kwargs)7 F+ i5 j6 Z4 h* i# r8 q
  File "c:\Python27\lib\site-packages\serial\serialutil.py", line 180, in __init__$ A* X8 R4 w2 |* t
    self.open()2 O( l$ _$ t; h1 q* Y( `
  File "c:\Python27\lib\site-packages\serial\serialwin32.py", line 47, in open( |# Z. R/ |4 m1 {! |9 ^
    if port.upper().startswith('COM') and int(port[3:]) > 8:1 m9 k0 U& Q6 {) V" C/ w, L
AttributeError: 'int' object has no attribute 'upper'
" I' p, M+ D% D9 N---------------------
0 \% ~( L& L4 k' e+ E
watershade 回答时间:2016-3-30 16:29:26
lzm1019 发表于 2016-3-30 15:16- l# s- ?6 r6 D7 G$ B6 b
再麻烦您一下。/ F0 H, @4 ~: W% ]1 o
之前您提到的STM32F411的移植代码,还能找到吗?可否提供我参考下。多谢!
) h" [% v# \1 m/ [" B============= ...

3 {9 W% N' i* h3 U. I4 ]  l& X请务必注意stack和heap的尺寸。因为库中用到了malloc来分配内存,所以stack用到了很多。除此之外,接线如果用的是杜邦线之类的临时连线,请确保连线稳定。如果有必要的话换一组线,甚至传感器来做相同的实验。411的程序理论上是一致的。但是我最近在外面用一台老笔记本,之前的资料保存在家里的台式机上。但是我尽量基于401的还原一份411的稍后给你。但是这份我不确定是否能用。另外建议你最好从追踪代码开始,如果压根就没有进到main函数里面,这很可能是工程或者硬件的问题。, s1 {+ [6 e3 r5 ^
( ~% Y. t/ G+ I& O+ ^! t
关于python的问题,我觉得是串口驱动的问题。如果没记错的话,需要安装pyserial和game两个插件。这样才能正常运行。
8 ]' C; I1 b% V2 M- T1 V
watershade 回答时间:2016-3-30 16:55:56
lzm1019 发表于 2016-3-30 13:00
7 l' F3 E7 P/ z4 wFairchild的没用过;
, N( m8 G* E/ M* G# |1 P' B目前用的是MPU9250和ST的LSM9DS1;原计划同步开展的。但实际因经验不足(或者说全无 ...

6 {* H6 O: R. b5 m7 a所以我觉得是你硬件连接或者时钟设置的问题,请先确保这里没问题。SystemInit如果都不能正常进入那说明这里你没有修改好。如果你从官方的代码直接移植的话,时钟这个问题必须要注意的。因为F407的最大时钟时168MHZ而401是84M,411是100M。所以这里注意一下。
& E1 J$ W3 d3 R% \1 S( q1 V9 g$ B另外确保你的MPU连线正确,单我估计这里没问题。
lzm1019 回答时间:2016-3-30 21:25:57
watershade 发表于 2016-3-30 16:551 L3 |! K6 d4 Q3 |2 I
所以我觉得是你硬件连接或者时钟设置的问题,请先确保这里没问题。SystemInit如果都不能正常进入那说明这 ...
0 f  k+ y, Z$ T/ a+ F
多谢!4 s: v$ M  o7 j/ l: o0 Z: i- j
关于物理连线,确认过多次,应该没有问题。, I* o2 J1 E# m0 R) k, j
昨天调试,发现无法跳转main(),实际应操作失误。但具体是怎么回事,也高不清楚。# S% ~; Z5 ]3 I! H7 A
将SetSysClock()注释取消后,今天在线调试,可一路运行至最终发现停滞在Gyro的INT_PIN_CFG配置中。
0 {. f/ y. |9 H+ M: d----------1 Y  F7 Z; g" \' F2 z: `
if (i2c_write(st.hw->addr, st.reg->int_pin_cfg, 1, &tmp))8 ^1 w' x6 c0 E; |8 v, W
        return -1;9 ^# u- u- T1 b9 z* F
-------------
$ N. d$ M/ ]. Q% u关于Gyro的int_pin_cfg,查证其对应寄存器,在上述代码前一行,已配置
0 {1 h# J( N7 ~8 o, @: ]-----------------------------------
, k) a# I2 ?: G' z6 Z            tmp |= BIT_LATCH_EN | BIT_ANY_RD_CLR;       
8 p/ _( V0 R$ ]* L: \7 ~9 K-----------------------------------
5 h% ^, n7 q. L$ M* q比较费解为什么配置setup_compass() -> mpu_set_bypass(1)执行到i2c_write()导致跑飞?
; h+ p" @$ ^7 J7 v5 ?! {+ @至于时钟:
3 y8 o1 h4 r/ \8 A1 \, A* c% A) h1)您提到的3种芯片的最大时钟的区别,之前已了解;但如何变更,尚不清楚;& f8 ^7 H% x' \+ C2 a! a
2)查看SystemInit(),其默认就是设置系统时钟为HSI(16MHz);9 o7 Z9 D  M- Y" h
3)另仔细读了一遍SetSysClock()函数,根据主芯片型号STM32F411CE,其配置代码主要是配置PLL;并未开启HSE_ON,因此我理解,系统时钟依然是HSI(16MHz)。
' M- W0 O0 L7 ]0 u+ f4)SetSysClock()中有两处开启HSE_ON,但分别被条件编译#if defined(xxx)和#if defined(USE_HSE_BYPASS)限定。前者肯定不对;后者,因为我使用的是无源晶体,没有使能USE_HSE_BYPASS。2 ]1 @( U5 Z: Z: u/ v) j
若要求配置系统时钟为HSE,是否在别的地方有配置HSE_ON呢?麻烦指点,多谢!; N& w! O4 S3 s5 r

$ Q& p8 ]4 A5 i, T+ [3 m9 y+ O

所属标签

相似技术帖

官网相关资源

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