STM32 FSMC/FMC原理保姆级讲解(一)

2023-05-16

      • FSMC通俗讲解
    • FSMC 框图
    • FMC引脚说明
    • FMC地址映射
    • FSMC不同位宽操作
    • FSMC寄存器
    • FSMC时钟
    • FSMC 四种模式
    • FSMC参数设置
    • FSMC 控制异步 NOR FLASH 的时序
    • FSMC的功能
    • FSMC的特点

STM32 FSMC/FMC原理保姆级讲解(二)

FSMC( Flexible static memory controller)全称“灵活的静态存储器控制器”,是 STM32中一个很有特色的外设,通过 FSMC,STM32可以通过FSMC与SRAM、ROM、PSRAM、Nor Flash和NandFlash存储器的引脚相连,从而进行数据的交换。

要注意的是,FSMC 只能扩展静态的内存,即名称里面的 S:static,不能是动态的内存,比如 SDRAM 就不能扩展。

关于DRAM跟SRAM等内存存储,如果不懂请看这篇:
SDRAM、DRAM及DDR FLASH ROM概念详解

FSMC通俗讲解

既然我们知道FMC是可以方便的跟内存存储,那么到底方便到什么地方了呢?

我们用DRAM做一个最简单的举例,让你最直观的了解FMC的用处和便捷之处。

首先我们想一下,你想要在自己的电脑中查找一个文档文件的数据 ,然后拷到U盘里,需要的步骤是什么呢?

  1. 找到该文档在电脑中的位置(地址)
  2. 复制该文档(数据)
  3. 将文档粘贴到U盘中(数据传输)

在这里插入图片描述

一共需要三步,而我们的DRAM和NOR FLASH 都是存储器,把它们想成电脑 ,U盘是我们的STM32

单片机跟外部存储器通信,也需要知道数据的地址(电脑中的位置),然后把数据的内容传递(复制粘贴)过来。 那这样的话,存储器就需要地址传输线数据传输线,还要加上一些控制时序引脚 比方说复位 写数据 读数据 等等

  • 1、地址线:是用来传输地址信息用的。举个简单的例子:cpu在内存或硬盘里面寻找一个数据时,先通过地址线找到地址,然后再通过数据线将数据取出来。 如果有32根.就可以访问2的32次方的字节,也就是4GB。

  • 2、数据线(data cable),来传递数据或通信。通俗点说,就是单片机发送指令给存储器,和存储器发送数据给单片机这两个功能

我们来看一个DRAM存储器的原理图:
在这里插入图片描述

图中A0 ~ 18为地址线,总共19根地址线(即2^19=512K,1K=1024);DQ0 ~ 15为数据线,总共16根数据线。CEn是芯片使能信号,低电平有效;OEn是输出使能信号,低电平有效;WEn是写使能信号,低电平有效;BLEnBHEn分别是高字节控制和低字节控制信号;


假设我们不用FSMC,直接跟DRAM通信,那么代码应该这样写:

CEn=0;
WEn=0;
....
省略的控制时序
//确定地址线
A0=1;
A1=0;
A2=1;
A3=1;
A4=1;
A5=0;
A6=1;
A7=1;
A8=1;
A9=0;
A10=1;
A11=1;
A12=1;
A13=0;
A14=1;
A15=1;
A16=1;
A17=1;
A18=1;

//地址线确定好了,假设是写数据,那么就要开始发送数据了
CEn=0;
....
省略的控制时序
//数据总线发送数据
D0=1;
D1=0;
D2=1;
D3=1;
D4=1;
D5=0;
D6=1;
D7=1;
D8=1;
D9=0;
D10=1;
D11=1;
D12=1;
D13=0;
D14=1;
D15=1;

....
省略的控制时序

通过上面最基本的演示,你就会发现,正常通过IO口的时序逻辑跟DRAM通信是非常繁琐的

那么有没有简单的方法呢? 有的! STM32自带的FSMC功能,就是专门为这类存储器设计的,在STM32上,有一些引脚被专门设计成地址线,还有一些被专门设计成数据线,还有一些被设计成控制线,然后这些地址线和数据线对应着固定的地址,只要外部的DRAM等存储器将对应的数据线连接到STM32这些对应的引脚上,引脚功能设置为复用模式,通过配置FSMC ,你可以直接给上面那个固定的地址赋值 ,其他操作STM32都会自动给你完成,就可以把数据存储到SRAM中!


我们来看下使用FSMC读写数据的流程:

定义FSMC数据线对应的地址


//FSMC_Bank1_NORSRAM  
#define      FSMC_Addr_DATA        ( ( uint32_t ) 0x60020000 )

如果要写数据,直接给这个地址赋值就可以:

/**
  * @brief  SRAM写入数据
  * @param  usData :要写入的数据
  * @retval 无
  */	
 void SRAM_Write_Data ( uint16_t usData )
{
	* ( __IO uint16_t * ) ( FSMC_Addr_DATA ) = usData;
	
}

如果要从存储器中读取数据,直接读取这个地址就可以:


/**
  * @brief  从SRAM读取数据
  * @param  无
  * @retval 读取到的数据
  */	
 uint16_t SRAM_Read_Data ( void )
{
	return ( * ( __IO uint16_t * ) ( FSMC_Addr_DATA ) );	
}

uint16_t usR=0;

usR = SRAM_Read_Data (); 	/* READ DATA*/

是不是傻瓜式操作,极大的方便了我们的程序编写,其实这就好比软件IIC SPI 跟硬件IIC SPI 一样 我们不需要关心协议本身的时序,这些都由STM32内部来设置,我们只需要发送和读取数据就可以,STM32跟外部存储器通信,使用硬件方式就是FMC,这样就很容易理解了


那么,在你了解了什么是FSMC之后,我们就要来详细的讲解FSMC了,它在STM32中到底要怎么配置呢,他又有那些特性呢? 我们接下来将一一阐述。

STM32F1系列的芯片不支持扩展SDRAM (STM32F4跟H7支持),它仅支持使用FSMC外设扩展SRAM,由于引脚数量的限制,只有STM32F103ZE 或以上型号的芯片才可以扩展外部SRAM

FSMC 框图

FSMC 的框图如图所示:
在这里插入图片描述
F1的FSMC包含四个主要模块:AHB总线(包含FSMC配置寄存器);HCLK时钟;NOR闪存和PSRAM控制器;NAND闪存和PC卡控制器;

FMC引脚说明

1、在框图的右侧是FSMC外设相关的控制引脚,控制不同类型存储器的时候会有一些不同的引脚,其中地址线FSMC_A和数据线FSMC_D是所有控制器都共用的

NOR/SRAM信号 :这部分是NOR 和SRAM这类存储器的控制信号,其中:

  • FSMC_CLK是时钟信号
  • FSMC_NE[4:0]是片选信号 选择SRAM的不同存储区域
  • FSMC_NBL[1:0] 是数据掩码
  • FSMC_NL是输入地址是否有效

再加上下面的公共信号,组成了SRAM的控制引脚:
在这里插入图片描述

FMC地址映射

2、FSMC 连接好外部的存储器并初始化后,就可以直接通过访问地址来读写数据 其中这部分在内存中有着固定的存储地址,存储单元是映射到 STM32 的内部寻址空间的;在程序里,定义一个指向这些地址的指针,然后就可以通过指针直接修改该存储单元的内容,FSMC 外设会自动完成数据访问过程,读写命令之类的操作不需要程序控制,具体如下:

在这里插入图片描述

也就是从0x6000 0000 到0x9FFF FFFF 这1.0GB大小的空间被作为FMC的地址

如果从内核看的话中,左侧的是 Cortex-M3 内核的存储空间分配,右侧是 STM32 FSMC 外设的地址映射。可以看到 FSMC 的 NOR/PSRAM/SRAM/NAND FLASH 以及 PC 卡的地址都在 External RAM 地址空间内。正是因为存在这样的地址映射,使得访问 FSMC 控制的存储器时,就跟访问 STM32 的片上外设寄存器一样(片上外设的地址映射即图中左侧的“Peripheral”区域)

也就是访问FSMC其实就是访问固定的地址,跟寄存器操作异曲同工。

在这里插入图片描述

FSMC 把整个 存储区域分成了 4 个 Bank 区域,NOR 及 SRAM 存储器只能使用 Bank1 的地址,在每个 Bank 的内部又分成了 4 个小块,每个小块有相应的控制引脚用于连接片选信号FSMC_NE1/2/3/4

当 STM32 访问0x6C000000-0x6FFFFFFF 地址空间时,其实就是访问FSMC BANK1的第一块区域

,FSMC_NE1 引脚会自动设置为低电平
在这里插入图片描述

具体是选择那个小快,由地址线(ADDR[27:26])寻址确定
在这里插入图片描述

Bank1的256M字节空间由28根地址线(ADDR[27:0])寻址。这里ADDR 是内部AHB地址总线,其中ADDR[25:0]对应外部存储器地址FSMC_A[25:0],而HADDR[26:27]对4个区进行寻址

在这里插入图片描述

也就是ADDR 28位地址线的头两位,是选择那个分区,后26位是选择对应64M个byte地址

四个区对应二进制:

Bank1:0110-0000 0000-0000 0000-0000 0000-0000 ,即 60 00 00 00;

Bank2:0110-0100 0000-0000 0000-0000 0000-0000 ,即 64 00 00 00;

Bank3:0110-1000 0000-0000 0000-0000 0000-0000 ,即 68 00 00 00;

Bank4:0110-1100 0000-0000 0000-0000 0000-0000 ,即 6c 00 00 00;

FSMC不同位宽操作

FSMC总线除了复用到具体引脚上的FSMC_A[25:0],共计26路地址以外,还有两条内部总线ADDR[27:26]。通过这两路线才区分出了FMC_NE1,FMC_NE2,FMC_NE3和FMC_NE4。即0x60xx xxxx,0x64xx xxxx,0x68xx xxx和0x6Cxx xxxx。

这里要注意的是FSMC中每一个地址,对应的是存储器中的一个字节

假设我们用BANK1的区1,那么0x6000 0000-0x63ff ffff (共64M个字节byte地址) 对应的就是存储器的地址就是64Mx8=512M地址

也就是FSMC的64M个bit地址映射着存储器64M个字节byte地址

那也就是默认情况下存储器地址数据为8位,可以正常读取,但是如果存储器地址数据为16位,32位,就是两个字节一个地址,四个字节一个地址,那么控制16位,32位宽度的存储设备,且不支持单字节访问就比较麻烦了。比如16位宽度的NOR Flash,写入仅支持16位或者32位(通过写入两次16位),写入8位数据是不支持的 。

这样的话,我们本来对应64M的字节byte地址,就变成了32M的双字节byte地址,也就是最后一位无效了,因为地址一次要加2

这个时候,为了方便操作,FMC在硬件设计上就提供了一种解决办法,将内部数据总线ADDR[25:0]措位后接到FMC_A地址引脚上,“丢弃”地址的bit-0,从bit-1开始对地址计数(相当于只计算偶数地址,总共有32M个地址)

FSMC在实际输出地址时,将地址的值右移一位(相当于除以2,变成了偶数地址),输出到实际的地址线上。F103的文档上是这么写的:

在这里插入图片描述

如果是存储器宽度是32位的话,就是4个字节一个地址,就是右移两位

在这里插入图片描述

最终就是配置外部存储器的宽度为16位, FMC将使用内部的ADDR[25:1]地址来作为对外部存储器的寻址地址FMC_A[24:0]。如果存储器宽度为32位, FMC将使用内部的ADDR[25:2]地址进行外部寻址



FSMC寄存器

上图中的第三部分,FSMC是由AHB总线控制配置寄存器来设置的,

NOR/PSRAM/SRAM 设备使用相同的控制器,NAND/PC 卡设备使用相同的控制器,不同的控制器有专用的寄存器用于配置其工作模式。

  • 控制 NOR FLASH 的有 FSMC_BCR1/2/3/4 控制寄存器、FSMC_BTR1/2/3/4 片选时序寄存器以及 FSMC_BWTR1/2/3/4 写时序寄存器。

每种寄存器都有 4 个,分别对应于 4 个不同的存储区域,各种寄存器介绍如下:

  • FSMC_BCR 控制寄存器可配置要控制的存储器类型、数据线宽度以及信号有效极性能参数。
  • FMC_BTR 时序寄存器用于配置 SRAM 访问时的各种时间延迟,如数据保持时间、地址保持时间等。
  • FMC_BWTR 写时序寄存器与 FMC_BTR 寄存器控制的参数类似,它专门用于控制写时序的时间参数

FSMC时钟

FSMC 外设挂载在 AHB 总线上,时钟信号来自于 HCLK(默认 72MHz),控制器的同步时钟输出就是由它分频得到。
它的时钟频率可通过 FSMC_BTR 寄存器的 CLKDIV 位配置,HCLK 与 FSMC_CLK 的分频系数(CLKDIV),可以为 2~16 分频

  • 它可用于与同步类型的 NOR FLASH 芯片通过FSMC_CLK 引脚输出进行同步通讯

  • 对于异步类型的存储器,不使用同步时钟信号,所以时钟分频配置不起作用

FSMC 四种模式

对于存储器来说,可以分为带时钟信号的同步存储器和不带时钟信号的异步存储器

  • 同步突发访问中获得第 1 个数据所需要的等待延迟(DATLAT)
  • 异步突发访问方式,FSMC 主要设置 3 个时间参数:地址建立时间(ADDSET)、数据建立时间(DATAST)和地址保持时间(ADDHLD)。

FSMC 外设支持输出多种不同的时序以便于控制不同的存储器, 综合了 SRAM/ROM、PSRAM 和 NOR Flash 产品的信号特点,定义了 ABCD 四种不同的异步时序模型。选用不同的时序模型时,需要设置不同的时序参数
在这里插入图片描述

FSMC参数设置

我们知道NOR FLASH跟SRAM等存储器除了地址线跟数据线还有其他的控制线跟读写时序,在STM32中,这些时序都很贴心的为我们提供了设置方式,可以很好地匹配不同型号的存储器。
在这里插入图片描述

下面我们来看下不同模式的时序图,通过时序图来看下FSMC具体的流程:

模式1读操作
在这里插入图片描述

  • NOE 是存储器的读信号线,N表示低电平有效,O表示output,E表示enable,

  • NWE 是存储器的写信号线,N表示低电平有效,W表示write,E表示enable,

写存储器时,用NWE输出一个低电平,NOE保持高电平,读存储器时,用NOE输出一个低电平,NWE保持高电平

模式1写操作

在这里插入图片描述

模式A与模式1的区别是NOE的变化和相互独立的读写时序

FSMC 控制异步 NOR FLASH 的时序

下面我们以控制异步 NOR FLASH 使用的模式 B 进行讲解

FSMC 读 NOR FLASH 的时序图:
在这里插入图片描述
在这里插入图片描述

以读时序为例,该图表示一个存储器读操作周期由地址建立周期(ADDSET)数据建立周期(DATAST)以及 2 个 HCLK 周期组成。

  • 在地址建立周期中,地址线发出要访问的地址,数据掩码信号线指示出要读取地址的高、低字节部分,片选信号使能存储器芯片;
  • 地址建立周期结束后读使能信号线发出读使能信号,接着存储器通过数据信号线把目标数据传输
    给 FSMC,FSMC 把它交给内核

FSMC 写 NOR FLASH 的时序图:
在这里插入图片描述

写时序类似,区别是它的一个存储器操作周期仅由地址建立周期(ADDSET)和数据建
立周期(DATAST)组成,且在数据建立周期期间写使能信号线发出写信号,接着 FSMC 把
数据通过数据线传输到存储器中。

当 FSMC 外设被配置成正常工作,并且外部接了 NOR FLASH 时,若向 0x60000000 地址写入数据如 0xABCD,FSMC 会自动在各信号线上产生相应的电平信号,写入数据。FSMC 会控制片选信号 NE1 输出低电平选择相应的 NOR 芯片,然后使用地址线 A[25:0]输出0x60000000,在 NWE 写使能信号线上发出低电平的写使能信号,而要写入的数据信号0xABCD 则从数据线 D[15:0]输出,然后数据就被保存到 NOR FLASH 中了。

FSMC的功能

FSMC的功能总结:将AHB传输信号转换到适当的外部设备协议;满足访问外部设备的时序要求。
所有的外部存储器共享控制器输出的地址、数据和控制信号,每个外部设备可以通过一个唯一的片选信号加以区分。FSMC在任一时刻只访问一个外部设备。

FSMC的特点

1、 FSMC的一大特点是支持不同位宽的异步读写操作。

2、 FSMC的映射地址空间中,不同的BANK是独立的,可用于扩展不同类型的存储器。当FSMC同时使用多个外部存储器时,FSMC会通过总线悬空延时时间参数,来防止访问冲突发生。

3、 支持代码从FSMC扩展的外部存储器中直接运行。不需要首先调入内部SRAM。


关于FSMC的基本原理就说到这里,下一篇我们将讲解下如何使用HAL库来对FSMC进行初始化
请添加图片描述

请添加图片描述

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

STM32 FSMC/FMC原理保姆级讲解(一) 的相关文章

  • /usr/bin/ld: warning: libopencv_imgcodecs.so.3.2, needed by /usr/lib/x86_64-linux-gnu/libopencv_high

    出现一个警告信息 xff0c 暂时不管 usr bin ld warning libopencv imgcodecs so 3 2 needed by usr lib x86 64 linux gnu libopencv highgui s
  • 灰度图像二值化-----c++实现

    前天闲着没事干 xff0c 就写了写BMP图像处理 xff0c 感觉大家还比较感兴趣 所以现在没事 xff0c 继续更新 这次简单的写了灰度图像二值化 这是什么概念呢 xff1f 图像的二值化的基本原理 图像的二值化处理就是将图像上的点的灰
  • 3D打印情况记录(1)

    打印情况记录 xff08 1 xff09 打印参数打印结果 打印参数 切片软件MakerBot Print xff0c 温度195 xff0c 材料白色pla xff0c 外壳打印速度40mm s xff0c 内衬打印速度稀疏30mm s
  • 【在VScode中使用终端命令编译运行c++程序】

    在VScode下的powershell下使用命令行编译运行c 43 43 文件 xff1a 首先 xff0c 进入文件所在的路径地址 xff1a 编译生成 exe可执行文件的不同方式 xff1a 不指定生成可执行文件的名称 xff1a 执行
  • 连接字符串strcat()函数

    strcat 函数的原型 xff1a span class hljs preprocessor include lt string h gt span span class hljs keyword char span span class
  • makefile '@' '$' '$$' '-' '-n ' 使用小结

    编译代码时 xff0c 会进程接触makefile xff0c 会涉及到一些符号 xff0c 由于不明白有些意思经常出现问题 xff0c 在此归纳一下 39 64 39 符号的使用 通常makefile会将其执行的命令行在执行前输出到屏幕上
  • 【STM32】RTC实时时钟,步骤超细详解,一文看懂RTC

    什么是RTC RTC Real Time Clock xff1a 实时时钟 RTC是个独立的定时器 RTC模块拥有一个连续计数的计数器 xff0c 在相应的软件配置下 xff0c 可以提供时钟日历的功能 修改计数器的值可以重新设置当前时间和
  • FreeRTOS学习(一)

    前言 最近正在学习和FreeRTOS相关的知识 xff0c 在此记录一下 xff0c 学习资料来自正点原子 在学习之前 xff0c 我也有一个和很多初学者共同的疑惑 Why RTOS xff1f 在探究这个问题之前 xff0c 我想先回顾一
  • stm32CUBEIDE 生成的串口初始化代码详解

    static void MX USART1 UART Init void huart1 Instance 61 USART1 huart1 Init BaudRate 61 115200 huart1 Init WordLength 61
  • Install Python 3 on Ubuntu 18.04 or 20.04

    Install Python 3 on Ubuntu 18 04 or 20 04 Step1 Check your version of PythonStep 2 Install Supporting SoftwareStep 3 Dow
  • Python 报错:Command "python setup.py egg_info" failed with error code 1

    最近做一个项目 xff0c 需要搭建很多不同的python环境 xff0c 于是我就用pip install装了很多包 xff0c 但是装包的时候我遇到了很多次这个报错 xff0c 比如这一次我在安装imgaug的时候也提示了这个错误 如图
  • FreeRTOS 常用的几个函数

    1 xff09 vTaskSuspend TaskHandle t Task ID 挂起指定任务 被挂起的任务绝不会得到CPU的使用权 xff0c 不管该任务具有什么优先 级 使用实例 static TaskHandle t LED Tas
  • FreeRTOS 任务设计注意事项

    1 FreeRTOS中程序运行的上下文包括 xff1a 中断服务函数普通任务空闲任务 1 xff09 中断服务函数是一种需要特别注意的上下文环境 xff0c 它运行在非任务的执行环境下 xff08 一般为芯片的一种特殊运行模式 xff08
  • 2022,程序员应该如何找工作

    最近找工作面了不少公司 xff0c 也有不少感悟和心得 xff0c 今天在这里分享给大家 1 想清楚自己为什么离职 每个人离职都有自己的理由 xff0c 这里列举了一些离职理由 钱给的不够干的不开心没有发展前途加班太严重回老家发展领导不好不
  • 我的四轴飞行器经验总结(一)

    从我看到了TED的演讲和不断冒出来大疆的无人机产品新闻开始 xff0c 我开始爱上了做四轴飞行器 xff0c 有的人可能只当做是一个电子产品制作或者DIY什么的 xff0c 可是我觉的我对四轴飞行器有着更加深的感情 xff0c 就连我的桌面
  • 环境变量设置后不生效

    不需要重启系统 xff0c 只需要重启VS
  • mac os上编译vlc视频库的踩坑之旅

    mac os上编译vlc视频库的踩坑之旅 mac os上编译vlc视频库的踩坑之旅 开始编译VLC视频库 一前期准备工作二参照官方编译文档安装软件三开始编译vlc四踩一些坑五总结 新项目开始目涉及媒体播放 xff0c 在android上多媒
  • 【JAVA】Eclipse保存时出现“Save could not be completed”问题

    问题 xff1a Save could not be completed 原因 xff1a eclipse的默认编译语言是 34 ISO 8859 1 34 xff0c 这个语言不支持中文 xff0c 所以如果编辑的程序含有中文而且编译语言
  •  MX-Linux:在distrowatch上的排名,为什么能够做到第一?

    个人观点 xff1a MX Linux 很好 MX Linux 桌面操作系统的成功 xff0c 主要有以下这几个因素 xff1a A 技术因素 xff1a 1 关键因素 xff1a MX snapshots工具 xff1b 2 次要因素 x
  • Qt 出现“程序异常结束”问题可能的解决思路

    第三方库的编译有问题 请注意 xff0c 出现此种问题绝不止这一个原因 xff0c 还包括其它很多原因 xff0c 这些原因可能千奇百怪 xff0c 需要你的开发经验去积累去发掘 在这里 xff0c 根据我自己的经验 xff0c 总结几种可

随机推荐

  • Qt 中如何在主窗口中添加子窗口

    方法 原理其实简单 和在窗口上动态 代码的形式 添加控件的方法一样 但需要设置一下子窗口的属性 在子窗口构造函数中添加代码 setWindowFlags Qt FramelessWindowHint 作用 隐藏子窗口的标题栏和边框 如果不隐
  • Qt5 自定义字体修改: 字体、大小以及颜色(部分要点已实测)

    Qt设置字体类型及添加字体文件 Qt 添加字体文件 1 设置支持的字体 QFont font font setFamily 34 填写字体名称 34 2 通过字体文件来设置字体 字体的名称可以是自带的 xff0c 也可以是外部的 xff0c
  • Qt QTableWidget 表格自适应 高度和宽度

    1 在MainWindow中设置 对被嵌入的子窗口进行设置 xff0c 去除子窗口的一些影响到嵌入的部件 pTable gt setWindowFlags Qt CustomizeWindowHint Qt FramelessWindowH
  • 互斥信号量和二值信号量的区别

    详解互斥信号量的概念和运行 https blog csdn net weichushun article details 122744773 互斥信号量的主要作用是对资源实现互斥访问 xff0c 使用二值信号量也可以实现互斥访问的功能 xf
  • Qt QTableWidget设置表头、菜单 背景色,以及不成功的原因

    Qt QTableWidget设置表头背景色不成功的原因 QTableWidget没有设置背景色的函数 xff0c 通过Qss样式来设置背景色 m pTable gt horizontalHeader gt setStyleSheet 34
  • Qt记住上次窗口的位置和状态

    include lt QCloseEvent gt include lt QShowEvent gt void MainWindow showEvent QShowEvent event restoreGeometry config gt
  • git-cola 使用方法

    目录 git cola 的用法实践记录 git cola 是 git的图形界面管理工具 因此 xff0c 在安装 git cola之前 xff0c 一般首先需要安装 git 官网地址 xff1a http git cola github i
  • Qt中的 DEPENDPATH 和 INCLUDEPATH 的区别

    在Qt中添加库文件的时候 xff0c Qt会自动在pro文件里生成三行配置 INCLUDEPATH 43 61 dir DEPENDPATH 43 61 dir LIBS 43 61 Ldir llibxxx includepath 和 l
  • STM32--MPU内存保护单元(一)

    先说明一下MPU xff0c MPU有很多含义 xff0c 我们常见的有 xff1a MPU xff1a Memory Protection Unit xff0c 内存保护单元 xff08 本文描述的内容 xff09 xff1b MPU x
  • Qt .pro 官方手册 Creating Project Files (*)

    Creating Project Files Qt 6 5 Creating Project Files qmake Manual Creating Project Files Qt 5 14 Qt 5 14 qmake Manual Cr
  • 感悟 编程思想:Rust,不同于面向过程思想与面向对象思想 (**)

    编程思想的演变 面向过程思想 xff1f 面向对象思想 xff1f Rust语言 xff0c 据说既有面向过程的特征 xff0c 又有面向对象的特点 xff1f 不要过分地拘泥于在一个项目中采用面向过程思想与面向对象思想 实际上 xff0c
  • 基础数据结构:单链表

    定义 单链表是一种线性数据结构 xff0c 用一组地址任意存储单元来存储数据 xff0c 存储单元分散在内存任意地址上 xff0c 存储单元之间用指针连接 单链表一般有两种 xff1a 带头结点的 xff0c 头结点不存放数据 xff0c
  • 开源飞控种类分享

    开源飞控发展 一 开源飞控发展 第一代开源飞控系统使用Arduino或其他类似开源电子平台为基础 xff0c 扩展连接各种MEMS传感器 xff0c 能够让无人机能平稳地飞起来 第二代开源飞控系统大多拥有自己的开源硬件 开发环境和社区 xf
  • 2020电赛绕障飞行无人机无遥控自动飞行解决方案(Ti)

    一 方案目标 针对部分大赛要求无人机在无遥控的情况下实现自主飞行 xff0c 本方案实现无遥控和接收机 情况下 xff0c 通过杜邦线或者按钮触发无人机进入相应模式 xff0c 执行模式对应的指令 由于 Ti 飞控有 8 个 PWM 接口
  • 数组名a+1和&a+1的区别

    C C 43 43 里面的数组名字会退化为指针 xff0c 所以数组名a实际指的是数组的第一个元素的地址 而数组名作为指针来讲有特殊性 xff0c 它正在它所指向的内存区域中 xff0c amp a的值和a的数值是相同的 xff08 可以输
  • float精度分析

    二进制浮点数是以 符号 43 数值表示法 储存 xff1a 将最高位指定为符号位 xff08 sign bit xff09 xff1b 指数部份 xff1a 即次高的e位 决定数值的数量级 小数部份 xff1a 即余下的f位 决定数值的浮动
  • Eigen库四元数表示顺序

    Eigen Quaterniond Q 1 2 3 4 表示顺序为 xff1a w 61 1 x 61 2 y 61 3 z 61 4 同理其余常用四元数数组顺序为q w x y z euler 61 R eulerAngles xff08
  • mavros中的一些坑

    固件 xff1a px4 控制 xff1a 通过对mavros发布mavros setpoint raw local话题控制无人机飞行 获取飞机的ENU坐标系坐标有两个话题 xff1a mavros global position loca
  • rosdep update 超时失败2021最新解决方法

    好记性不如烂笔头 xff0c 记录方法 xff0c 方便大家 一 关于 rosdep 安装ros的最后一步是rosdep init和rosdep update xff0c rosdep是解决ros包依赖问题的一个工具 rosdep init
  • STM32 FSMC/FMC原理保姆级讲解(一)

    FSMC通俗讲解 FSMC 框图FMC引脚说明FMC地址映射FSMC不同位宽操作FSMC寄存器FSMC时钟FSMC 四种模式FSMC参数设置FSMC 控制异步 NOR FLASH 的时序FSMC的功能FSMC的特点 STM32 FSMC F