|
四軸飛行器完整源代碼,分享給有需要的朋友。
1, MiniFly Master:包含MiniFly主機(jī)芯片STM32F411源碼、芯片NRF51822源碼。
2, MiniFly Remoter:包含遙控器遙控器芯片STM32F103源碼。
0.png (36.15 KB, 下載次數(shù): 57)
下載附件
2018-10-17 14:22 上傳
單片機(jī)源程序如下:
- #include <string.h>
- #include "sys.h"
- #include "delay.h"
- #include "config.h"
- #include "led.h"
- #include "iap.h"
- #include "protocol.h"
- #include "check.h"
- #include "stmflash.h"
- #include "hw_config.h"
- #include "key.h"
- /********************************************************************************
- * 本程序只供學(xué)習(xí)使用,未經(jīng)作者許可,不得用于其它任何用途
- * ALIENTEK MiniFly
- * main.c
- * 正點(diǎn)原子@ALIENTEK
- * 版本:V1.0
- * 版權(quán)所有,盜版必究。
- * Copyright(C) 廣州市星翼電子科技有限公司 2014-2024
- * All rights reserved
- ********************************************************************************/
- extern _usb_usart_fifo uu_rxfifo;
- const u8 HexTable[] ={
- '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
- };
- //設(shè)備信息緩存
- u8 DeviceInfoBuffer[13];
- #define DEVICE_INFO_BUFFER_SIZE (sizeof(DeviceInfoBuffer)/sizeof(u8))
- //轉(zhuǎn)換字符串的buffer
- u8 RecieveBuf[10];
- #define IAP_BUFFER_SIZE 2048
- //iap 緩存
- u8 ipap_buf[IAP_BUFFER_SIZE];
- //定義一幀協(xié)議
- TransportProtocol_Typedef TransportProtocol;
- //判斷進(jìn)行固件升級(jí)還是跳轉(zhuǎn)APP
- void isUpgradeFirmware(void)
- {
- if(READ_KEY_L() == 0)
- {
- delay_ms(1500);
- if(READ_KEY_L() != 0)
- {
- iap_load_app(FIRMWARE_START_ADDR);
- }
- }
- else
- {
- iap_load_app(FIRMWARE_START_ADDR);
- }
- LED_BLUE = 0;
- }
- //得到設(shè)備信息
- void GetDeviceInfo(void)
- {
- u8 i=0;
- u16 buf = 1;
-
- STMFLASH_Read(CONFIG_PARAM_ADDR, &buf, 1);
- DeviceInfoBuffer[0] = (u8)buf; //軟件版本 11表示V1.1
- for(i=1;i<=12;i++)
- DeviceInfoBuffer[i]=*(vu32*)(0x1FFFF7E8+i); //軟件序列號(hào)
- }
- //一個(gè)字節(jié)轉(zhuǎn)換為16進(jìn)制字符形式的字符串
- void OneByteToStr(u8 byte,u8* str)
- {
- *str = HexTable[byte/16];
- str++;
- *str = HexTable[byte%16];
- str++;
- *str = 0;
- }
- //多個(gè)字節(jié)轉(zhuǎn)化為16進(jìn)制字符形式的字符串并以空格隔開
- void MultiByteToStr(u8 *byteBuf,u16 len,u8 *str)
- {
- while(len--)
- {
- *str = HexTable[(*byteBuf)/16];
- str++;
- *str = HexTable[(*byteBuf)%16];
- str++;
- *str = ' ';
- str++;
- byteBuf++;
- }
- *str = 0;
- }
- //extern void usbIapResponse(uint8_t* buf, uint32_t len);
- //用來響應(yīng)上位機(jī)
- void IAP_Response()
- {
- TransportProtocol.Device_Address = 0x01; //設(shè)備地址
- TransportProtocol.Sequence = TransportProtocol.Sequence; //幀序列 和收到的一致,這里不改變
- TransportProtocol_Manager.Packed(); //打包
- usbsendData(TransportProtocol_Manager.Buf, TransportProtocol_Manager.FrameTotalLength);
- }
- int main()
- {
- u16 t = 0;
- u32 timeOut = 0;
- u32 revcnt = 0;
- u16 oldcount = 0;
- u8 IsTransportOK = 0; //標(biāo)記代碼是否傳輸完畢
- TransportProtocol_Result res; //傳輸結(jié)果
- u32 Flash_App_Pos = FIRMWARE_START_ADDR;//用來記錄代碼更新的地址
-
- ledInit();
- keyInit();
- delay_init();
- isUpgradeFirmware(); /*判斷是否要固件升級(jí)*/
- usb_vcp_init();
-
- //初始化傳輸協(xié)議 指向串口接收緩沖區(qū) 選擇sum的校驗(yàn)方式
- TransportProtocol_Init(&TransportProtocol, uu_rxfifo.buffer, Checksum_Sum);
-
- while(1)
- {
- if(uu_rxfifo.writeptr)
- {
- if(oldcount == uu_rxfifo.writeptr)//新周期內(nèi),沒有收到任何數(shù)據(jù),認(rèn)為本次數(shù)據(jù)接收完成.
- {
- //獲取接收的總字節(jié)數(shù)
- TransportProtocol_Manager.RecieveByteCount = uu_rxfifo.writeptr;
- //解包
- res = TransportProtocol_Manager.Unpacked();
- if(res!=UPACKED_SUCCESS) //解包失敗的時(shí)候,不響應(yīng)上位機(jī),上位機(jī)會(huì)自動(dòng)重發(fā)
- {
- OneByteToStr(res,RecieveBuf);
- }
- else //解包成功 每接收到2K字節(jié)則寫入一次FLASH 所以上位機(jī)最大有效數(shù)據(jù)長度最好和2K成倍數(shù)關(guān)系
- {
- if(TransportProtocol.Function_Type==0x01) //該幀為發(fā)送的文件數(shù)據(jù)
- {
- if(TransportProtocol.Data_Length==0)
- {
- IsTransportOK = 1; //代碼傳輸完畢
- iap_write_appbin(Flash_App_Pos,ipap_buf,revcnt);//更新FLASH代碼
- revcnt = 0;
- Flash_App_Pos=FIRMWARE_START_ADDR; //恢復(fù)到原來的起始地址
- }else
- {
- if(IsTransportOK==0) //可以將代碼寫入falsh
- {
- memcpy(ipap_buf+revcnt,TransportProtocol.Data,TransportProtocol.Data_Length);
- revcnt += TransportProtocol.Data_Length;
- if(revcnt>=IAP_BUFFER_SIZE)
- {
- revcnt =0;
- iap_write_appbin(Flash_App_Pos,ipap_buf,IAP_BUFFER_SIZE);//更新FLASH代碼
- Flash_App_Pos += IAP_BUFFER_SIZE;
- }
- }
- }
- TransportProtocol.Data_Length = 0; //有效數(shù)據(jù)大小
- TransportProtocol.Data = 0; //要發(fā)送的數(shù)據(jù)
- TransportProtocol.Function_Type = 0x01; //幀功能
- }else if(TransportProtocol.Function_Type==0x05) //該幀為查詢?cè)O(shè)備信息的功能
- {
- GetDeviceInfo();
- TransportProtocol.Data_Length = DEVICE_INFO_BUFFER_SIZE; //有效數(shù)據(jù)大小
- TransportProtocol.Data = (u8*)DeviceInfoBuffer; //要發(fā)送的設(shè)備信息
- TransportProtocol.Function_Type = 0x05; //幀功能
- }
- IAP_Response(); //響應(yīng)上位機(jī)
- }
- uu_rxfifo.writeptr=0;
- }else
- {
- oldcount = uu_rxfifo.writeptr;
- }
- timeOut = 0; //超時(shí)清零
-
- }else
- {
- delay_ms(60);
- if(IsTransportOK == 1 || timeOut++ > 1000) /*60S 超時(shí)退出bootloader*/
- {
- timeOut = 0;
- iap_load_app(FIRMWARE_START_ADDR);
- }
- if(++t >= 10)
- {
- t = 0;
- LED_BLUE = !LED_BLUE;
- }
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
4 , MiniFly V1.2.1.zip
(4.45 MB, 下載次數(shù): 120)
2018-10-17 10:31 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|