STM32单片机FSMC的使用解析

发布者:innovator7最新更新时间:2024-03-04 来源: elecfans关键字:STM32  单片机  FSMC 手机看文章 扫描二维码
随时随地手机看文章

在做项目的过程中遇到了这个问题,感觉文章写得不错,共享给对FSMC的使用怀有疑惑的同伴们!


LCD有如下控制线:

CS:Chip Select片选,低电平有效

RS:Register Select寄存器选择

WR:Write写信号,低电平有效

RD:Read读信号,低电平有效

RESET:重启信号,低电平有效

DB0-DB15:数据线

STM32单片机FSMC的使用解析

假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多):

如果情况如下:

DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。

CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效)

RS为1(表示DB0-15上传递的是要被写到寄存器的值),如果为0,表示传递的是数据。

WR为0,RD为1(表示是写动作),反过来就是读动作。

RESET一直为高,如果RESET为低,会导致芯片重启。

这种情况,会导致一个值0xff被传入芯片,被LCD控制芯片当作写寄存器值去解析。LCD控制芯片收到DB0-15上的值之后,根据其他控制线的情况,它得出结论,这个0xff是用来设置寄存器的。一般情况下,LCD控制芯片会把传入的寄存器值的高8位当做寄存器地址(因为芯片内部肯定不止一个寄存器),低8位当做真正的要赋给对应寄存器值。这样,就完成了一个写LCD控制芯片内部寄存器的时序。

如果上述情况不变,只将RS置低,那么得到的情况如下:LCD控制芯片会把DB0-15上的数据当做单纯的数据值来处理。那么假如LCD处在画图状态,这个传入的值0xff,就会被显示到对应的点上,0xffff就表示白色,那么对应的点就是白色。在这个数据值传递过来之前,程序肯定会通过设置寄存器值,告诉LCD控制芯片要写的点的位置在哪里。

如果上述两种情况都不变,分别把WR和RD的信号反过来(WR=1,RD=0),那么写信号就会被变成读信号。读信号下,主控芯片需要去读DB0-15的值,而LCD控制芯片就会去设置DB0-15的值,从而完成读数据的时序。读寄存器的时序麻烦一点。第一步,先要将WR和RD都置低,主控芯片通过DB0-15传入寄存器地址。第二步就和前面读数据一样,将WR置高,RD置低,读出DB0-15的值即可。在这整个的过程中,RS一直为低。好了,上面就是IO直接控制LCD的方法。假如放到STM32里面,用IO直接控制显得效率很低。

STM32有FSMC(其实其他芯片基本都有类似的总线功能),FSMC的好处就是你一旦设置好之后,WR、RD、DB0-DB15这些控制线和数据线,都是FSMC自动控制的。打个比方,当你在程序中写到:

*(volatile unsigned short int *)(0x60000000)=val;

那么FSMC就会自动执行一个写的操作,其对应的主控芯片的WE、RD这些脚,就会呈现出写的时序出来(即WE=0,RD=1),数据val的值也会通过DB0-15自动呈现出来(即FSMC-D0:FSMC-D15=val)。地址0x60000000会被呈现在数据线上(即A0-A25=0,地址线的对应最麻烦,要根据具体情况来,好好看看FSMC手册)。

那么在硬件上面,我们需要做的,仅仅是MCU和LCD控制芯片的连接关系:

WE-WR,均为低电平有效

RD-RD,均为低电平有效

FSMC-D0-15接LCD DB0-15

连接好之后,读写时序都会被FSMC自动完成。但是还有一个很关键的问题,就是RS没有接,CS没有接。因为在FSMC里面,根本就没有对应RS和CS的脚。怎么办呢?这个时候,有一个好方法,就是用某一根地址线来接RS。比如我们选择了A16这根地址线来接,那么当我们要写寄存器的时候,我们需要RS,也就是A16置高。软件中怎么做呢?也就是将FSMC要写的地址改成0x60020000,如下:

*(volatile unsigned short int *)(0x60020000)=val;

这个时候,A16在执行其他FSMC的同时会被拉高,因为A0-A18要呈现出地址0x60020000。0x60020000里面的Bit17=1,就会导致A16为1。当要读数据时,地址由0x60020000改为了0x60000000,这个时候A16就为0了。

那么有朋友就会有疑问,第一,为什么地址是0x6xxxxxxx而不是0x0xxxxxxx;第二,CS怎么接;第三,为什么Bit17对应A16?

先来看前两个问题,大家找到STM32的FSMC手册,在FSMC手册里面,我们很容易找到,FSMC将0x60000000-0x6fffffff的地址用作NOR/PRAM(共256M地址范围)。而这个存储块,又被分成了四部分,每部分64M地址范围。当对其中某个存储块进行读写时,对应的NEx就会置低。这里,就解决了我们两个问题,第一,LCD的操作时序,和NOR/PRAM是一样的(为什么一样自己找找NOR/PRAM的时序看看),所以我们选择0x6xxxxxxx这个地址范围(选择这个地址范围,操作这个地址时,FSMC就会呈现出NOR/PRAM的时序)。第二,我们可以将NEx连接到LCD的CS,只要我们操作的地址是第一个存储块内即可(即0-0x3ffffff地址范围)。第三个问题再来看一看FSMC手册关于存储器字宽的描述,我们发现,当外部存储器是16位时,硬件管脚A0-A24表示的是地址线A1-A25的值,所以我们要位移一下,Bit17的值,实际会被反应到A16这根IO来。关于数据宽度及位移的问题,初学的朋友可能会比较疑惑,当你接触了多NOR/PRAM这样的器件后,你会发现,很多芯片的总线,都是这样设计的,为的是节省地址线。


关键字:STM32  单片机  FSMC 引用地址:STM32单片机FSMC的使用解析

上一篇:新款STM32U5:让便携产品拥有惊艳图效
下一篇:基于STM32对DS1302的驱动

推荐阅读最新更新时间:2024-11-17 16:33

单片机PWM舵机控制原理
舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的: 0.5ms--------------0度; 1.0ms------------45度; 1.5ms------------90度; 2.0ms-----------135度; 2.5ms-----------180度; 如下图可形象地表示脉冲与角度关系 #include reg52.h unsigned char count; //0.5ms次数标识 sbit pwm=P1^0; //信号输出 sbit jia=P1^1;
[单片机]
单片机微波炉控制系统
单片机源程序如下: Wendu.h (头文件) #define jump_ROM 0xCC//ds18B20定义 #define start 0x44 #define read_EEROM 0xBE void delay(unsigned int N); void delay_1(); unsigned char Reset(void);//复位DS18B20 unsigned char read_bit(void);//从DS18B20读一个位值 void write_bit(unsigned char bitval);//向DS18B20写一位 unsigned char read_byte(void);//从DS18B20
[单片机]
<font color='red'>单片机</font>微波炉控制系统
基于AVR单片机及MODEM芯片的MTU、RTU无线电遥测系统
一、引言  基于AVR单片机及专用MODEM芯片的MTU(Master Terminal Unit中心调度机)、RTU无线电遥测系统。   分散地分布在全市的管网监测点上的远端RTU(系统可带256个RTU)采集数据,进行数据处理后通过无线电台向中心调度端发送数据,中心调度端接收到数据后进行数据处理,数据存储,并送给模拟屏显示。    二、设计思想   原有系统的使用中,主要存在以下几个问题:1. 无线通信波特率低(300bps),误码率高,巡测速度慢,最多带32个RTU终端;2. 当某一远程RTU端的无线电台一直处于长时间误发射状态时(简称“长发” )一直占用系统频点,由于系统共用一组无线电频点,这将使系统其他所有电台无
[单片机]
关于STM32的IAP与APP互相跳转
之前做了一个不带系统的IAP与APP互相跳转,在网上找了资料后,很顺畅就完成了,后来在IAR集成开发环境下,IAP无系统,APP用UCOS系统做互相跳转出现了很多问题。现将IAP学习过程和实际遇到问题总结一下。 首先说一下什么是IAP。IAP(In Application Programming)即在应用编程,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。通常实现IAP功能时,即用户程序运行中作自身的更新操作,需要在设计固件程序时编写两个项目代码,第一个项目程序不执行正常的功能操作,而只是通过某种通信方式(如USB、USA
[单片机]
STM32的ADC1采集多条通道 可以不使用DMA功能吗?
类似的问题 为什么我采集5条通道的电压,而采集到的值却都是第一条的呢? 我什么时候需要使用DMA功能? Ⅰ 关于ADC的一些知识 STM32的ADC是一种12位逐次逼近型的模拟数字转换器。它有多达18条通道,可测量16个外部和2个内部信号源。 各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器ADC_DR中。 其实就是说,一个ADC,可检测18条通道,我们外接的只有16条。而结果只保存在一个寄存器ADC_DR中。 要使用ADC1采集多条通道,那么就需要对采集的通道进行分组排序。STM32的ADC可以把转换组织成两组:规则组和注入组。 假如我们采集的通道按照如下顺
[单片机]
<font color='red'>STM32</font>的ADC1采集多条通道 可以不使用DMA功能吗?
贸泽推出各种Microchip创新MCU解决方案
贸泽推出各种Microchip创新MCU解决方案为嵌入式系统工程师提供更多支持 2022年9月21日 – 专注于引入新品并提供海量库存™的电子元器件分销商贸泽电子 (Mouser Electronics) 持续为嵌入式系统工程师提供一系列支持资源。 作为Microchip Technology解决方案的全球授权分销商,贸泽备有其新一代MCU、混合信号、模拟和闪存IP解决方案,以降低各类应用的产品开发风险并加快上市。贸泽还为工程师提供了电子书等丰富的Microchip资源,为设计提供支持。 电子书:贸泽和Microchip最近联手推出了 《Effortless Embedded Solutions》 (轻松设计嵌入式
[单片机]
贸泽推出各种Microchip创新<font color='red'>MCU</font>解决方案
单片机精确延时几种方式
目前在单片机中有不少延时的方法: 1、使用循环函数延时: void delay1ms(void) //误差 0us,延时1ms { unsigned char a,b; for(b=199;b 0;b--) for(a=1;a 0;a--); } 可以用单片机精灵来获取更多延时,下载地址https://pan.baidu.com/s/1qYQeoig 这种延时方式虽然说可以比较精确的延时,但是他会一直占用cpu,延时期间cpu只能选择等待,无法执行其他事情,降低了cpu的使用效率。 2、使用定时器中断延时(C语言版) void IinitTimer() { TMOD = 0x01;
[单片机]
ST 推出针对内置以太网接口的基于STR9 ARM966E内核的微控制器的超低成本开发工具
价值49美元的U盘式开发工具让联网嵌入式系统的开发变得更容易 中国,2007年5月23日 — 全球微控制器的领导厂商意法半导体(纽约证券交易所:STM)今天针对其功能强大的STR91x系列32位微控制器推出一个功能完整且价格极低的评估及开发工具。STR91x系列微控制器芯片基于ARM966E 内核,特别适合联网的嵌入式应用。新工具STR9-comStick被设计成一个带USB接口的U盘形状,所以可以直接插入一台PC机的主机内,厂家建议零售价仅为49美元,该工具还配有一套完整的Hitex软件工具。 STR91x是一系列通用闪存微控制器产品,以ARM9E处理器为内核,内置大容量的静态RAM和闪存,并配备10/100-Mbit以太网
[新品]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved