【STM32】FSMC

2024-08-27 23:36
文章标签 stm32 fsmc

本文主要是介绍【STM32】FSMC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

FSMC在正点原子的HAL课程中用法较为单一,就是用来模拟8080时序驱动LCD屏幕,其实就是利用FSMC读写LCD模块的SRAM。当然,这个我也没有买,只学习了理论。

大部分图片来源:正点原子HAL库课程

 专栏目录:记录自己的嵌入式学习之路-CSDN博客


目录

1    用途

2    引脚

3    FSMC驱动LCD屏幕

3.1    GPIO8080和FSMC驱动的概念区别

​编辑

3.2    FSMC的五种异步时序

3.3    FSMC时序与GPIO8080时序的对比

3.4    FSMC的地址映射

3.5    FSMC的本质

3.6    8080 RS信号选择的实现

3.7    相关HAL库函数

3.8    重要结构体

3.9    实际使用


1    用途

FSMC,Flexible Static Memory Controller,灵活的静态存储控制器。

用于驱动SRAM,NOR FLASH,NAND FLASH及PC卡类型的存储器。配置好FSMC,定义一个指向这些地址的指针,通过对指针操作就可以直接修改存储单元的内容,FSMC自动完成读写命令和数据访问操作,不需要程序去实现时序。也就是无需手动去拉高、拉低信号实现选择写、读和选择读写命令、数据等东西。

F1/ F4(407)系列大容量型号,且引脚数目在100脚以上的芯片都有FSMC接口。F4/F7/H7系列就是FMC接口,区别是FMC可以直接驱动SDRAM,FSMC不行。


2    引脚

  • 引脚名称的N表示该信号是低电平有效。
  • 上面红框框着的部分是LCD要用到的。

3    FSMC驱动LCD屏幕

3.1    GPIO8080和FSMC驱动的概念区别

3.2    FSMC的五种异步时序

选择模式A的原因:

  • 操作屏幕实际操作的是屏幕的SRAM,因此模式B、C都不满足;
  • 而模式1在读时序时片选信号不翻转,但在8080时序中,要进行读写操作时WR和RD都是上升沿才有效,因此模式1也不满足;
  • 忽略过于高级的模式D;
  • 选择模式A;

3.3    FSMC时序与GPIO8080时序的对比

可以看到,总体来说FSMC的时序和8080是一致的,只是在实际使用中,各高低电平的脉宽需要根据8080的进行细微调整,具体需要查阅LCD屏幕的数据手册。需调整的部分时序如下图所示:

3.4    FSMC的地址映射

注意⚠️:这里FSMC有4个存储块,每个存储块又有4个区;存储块叫做Bank,选区其实也叫Bank。在实际使用中,一般都是通过存储块的功能来区分存储块,再通过序号区分选区,如:FSMC_NORSRAM_BANK1,这里说的就是Bank1的第4区。因此正点原子的例程写的Bank4其实是没错的,因为它已经指定了NOR的存储块了。

这里HADDR是内部AHB地址总线,其中HADDR[25:0]来自外部存储器地址FSMC_A[25:0],而HADDR[26:27]对4个区进行寻址。

在FSMC连接到8位的存储器时,其HADDR[25:0]就完全对应FSMC_A[25:0],但是对于16位的存储器,由于HADDR的一个位就不对应FSMC中的一个地址了,因为其一个位本应对应一个字节,但如果按一个一个来,访问到的就是外部的半个数据,因此需要将HADDR右移一位,使得HADDR的一位对应上FSMC的一个数据长度。

3.5    FSMC的本质

自动片选、自动发送地址信号,自动输出/输入。

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

3.6    8080 RS信号选择的实现

要实现8080的RS选择命令/数据的效果,需要用地址线来做。

因为RS信号线实质就是低电平是命令,高电平是数据,所以实际上它不需要选择命令,只需要有一条信号线选择数据就行。因此,在LCD的例子中,使用FSMC_A10,即地址总线的其中一根来做选择即可。

而例子中之所以说代表命令的地址是0x6C00 0000,而代表数据的地址是0x6C00 0800(注意⚠️这里偏移了0x800是因为10号地址线是210*2,乘2是因为要将地址右移以满足16位的数据宽度),是因为总得选择一个地址嘛,所以就是用FSMC_NEx的基地址做命令地址,用FSMC_A10的地址做数据地址。那么,在将FSMC_A10接到RS线上后,根据FSMC的信号时序,我在写FSMC_A10的数据时,那么由于FSMC_A10变为高电平,那么RS也会处于高电平,相当于选择了数据。而不对FSMC_A10写数据时,其将位于低电平状态,从而选择了命令。

3.7    相关HAL库函数

3.8    重要结构体

SRAM_HandleTypeDef:SRAM控制句柄

其中:

  • Instance应为FSMC_NORSRAM_DEVICE
  • Extended应为FSMC_NORSRAM_EXTERNDEVICE
  • Init最为重要
  • 剩下的用不到

FSMC_NORSRAM_InitTypeDef:SRAM初始化结构体

其中:

  • NSBank设为FSMC_NORSRAM_BANK4(因为实验中用到的是内存块4)
  • DataAddressMux设为FSMC_DATA_ADDRESS_MUX_DISABLE(因为实验中并未将地址线和数据线复用,因此不使能)
  • MemoryType设为FSMC_MEMORY_TYPE_SRAM(屏幕的显存为SRAM)
  • MemoryDataWidth设为FSMC_NORSRAM_MEM_BUS_WIDTH_16(屏幕的数据宽度为16位)
  • WriteOperation设为FSMC_WRITE_OPERATION_ENABLE(使能写操作)
  • ExtendedMode设为FSMC_EXTENDED_MODE_ENABLE(扩展模式指的是设置读写时设置的时序不一致,而LCD的8080总线需要读写时序不一致,因此需要设置为使能)
  • 其余在SRAM模式基本不需要管

FSMC_NORSRAM_TimingTypeDef:时序初始化结构体

其中:

  • AddressHoldTime在模式A中并没有用到;

3.9    实际使用

在FSMC的实际使用中,其实就是定义并初始化好了FSMC之后,直接根据FSMC的基地址定义一个数据长度的两个变量,一个是命令地址,一个是数据地址。如:

#define FSMC_ADDR_DATA          ((uint32_t) 0X6C000800)
#define FSMC_ADDR_CMD           ((uint32_t) 0X6C000000)

而这之后,对这两个地址写入数据就是写命令和写数据啦,如下:

这篇关于【STM32】FSMC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113106

相关文章

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

寻迹模块TCRT5000的应用原理和功能实现(基于STM32)

目录 概述 1 认识TCRT5000 1.1 模块介绍 1.2 电气特性 2 系统应用 2.1 系统架构 2.2 STM32Cube创建工程 3 功能实现 3.1 代码实现 3.2 源代码文件 4 功能测试 4.1 检测黑线状态 4.2 未检测黑线状态 概述 本文主要介绍TCRT5000模块的使用原理,包括该模块的硬件实现方式,电路实现原理,还使用STM32类

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

基于stm32的河流检测系统-单片机毕业设计

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

STM32的使用方法一

注:我采用的是STM32F103RC芯片、相应的电路图和STM32CubeIDE软件这是在STM32CubeIDE软件定义芯片后,所给的必要的代码逻辑,加上了注释 #include "main.h"/* Private variables ---------------------------------------------------------*//* Private function

STM32 HAL CAN通讯 实操

1、简介 相比于串口通讯,对于刚接触CAN通讯的小白来说,CAN通讯相对复杂,看各种视频、帖子理论,总是一知半解。本次通过傻瓜式操作,先实现CAN通讯的交互,以提高小白的信心,也便于自己复习观看。本次以STM32CubeMX进行初始化配置,通过Keil 5软件进行软件设计,通过CAN盒实现进行数据的交互。该流程实际以STM32F0、F1、F3、F4、F7实测好用(理论上都适用),这三种型号单片机

我在高职教STM32——准备HAL库工程模板(1)

新学期开学在即,又要给学生上 STM32 嵌入式课程了。这课上了多年了,一直用的都是标准库来开发,已经驾轻就熟了。人就是这样,有了自己熟悉的舒适圈,就很难做出改变,老师上课也是如此,排斥新课和不熟悉的内容。显然,STM32 的开发,HAL 库已是主流,自己其实也在使用,只不过更换库就意味着教学内容有很大变化,自己也就迟迟没有迈出调整这一步。现在,是时候做出变化了,笔者计划保持教学项