
新鲜出炉!X-LINUX-QT正式支持Qt 6!STM32 MPU迎来UI科技美学
利用STM32MP1和STM32MP2为嵌入式Linux提供有效的安全措施:供当今决策者参考的3条宝贵经验
有奖直播 | STM32MP2x 资源隔离架构 (RIF) 介绍与使用
白皮书下载|边缘 AI 变革:MCU集成 NPU 的破局与领航
OpenSTLinux:为STM32 MPU生态系统带来超强助力
【STM32MP257】轻松搭建A35 Linux编译及调试环境
【STM32MP257】🥳STM32MP257-DK-开发板开箱体验
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【STM32MPU 安全启动】 TF-A BL2 TrustedBoot原理学习
《STM32MPU安全启动》学**结
您好!对比您之前#1的代码,发现invensense_adv.h文件有变更,具体为:
---------------------
调用#include “mag_disturb.h” 变更为 #include “inv_math.h"
---------------------
其他内容暂时未发现。
想请教下,此处变更的作用?屏蔽到mag_disturb.h中的多个inv_set/enable/init/disable_***函数,进而调用系统的math.h吗?
我的理解是,上述mag_disturb.h中的函数实现应该已封装在libmpllib.lib中了。实际不需使用吗?
多谢!
的确磁力的数据有时能读上来,有时读不上来。我暂时不能做实验找到问题的根源。你找出来可以告诉我。
可能是因为打开了自动排除干扰模式,在检测到干扰很大的时候就把磁力计甩掉。
但是这只是我的推测,好久没有玩了。不好意思
是吗,这部分的更改我没有印象。时间有点久了,我暂时试不了。真不好意思
你还需要原版吗,给我邮箱我发给你。我抽空又下了一遍
你贴的代码是不是偶尔也可以读出磁力计...
多谢!我的邮箱 lzm1019@hotmail.com
====
题外话,Invensense的代码结构,没有对应的文档说明,读起来极不习惯,颇费周折去厘清其关系。找到您的帖子,方便许多。
我是新手,刚学习EMD6.12,想移植到STM32F411;无意对比了下,发现invensense_adv.h中的变更,所以请教下。
Sorry,刚理解错了,以为您有新的代码,提供了邮箱。
========
关于emd6.12的源码,我能下载;之前是应#38楼 rushidao 的需要,分享baidupan链接。
ok,很抱歉没能帮到你。祝你成功
另外建议你看一下飞兆半导体的传感器FIS1100,或者ST的iNemo-M1。这两者都有比较好的库。前者的硬件因为电压问题不方便STM32使用。后者的算法似乎有些问题,校准部分不太好。如果你刚好调试过,能否交流一下经验。
Fairchild的没用过;
目前用的是MPU9250和ST的LSM9DS1;原计划同步开展的。但实际因经验不足(或者说全无经验),先从MPU9250开始。
这两天,基于您共享的移植文件在学习;我用的是STM32F411CEU6,按您的简单移植说明,处理后,编译ok;但是download板子上,串口没有任何输出。
调试情况:
1)在板上调试,debug卡在启动文件中的SystemInit,意思是还没有进入main();随后将setsysclk()注释掉,再仿真,最终发现停滞在Gyro的INT_PIN_CFG配置中。
----------
if (i2c_write(st.hw->addr, st.reg->int_pin_cfg, 1, &tmp))
return -1;
-------------
2)模拟仿真,不带板的情况,则停滞在USART的发送循环中;
-------------------
//* Loop until the end of transmission
while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET)
{}
-----------------
我的理解,无板时,USART发送接收无效,导致死循环。
后面,用最笨的方法,直接以LED来指示,确定代码停滞在mpu_set_bypass()中;但原因不明。
再麻烦您一下。
之前您提到的STM32F411的移植代码,还能找到吗?可否提供我参考下。多谢!
===============
手头没有STM32F4-Discovery的板子,没法验证原始工程是否能正常输出9轴数据。看您之前的记录,移植后是正常输出了的,具体情形如何呢?我之前基于您的F401KeilPorting的代码,编译OK,运行后串口无输出。
----------------
另,刚尝试安装Invensense的AppNote1,安装Python环境,运行eMPL-Client.py,闪退;报错如下:
--------------
c:\Python27>python eMPL612\eMPL-client.py 6
Traceback (most recent call last):
File "eMPL612\eMPL-client.py", line 273, in <module>
def four_bytes(d1, d2, d3, d4):
File "eMPL612\eMPL-client.py", line 12, in __init__
File "c:\Python27\lib\site-packages\serial\serialwin32.py", line 31, in __init__
SerialBase.__init__(self, *args, **kwargs)
File "c:\Python27\lib\site-packages\serial\serialutil.py", line 180, in __init__
self.open()
File "c:\Python27\lib\site-packages\serial\serialwin32.py", line 47, in open
if port.upper().startswith('COM') and int(port[3:]) > 8:
AttributeError: 'int' object has no attribute 'upper'
---------------------
请务必注意stack和heap的尺寸。因为库中用到了malloc来分配内存,所以stack用到了很多。除此之外,接线如果用的是杜邦线之类的临时连线,请确保连线稳定。如果有必要的话换一组线,甚至传感器来做相同的实验。411的程序理论上是一致的。但是我最近在外面用一台老笔记本,之前的资料保存在家里的台式机上。但是我尽量基于401的还原一份411的稍后给你。但是这份我不确定是否能用。另外建议你最好从追踪代码开始,如果压根就没有进到main函数里面,这很可能是工程或者硬件的问题。
关于python的问题,我觉得是串口驱动的问题。如果没记错的话,需要安装pyserial和game两个插件。这样才能正常运行。
所以我觉得是你硬件连接或者时钟设置的问题,请先确保这里没问题。SystemInit如果都不能正常进入那说明这里你没有修改好。如果你从官方的代码直接移植的话,时钟这个问题必须要注意的。因为F407的最大时钟时168MHZ而401是84M,411是100M。所以这里注意一下。
另外确保你的MPU连线正确,单我估计这里没问题。
多谢!
关于物理连线,确认过多次,应该没有问题。
昨天调试,发现无法跳转main(),实际应操作失误。但具体是怎么回事,也高不清楚。
将SetSysClock()注释取消后,今天在线调试,可一路运行至最终发现停滞在Gyro的INT_PIN_CFG配置中。
----------
if (i2c_write(st.hw->addr, st.reg->int_pin_cfg, 1, &tmp))
return -1;
-------------
关于Gyro的int_pin_cfg,查证其对应寄存器,在上述代码前一行,已配置
-----------------------------------
tmp |= BIT_LATCH_EN | BIT_ANY_RD_CLR;
-----------------------------------
比较费解为什么配置setup_compass() -> mpu_set_bypass(1)执行到i2c_write()导致跑飞?
至于时钟:
1)您提到的3种芯片的最大时钟的区别,之前已了解;但如何变更,尚不清楚;
2)查看SystemInit(),其默认就是设置系统时钟为HSI(16MHz);
3)另仔细读了一遍SetSysClock()函数,根据主芯片型号STM32F411CE,其配置代码主要是配置PLL;并未开启HSE_ON,因此我理解,系统时钟依然是HSI(16MHz)。
4)SetSysClock()中有两处开启HSE_ON,但分别被条件编译#if defined(xxx)和#if defined(USE_HSE_BYPASS)限定。前者肯定不对;后者,因为我使用的是无源晶体,没有使能USE_HSE_BYPASS。
若要求配置系统时钟为HSE,是否在别的地方有配置HSE_ON呢?麻烦指点,多谢!