单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1920|回复: 0
收起左侧

MiniFly四轴飞控完整源代码

[复制链接]
collapsar147 发表于 2018-10-17 10:31 | 显示全部楼层 |阅读模式
四轴飞行器完整源代码,分享给有需要的朋友。
1, MiniFly Master:包含MiniFly主机芯片STM32F411源码、芯片NRF51822源码。
2, MiniFly Remoter:包含遥控器遥控器芯片STM32F103源码。
0.png

单片机源程序如下:
  1. #include <string.h>
  2. #include "sys.h"
  3. #include "delay.h"
  4. #include "config.h"
  5. #include "led.h"
  6. #include "iap.h"
  7. #include "protocol.h"
  8. #include "check.h"
  9. #include "stmflash.h"
  10. #include "hw_config.h"
  11. #include "key.h"
  12. /********************************************************************************         
  13. * 本程序只供学习使用,未经作者许可,不得用于其它任何用途
  14. * ALIENTEK MiniFly
  15. * main.c       
  16. * 正点原子@ALIENTEK

  17. * 版本:V1.0
  18. * 版权所有,盗版必究。
  19. * Copyright(C) 广州市星翼电子科技有限公司 2014-2024
  20. * All rights reserved
  21. ********************************************************************************/

  22. extern _usb_usart_fifo uu_rxfifo;

  23. const u8 HexTable[] ={
  24. '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
  25. };


  26. //设备信息缓存
  27. u8 DeviceInfoBuffer[13];

  28. #define DEVICE_INFO_BUFFER_SIZE   (sizeof(DeviceInfoBuffer)/sizeof(u8))

  29. //转换字符串的buffer
  30. u8 RecieveBuf[10];

  31. #define IAP_BUFFER_SIZE 2048
  32. //iap 缓存
  33. u8 ipap_buf[IAP_BUFFER_SIZE];

  34. //定义一帧协议
  35. TransportProtocol_Typedef TransportProtocol;


  36. //判断进行固件升级还是跳转APP
  37. void isUpgradeFirmware(void)
  38. {
  39.         if(READ_KEY_L() == 0)
  40.         {
  41.                 delay_ms(1500);
  42.                 if(READ_KEY_L() != 0)
  43.                 {
  44.                         iap_load_app(FIRMWARE_START_ADDR);       
  45.                 }
  46.         }
  47.         else
  48.         {
  49.                 iap_load_app(FIRMWARE_START_ADDR);
  50.         }
  51.         LED_BLUE = 0;
  52. }

  53. //得到设备信息
  54. void GetDeviceInfo(void)
  55. {
  56.         u8 i=0;
  57.         u16 buf = 1;
  58.        
  59.         STMFLASH_Read(CONFIG_PARAM_ADDR, &buf, 1);
  60.         DeviceInfoBuffer[0] = (u8)buf;  //软件版本 11表示V1.1
  61.         for(i=1;i<=12;i++)
  62.                 DeviceInfoBuffer[i]=*(vu32*)(0x1FFFF7E8+i); //软件序列号
  63. }


  64. //一个字节转换为16进制字符形式的字符串
  65. void  OneByteToStr(u8 byte,u8* str)
  66. {
  67.         *str = HexTable[byte/16];
  68.         str++;
  69.         *str = HexTable[byte%16];       
  70.         str++;
  71.         *str = 0;
  72. }

  73. //多个字节转化为16进制字符形式的字符串并以空格隔开
  74. void MultiByteToStr(u8 *byteBuf,u16 len,u8 *str)
  75. {
  76.         while(len--)
  77.         {
  78.                 *str = HexTable[(*byteBuf)/16];
  79.                 str++;
  80.                 *str = HexTable[(*byteBuf)%16];
  81.                 str++;
  82.                 *str = ' ';
  83.                 str++;
  84.                 byteBuf++;
  85.         }
  86.         *str = 0;
  87. }

  88. //extern void usbIapResponse(uint8_t* buf, uint32_t len);

  89. //用来响应上位机
  90. void IAP_Response()
  91. {
  92.         TransportProtocol.Device_Address = 0x01;        //设备地址
  93.         TransportProtocol.Sequence = TransportProtocol.Sequence;        //帧序列 和收到的一致,这里不改变
  94.         TransportProtocol_Manager.Packed();                        //打包       

  95.         usbsendData(TransportProtocol_Manager.Buf, TransportProtocol_Manager.FrameTotalLength);       
  96. }

  97. int main()
  98. {
  99.         u16 t = 0;
  100.         u32 timeOut = 0;
  101.         u32  revcnt = 0;
  102.         u16 oldcount = 0;
  103.         u8 IsTransportOK = 0;   //标记代码是否传输完毕
  104.         TransportProtocol_Result res;        //传输结果
  105.         u32 Flash_App_Pos = FIRMWARE_START_ADDR;//用来记录代码更新的地址
  106.        
  107.         ledInit();
  108.         keyInit();
  109.         delay_init();
  110.         isUpgradeFirmware();         /*判断是否要固件升级*/
  111.         usb_vcp_init();
  112.        
  113.         //初始化传输协议  指向串口接收缓冲区  选择sum的校验方式
  114.         TransportProtocol_Init(&TransportProtocol, uu_rxfifo.buffer, Checksum_Sum);
  115.        
  116.         while(1)
  117.         {       
  118.                 if(uu_rxfifo.writeptr)
  119.                 {
  120.                         if(oldcount == uu_rxfifo.writeptr)//新周期内,没有收到任何数据,认为本次数据接收完成.
  121.                         {
  122.                                 //获取接收的总字节数
  123.                                 TransportProtocol_Manager.RecieveByteCount = uu_rxfifo.writeptr;
  124.                                 //解包
  125.                                 res = TransportProtocol_Manager.Unpacked();
  126.                                 if(res!=UPACKED_SUCCESS)  //解包失败的时候,不响应上位机,上位机会自动重发
  127.                                 {       
  128.                                         OneByteToStr(res,RecieveBuf);
  129.                                 }
  130.                                 else  //解包成功  每接收到2K字节则写入一次FLASH 所以上位机最大有效数据长度最好和2K成倍数关系
  131.                                 {       
  132.                                         if(TransportProtocol.Function_Type==0x01)  //该帧为发送的文件数据
  133.                                         {       
  134.                                                 if(TransportProtocol.Data_Length==0)
  135.                                                 {       
  136.                                                         IsTransportOK = 1;   //代码传输完毕

  137.                                                         iap_write_appbin(Flash_App_Pos,ipap_buf,revcnt);//更新FLASH代码
  138.                                                         revcnt = 0;

  139.                                                         Flash_App_Pos=FIRMWARE_START_ADDR;  //恢复到原来的起始地址
  140.                                                 }else
  141.                                                 {
  142.                                                         if(IsTransportOK==0)  //可以将代码写入falsh
  143.                                                         {
  144.                                                                 memcpy(ipap_buf+revcnt,TransportProtocol.Data,TransportProtocol.Data_Length);
  145.                                                                 revcnt += TransportProtocol.Data_Length;
  146.                                                                 if(revcnt>=IAP_BUFFER_SIZE)
  147.                                                                 {       
  148.                                                                         revcnt =0;
  149.                                                                         iap_write_appbin(Flash_App_Pos,ipap_buf,IAP_BUFFER_SIZE);//更新FLASH代码   
  150.                                                                         Flash_App_Pos += IAP_BUFFER_SIZE;
  151.                                                                 }
  152.                                                         }
  153.                                                 }       
  154.                                                 TransportProtocol.Data_Length = 0;            //有效数据大小
  155.                                                 TransportProtocol.Data = 0;                                           //要发送的数据      
  156.                                                 TransportProtocol.Function_Type = 0x01;                                //帧功能                       

  157.                                         }else if(TransportProtocol.Function_Type==0x05) //该帧为查询设备信息的功能
  158.                                         {       
  159.                                                 GetDeviceInfo();
  160.                                                 TransportProtocol.Data_Length = DEVICE_INFO_BUFFER_SIZE;       //有效数据大小
  161.                                                 TransportProtocol.Data = (u8*)DeviceInfoBuffer;                    //要发送的设备信息   
  162.                                                 TransportProtocol.Function_Type = 0x05;                                             //帧功能                                   
  163.                                         }       
  164.                                         IAP_Response();  //响应上位机                                               
  165.                                 }       

  166.                                 uu_rxfifo.writeptr=0;                                                               
  167.                         }else
  168.                         {
  169.                                 oldcount = uu_rxfifo.writeptr;       
  170.                         }
  171.                         timeOut = 0;        //超时清零
  172.                        
  173.                 }else
  174.                 {
  175.                         delay_ms(60);
  176.                         if(IsTransportOK == 1 || timeOut++ > 1000)        /*60S 超时退出bootloader*/
  177.                         {
  178.                                 timeOut = 0;
  179.                                 iap_load_app(FIRMWARE_START_ADDR);
  180.                         }                       
  181.                         if(++t >= 10)
  182.                         {
  183.                                 t = 0;
  184.                                 LED_BLUE = !LED_BLUE;
  185.                         }                                                       
  186.                 }               
  187.         }
  188. }
复制代码

所有资料51hei提供下载:
4 , MiniFly V1.2.1.zip (4.45 MB, 下载次数: 32)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|单片机论坛 |51黑电子论坛技术交流 QQ 管理员QQ:125739409;技术交流QQ群636986012

Powered by 单片机教程网

快速回复 返回顶部 返回列表