目錄
2.Remote_Control_Init();遙控器輸入類型
4.spi_2初始化,用於讀取飛控板上所有傳感器,都用SPI讀取
初始化All_Init();
函數在BSP_Init.c中
看下源程序
u8 All_Init()
{
NVIC_PriorityGroupConfig(NVIC_GROUP); //中斷優先級組別設置
SysTick_Configuration(); //滴答時鐘
Delay_ms(100); //延時
Drv_LED_Init(); //LED功能初始化
Flash_Init(); //板載FLASH芯片驅動初始化
Para_Data_Init(); //參數數據初始化
Remote_Control_Init();
PWM_Out_Init(); //初始化電調輸出功能
Delay_ms(100); //延時
Drv_SPI2_init(); //spi_2初始化,用於讀取飛控板上所有傳感器,都用SPI讀取
Drv_Icm20602CSPin_Init(); //spi片選初始化
Drv_AK8975CSPin_Init(); //spi片選初始化
Drv_SPL06CSPin_Init(); //spi片選初始化
sens_hd_check.gyro_ok = sens_hd_check.acc_ok =
Drv_Icm20602Reg_Init(); //icm陀螺儀加速度計初始化,若初始化成功,則將陀螺儀和加速度的初始化成功標誌位賦值
sens_hd_check.mag_ok = 1; //標記羅盤OK
sens_hd_check.baro_ok = Drv_Spl0601_Init(); //氣壓計初始化
Usb_Hid_Init(); //飛控usb接口的hid初始化
Delay_ms(100); //延時
Usart2_Init(115200); //串口2初始化,函數參數爲波特率
Delay_ms(10); //延時
// Uart4_Init(115200); //首先判斷是否連接的是激光模塊
// if(!Drv_Laser_Init()) //激光沒有有效連接,則配置爲光流模式
// Uart4_Init(500000);
// Delay_ms(10); //延時
// Usart3_Init(500000); //連接UWB
// Delay_ms(10); //延時
//
Uart4_Init(19200); //接優像光流
Uart5_Init(115200);//接大功率激光
// MyDelayMs(200);
//優像光流初始化
of_init_type = (Drv_OFInit()==0)?0:2;
if(of_init_type==2)//優像光流初始化成功
{
//大功率激光初始化
Drv_Laser_Init();
}
else if(of_init_type==0)//優像光流初始化失敗
{
Uart4_Init(500000); //接匿名光流
}
//
Drv_AdcInit();
Delay_ms(100); //延時
All_PID_Init(); //PID初始化
////////////
Drv_GpsPin_Init(); //GPS初始化 串口1
Delay_ms(50); //延時
Drv_HeatingInit();
// Drv_HeatingSet(5);
//
Sensor_Basic_Init();
//
ANO_DT_SendString("SYS init OK!");
return (1);
}
其中 中斷優先級組別設置,滴答時鐘,LED功能初始化,板載FLASH芯片驅動初始化是Stm32自帶庫函數,不需要細看
1.Para_Data_Init()參數初始化
函數在Ano_FcData.c文件中,
最終執行的是Ano_Parame_Read()函數
void Ano_Parame_Read(void)
{
Flash_SectorsRead ( 0x000000, &Ano_Parame.byte[0], 1 ); //讀取第一扇區內的參數
if(Ano_Parame.set.frist_init != SOFT_VER) //內容沒有被初始化,則進行參數初始化工作
{
Parame_Reset();
PID_Rest();
Ano_Parame_Write();
}
Parame_Copy_Para2fc();
}
Parame_Reset(), PID_Rest()參數初始化,重置成寫死在程序裏的默認參數,也就是地面站點擊默認參數上看到那些參數
Ano_Parame_Write(void) 將參數寫入第一扇區,這個函數作用是將寄存器中值的寫進閃存
{
All_PID_Init(); //////存儲PID參數後,重新初始化PID
Ano_Parame.set.frist_init = SOFT_VER;
Parame_Copy_Fc2para();
Flash_SectorErase ( 0x000000, 1 ); //擦除第一扇區
Flash_SectorsWrite ( 0x000000, &Ano_Parame.byte[0], 1 ); //將參數寫入第一扇區
}
2.Remote_Control_Init();遙控器輸入類型
函數在Ano_RC.c文件
void Remote_Control_Init()
{
//
RC_IN_MODE = Ano_Parame.set.pwmInMode;
//
if(RC_IN_MODE == SBUS)
{
Drv_SbusInit();
}
else
{
PWM_IN_Init(RC_IN_MODE);
}
}
就是 根據參數RC_IN_MODE,地面站上可以設置,subs或ppm或pwm,判斷是執行那種驅動,但是我用的版本sbus一直沒有信號輸入進來,用示波器監控硬件也是有觀測到芯片管腳的輸入,但是軟件中斷抓不到信號,最後也是懶得換就用pwm用了,但按匿名那邊的說法他們這個sbus是可以是使用的,接着往下看
這個if和else程序讀起來怪怪的,判斷的是RC_IN_MODE在subs執行的Drv_SbusInit()函數在Drv_sbus.c文件中,執行的任務是SBUS驅動,else語句中PWM_IN_Init()函數又進行了一個if判斷RC_IN_MODE,然後subs是前面執行過所以是空的,else if判斷是pwm還是ppm,最後執行初始化驅動,底層能跑通的話就不用細究了。
3.PWM_Out_Init ()電調輸出的初始化
在Drv_pwm_out.c文件中.這裏注意文件的上方的宏定義
//21分頻到 84000000/21 = 4M 0.25us
/*初始化高電平時間1000us(4000份)*/
//#define INIT_DUTY 4000 //u16(1000/0.25)
#define INIT_DUTY 4000 //u16(1000/0.25)
/*頻率400hz*/
#define HZ 400
/*精度10000,每份0.25us*/
#define ACCURACY 10000 //u16(2500/0.25) //accuracy
/*設置飛控控制信號轉換比例爲4*/
#define PWM_RADIO 4//(8000 - 4000)/1000.0
這裏的意思是輸出的信號除以4纔是實際的輸出,比如實際中需要脈寬1500的信號,在這裏必須是1500*4 = 6000纔行
4.spi_2初始化,用於讀取飛控板上所有傳感器,都用SPI讀取
底層無誤,暫時忽略
5.傳感器初始化
Drv_Icm20602Reg_Init();
Drv_Spl0601_Init();
6.接口初始化
usb和串口,飛控板上這些接口的功能在程序中已經默認定義好了
Usb_Hid_Init(); //飛控usb接口的hid初始化
Delay_ms(100); //延時
Usart2_Init(115200); //串口2初始化,函數參數爲波特率
Delay_ms(10); //延時
// Uart4_Init(115200); //首先判斷是否連接的是激光模塊
// if(!Drv_Laser_Init()) //激光沒有有效連接,則配置爲光流模式
// Uart4_Init(500000);
// Delay_ms(10); //延時
// Usart3_Init(500000); //連接UWB
// Delay_ms(10); //延時
//
Uart4_Init(19200); //接優像光流
Uart5_Init(115200);//接大功率激光
// MyDelayMs(200);