pixhawk px4 飞行模式切换器
- 格式:docx
- 大小:18.08 KB
- 文档页数:7
PIXHAWK飞控概览Pixhawk飞控的技术规格、接口分配、PWM,PPM-SUM和SBUS模式下的舵机与电调的连接方法、接口图,和与其他常见飞控的区别与选择。
技术规格•处理器32位 STM32F427 ARM Cortex M4 核心外加 FPU(浮点运算单元)168 Mhz/256 KB RAM/2 MB 闪存32位 STM32F103 故障保护协处理器•传感器Invensense MPU6000 三轴加速度计/陀螺仪ST Micro L3GD20 16位陀螺仪ST Micro LSM303D 14位加速度计/磁力计MS5611 MEAS 气压计•电源良好的二极管控制器,带有自动故障切换舵机端口7V高压与高电流输出所有的外围设备输出都有过流保护,所有的输入都有防静电保护•接口5个UART串口,1个支持大功率,两个有硬件流量控制Spektrum DSM/DSM2/DSM-X 卫星输入Futaba SBUS输入(输出正在完善中)PPM sum 信号RSSI(PWM或者电压)输入I2C, SPI, 2个CAN, USB3.3 与 6.6 ADC 输入•尺寸重量 38g宽 50 mm高 15.5 mm长 81.5 mmPixhawk 的接口分配PWM,PPM-SUM和SBUS模式下的舵机与电调的连接方法Pixhawk 接口图上图中针脚1在右边串口 1 (Telem 1),串口 2 (Telem 2) ,串口 (GPS) 针脚: 6 = GND, 5 = RTS, 4 = CTS, 3 = RX, 2 = TX, 1 = 5V.选择哪款飞控? APM 、PX4,还是 PIXHAWK•APM2.5与2.6是传统ardupilot飞控的最新(也是最终)版本:APM25 与 26 概览•PX4FMU与PX4IO 是这个新飞控家族的最初两个版本:Px4FMU 概览与 Px4IO 概览•Pixhawk是根据我们的需要,结合PX4FMU / PX4IO改进而开发出的PX4飞控的单块电路板版本。
论坛/forum.php版本时间说明修订者0.12014-8-10起草目录wikiuavPIXHAWk简介参考网址/目录一、PIXHAWK飞控简介及使用说明 (2)二、PIXHAWK插脚引线介绍 (14)三、PIXHAWK飞控板原理图 (15)四、PIXHAWK与电机、电调的连接图 (28)论坛/forum.php采用PIXHAWK2.4.5作为飞行控制器,它是世界上最出名的开源飞控的硬件厂商3DR最新推出了最新一代飞控系统,其前身是APM,由于APM的处理器已经接近满负荷,没有办法满足更复杂的运算处理,所以硬件厂商采用了目前最新标准的32位ARM处理器,第一代产品是PX4系列,他分为飞控处理器PX4FMU和输入输出接口板PX4IO。
PX4系列可以单独使用PX4FMU,但是接线很复杂,也可以配合输入输出接口板PX4IO来使用,但是因为没有统一的外壳,不好固定,再加上使用复杂,所以基本上属于一代实验版本。
通过PX4系列的经验,厂商终于简化了结构,把PX4FMU和PX4IO整合到一块板子上,并加上了骨头形状的外壳,优化了硬件和走线,也就是这款第二代产品PIXHAWK。
一、PIXHAWK飞控简介及使用说明PIXHAWK的所有硬件都是透明的,它用的是什么芯片和传感器一目了然,所有的总线和外设都进行引出,不但以后可以兼容一些其他外设,而且对于有开发能力的用户提供了方便。
PIXHAWK是一个双处理器的飞行控制器,一个擅长于强大运算的32bit STM32F427 Cortex M4核心168MHz/256KB RAM/2MB Flash处理器,还有一个主要定位于工业用途的协处理器32bit STM32F103,它的特点就是安全稳定。
所以就算主处理器死机了,还有一个协处理器来保障安全。
1)特性●核心MCU性能:168MHz/252MIPS Cortex-M4F;●输出能力:14PWM/舵机输出(其中8个带有失效保护功能,可人工设定。
Qgroundconttol/PX4 fly stack中文使用手册编辑:@薛定谔的猫翻译:@斑斑点点校对:@薛定谔的猫原文地址:https://donlakeflyer.gitbooks.io/qgroundcontrol-user-guide/content/ 翻译修订针对开发者内容略有删减。
目录概述 1.1 快速入门 1.2 下载和安装 1.3 飞行 1.4 任务计划 1.5 配置调试 1.6 固件 1.6.1 机架类型 1.6.2 遥控器 1.6.3 传感器 1.6.4 飞行模式 1.6.5 电源 1.6.6 电机 1.6.7 安全设置 1.6.8 调试 1.6.9 相机 1.6.10 参数 1.6.11 设置 1.7 支持 1.8QGroundControlQGroundControl为加载了了ArduPilot 或 PX4 的载具提供全面的飞行控制和载具设置。
QGroundControl 的目标是简化新用户的使用,同时为有经验的用户提供高端功能支持。
QGroundControl 功能:●为安装了ArduPilo或PX4 Pro的载具提供完善的配置支持●无人飞行任务规划●在飞行地图上显示载具位置、飞行轨迹、航点和仪表盘●叠加仪表视图的视频流显示●为任何MAVLink的载具提供飞行支持●IMAV和EMAV比赛的比赛验证QGroundControl 可以在Window、OS X以及Linux 平台,比如iOS或Android 设备上运行This is QGroundControl第一步是下载和安装。
在主界面上可以访问QGC的主要功能,:例如配置无人机,计划并监视飞行任务。
应用设置配置QGroundControl功能安装配置与调试载具任务规划创建无人任务飞行在飞行时监视载具状态和视频流Quick start连接载具如果你通过USB线缆、数传电台,或者WIFI连接你的载具,在大多数情况下都并不需要做更多的操作,QGC会自动识别你的载具并连接。
飞行模式中文意思:0:Stabilize自稳,1:Acro特技,2:AltHold定高,3:Auto自动,4:Guided引导,5:Loiter留待(常叫悬停),6:RTL返航,7:Circle绕圈,9:Land降落,11:Drift飘移,13:Sport运动,14:Flip翻转,15:AutoTune自动调参,16:PosHold定点,17:Brake暂停M:Copter中有14种飞行模式可供选择,有10种是常用的。
你可以按照下列流程进行设定:1.打开你的遥控发射机2·连接APM/PX4至Mission Planner3·进入Initial Setup(初始设置)> Mandatory Hardware(必备硬件)> Flight Modes(飞行模式)界面·注意下,切换发射机的飞行模式开关(通道5),绿色高光就会移动到不同的位置。
·使用每行的下拉菜单选择飞行模式应用到这个开关位置上,确保至少有一个开关位置是给自稳的。
·而且可以为这个开关位置选中简单模式复选框。
如果使用的是AC3.1或更新版本,你也可以设为超简单模式。
如果简单模式和超简单模式同时被选中,那么会使用超简单模式。
建议第一次使用不要打开简单模式或者超简单模式,设置不好飞机会自旋!·当完成时点击“保存模式”按钮。
飞行模式注解1、稳定模式Stabilize稳定模式是使用得最多的飞行模式,也是最基本的飞行模式,起飞和降落都应该使用此模式。
此模式下,飞控会让飞行器保持稳定,是初学者进行一般飞行的首选,也是FPV第一视角飞行的最佳模式。
一定要确保遥控器上的开关能很方便无误地拨到该模式,应急时会非常重要。
2、比率控制模式Acro这个是非稳定模式,这时apm将完全依托遥控器遥控的控制,新手慎用。
3、定高模式ALT_HOLD定高模式(AltHold)是使用自动油门,试图保持目前的高度的稳定模式。
特技模式Acro Mode特技模式•特技模式是仅基于速率控制的模式。
•特技模式提供了遥控器摇杆到飞行器电机之间的最直接的控制关系。
•在特技模式下飞行,就像是不装飞控的遥控直升机一样,需要持续不断的手工摇杆操作。
细节特技模式有两种类型:默认的模式是基于地面坐标系的比率控制(AXIS_ENABLE = 1)。
第二是基于飞行器本体三个轴的转速比率控制(AXIS_ENABLE = 0)。
由于自我平衡能力不好,不建议用这种高难度模式飞行。
•特技模式下飞行器的滚转、俯仰、偏航三个轴的角速率由摇杆偏移角度来控制。
•摇杆居中意味着保持当前角度的姿态。
缺省模式也可以设置成为在摇杆居中的时候把飞行器控制到水平姿态。
•纵倾和侧倾的控制杆会使飞行器在相应的方向产生相应的倾斜角。
•为了使飞行器重新恢复水平,各轴摇杆需要向相反方向推。
•为了维持飞行水平,各轴控制摇杆需要不停地调整。
•缺省模式有两个参数。
以百分比的形式表示,各自乘以当前的滚转角和俯仰角,然后得到回到水平位置所需要的角速度。
•偏航控制杆的操纵方式,同稳定状态下的操纵方式相同。
•油门杆也是直接按照杆量加速或者减速控制控制四个电机。
•油门也需要不停地修正以维持飞行高度。
调试:•AXIS_ENABLE = 1 时的控制器基本上是转速比率控制稳定模式,有一些有用的功能。
有两个参数控制•ACRO_BAL_ROLL配置:•Beginner 200•Intermediate 100•Expert 0.•ACRO_BAL_PITCH配置:•Beginner 200•Intermediate 0•Expert 0.•参数ACRO_P:映射控制杆到所需的速度旋转。
•例如:ACRO_P等于4 就每秒转180°即4乘45°等于180°(4是最大值)。
•降低ACRO_P值,旋转速度变慢。
•稳定速率控制PID是•PID用在稳定模式作为主要角度控制参数。
•Rate_P是用于控制飞机振动程度。
一、固定翼起飞:
1.Mp内设置好飞行任务
2.数传连接电脑、飞机
3.Mp检查飞机数据是否正常
4.遥控器混控拨到增稳模式
5.油门最大,抛飞固定翼
6.手动油门、方向飞行至120米高度,然后遥控器混控拨到返航模式,此后飞机绕圈飞行
至设定高度210米,继续水平绕圈飞行。
7.等机头朝向测区方向后,遥控器拨至AUTO模式,飞机执行任务,自动飞向测区。
8.关闭遥控器,混控模式调整到返航模式。
二、固定翼降落:
1.飞机返航至HOME点,210高度绕圈飞行,通过地面站调整飞机高度90、70、50、40等。
2.最终通过地面站飞机时速调整到20公里,然后遥控器混控调整到增稳模式。
3.当飞机机头即将朝向降落跑道,然后混控拨至增稳模式,人工接受飞机,控制油门和方向,降落飞机。
注意:混控只设置三个模式:增稳、返航、AUTO自动。
1.。
___________________________________________信息记录材料2021年5月第22卷第5期(信息:技术与应用]Pixhawk飞控在无人机中的应用研究卢孟常(贵州航天职业技术学院贵州遵义563000)【摘要】飞行控制器(飞控)作为无人机的控制大脑,是无人机能保持稳定飞行姿态的核心部件,Pixhawk飞控是一款性能优良的开源飞控,因其性能稳定、通用性强以及价格低廉等优势得到了广泛的应用。
本文以Pixhawk飞控为研究对象,对在无人机调试中的故障成因、功能应用等问题进行研究,给使用者提供一定的参考价值。
【关键词】无人机;Pixhawk飞控;调试;故障分析【中图分类号】TP39【文献标识码】A【文章编号】1009-5624(2021)05-0151-031引言Pixhawk系列飞控一经推出就广受好评,这主要得益于其硬件和软件完全开源且功能强大,无人机设计公司和无人机爱好者可以来做应用研究和二次开发。
因该飞控系列产品还在不断推陈出新,性能在不断完善,在利用软件进行调参时,相对其他飞控产品较复杂,易出现无法解锁、调试失败的情况,这就需要使用者对飞控的应用功能和调试故障进行深度分析、总结发生问题的成因,针对以上问题,本文做了一定程度的归纳和总结。
2Pixhawk飞控简介目前市场上的无人机飞控品牌繁多,比如:大疆、零度智控、极翼、APM和PIX(Pixhawk)等,其硬件结构基本都集成了陀螺仪、加速度计、磁力计、GPS、气压计等,这些传感器与飞控的MCU以及伺服机构控制单元共同配合控制,保证了无人机飞行姿态的稳定「Pixhawk飞控是著名飞控厂商3DR推出的新一代开源、高效的飞行控制器[1]。
功能上支持多旋翼、固定翼和直升机等多种无人机型,配合Mission Planner地面站软件使用,可以完成对飞控的在线烧写固件、调参,使用无线数据传输系统建立地面站与自驾仪之间的通信,构建了一套无人机自动控制系统[2]oPixhawk飞控的前身是APM飞控,后面通过传感器和主控芯片的升级推出了PX4,在PX4的基础上又推出了PixhawkoPixhawk的飞行控制器采用的是双处理器结构,即由一个主处理器和一个备用处理器构成,这样设计的好处是当主处理器出现异常死机,备用处理器可以接管过来继续正常工作,极大地保障了系统的可靠性和稳定性。
请注意:1.PIXHAWK解锁前要先安装安全开关,上电解锁前要长按安全开关直到安全开关的灯常亮,如果一次按着不亮,可以松开再一直按着,多次操作直到安全开关常亮。
2.如果无安全开关,可以禁止关闭安全开关的功能。
修改BRD_SAFETYENABLE为0,改后记得点击右边的写入参数按钮,改后记得飞控断电,重新连接才起作用。
1. 在地面站要先校准遥控如果你遥控还没对码,记得一定要先对码。
2.确保接收机的线没接错,注意推动遥控要能对的上图片的红色字体,否则就是线错了。
3.遥控通道方向不可以反升降方向在地面站的方向和你遥控的升降方向是相反不一致的(比如遥控的升降通道往下,地面站看到的是往上),其他通道跟地面站一致,如果不是这样,就说明你通道方向错了,在遥控设置反过来,之后重新校准。
一定要重点查看上面这张图,通道方向错了,就没法解锁的。
如果遥控通道错了,在你自己的遥控设备的设置里,有个通道方向,反设置一下就可以了,记得设置后要重新再地面站校准遥控。
遥控有很多,具体设置方法就不说了,不明白的打开遥控设置,找一下,实在不明白的,就找遥控说明书。
5.飞行模式设置解锁最好使用自稳模式,室内不可以使用与GPS有关的飞行模式。
请查看地面站,确保你解锁使用的是自稳(stabilize)模式。
如果你使用自稳模式,还出现解锁需要GPS,那可能你在室内打开了地理围栏。
这个要先关闭地理围栏。
7.地面站检查确保地面站无任何错误,包括罗盘,加速度,遥控,如果这些有很地方任何一个报错,不健康的,都会无法解锁。
像这种情况,就是遥控没校准,这就是属于报错内容,有这类报错的,都会无法解锁,一定要先解决掉这些错误。
6解锁方法左手油门和右手油门解锁方法是不同的,请注意鉴别自己遥控器是哪种油门。
左手油门的遥控解锁是油门右下角拨,右手油门是油门最低,方向最右。
有些人拨遥控器只拨一下,这是不对,要一致按着知道解锁。
左手油门解锁如下:油门右下角一直按着。
#include "stm32f10x.h"#include "delay.h"#include "key.h"#include "dac.h"voidRCC_Configuration(void);voidGPIO_Configuration(void); voidNVIC_Configuration(void);voidDAC_Configuration(void);int main(void){u8 t;RCC_Configuration();NVIC_Configuration();GPIO_Configuration();DAC_Configuration();GPIO_SetBits(GPIOA, GPIO_Pin_4);DAC_OutVoltage(3);/* check all LED */GPIO_ResetBits(GPIOA, GPIO_Pin_0);GPIO_ResetBits(GPIOA, GPIO_Pin_1);GPIO_ResetBits(GPIOA, GPIO_Pin_2);GPIO_ResetBits(GPIOC, GPIO_Pin_13);GPIO_ResetBits(GPIOC, GPIO_Pin_14);GPIO_ResetBits(GPIOC, GPIO_Pin_15);Delayms(300);GPIO_SetBits(GPIOA, GPIO_Pin_0);GPIO_SetBits(GPIOA, GPIO_Pin_1);GPIO_SetBits(GPIOA, GPIO_Pin_2);GPIO_SetBits(GPIOC, GPIO_Pin_13);GPIO_SetBits(GPIOC, GPIO_Pin_14);GPIO_SetBits(GPIOC, GPIO_Pin_15);Delayms(300);GPIO_ResetBits(GPIOA, GPIO_Pin_0);GPIO_ResetBits(GPIOA, GPIO_Pin_1);GPIO_ResetBits(GPIOA, GPIO_Pin_2);GPIO_ResetBits(GPIOC, GPIO_Pin_13);GPIO_ResetBits(GPIOC, GPIO_Pin_14);GPIO_ResetBits(GPIOC, GPIO_Pin_15);Delayms(300);GPIO_SetBits(GPIOA, GPIO_Pin_0);GPIO_SetBits(GPIOA, GPIO_Pin_1);GPIO_SetBits(GPIOA, GPIO_Pin_2);GPIO_SetBits(GPIOC, GPIO_Pin_13);GPIO_SetBits(GPIOC, GPIO_Pin_14);GPIO_SetBits(GPIOC, GPIO_Pin_15);Delayms(300);GPIO_ResetBits(GPIOA, GPIO_Pin_0);GPIO_ResetBits(GPIOA, GPIO_Pin_1);GPIO_ResetBits(GPIOA, GPIO_Pin_2);GPIO_ResetBits(GPIOC, GPIO_Pin_13);GPIO_ResetBits(GPIOC, GPIO_Pin_14);GPIO_ResetBits(GPIOC, GPIO_Pin_15);Delayms(300);GPIO_SetBits(GPIOA, GPIO_Pin_0);GPIO_SetBits(GPIOA, GPIO_Pin_1);GPIO_SetBits(GPIOA, GPIO_Pin_2);GPIO_SetBits(GPIOC, GPIO_Pin_13);GPIO_SetBits(GPIOC, GPIO_Pin_14);GPIO_SetBits(GPIOC, GPIO_Pin_15);Delayms(300);while (1){t = KEY_Scan(0); //????switch(t) {case KEY0: //?????GPIO_SetBits(GPIOA, GPIO_Pin_0);GPIO_SetBits(GPIOA, GPIO_Pin_1);GPIO_SetBits(GPIOA, GPIO_Pin_2);GPIO_ResetBits(GPIOC, GPIO_Pin_13);GPIO_SetBits(GPIOC, GPIO_Pin_14);GPIO_SetBits(GPIOC, GPIO_Pin_15);DAC_OutVoltage(0.5);break;case KEY1: //?? LED0 ??GPIO_SetBits(GPIOA, GPIO_Pin_0);GPIO_SetBits(GPIOA, GPIO_Pin_1);GPIO_SetBits(GPIOA, GPIO_Pin_2);GPIO_SetBits(GPIOC, GPIO_Pin_13);GPIO_ResetBits(GPIOC, GPIO_Pin_14);GPIO_SetBits(GPIOC, GPIO_Pin_15);DAC_OutVoltage(1.0);break;case KEY2: //?? LED1 ??GPIO_SetBits(GPIOA, GPIO_Pin_0);GPIO_SetBits(GPIOA, GPIO_Pin_1);GPIO_SetBits(GPIOA, GPIO_Pin_2);GPIO_SetBits(GPIOC, GPIO_Pin_13);GPIO_SetBits(GPIOC, GPIO_Pin_14);GPIO_ResetBits(GPIOC, GPIO_Pin_15);DAC_OutVoltage(1.5);break;case KEY3: //???? LED0,LED1 ??GPIO_ResetBits(GPIOA, GPIO_Pin_0);GPIO_SetBits(GPIOA, GPIO_Pin_1);GPIO_SetBits(GPIOA, GPIO_Pin_2);GPIO_SetBits(GPIOC, GPIO_Pin_13);GPIO_SetBits(GPIOC, GPIO_Pin_14);GPIO_SetBits(GPIOC, GPIO_Pin_15);DAC_OutVoltage(2.0);break;case KEY4: //???? LED0,LED1 ??GPIO_SetBits(GPIOA, GPIO_Pin_0);GPIO_ResetBits(GPIOA, GPIO_Pin_1);GPIO_SetBits(GPIOA, GPIO_Pin_2);GPIO_SetBits(GPIOC, GPIO_Pin_13);GPIO_SetBits(GPIOC, GPIO_Pin_14);GPIO_SetBits(GPIOC, GPIO_Pin_15);DAC_OutVoltage(2.5);break;case KEY5: //???? LED0,LED1 ??GPIO_SetBits(GPIOA, GPIO_Pin_0);GPIO_SetBits(GPIOA, GPIO_Pin_1);GPIO_ResetBits(GPIOA, GPIO_Pin_2);GPIO_SetBits(GPIOC, GPIO_Pin_13);GPIO_SetBits(GPIOC, GPIO_Pin_14);GPIO_SetBits(GPIOC, GPIO_Pin_15);DAC_OutVoltage(3.0);break;default:Delayms(10);}}}voidRCC_Configuration(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);}voidGPIO_Configuration(void){GPIO_InitTypeDefGPIO_InitStructure;/* PC13/14/15 - LED */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);/* PA0/1/2 - LED */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);/* PB0/1/2/3/4/5 - KEY */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode= GPIO_Mode_IPU;GPIO_Init(GPIOB, &GPIO_InitStructure);/* PA4 - DAC1 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);}voidNVIC_Configuration(void){NVIC_InitTypeDefNVIC_InitStructure;}voidDAC_Configuration(void){DAC_InitTypeDefDAC_InitStructure;DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;DAC_Init(DAC_Channel_1, &DAC_InitStructure);DAC_Cmd(DAC_Channel_1, ENABLE);}#include "dac.h"voidDAC_OutVoltage(float voltage){uint16_t data;data = (uint16_t)((voltage/3.3)*4096);DAC_SetChannel1Data(DAC_Align_12b_R, data);//DAC_SoftwareTriggerCmd(DAC_Channel_1, ENABLE);}#include "key.h"#include "delay.h"u8 KEY_Scan(u8 mode){static u8 key_up = 1; //???????if (mode)key_up = 1; //????if(key_up&&(READ_KEY0==0||READ_KEY1==0||READ_KEY2==0||READ_KEY3==0||READ_KEY4== 0||READ_KEY5==0)){Delayms(10); //???key_up = 0;if(READ_KEY0 == 0)return KEY0;if(READ_KEY1 == 0)return KEY1;if(READ_KEY2 == 0)return KEY2;if(READ_KEY3 == 0)return KEY3;if(READ_KEY4 == 0)return KEY4;if(READ_KEY5 == 0)return KEY5;}else if(READ_KEY0==1 && READ_KEY1==1 && READ_KEY2==1 && READ_KEY3==1 && READ_KEY4==1 && READ_KEY5==1)key_up = 1;return 0; // ?????}#include "stm32f10x.h"#include "led.h"voidled_set (int id, int status){if (status == LED_ON){if (id == LED_GREEN)GPIO_ResetBits(GPIOB, GPIO_Pin_9);elseGPIO_ResetBits(GPIOB, GPIO_Pin_8);}else{if (id == LED_GREEN)GPIO_SetBits(GPIOB, GPIO_Pin_9);elseGPIO_SetBits(GPIOB, GPIO_Pin_8);} }。