移植mavlink到stm32詳細教程,後面附快速移植方法

一:準備材料: mavlink源碼 stm32串口程序python

   1.mavlink源碼:
            
            
           b.下拉到MAVLink Code and Generator點擊MAVLink Generator (C/C++, Python)下載源碼生成器          
                
 
             c.解壓縮下載的文件,點擊mavgenerate.py這個文件(前提是已經安裝好了python軟件)
                
             d.xml是生成的源文件,out是生成的目錄 langguage是生成的代碼語言。
                xml:mavlink-master/message_definitions/v1.0/common.xml
                out:D:/Backup/桌面/mav
                langguage:C
                protocol:1.0
                
                點擊generate就能生成相應的文件到out目錄裏去
                
     2.stm32串口代碼選用正點原子的串口代碼,將生成的文件新建一個MAVLINK文件夾添加到工程裏去(添加文件,添加頭文件)
            
             
                     其中manlink_avoid_errors.h是我本身添加的用來解決報錯的文件,儘可能將更改添加到這個文件,方便之後移植
              
 二:準備移植
    將準備好的工程編譯,會出現一堆錯誤("..\OBJ\USART.axf" - 30 Error(s), 17 Warning(s).),別急,一個一個解決就行了
 
    錯誤1:..\MAVLINK\common\../mavlink_types.h(53): error:  #20: identifier "pack" is undefined
    解決方法:這個錯誤是由於對齊方式的緣由,由於gun編譯跟mdk有些差別,具體我沒有深究。
    屏蔽mavlink_types.h中的以下代碼
  1. // Macro to define packed structures
  2. //#ifdef __GNUC__
  3. // #define MAVPACKED( __Declaration__ ) __Declaration__ __attribute__((packed))
  4. //#else
  5. // #define MAVPACKED( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) )
  6. //#endif
     在  mavlink_avoid_errors.h中加入以下代碼(意思就是讓MAVPACKED不起任何做用)
  1. #define MAVPACKED( __Declaration__ ) __Declaration__
    編譯後:"..\OBJ\USART.axf" - 30 Error(s), 7 Warning(s).
 
 
    錯誤2:..\MAVLINK\common\../mavlink_types.h(53): error:  #3092: anonymous unions are only supported in --gnu mode, or when enabled with #pragma anon_unions
    解決方法:根據錯誤提示在 mavlink_avoid_errors.h中添加以下代碼
  1. #pragma anon_unions
     編譯後:"..\OBJ\USART.axf" - 30 Error(s), 8 Warning(s).
 
 
 
    錯誤3:..\MAVLINK\common\../checksum.h(34): warning:  #260-D: explicit type is missing ("int" assumed)
     解決方法: 包括後面不少錯誤都有共同點,指向有inline的行,這裏是由於mdk中沒法識別inline,從新定義inline就好
    在 mavlink_avoid_errors.h中加入以下代碼(由於mdk認識__INLINE)
  1. #defineinline __INLINE
     編譯後:"..\OBJ\USART.axf" - 4 Error(s), 195 Warning(s).
 
 
 
   錯誤4:..\MAVLINK\common\../mavlink_conversions.h(167): error:  #268: declaration may not appear after executable statement in block
    解決方法:這個錯誤是由於將參數定義到了函數後面了。
    更改mavlink_conversions.h中的代碼爲
  1. MAVLINK_HELPER void mavlink_dcm_to_quaternion(constfloat dcm[3][3],float quaternion[4])
  2. {
  3. int dcm_j,dcm_k;
  4. float s;
  5. float tr = dcm[0][0]+ dcm[1][1]+ dcm[2][2];
  6. if(tr >0.0f){
  7. float s = sqrtf(tr +1.0f);
  8. quaternion[0]= s *0.5f;
  9. s =0.5f/ s;
  10. quaternion[1]=(dcm[2][1]- dcm[1][2])* s;
  11. quaternion[2]=(dcm[0][2]- dcm[2][0])* s;
  12. quaternion[3]=(dcm[1][0]- dcm[0][1])* s;
  13. }else{
  14. /* Find maximum diagonal element in dcm
  15. * store index in dcm_i */
  16. int dcm_i =0;
  17. int i;
  18. for(i =1; i <3; i++){
  19. if(dcm[i][i]> dcm[dcm_i][dcm_i]){
  20. dcm_i = i;
  21. }
  22. }
  23. dcm_j =(dcm_i +1)%3;
  24. dcm_k =(dcm_i +2)%3;
  25. s = sqrtf((dcm[dcm_i][dcm_i]- dcm[dcm_j][dcm_j]-
  26. dcm[dcm_k][dcm_k])+1.0f);
  27. quaternion[dcm_i +1]= s *0.5f;
  28. s =0.5f/ s;
  29. quaternion[dcm_j +1]=(dcm[dcm_i][dcm_j]+ dcm[dcm_j][dcm_i])* s;
  30. quaternion[dcm_k +1]=(dcm[dcm_k][dcm_i]+ dcm[dcm_i][dcm_k])* s;
  31. quaternion[0]=(dcm[dcm_k][dcm_j]- dcm[dcm_j][dcm_k])* s;
  32. }
  33. }
   更改mavlink_helpers.h中的代碼爲
  1. MAVLINK_HELPER uint16_t mavlink_msg_to_send_buffer(uint8_t*buffer,constmavlink_message_t*msg)
  2. {
  3. uint8_t*ck;
  4. memcpy(buffer,(constuint8_t*)&msg->magic, MAVLINK_NUM_HEADER_BYTES +(uint16_t)msg->len);
  5. ck = buffer +(MAVLINK_NUM_HEADER_BYTES +(uint16_t)msg->len);
  6. ck[0]=(uint8_t)(msg->checksum &0xFF);
  7. ck[1]=(uint8_t)(msg->checksum >>8);
  8. return MAVLINK_NUM_NON_PAYLOAD_BYTES +(uint16_t)msg->len;
  9. }
   編譯後:"..\OBJ\USART.axf" - 0 Error(s), 195 Warning(s).
 
    警告:..\MAVLINK\common\./mavlink_msg_heartbeat.h(261): warning:  #191-D: type qualifier is meaningless on cast type
    解決方法:按照提示跟蹤錯誤到protocol.h,
    更改 protocol.h的代碼爲(就是去掉了const)
  1. #define_MAV_RETURN_int8_t(msg, wire_offset)(int8_t)_MAV_PAYLOAD(msg)[wire_offset]
  2. #define_MAV_RETURN_uint8_t(msg, wire_offset)(uint8_t)_MAV_PAYLOAD(msg)[wire_offset]
    編譯後:"..\OBJ\USART.axf" - 0 Error(s), 0 Warning(s).
   到此不表明移植好了,上面是本人邊移植邊寫的教程,以下給你們作一個總結。可能不少東西跟上面重複的,若是你們想盡快的移植好能夠參考下面的,若是你想了解爲何這麼移植請參考上    面的移植過程。
 
三:不須要懂過程的快速移植,只需作好這幾步就能快速移植了
    1.準備好工程變添加好生成的mavlink純淨文件(未經任何修改的文件)
    2.添加我寫好的mavlink_avoid_errors.h文件,代碼以下
  1. /** @file mavlink_avoid_errors.h
  2. * @簡介:本文件是由624668529添加,用來統一解決mavlink報錯信息
  3. * @see QQ624668529
  4. */
  5. #ifndef MAVLINK_AVOID_ERRORS_H
  6. #define MAVLINK_AVOID_ERRORS_H
  7. /*解決..\MAVLINK\common\../mavlink_types.h(53): error: #20: identifier "pack" is undefined*/
  8. #define MAVPACKED( __Declaration__ ) __Declaration__
  9. /*解決..\MAVLINK\common\../mavlink_types.h(53): error: #3092: anonymous unions are only supported in --gnu mode, or when enabled with #pragma anon_unions*/
  10. #pragma anon_unions
  11. #defineinline __INLINE
  12. #ifndef memset//由624668529添加 2018-08-24
  13. staticinlinevoid*memset(void*dest,int data,size_t length){
  14. uint32_t i;
  15. int*point = dest;
  16. for(i=0; i<length; i++) point[i]= data;
  17. return dest;
  18. }
  19. #endif
  20. #ifndef memcpy//由624668529添加 2018-08-24
  21. void*memcpy(void*dest,constvoid*src,size_t n)
  22. {
  23. unsignedchar*pout =(unsignedchar*)dest;
  24. unsignedchar*pin =(unsignedchar*)src;
  25. while(n-->0)*pout++=*pin++;
  26. return dest;
  27. }
  28. #include"mavlink_types.h"
  29. #define MAVLINK_USE_CONVENIENCE_FUNCTIONS
  30. #define MAVLINK_SEPARATE_HELPERS
  31. //mavlink_system_t mavlink_system = {0,0};
  32. mavlink_system_t mavlink_system ={
  33. 1,
  34. 1
  35. };// System ID, 1-255, Component/Subsystem ID, 1-255
  36. void comm_send_ch(mavlink_channel_t chan,uint8_t buf)
  37. {
  38. chan=chan;
  39. USART_SendData(USART1, buf);//向串口1發送數據
  40. while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
  41. }
  42. #endif
  43. #include"mavlink.h"
  44. #include"mavlink_helpers.h"
  45. #endif//AVLINK_AVOID_ERRORS_H
    3.在main.c中更改爲以下代碼
  1. #include"sys.h"
  2. #include"delay.h"
  3. #include"usart.h"
  4. #include"led.h"
  5. #include"beep.h"
  6. #include"key.h"
  7. #include"mavlink_avoid_errors.h"
  8. //ALIENTEK 探索者STM32F407開發板 實驗4
  9. //串口通訊實驗 -庫函數版本
  10. //技術支持:www.openedv.com
  11. //淘寶店鋪:http://eboard.taobao.com
  12. //廣州市星翼電子科技有限公司
  13. //做者:正點原子 @ALIENTEK
  14. int main(void)
  15. {
  16. mavlink_heartbeat_t packet_in ={
  17. 963497464,17,84,151,218,3
  18. };
  19. mavlink_heartbeat_t packet1;
  20. memset(&packet1,0,sizeof(packet1));
  21. packet1.custom_mode = packet_in.custom_mode;
  22. packet1.type = packet_in.type;
  23. packet1.autopilot = packet_in.autopilot;
  24. packet1.base_mode = packet_in.base_mode;
  25. packet1.system_status = packet_in.system_status;
  26. packet1.mavlink_version = packet_in.mavlink_version;
  27. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
  28. delay_init(168);//延時初始化
  29. uart_init(115200);//串口初始化波特率爲115200
  30. LED_Init();//初始化與LED鏈接的硬件接口
  31. while(1)
  32. {
  33. mavlink_msg_heartbeat_send(MAVLINK_COMM_1 , packet1.type , packet1.autopilot , packet1.base_mode , packet1.custom_mode , packet1.system_status );
  34. delay_ms(1000);
  35. }
  36. }
    4將mavlink_conversions.h更改這一部分代碼爲
  1. MAVLINK_HELPER void mavlink_dcm_to_quaternion(constfloat dcm[3][3],float quaternion[4])
  2. {
  3. int dcm_j,dcm_k;
  4. float s;
  5. float tr = dcm[0][0]+ dcm[1][1]+ dcm[2][2];
  6. if(tr >0.0f){
  7. float s = sqrtf(tr +1.0f);
  8. quaternion[0]= s *0.5f;
  9. s =0.5f/ s;
  10. quaternion[1]=(dcm[2][1]- dcm[1][2])* s;
  11. quaternion[2]=(dcm[0][2]- dcm[2][0])* s;
  12. quaternion[3]=(dcm[1][0]- dcm[0][1])* s;
  13. }else{
  14. /* Find maximum diagonal element in dcm
  15. * store index in dcm_i */
  16. int dcm_i =0;
  17. int i;
  18. for(i =1; i <3; i++){
  19. if(dcm[i][i]> dcm[dcm_i][dcm_i]){
  20. dcm_i = i;
  21. }
  22. }
  23. dcm_j =(dcm_i +1)%3;
  24. dcm_k =(dcm_i +2)%3;
  25. s = sqrtf((dcm[dcm_i][dcm_i]- dcm[dcm_j][dcm_j]-
  26. dcm[dcm_k][dcm_k])+1.0f);
  27. quaternion[dcm_i +1]= s *0.5f;
  28. s =0.5f/ s;
  29. quaternion[dcm_j +1]=(dcm[dcm_i][dcm_j]+ dcm[dcm_j][dcm_i])* s;
  30. quaternion[dcm_k +1]=(dcm[dcm_k][dcm_i]+ dcm[dcm_i][dcm_k])* s;
  31. quaternion[0]=(dcm[dcm_k][dcm_j]- dcm[dcm_j][dcm_k])* s;
  32. }
  33. }
    5.將mavlink_helpers.h中更改這一部分代碼爲
  1. MAVLINK_HELPER uint16_t mavlink_msg_to_send_buffer(uint8_t*buffer,constmavlink_message_t*msg)
  2. {
  3. uint8_t*ck;
  4. memcpy(buffer,(constuint8_t*)&msg->magic, MAVLINK_NUM_HEADER_BYTES +(uint16_t)msg->len);
  5. ck = buffer +(MAVLINK_NUM_HEADER_BYTES +(uint16_t)msg->len);
  6. ck[0]=(uint8_t)(msg->checksum &0xFF);
  7. ck[1]=(uint8_t)(msg->checksum >>8);
  8. return MAVLINK_NUM_NON_PAYLOAD_BYTES +(uint16_t)msg->len;
  9. }
    6.屏蔽mavlink_types.h中這一部分代碼
  1. // Macro to define packed structures
  2. //#ifdef __GNUC__
  3. // #define MAVPACKED( __Declaration__ ) __Declaration__ __attribute__((packed))
  4. //#else
  5. // #define MAVPACKED( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) )
  6. //#endif
    7.更改protocol.h中的代碼爲(即去掉const)解決警告的方法
  1. #define_MAV_RETURN_int8_t(msg, wire_offset)(int8_t)_MAV_PAYLOAD(msg)[wire_offset]
  2. #define_MAV_RETURN_uint8_t(msg, wire_offset)(uint8_t)_MAV_PAYLOAD(msg)[wire_offset]
編譯後:"..\OBJ\USART.axf" - 0 Error(s), 0 Warning(s).
 
 
四:下載到開發板打開串口調試助手
   成功接收到數據,如圖,表示移植成功
    
 
 移植成功。
做者:恆久力行 QQ:624668529
 
本次進添加了串口發送函數,之後如有須要我會繼續添加串口接收函數。
 
分享教程,只但願中國的科學技術日新月異過,望早日超越其餘國家。加油中國人
 

 

 



相關文章
相關標籤/搜索