初始化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(); //气压计初始化
U***_Hid_Init(); //飞控u***接口的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,判断是执行那种驱动,但是我用的版本***us一直没有信号输入进来,用示波器监控硬件也是有观测到芯片管脚的输入,但是软件中断抓不到信号,最后也是懒得换就用pwm用了,但按匿名那边的说法他们这个***us是可以是使用的,接着往下看
这个if和else程序读起来怪怪的,判断的是RC_IN_MODE在subs执行的Drv_SbusInit()函数在Drv_***us.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.接口初始化
u***和串口,飞控板上这些接口的功能在程序中已经默认定义好了
U***_Hid_Init(); //飞控u***接口的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);
初始化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(); //气压计初始化
U***_Hid_Init(); //飞控u***接口的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,判断是执行那种驱动,但是我用的版本***us一直没有信号输入进来,用示波器监控硬件也是有观测到芯片管脚的输入,但是软件中断抓不到信号,最后也是懒得换就用pwm用了,但按匿名那边的说法他们这个***us是可以是使用的,接着往下看
这个if和else程序读起来怪怪的,判断的是RC_IN_MODE在subs执行的Drv_SbusInit()函数在Drv_***us.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.接口初始化
u***和串口,飞控板上这些接口的功能在程序中已经默认定义好了
U***_Hid_Init(); //飞控u***接口的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);
举报