inav向STM32F401CCU开发板定制的过程(二)

首先是MCU用于iNav的各种功能的引脚的分配计划:

一、PPM接收机输入引脚,需要使用一个复用有定时器的引脚,我这里选择了PA0,对应选择的是TIM2_CH1。

修改target/FLYESF401/target.c文件,里面定义了MCU要使用什么引脚上的哪一个定时器的哪一个道道。

里面有一个静态的数组,这里我已经把所有的定时器都清掉了,(当然也可以改):

const timerHardware_t timerHardware[] = {}

在里面加入PPM接收机决定使用的引脚和时钟通道等

const timerHardware_t timerHardware[] = {

    DEF_TIM(TIM2,  CH1, PA0,  TIM_USE_PPM , 0,0), //S1_IN

}

就完成了在PPM引脚的定义分配了。对应的还要有:

二、固定翼模式下的无刷电调的PWM输出通道的定时器和引脚,要留意,固定翼模式下,无刷电调的输出定时器不能和舵机PWM输出用同一个定时器的不同通道,所以我选择使用PB7, PB6这两个引脚,分别对应TIM4_CH2, TIM4_CH1,作为电调的PWM输出。而相应的,使用PA6、PA7、PB0、PB1及对应的TIM3_CH1、TIM3_CH2、TIM3_CH3、TIM4_CH4来作为4个舵机PWM输出。

于是修改过的timerHardware[] 像下面:

const timerHardware_t timerHardware[] = {

    DEF_TIM(TIM2,  CH1, PA0,  TIM_USE_PPM , 0,0), //S1_IN

    DEF_TIM(TIM4,  CH2, PB7,  TIM_USE_MC_MOTOR | TIM_USE_FW_MOTOR,  0, 0),        // S5_OUT MOTOR, SERVO or LED

    DEF_TIM(TIM1,  CH1, PB6,  TIM_USE_MC_MOTOR | TIM_USE_FW_MOTOR,                0, 0), // S6_OUT

    DEF_TIM(TIM3,  CH1, PA6,  TIM_USE_MC_MOTOR | TIM_USE_MC_SERVO | TIM_USE_FW_SERVO,               0, 0), // S1_OUT D1_ST7

    DEF_TIM(TIM3,  CH2, PA7,  TIM_USE_MC_MOTOR | TIM_USE_MC_SERVO | TIM_USE_FW_SERVO | TIM_USE_LED,               0, 0), // S2_OUT D1_ST2

    DEF_TIM(TIM3,  CH3, PB0,  TIM_USE_MC_MOTOR | TIM_USE_FW_SERVO,               0, 0), // S3_OUT D1_ST6

    DEF_TIM(TIM3,  CH4, PB1,  TIM_USE_MC_MOTOR | TIM_USE_FW_SERVO,               0, 0), // S4_OUT D1_ST1

}

timerHardware还包括了软串口的定义等。

完成定时器引脚使用和分配后,接下来要修改target.h来决定固件有多少功能和接口要用。

一般来说,原来从其它TARGET抄来的target.h基本都可以清除或注释掉,在这个开发板上,我计划用一个I2C接口来串接姿态传感器(运动传感器)MPU6050,大气压力传感器BMP280,如果有可能,还可以接上HMC5883磁盘盘(多轴飞行器需要使用磁罗盘),SPI口就不需要了,然后可以使用到的片上UART只有两个,其中一个将用来接GPS,另一个可以留来接蓝牙模块以方便现场调机。因此基于串口的其它功能包括遥测输出、图传控制都可以不计划使用了。

target.h文件里主要还要定义几样硬件相关的内容(宏定义):

飞控板的识别,这个自己命名就好了,我这里命名为FLYESF401

FLASH_PAGE_SIZE  STM32芯片的内部flash容量,以字节为单位,所以是0x4000,256KB.

HSE_VALUE 板上晶振的频率,这个非常重要,没有定义时,默认会用8MHz,而实际板上的晶振是25MHz,会引起固件无法启动。

LED0的引脚, 这里用了板上的LED指示灯,使用的是PC13

BEEPER的引脚,选一个可用的GPIO脚就行了,我选择的是PA14

所以target.h从progma once开始就如下:

#pragma once

#ifndef FLYESF401

#define FLYESF401

#endif

#define FLASH_PAGE_SIZE ((uint32_t)0x4000)

#ifndef HSE_VALUE

#define HSE_VALUE 25000000

#endif


 

#define TARGET_BOARD_IDENTIFIER "FY40"

#define USBD_PRODUCT_STRING "FlyYes!401"


 

#define LED0                    PC13

#define BEEPER                  PA4

//#define BEEPER_INVERTED

//#define USE_I2C_PULLUP

#define USE_I2C

后面的,可以直接参考仓库里的,主要就是启动需要的功能,去掉不需要的功能。

定制到这里,还是不能编译链接出可用的固下来的,接下来要去定制链接的flash布局和功能选择开关,后续。

后记:

一些小细节

3.3V 到 5V的电平转换有点多余,大部分外设都支持 3.3V的电平工作。

时间过去很久了,iNav也已经升级过了第7版,虽然很多模友还在用2.6和2.5这些上古版本,再继续纠缠在2.5.2上的必要性也不高了。

后来的iNav一是砍掉了PPM输入,但是SBUS需要外接反相电路,而IBUS输入默认的又不能识别到信号中断,有点尴尬。

而且后期版本的iNav体积更大,要修整到F401CCU6这种只有256KBFLASH空间的芯片中也很有难度。

iNav 4以后,PCA9685外接16路PWM驱动板也被从代码中清出去了,对于引脚少的开发板来说,更是雪上加霜,需要用多个舵机时(比如常规布局的固定翼航模)解决的办法可以又用一个串口输出SBUS并使用SBUS扩展板来,某宝16路的SBUS扩展板大约是80元左右,以于玩十元级别单片机的DIY玩家来说,又更尴尬了。

期中还试过移植到其它单片机上,不过比起用STM32或是AT32这类MCU的情况来,还是STM32外设接口更为丰富。

于是最后入手了STM32F411开发板打算再次跟上新版本的脚步,这个移植难度就低得多了,毕竟本来就有使用F411芯片的好些飞控产品。

因此这个笔记也就到此为止了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值