CF
准备
编译器
编译器可以在ARM官网下载,地址:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads
CF2.5版本需要使用7.2.1版本,下载时选择GNU Arm Embedded Toolchain: 7-2017-q4-major。
CF源码
位于Github上,地址:https://github.com/cleanflight/cleanflight。
编译
查看编译目标
$ make targets
编译NAZE
$ make TARGET=NAZE
...
Linking NAZE
Notice: STM32F1 based targets will be unsupported soon.
Memory region Used Size Region Size %age Used
FLASH: 128475 B 126 KB 99.57%
FLASH_CONFIG: 0 GB 2 KB 0.00%
RAM: 19056 B 20 KB 93.05%
MEMORY_B1: 0 GB 0 GB -nan%
text data bss dec hex filename
127199 1272 17784 146255 23b4f ./obj/main/cleanflight_NAZE.elf
Creating HEX ./obj/cleanflight_2.5.0_NAZE.hex
NAZE
NAZE硬件版本
NAZE头文件中定义了硬件版本号,不同版本硬件略有差异:
typedef enum nazeHardwareRevision_t {
UNKNOWN = 0,
NAZE32, // Naze32 and compatible with 8MHz HSE
NAZE32_REV5, // Naze32 and compatible with 12MHz HSE
NAZE32_SP // Naze32 w/Sensor Platforms
} nazeHardwareRevision_e;
三种硬件类型中,NAZE32为Rev4及之前版本,NAZE32_SP为REV5的升级版,此版本在REV5的基础上增加了SPI Flash。
| 项目 | REV5之前版本 | REV5版本 |
|---|---|---|
| Buzzer驱动 | 使用开漏的PNP管驱动 | 使用NPN管驱动 |
| MAG_INT | PB12 | PC14 |
| MPU_INT | PB13 | PC13 |
| ACC_ADXL345 | 不支持 | 支持 |
注:NAZE_SP版本如果启用了UART3,那么就不能使用I2C设备了。所以NAZE配置文件中默认不启用UART3。
NAZE中定义使用I2C2,对应SCL引脚为PB10,SDA引脚为PB11:
#define USE_I2C
#define USE_I2C_DEVICE_2
#define I2C_DEVICE (I2CDEV_2)
确定硬件版本
不同版本的是根据PC15引脚决定的,在lib\main\STM32F4\Drivers\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rcc.文件中实现如下:
void SetSysClock(bool overclock)
{
#if defined(CJMCU)
RCC_CFGR_PLLMUL = RCC_CFGR_PLLMULL9;
#else
RCC_CFGR_PLLMUL = GPIOC->IDR & GPIO_IDR_IDR15 ? hse_value = 12000000, RCC_CFGR_PLLMULL6 : RCC_CFGR_PLLMULL9;
#endif
}
NAZE硬件根据PC15引脚的值决定HSE外部晶振频率,当拉高时为12MHz,否则为8Mhz。接下来在硬件检测函数中,根据外部晶振频率决定硬件版本,REV5为12MHz。
void detectHardwareRevision(void)
{
if (hse_value == 8000000)
hardwareRevision = NAZE32;
else if (hse_value == 12000000)
hardwareRevision = NAZE32_REV5;
}
NAZE配置文件中定义了USE_HARDWARE_REVISION_DETECTION,在硬件检测完成后还会调用updateHardwareRevision更新硬件版本,这个函数中根据是否检测到SPI硬件决定将REV5硬件类型升级为NAZE32_SP:
void updateHardwareRevision(void)
{
#ifdef USE_SPI
uint8_t detectedSpiDevice = detectSpiDevice();
if (detectedSpiDevice == SPI_DEVICE_MPU && hardwareRevision == NAZE32_REV5)
hardwareRevision = NAZE32_SP;
#endif
}
浙公网安备 33010602011771号