STM32
直播中

djelje

8年用户 929经验值
擅长:光电显示
私信 关注
[问答]

如何去编写All_Init()函数的源程序代码呢

如何对All_Init()函数进行初始化呢?
如何去编写All_Init()函数的源程序代码呢?

回帖(1)

李富才

2021-11-11 10:28:47
  初始化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);
举报

更多回帖

发帖
×
20
完善资料,
赚取积分