Motion Driver6.1.2 Demo移植(需要起个大众都知道的名字,改成F4-Discovery连接MPU9250) 最近下载了Invensense的最新姿态传感器库Motion Driver6.1.2,内含一个F4-Discovery板子的Demo。 就准备了硬件MPU9250的测试板和F4-Disco的板子。 起初以为调试很简单。不想练在连接I2C的硬件时就犯了很大的错误。NCS起初调试的时候浮空了,AD0也是浮空。这就浪费了我不少时间,一时间信心全无。还在我之前用BB-Black运行的linux系统上的I2C-Detect测试过这块传感器板子。又仔细的检查了电路和官方的PS之后就解决了问题。 起初在的测试是在IAR上测试的,但是个人更喜欢keil上的全局搜索功能,就将工程移植到keil,以便后续工程的迁移。 现在将IAR移植到keil的笔记和最终代码发到论坛。期望对人有些帮助。至于后续的迁移项目,视情况而定吧。 下图是利用自导的python测试程序测试的图片截屏。 注意在迁移的时候我将工程的标准库更新到了最新的V1.5.1. 调试记录属于随笔记录性质的,所以语言可能不流畅。勉强看吧。原本是txt的文档,因为格式不允许就压缩了。 因为大小有限制,所以分成压缩成两个包。 因为只贴附件不够直观(因为文件是用sublime编写的,用notepad打开可能是乱码),现在将调试记录的内容粘贴如下: 在调试的时候发现地址是很有意思的如果连接AD到GND的话,I2C地址是68. AD悬空或者拉高是69. 上面的情况是我出错的一个原因,另一个原因是在I2C连接时将CS浮空,但是事实上在使用I2C的时候务必将其拉高。 2015.08.05 使用官方提供的python测试程序测试通过。解决了困扰已久的硬件问题。本次硬件问题的解决借助了BB-Black来帮忙,使用BBB内置的I2Cdetect来测试。找到了问题。 关于SPI和I2C的接线还要参考demo板和原理图说明。[UEVB] PS-MPU-9250A-01.pdf文件第12页给出了I2C地址的描述。AD0 = 0时,地址1101000, AO0 =1时地址是1101001.在实际应用中这个字节的最低位会添加0或1.表示写或者读。所以读地址是11010001或11010011(D1或D3),写地址是11010000或11010010(D0或者D2)。 测试的下一个阶段是将项目移植到keil上面,进行测试。另一个阶段的工作是使用cube库进行移植。 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 第二阶段:移植到keil工程中 说明:本次移植不只是简单的复制粘贴,本次移植的目的还有一个是能够将其代码F4在不同的系列上面移植,目标之一就是F401板子。 本次一直是利用官方的标准库结合特定的BSP来进行移植的。在移植之前需要分析工程的代码结构。 ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 1 看代码[] 省略。。。 2 硬件描述: 2.1>传感器和开发板之间: 信号 MPU9250测试板 开发板 描述 +5V VCC_IN(内含3.3V稳压) +5V 电源+ GND GND GND 电源- SCL SCL/SCLK PB10(I2C2-SCL) I2C时钟线 SDA SDA/MOSI PB11(I2C2-SDA) I2C数据线 NONE NCS(无用须拉高) +3V 高电平,MOSI时有用 sel AD AD/MOSI GND 拉低地址68,拉高69 2.2>UART信号通过USB转TTL(FT232)引入电脑 开发板 FT232板子 描述 PA2(Tx2) RX 开发板信号传出 PA3(Rx2) TX 开发板信号引入 GND GND GND 3 文件结构分析 3.1包含目录 @1 STM32F4xx_StdPeriph_Driver |+inc{} |+src{} @2 core |+driver +eMPL{} +include{} stm32L{} |eMPL-hal{} |mllite{} |mpl @3 DeviceSupport |+inc{} |+src{} @4 Peripheral |+inc{} |+src{} @5 User |+inc{} |+src{} 下面列出SRC $PROJ_DIR$..Userinc $PROJ_DIR$..Usersrc $PROJ_DIR$..Peripheralinc $PROJ_DIR$..Peripheralsrc $PROJ_DIR$..STM32F4xx_StdPeriph_Driverinc $PROJ_DIR$..STM32F4xx_StdPeriph_Driversrc $PROJ_DIR$..DeviceSupportinc $PROJ_DIR$..DeviceSupportsrc $PROJ_DIR$..coredriverinclude $PROJ_DIR$..coredrivereMPL $PROJ_DIR$..coredriverstm32l $PROJ_DIR$..coremllite $PROJ_DIR$..corempl $PROJ_DIR$..coreeMPL-hal 转换到keil是(keil目录在): ..Userinc ..Usersrc ..Peripheralinc ..Peripheralsrc ..STM32F4xx_StdPeriph_Driverinc ..STM32F4xx_StdPeriph_Driversrc ..DeviceSupportinc ..DeviceSupportsrc ..coredriverinclude ..coredrivereMPL ..coredriverstm32l ..coremllite ..corempl ..coreeMPL-hal keil工程位于新建的MDK-ARM文件夹内 @6 MDK-ARM 也新建下面目录存储二进制文件 @7 Binary 3.2预处理命令: USE_STDPERIPH_DRIVER USE_DMP MPL_LOG_NDEBUG=1 EMPL MPU9250 EMPL_TARGET_STM32F4 迁移到keil: USE_STDPERIPH_DRIVER,USE_DMP,MPL_LOG_NDEBUG=1,EMPL,MPU9250,,EMPL_TARGET_STM32F4 在keil的标准库中还需要添加设备名称F407的名称对应STM32F40_41xxx 这部分可参考文件stm32f4xx.h /* #define STM32F40_41xxx */ /*!< STM32F405RG, STM32F405VG, STM32F405ZG, STM32F415RG, STM32F415VG, STM32F415ZG, STM32F407VG, STM32F407VE, STM32F407ZG, STM32F407ZE, STM32F407IG, STM32F407IE, STM32F417VG, STM32F417VE, STM32F417ZG, STM32F417ZE, STM32F417IG and STM32F417IE Devices */ /* #define STM32F427_437xx */ /*!< STM32F427VG, STM32F427VI, STM32F427ZG, STM32F427ZI, STM32F427IG, STM32F427II, STM32F437VG, STM32F437VI, STM32F437ZG, STM32F437ZI, STM32F437IG, STM32F437II Devices */ /* #define STM32F429_439xx */ /*!< STM32F429VG, STM32F429VI, STM32F429ZG, STM32F429ZI, STM32F429BG, STM32F429BI, STM32F429NG, STM32F439NI, STM32F429IG, STM32F429II, STM32F439VG, STM32F439VI, STM32F439ZG, STM32F439ZI, STM32F439BG, STM32F439BI, STM32F439NG, STM32F439NI, STM32F439IG and STM32F439II Devices */ /* #define STM32F401xx */ /*!< STM32F401CB, STM32F401CC, STM32F401RB, STM32F401RC, STM32F401VB, STM32F401VC STM32F401CD, STM32F401RD, STM32F401VD, STM32F401CExx, STM32F401RE and STM32F401VE Devices */ /* #define STM32F411xE */ /*!< STM32F411CD, STM32F411RD, STM32F411VD, STM32F411CE, STM32F411RE and STM32F411VE Devices */ /* #define STM32F446xx */ /*!< STM32F446MC, STM32F446ME, STM32F446RC, STM32F446RE, STM32F446VC, STM32F446VE, STM32F446ZC and STM32F446ZE Devices */ 3.3浮点运算 IAR:Genaeral Options>FPU>VFPv4 keil: Target>Roating Point Hardware>Usr Single Precision 3.4堆栈大小 IAR:Linker>Config>Override default>$PROJ_DIR$stm32f40x_flash.icf>[.intec=0x08000000,ROM{S=0x8000000,E=0x080FFFFF},RAM{S=0x20000000,E=0x2001BFFF},CSTACK=0x1000,HEAP=0x800] Keil分别在Target>IROM1/IRAM1(保持默认),和.s文件处修改(稍后修改)。 3.5项目目录结构 参照3.1中的描述建立但是因为keil不支持多级目录所以用符号代替,同时只用包含C和s文件就足够了 3.6替换.s和.a文件 这两个文件分别位于core/mpl和DeviceSupport下面。 其中.a文件换成了.lib文件,因为keil不支持.a,而支持lib 在更换.s文件时也配套更换了对应的.h文件 添加CMSIS目录 @8 CMSIS 内部包含Include和lib目录 //////////////////////////////// 编译不通过 ////////////////////////////////////////////// 继续修改 编译模式修改为c99模式,并包含micro lib之后去掉了多数错误 目前主要的警告包含两类: 一类是without a new line,另一类是void参数省略提醒。 几个小的警告: 还有几个警告是单精度转换成双精度类型。 __no_operation();没有定义 目前还剩余的三处错误。但实际上是一个错误,这个错误是: 1 fputs错误:IAR的fputs原型是fputc(int ch),keil的fputs原型是fputc(int ch, FILE *f) 这三个错误排出之后新增一个__no_operation()的错误,在IAR中,这一项在intrinsics.h中定义。 在keil中使用nop函数来替代,这个函数在intrins.h。但是这个语法不能用在ARM上。 MDK上的替代语句是:__nop()语句 3.7测试 忘记连接INT到PA1上,串口连线松动。修整好之后,测试通过。 MPU9250这个芯片的磁力计AK8963只有I2C接口,而加速度计陀螺仪MPU6500模块是I2C接口与SPI都有的, 看他手册的block diagram描述应该就是这样,所以如果使用SPI接口,我们只能通过配置内部的I2C master模块,让i2c matster通过内部的i2c总线来读取磁力计数据。。。所以总结我遇到的问题就是,当使用SPI接口时,我用i2c master碰到问题了,无论如何尝试都不能通过i2c master读取磁力计,只能读到加速度和陀螺仪数据。而我使用i2c的bypass模式可以读取所有的9轴数据。他的程序我以前也试过了,初始化的时候就是失败的,所以已经放弃SPI读取地磁很久了。。不过看到你发帖,突然很激动。。希望多多交流 F4DiscKeil-MD612.part01.rar F4DiscKeil-MD612.part02.rar |
更多回帖