惯性导航之程序(OpenShoe)移植从avr32移植到stm32f4xx

            惯性导航程序(OpenShoe)移植

任务:惯性导航程序从avr32(开发工具AtmelStudio6)移植到stm32f4xx(开发工具keil5_11)。

分析:将程序移植到不同微控制器,将源程序分成硬件相关和硬件不相关(算法、控制方式等)两部分。

以惯性导航源码为例:

1. 惯性导航硬件不相关代码移植

  Step1:将去掉微控制器相关驱动后的惯性导航源码加入到keil5工程序中,从main函数中开始,然后注示掉硬件相关的函数。

  Step2: 惯性导航源码中使用了inline等C++关键字(开c99)和开硬件浮点单元(FPU),在keil5开发工具中配制如下:

  所有inline函数前加static,因为keil5开发工具必须这样做。

  Step3: 编译,根据出错信息来解决错误;比如:

  1) #define M_PI 3.14159265358979323846

  //atmelStudio6中math.h中有,但在keil5 math.h中无,所以要自己添加

2) #define Bool bool //++

   3)  #define max(a,b) ((a)>(b)? (a):(b))  //++

   4)  #include <stdbool.h>

  等等.....

  Step4: avr32是大端地址,而stm32f4xx小端地址,上位机要修改,而源码中修改的部分如下:

  小端地址:

  #define  MSB(u16)       (((uint8_t  *)&(u16))[1]) //!< Most significant byte of \a u16.

  #define  LSB(u16)       (((uint8_t  *)&(u16))[0]) //!< Least significant byte of \a u16.

  大端地址:

  #define  MSB(u16)       (((uint8_t  *)&(u16))[0]) //!< Most significant byte of \a u16.

  #define  LSB(u16)       (((uint8_t  *)&(u16))[1]) //!< Least significant byte of \a u16.

2. 惯性导航硬件相关代码移植

  通过分析惯性导航源码,可以知道使用的硬件相关配制:

  1. 系统时钟初始化;
  2. 定时器中断;
  3. 串口通信,接收数据和发送数据都使用了中断方式,但可以考虑接收采用中断;
  4. 获取程序运行时间dt, dt用于惯性导航算法的参数(avr32 使用32位递增计时器)。
  5. 模拟I2C

  Step1: 新建工程,实现a~c(1~3)功能,并测试。

  Step2:d功能,采用stm32中systick,systick在Cortex M4内核编程手册中有说明;systick是24位递减计时器,不占用CPU。

  修改inertial_frontend.c文件中代码,深黑色为修改后的:

  frontend_postproc函数中:

  未修改:

  dt_k = ((precision)(t_int_k - t_int_km1))*TIME_SCALE;

  t_int_km1 = t_int_k;

  修改后:

  if (t_int_km1 < t_int_k)

    dt_k = ((precision)(0x00ffffff - t_int_k + t_int_km1))*TIME_SCALE;

  else

    dt_k = ((precision)(t_int_km1 - t_int_k))*TIME_SCALE;

  t_int_km1 = t_int_k;

  修改i2c.c中代码:(深黑色为修改后)

  未修改前:

  inline static void half_tick(void){

  int32_t wait_to = last_tick + 2*QUATER_CC_COUNT;

  while (Get_system_register(AVR32_COUNT) - wait_to < 0);

  last_tick = Get_system_register(AVR32_COUNT);

  }

  inline static void quater_tick(void){ //++

  int32_t wait_to = last_tick + QUATER_CC_COUNT;

  while (Get_system_register(AVR32_COUNT) - wait_to < 0);

  last_tick = Get_system_register(AVR32_COUNT);

  }

  修改后:

  int32_t temp;

  inline static void half_tick(void){

  int32_t wait_to = last_tick - 2*QUATER_CC_COUNT;

  if (wait_to & 0x80000000) wait_to = -wait_to; 

 

  do{

    temp = Get_system_register();

  }while (temp - wait_to > 0 && temp < last_tick);

  last_tick = Get_system_register();

  }

  inline static void quater_tick(void){

  int32_t wait_to = last_tick - QUATER_CC_COUNT;

  if (wait_to & 0x80000000) wait_to = -wait_to;

 

  do{

  temp = Get_system_register();

  }while (temp - wait_to > 0 && temp < last_tick);

  last_tick = Get_system_register();

  }

  Step3:使用stm32f4xx模拟I2C,或者将惯性导航中的模拟I2C移植过来。

时间: 2024-08-30 10:19:50

惯性导航之程序(OpenShoe)移植从avr32移植到stm32f4xx的相关文章

linux下用于二进制程序及其依赖库的移植的脚本

#!/bin/bash ##指定移植目录 DEST=/mnt/sysroot #依赖库文件拷贝 libcp() { LIBPATH=${1%/*} [ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH [ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $1 finished." } #程序本身的拷贝 bincp() { CMD

一些遇到的Qt程序在Windows平台间移植问题整理

今天尝试把Qt程序移植到各种虚拟机中测试,由于Qt的依赖库报告往往不能显示出全部依赖库.结果频频出现问题,好不容易全部解决了,这里给出一些套路. 首先对于Qt版本,我用过很多,最终表示现阶段推荐MingGW的版本(此版自带MingGW),官网链接: Qt 5.4.2 for Windows 32-bit (MinGW 4.9.1, 852 MB) (info) 我个人百度网盘链接:Qt 5.4.2 MinGW 安装时要注意勾选上MinGW ,如果你没有的话.此版本可以在WindowsXP下运行.

OLED程序在stm32f103上的移植

最近买了中景园5.5寸的OLED显示屏,官方给的驱动程序是在stm32f103VC版本上的,由于在stm32f103c8t6上显示,于是需要移植. 基本情况:官方给的例程是使用GPIO口模拟的SPI驱动显示液晶屏 1.修改GPIO口,将OLED模拟显示GPIO口组全部替换成stm32f103c8t6上有的GPIO口 2.修改芯片容量.S文件 由于stm32f103vc使用的.S文件是starup_stm32f10x_hd.s 而stm32f103c8t6使用的.S文件是starup_stm32f

Cocos2d-x移植到WindowsPhone8移植问题-libcurl库移植问题

在Cocos2d-x 3.x最新版本中提供了Windows Phone 8平台移植libcurl库所需要的头文件和库文件.但要在Windows Phone 8平台成功移植libcurl库还是很不容易,需要费一些周折,我总结了如下几个步骤:配置头文件搜索路径配置链接环境添加动态链接库 1.配置头文件搜索路径整个步骤我们可以参考上一节介绍的rapidjson库移植.具体过程是选中HelloCppComponent工程,打开菜单"项目"→ "属性"弹出工程属性对话框,选择

Linux-2.6.39在Tiny6410上的移植 - 外设驱动移植

Linux内核版本号:linux 2.6.39 交叉编译工具:arm-linux-gcc 4.5.1 Linux内核下载:www.kernel.org 开发板:友善之臂Tiny6410 LCD:友善之臂S70 一.移植LED驱动 打开arch/arm/mach-s3c64xx/mach-mini6410.c添加下列代码: 1 static struct gpio_led tiny6410_gpio_led[] = { 2 [0] = { 3 .name = "led1", //设备名

基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

【系统移植】U_BOOT移植

U-BOOT移植 Bootloader引导启动 0x0000_0000 0x0000_8000 32KB IROM 0x0002_0000 0x0003_8000 96KB IRAM 0x0003_4000 0x0003_8000 16KB BL1 The boot loader is divided into the BL0( 1st boot loader) and the BL1(2nd boot loader). ?    BL0 which is placed in iROM load

Cocos2d-x移植到WindowsPhone8移植问题-libNetwork库移植问题

Cocos2d-x提供了libNetwork库的源代码,而且还提供了libNetwork库的源代码Visual Studio 2012工程文件libNetwork.vcxproj,这样就更方便移植了.提示 有的Cocos2d-x工程模板在解决方案中,已经有libNetwork库了,本节所介绍的过程就不需要了. 由于libNetwork库底层是依赖libcurl库,所以我们先要按照上一节介绍的步骤移植libcurl库,这个过程不在介绍.下面我们移植libNetwork库,具体步骤是:在解决方案中添