无名飞控框架梳理

2023-05-16

打开飞控的main.c文件

首先是HardWave_Init();//飞控板内部资源、相关外设初始化

打开

#include "Headfile.h"
Sensor_Okay_Flag Sensor_Init_Flag;
void HardWave_Init(void)
{
   SystemInit();//时钟初始化
   cycleCounterInit();//系统滴答时钟初始化,程序精准延时
   SysTick_Config(SystemCoreClock / 1000);//SysTick开启系统tick定时器并初始化其中断,1ms
   USART1_Init(115200);//主串口初始化
   OLED_Init();         //显示屏初始化
   Bling_Init();        //指示灯、测试IO初始化
   Key_Init();          //按键初始化
   PPM_Init();          //PPM遥控器接收初始化
   HC_SR04_Init();      //超声波初始化
   PWM_Init();          //PWM初始化—TIM4
/*
   SPI2_Configuration();
   NRF24L01_Init();//
   while(NRF24L01_Check())
  {
    printf("24L01 Check Failed!\r\n");
    printf("Please Check!\r\n");
   delay_ms(100);
  }
  NRF24L01_RX_Mode();
*/
   Sensor_Init_Flag.NRF24L01_Okay=1;
   QuadInit();
/*******************IMU初始化开始*************************/
   delay_ms(2000);
/***********MPU6050初始化***************/
   IIC_GPIO_Config();
   InitMPU6050_GY86();
   delay_ms(500);
   IMU_Calibration();
   Sensor_Init_Flag.MPU6050_Okay=1;
/***********HMC5883初始化***************/
   delay_ms(100);
   QuadInit();
/***********磁力计+气压计初始化***************/
   delay_ms(500);
#ifdef IMU_BOARD_GY86
   HMC5883L_Initial();
   Sensor_Init_Flag.Mag_Okay=1;
   QuadInit();
   Baro_init();
   Read_MS5611_Offset();
   Sensor_Init_Flag.Baro_Okay=1;
#elsedef IMU_BOARD_NC686
   IST8310_Init();
   Sensor_Init_Flag.Mag_Okay=1;
   QuadInit();
   spl0601_init();
   Sensor_Init_Flag.Baro_Okay=1;
   QuadInit();
#elsedef IMU_BOARD_NC683
   IST8310_Init();
   Sensor_Init_Flag.Mag_Okay=1;
   QuadInit();
   FBM320_Init();
   Sensor_Init_Flag.Baro_Okay=1;
   QuadInit();
#endif
/*******************IMU初始化结束*************************/
   Quad_Start_Bling();//LED开机预显示
   delay_ms(500);
   Parameter_Init();//传感器参数初始化
   LCD_CLS();//清屏
   USART2_Init(19200);//串口2、备用
   USART3_Init(115200);//串口3、解析GPS
   Total_PID_Init();//PID控制器初始化
   TIM2_Configuration_Cnt();//TIM2
   Timer4_Configuration();//TIM3
   NVIC_Configuration();//中断优先级设置
}


void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;					//定义NVIC初始化结构体
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);			//优先级组别2,具体参见misc.h line80
/*
  //-----NRF24L01数据中断-----//
  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;			//IRQ中断通道-->NRF24L01,PB12
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;		//抢先式优先级别
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;			//副优先级别
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//使能通道
  NVIC_Init(&NVIC_InitStructure);				       //初始化NVIC
*/
//飞控系统定时器
  NVIC_InitStructure.NVIC_IRQChannel =TIM2_IRQn ;//计数定时器
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  //超声波
  NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

//PPM接收机
  NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

//GPS数据接收中断
  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;//串口中断3
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

//串口2、光流模块
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口中断1
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  //USART_Cmd(USART3, ENABLE);

//飞控控制定时器
  NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;//主控制定时器
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}
首先定义一个名为Sensor_Init_Flag的结构体:

Sensor_Okay_Flag Sensor_Init_Flag;

typedef struct
{
  uint16 NRF24L01_Okay:1;
  uint16 MPU6050_Okay:1;
  uint16 Mag_Okay:1;
  uint16 Baro_Okay:1;
}Sensor_Okay_Flag;

进入到void HardWave_Init(void)函数

首先是SystemInit();//时钟初始化,这个是库函数在 系统初始化函数SystemInit讲解里有解释

 cycleCounterInit();//系统滴答时钟初始化,程序精准延时
如果到这个追终到这个函数的定义里面去看很容易就发现这就是个得出当前系统时钟频率的函数

void cycleCounterInit(void)
{
    RCC_ClocksTypeDef clocks;
    RCC_GetClocksFreq(&clocks);
    usTicks = clocks.SYSCLK_Frequency / 1000000;
}
// Return system uptime in microseconds (rollover in 70minutes)
//返回 us
固件库里的解释显示该函数返回不同片上时钟的频率


SysTick_Config(SystemCoreClock / 1000)//SysTick开启系统tick定时器并初始化其中断,1ms
这个函数的解释可以在 回顾※STM32入门学习之_SysTick_Config()函数的SysTick时钟配置和 CRAZEPONY飞控学习(一)参考一下

USART1_Init(115200);//主串口初始化
就是一个简单的串口初始化,设置串口和波特率
定义:
void USART1_Init(unsigned long bound)//根据USART_InitStruct中指定的参数初始化外设USART1寄存器,并设置波特率
{


	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;


	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);


	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);


	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
//	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);




	USART_InitStructure.USART_BaudRate = bound;//设置波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8bits,在一个帧中传输或者接收到的数据位数8位或者9位,这里选8位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//stop bit is 1,定义了发送的停止位数目,在帧结尾传输1个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//no parity,定义了奇偶模式,奇偶失能
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//no Hardware Flow Control//指定了硬件流控制模式使能还是失能
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//enable tx and rx//指定了使能或者失能发送和接收模式
	USART_Init(USART1, &USART_InitStructure);//初始化外设USART1寄存器


	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//rx interrupt is enable,使能或者失能指定的USART中断,接收中断
	USART_Cmd(USART1, ENABLE);//使能或者失能USART外设


}
接下来:

  OLED_Init();         //显示屏初始化


void OLED_Init(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;  	  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);JTAG-DP失能 + SW-DP使能,改变指定管脚的映射
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);	//初始化gpio					    	 

OLEDInit();
}
对于OLEDInit:



Bling_Init();        //指示灯、测试IO初始化,指示灯初始化

Bling_Init();        //指示灯、测试IO初始化
void Bling_Init()
{
    GPIO_InitTypeDef  GPIO_InitStructure;//定义一个GPIO_InitTypeDef的结构体,具体定义于文件“stm32f10x_gpio.h”或者参考固件库使用手册
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|
                           RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD|
                             RCC_APB2Periph_AFIO,ENABLE);//打开GPIOA(B,C,D)的时钟H和功能复用IO时钟

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12;//选择待设置的GPIO管脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//最高输出速率50MHz
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

GPIO_InitTypeDef  GPIO_InitStructure;

RCC_APB2PeriphClockCmd

 Key_Init();          //按键初始化
 

按键初始化就是GPIO_Pin_8 | GPIO_Pin_9初始化,

void Key_Init(void)
{
GPIO_InitTypeDef  GPIO_InitStructure;  	  
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入		
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);	
}


PPM_Init();          //PPM遥控器接收初始化

void PPM_Init()
{
GPIO_InitTypeDef GPIO_InitStructure; 
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//GPIO_Pin_0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//输入下拉		
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);	
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);//选择GPIO管脚用作外部中断线路,
//选择PIOB用作外部中断线源的GPIO端口,GPIO_PinSource8待设置的外部中断线路
EXTI_InitStructure.EXTI_Line = EXTI_Line8;//外部中断线8
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//设置EXTI线路为中断请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//设置输入线路上升沿为中断请求
EXTI_InitStructure.EXTI_LineCmd	= ENABLE;//用来定义选中线路的新状态。它可以被设为ENABLE或者DISABLE
EXTI_Init(&EXTI_InitStructure);//数初始化外设EXTI寄存器

//EXTI->IMR &=~EXTI_Line2;//关闭外部中断
}




HC_SR04_Init();      //超声波初始化


void HC_SR04_Init(void)
{
GPIO_InitTypeDef  GPIO_InitStructure; 
EXTI_InitTypeDef EXTI_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出 		
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);	

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//下拉输入 		
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);
EXTI_InitStructure.EXTI_Line = EXTI_Line1;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd	= ENABLE;
EXTI_Init(&EXTI_InitStructure);

EXTI->IMR &=~EXTI_Line1;//关闭外部中断???????
}



 PWM_Init();          //PWM初始化—TIM4


void PWM_Init(void)
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
     uint16_t prescalerValue = 0, ccr1_PWMVal = 0;
	PWM_GPIO_Init();
	prescalerValue = (u16) (SystemCoreClock / 1000000)-1;//10us
	//-----TIM3定时配置-----//
	TIM_TimeBaseStructure.TIM_Period = MAX_PWM;				//40000/2M=20ms-->50Hz,
	//从0开始计数,这个值被写入到Auto-Reload Register中,设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间。
	TIM_TimeBaseStructure.TIM_Prescaler = 0;			    //暂时不分频,设置了用来作为TIMx时钟频率除数的预分频值。它的取值必须在0x0000和0xFFFF之间。
        TIM_TimeBaseStructure.TIM_ClockDivision = 0;			//时钟分割,设置了时钟分割
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;		//向上计数模式
	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;	//重复比较次数更新事件
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
	TIM_PrescalerConfig(TIM3, prescalerValue, TIM_PSCReloadMode_Immediate);//预分频,现在计时器频率为20MHz

		//-----PWM配置-----//
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; 		//选择定时器模式:TIM脉冲宽度调制模式1-->向上计数为有效电平
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_Pulse = ccr1_PWMVal;					//duty cycle
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; 	//输出极性:TIM输出比较极性高
	
	TIM_OC1Init(TIM3, &TIM_OCInitStructure);  					//初始化外设TIM3 OC1-->Motor1
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);  					//初始化外设TIM3 OC2-->Motor2
	TIM_OC3Init(TIM3, &TIM_OCInitStructure);  					//初始化外设TIM3 OC3-->Motor3
	TIM_OC4Init(TIM3, &TIM_OCInitStructure);  					//初始化外设TIM3 OC4-->Motor4

   	TIM_ARRPreloadConfig(TIM3, ENABLE);//自动重载寄存器使能,下一个更新事件自动更新影子寄存器
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能TIM3在CCR2上的预装载寄存器,在更新事件时,值才被写入到CCR
        TIM_Cmd(TIM3, ENABLE);
        PWM_Set(1000,1000,1000,1000);
}


其中:

void PWM_GPIO_Init(void )
{
	GPIO_InitTypeDef GPIO_InitStructure;
	//开始TIM4 的时钟 及GPIOB时钟 和AFIO时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//定时器3作为PWM输出
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	//设置PA5、PA66、PB0、PB1 为推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;//
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出速率
	GPIO_Init(GPIOA,&GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;//
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}
而对于PWM_Set具体定义

函数名:void PWM_Set(const u16 pwm1, const u16 pwm2, const u16 pwm3, const u16 pwm4)
说明:PWM设置
入口:无
出口:无
备注:根据PWM的数值给与相应PWM信号灯的状态:
当PWM为0时,灯灭
不为0时,灯亮
************************************************************************************/
void PWM_Set(const uint16_t pwm1, const uint16_t pwm2, const uint16_t pwm3, const uint16_t pwm4)
{
	TIM_SetCompare1(TIM3, pwm1);
	TIM_SetCompare2(TIM3, pwm2);
	TIM_SetCompare3(TIM3, pwm3);
	TIM_SetCompare4(TIM3, pwm4);
}




Sensor_Init_Flag.NRF24L01_Okay=1;变量赋值

 QuadInit();//初始化并显示



uint8 QuadShow_Cnt=0;
void QuadInit(void)
{
QuadShow_Cnt++;
delay_ms(100);
if(QuadShow_Cnt==4)  {LCD_CLS();delay_ms(500);}
if(QuadShow_Cnt<=3)
{
LCD_P8x16Str(0,0,"NamelessCotrun");
if(Sensor_Init_Flag.NRF24L01_Okay==1) LCD_P8x16Str(10,2,"NRF Is Okay"); 
if(Sensor_Init_Flag.MPU6050_Okay==1) LCD_P8x16Str(10,4,"MPU Is Okay"); 
if(Sensor_Init_Flag.Mag_Okay==1) LCD_P8x16Str(10,6,"Mag Is Okay"); 
}
else
{
LCD_P8x16Str(0,0,"NamelessCotrun");
if(Sensor_Init_Flag.Baro_Okay==1) LCD_P8x16Str(10,2,"MS Is Okay"); 
}
这个初始化里面用了好多LCD里面的函数查查!
 delay_ms(2000);//延时


/***********MPU6050初始化***************/
   IIC_GPIO_Config();
   InitMPU6050_GY86();
   delay_ms(500);
   IMU_Calibration(); 

其中第一个函数看定义应该是GPIO的IIC设置,但是具体定义是初始化GPIO,点亮GPIOB6和7管脚

void IIC_GPIO_Config(void)   
{          
  GPIO_InitTypeDef  GPIO_InitStructure;   
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	
  GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_6 | GPIO_Pin_7 ;           
  GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_Out_PP;             
  GPIO_InitStructure.GPIO_Speed  = GPIO_Speed_50MHz;	
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
  delay_ms(10);
  GPIO_SetBits(GPIOB,GPIO_Pin_6 | GPIO_Pin_7);
                    
}



 Sensor_Init_Flag.MPU6050_Okay=1;



按键扫描:

void Key_Scan()
{
  if(QuadKey1==0)
  {
    delay_ms(10);///消抖
    if(QuadKey1==0)
    {
      while(QuadKey1==0);//向下翻页
      Page_Number++;
      if(Page_Number>=10) Page_Number=10;
      LCD_CLS();//LCD复位
    }
  }

  if(QuadKey2==0)
  {
    delay_ms(10);
    if(QuadKey2==0)
    {
      while(QuadKey2==0);
      Page_Number--;//向前翻页

      if(Page_Number<=0) Page_Number=0;
      LCD_CLS();
    }
  }
}




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无名飞控框架梳理 的相关文章

  • 轻松搞定面试中的二叉树题目

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 7518888 树是一种比较重要的数据结构 xff0c 尤其是二叉树
  • 动态内存分配(malloc/free)简单实现--隐式空闲链表

    本文使用隐式空闲链表实现简单的动态内存分配 动态内存分配器维护一个大块区域 xff0c 也就是堆 xff0c 处理动态的内存分配请求 分配器将堆视为一组不同大小的块的集合来维护 xff0c 每个块要么是已分配的 xff0c 要么是空闲的 实
  • 二分查找,你真的掌握了吗?

    版权所有 xff0c 转载请注明出处 xff0c 谢谢 xff01 http blog csdn net walkinginthewind article details 8937978 二分查找 xff0c 最基本的算法之一 xff0c
  • 【谷歌面试题】求数组中两个元素的最小距离

    一个数组 xff0c 含有重复元素 xff0c 给出两个数num1和num2 xff0c 求这两个数字在数组中出现的位置的最小距离 O n 时间复杂度 xff0c O 1 空间复杂度 int minDistance int A int si
  • 进程间通信

    原作者地址不详 摘 要 随着人们对应用程序的要求越来越高 xff0c 单进程应用在许多场合已不能满足人们的要求 编写多进程 多线程程序成为现代程序设计的一个重要特点 xff0c 在多进程程序设计中 xff0c 进程间的通信是不可避免的 Mi
  • 通过能观性分析理解SLAM系统的可观维度。

    目录 1 能观性分析大体理解2 可观性定义3 可观性矩阵 1 能观性分析大体理解 什么是能观性分析 xff1f 能观性分析通过计算可观性矩阵 xff0c 分析它的零空间的秩 xff0c 来分析系统哪些状态维度可观 不可观 可观性矩阵对应系统
  • 百度2014移动研发笔试题目——1013清华版

    一 简答题 1 简述计算机的存储系统分为哪几个层次 xff0c 为什么这样的分层能够提高程序的执行效率 2 浮点数在计算中如何表示 xff0c 如何对浮点数判等 3 简述TCP与UDP协议的差别 xff0c 两者与HTTP的关系 并列举HT
  • 史上最全的ubuntu16.04安装nvidia驱动+cuda9.0+cuDnn7.0

    本文参考了 http www cnblogs com 5211314jackrose p 7081020 html https jingyan baidu com article 4853e1e55679491909f726f4 html
  • 4、ORB-SLAM闭环检测之通过词袋寻找当前关键帧和闭环候选帧之间的匹配

    目录 1 SearchByBoW 2 图解每一步实现原理 2 1 通过词袋模型寻找匹配 2 2 通过旋转直方图来筛除离群点 3 期待您加入 前面 我们已经了解到了sim3的求解流程 具体计算过程中有三步比较重要 1 寻找两关键帧之间的粗匹配
  • 基于Web服务的物联网-WoT(Web of Things)

    当我们谈到智能手机 xff0c 多样性 往往不是问题 xff0c 主流市场不是基于苹果IOS系统的就是谷歌的Android系统 xff0c 但即将到来的物联网浪潮 xff0c 智能对象是否也能这样 xff1f 这就复杂多了 xff0c 当前
  • 如何选择 catkin_make和catkin_make_isolated

    问题 在编译cartographer的代码包的时候 xff0c 会被建议使用catkin make isolated xff0c 为何不使用catkin make呢 xff1f 原因 catkin make was the first sc
  • 基于共享内存的分布式消息学习笔记

    作者 xff1a 深圳自研业务组 jimwu 编辑 xff1a 上海业务组 alenai 目录 xff1a Tbus 简介 Tbus 原理 Tbus 配置与工具 Tbus 简单应用 Tbus 运维应用 为 python 扩展 总结 Tbus
  • 分享一下工作以来我看过计算机书籍

    由于自工作依赖一直专注于linux 下的c c 43 43 编程工作 xff0c 所以 xff0c 我的书籍也大的都是这方 这边书尽管很经典 xff0c 但是我的能力实在有限 xff0c 只把数据结构的那点看了一下 xff0c 其他的 看的
  • 51单片机定时器初值计算详解

    前言 xff1a 本文详细介绍了51单片机学习过程中定时器的初值计算问题以及相关概念 xff0c 力求把每一个学习过程中的可能会遇到的难点说清楚 xff0c 并举相关的例子加以说明 学习完毕 xff0c 又顺手利用刚学到定时器的相关知识写了
  • STM32平台下官方DMP库6.12超详细移植教程

    前记 Motion Driver官方库 xff1a Motion Driver 6 12 STM32工程源码 xff1a STM32F103C8 软件MPU6050 xff08 DMP xff09 MPU6050软件I2C驱动 xff0c
  • STM32F103C8-平衡小车笔记

    STM32F103C8 平衡小车笔记 1 PID的作用 xff08 1 xff09 比例项 xff1a 提高响应速度 xff0c 减小静差 xff08 2 xff09 积分项 xff1a 消除稳态误差 xff08 3 xff09 微分项 x
  • 嵌入式Linux系统开发笔记(十四)

    U Boot环境变量 uboot 中有两个非常重要的环境变量 bootcmd 和 bootargs xff0c bootcmd 和 bootagrs 是采用类似 shell 脚本语言编写的 xff0c 里面有很多的变量引用 xff0c 这些
  • 嵌入式Linux系统开发笔记(十五)

    Linux内核启动验证 5 1 编译内核 span class token comment 清除工程 span span class token comment make distclean span span class token co
  • 基于ROS搭建机器人仿真环境

    别人的发复现及经验 https blog csdn net qq 38620941 article details 125321347 gazebo默认仿真环境 1 gazebo models 是系统下gazebo放置模型库的默认位置 2

随机推荐

  • 嵌入式Linux系统开发笔记(十六)

    根文件系统rootfs启动验证测试 接下来我们使用测试一下前面创建好的根文件系统 rootfs xff0c 测试方法使用 NFS 挂载 6 1 检查是否在Ubuntu主机中安装和开启了NFS服务 xff08 特别注意 xff1a nfs 配
  • 安卓5.0以上7.0以下使用Termux

    参考 xff1a https zhuanlan zhihu com p 400507701 说明 xff1a Termux支持5 0以上的安卓系统 Termux7 3版本之后 xff0c 仅支持7 0以上的安卓系统 1 安装Termux 设
  • 关于DSP的CCS6.0平台下的工程搭建(完全可移植)

    本工程以CCS6 0下新建TMS320F28335工程为例 xff0c 其他系列处理器工程搭建类似 xff0c 参考本例即可 工程搭建用到的F2833x TI官方库文件 下载链接 也可直接参考笔者搭建好CCS6 0的工程 下载链接 所建工程
  • STM32Fxx JTAG/SWD复用功能重映射

    问题描述 xff1a 在实验室调车过程中 xff0c 遇到的一个问题 xff1a 为了每次下载程序方便 xff0c 队员们往往会把 Jlink 插在板子上 xff0c 可是在调车过程中发现 xff0c 有时程序会莫名死掉 xff0c 而同样
  • VS2012编译RTKLIB——GNSS定位开源库

    RTKLIB 开源库 有着强大的 GPS 数据实时和后处理功能 xff0c 由于 笔者的毕业设计中需要对GPS 载波相位观测量进行 RTK 解算 xff0c 故而 xff0c 对 RTKLIB 开源库进行了学习与研究 RTKLIB 提供了很
  • 51单片机串行口波特率计算

    1 工作方式介绍 xff1a 方式 0 xff1a 这种工作方式比较特殊 xff0c 与常见的微型计算机的串行口不同 xff0c 它又叫 同步移位寄存器输出方式 在这种方式下 xff0c 数据从 RXD 端串行输出或输入 xff0c 同步信
  • 数码管显示问题总结

    1 数码管显示原理 我们最常用的是七段式和八段式 LED 数码管 xff0c 八段比七段多了一个小数点 xff0c 其他的基本相同 所谓的八段就是指数码管里有八个小 LED 发光二极管 xff0c 通过控制不同的 LED 的亮灭来显示出不同
  • 单片机与嵌入式linux 比较

    MCU门槛低 xff0c 入门容易 xff0c 但是灵活 xff0c 其实对工程师的软硬件功底要求更高 xff0c 随着半导体的飞速发展 xff0c MCU能实现很多匪夷所思匪夷所思的功能 xff0c 比如 xff0c 使用GPIO模拟1个
  • rtk 精确定位 简介

    RTK又称载波相位差分 xff1a 基准站通过数据链及时将其载波观测量及站坐标信息一同传送给用户站 用户站接收GPS卫星的载波相位与来自基准站的载波相位 xff0c 并组成相位差分观测值进行及时处理 xff0c 能及时给出厘米级的定位结果
  • STM32开发利器:STM32CubeMX

    这篇博客篇幅不长 xff0c 主要是为大家介绍ST公司推出的STM32CubeMX开发工具 xff0c 当成下周更新STM32 10个项目工程的预备篇 xff0c 同时FPGA FPGA 20个例程篇 xff1a 8 SD卡任意地址的读写
  • ROS命名空间

    ROS命令空间是一个很重要的内容 xff0c 官方文档 xff1a http wiki ros org Names 分为三类 xff1a relative xff0c global xff0c private 下边是一个官网给的示例 Nod
  • STM32CubeMX关于添加DSP库的使用

    前言 人生如逆旅 xff0c 我亦是行人 一 介绍 STM32 系列基于专为要求高性能 低成本 低功耗的嵌入式应用专门设计的 ARM Cortex M3 内核 而 DSP 应该是 TMS320 系列 xff0c TMS320 系列 DSP
  • STM32H750VBT6的DSP使用的学习——基于CubeMX

    前言 人生如逆旅 xff0c 我亦是行人 1 STM32H7的DSP功能介绍 xff08 STMicroelectronics xff0c 简称ST xff09 推出新的运算性能创记录的H7系列微控制器 新系列内置STM32平台中存储容量最
  • ROS中激光雷达数据类型传递转换及自定义点云数据类型介绍

    目录 一 ROS中激光雷达数据类型传递转换 xff1b 二 点云数据解析 三 自定义点云数据类型 一 ROS中激光雷达数据类型传递转换 xff1b ROS中涉及激光雷达传递的消息类型有两种 xff0c 一种是针对2D雷达 sensor ms
  • C/C++优秀书籍清单

    转载自 xff1a https www cnblogs com kimiway p 3225767 html 书籍是码农进步的阶梯 读好书 好读书 干一行爱一行 除了工作还有生活 在陪伴家人同时 也不忘提高自己 为更好的生活努力 1 C程序
  • 打印_battery_status.scale

    在px4的姿态控制中 xff0c publish控制量时代码乘以了一个 battery status scale xff0c scale effort by battery status if params bat scale en amp
  • 无名飞控

    无名飞控Time c文件 由于 无名飞控主要核心 xff1a 传感器滤波 姿态解算 惯导 控制等代码在TIME c里面运行 xff0c 所以先来分析这个文件 打开文件第一个函数 xff1a void Timer4 Configuration
  • 无名飞控姿态解算和控制(一)

    无名飞控的姿态解算和控制 从imu和磁力计 xff0c 气压计拿到数据后 xff0c 进入AHRSUpdate GraDes Delayback函数 xff0c 其中X w av Y w av Z w av来自陀螺仪 xff0c X g a
  • 无名飞控姿态解算和控制(三)

    继续码代码 上一篇主要写了自稳模式下的代码流程 xff0c 这次主要是飞控的定高和定点控制流程 首先是定高 控制模式在Main Leading Control里选择 定高模式代码 xff1a else if Controler Mode 6
  • 无名飞控框架梳理

    打开飞控的main c文件 首先是HardWave Init 飞控板内部资源 相关外设初始化 打开 include 34 Headfile h 34 Sensor Okay Flag Sensor Init Flag void HardWa