STM32硬件基础--FSMC/FMC总线控制器

【海东青电子原创文章,转载请注明出处:https://www.jianshu.com/p/62d1ef042d0c

TouchGFX是一套图形中间件代码,属于嵌入式软件范畴,它不可避免的要跟STM32的硬件资源发生联系,在使用STM32CUBEMX配置TouchGFX时,要配置FMC(FSMC)、显示接口(DSI或LTDC等)、QSPI等,就是这个原因。归纳起来,TouchGFX主要用到的MCU的资源有:

1)内存(RAM):为了处理图像,需要RAM来作为图像的缓存(buffer)。这个RAM,可以是MCU片内的,也可以是片外扩展的。LCD的显示像素一般都比较多,需要的RAM也比较大,所以TouchGFX应用基本上都需要MCU扩展RAM,而MCU与RAM最方便的连接方式就是通过FMC(或FSMC)接口。

2)显示接口(DSI或LTDC等)。

3)代码和静态图形存储区。实际应用中,可能要用到不止一个背景图形,这些图形资源被编译到代码中,存储在flash里。如果MCU的片内flash不够用,就需要外扩flash,常用的接口是QSPI。

了解了上述几个接口,再使用CUBEMX配置TouchGFX时,就容易的多了。我们先从配置FMC接口开始,并且从F103具有的FSMC开始,因为它更简单一些。

FSMC,Flexible Static Memory Controller,灵活的静态存储控制器,是MCU里的一个硬件结构,它的作用主要是简化了连接外设的接口。如果使用过IIC总线,就会知道,大致有2种使用IIC的方式:一种是用2根IO口线模拟IIC的时序、用户自己写相关的代码。另一种方法是,利用MCU提供的IIC总线控制器,先配置好IIC有关的一些控制寄存器(可以使用CUBEMX),然后通过HAL函数(或中断)直接读写IIC数据即可。后者是“流程化”的,是IIC操作的标准流程,使用起来更方便,也更稳定。FSMC于此类似,它包含了连接外设(静态RAM,NOR,NAND)所必须的接口信号:

1)片选信号CS;

2)数据总线D0-D15(16bit,也支持8-bit);

3)地址总线(可以跟数据总线复用,接LCD显示屏时,经常用来配置LCD的指令信号,见下面例子);

4)读信号;

5)写信号。

本例中,我们将实现STM32F103通过FSMC接口对 ILI9325 (ILI9320) 显示屏的驱动,接口示意图如下:


图一

对于 ILI9325 ,还需要一个reset复位信号,将MCU的一个GPIO配置成输出模式,并与 LCD 连接即可。

先来看看STM32F103的FSMC的结构(从103的用户手册中截图):


图二

为了简化,我们只关心 NOR/SRAM 部分:


图三

其中,做了标记的信号线是实例中要用到的。下面结合一个具体的例子来说明这些信号线的用法。本例是一个STM32F103通过FSMC连接了一个 ILI9325 LCD。在STM32F103板子上,MCU与LCD接口电路如图:


图四

MCU电路:


图五

16根数据线D0-D15不多说了,这里重点说一下几个控制信号:


图六

上表说明了读、写、片选信号是如何对应MCU的管脚编号的(是pin脚的复用功能,通过CUBEMX配置FSMC时,这些pin的复用功能被自动配置好了)。RS控制信号需要单独解释一下:RS用来告诉 ILI9325 控制器,当前收到MCU送来的数据是“命令”、还是“数据”(详见 ILI9325 数据手册),MCU与RS信号连接有2种方式:一种是通过一个MCU的GPIO与RS相连,每次MCU向 ILI9325 发送数据之前,都根据是发送命令、还是数据,对应地设置GPIO为0或1;另一种方法是将MCU的一个地址线(本例中是A16)与RS相连,并且在代码中使用与该地址线(A16)对应的“地址”来访问 ILI9325 即可(下面的代码会详述如何实现)。A16对应的pin如下:


图七

下面开始使用CUBEMX配置STM32F103的FSMC:


图八

使用外部晶振:


图九

FSMC的配置:


图十

FSMC的NOR(这里用来驱动LCD)区块部分,内部又分成了4个“子区块”:


图十一

这里要注意FSMC占用的地址,这是一个32位的地址,连接不同的外设,FSMC对应地使用不同的地址,比如连接NOR的话,MCU内部地址是从0x6000 0000 开始的,如果连接的是NAND,则地址是0x7000 0000 。而NOR的内部又分成了4个部分,起始地址由32位地址的bit[27:26]决定,用二进制表示为:

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

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

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

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

本例中使用的是Bank1,则地址范围为0x6000 0000-0x63ff ffff (共64M个byte地址)。对应的,访问这个地址空间时,FSMC自动输出NE1片选信号(即,PD7输出0,见图六)。

再来看一个特殊地址:0x6002 0000,二进制为 0110-0000 0000-0010 0000-0000 0000-0000,注意,这里的bit[17]特意设置为1 。FSMC的地址,是“字节地址”,从低到高的地址依次为:

0x6000 0000,0x6000 0001,0x6000 0002,......,共有64M个地址。

但是,当把FSMC配置为16-bit“地址模式”时(由FSMC控制寄存器 FSMC_BCR1 的 MWID 位来配置),显然就应该只有32M个地址了。此时,FSMC做了一个特殊处理:“丢弃”地址的bit-0,从bit-1开始对地址计数(相当于只计算偶数地址,总共有32M个地址),FSMC在实际输出地址时,将地址的值右移一位(相当于除以2,变成了偶数地址),输出到实际的地址线上。F103的文档上是这么写的:


图十二

以地址:0x6002 0000为例,FSMC为16-bit模式时,地址bit[17]的1右移一位后输出到地址线,即A16对应的pin(PD11,见图七)将输出1,也就是RS信号线将为1 。罗嗦了这么多,实际上就是想说明一件事:对 ILI9325 写数据时,使用地址 0x6002 0000 来访问;对 ILI9325 写命令时,使用地址 0x6000 0000 来访问!

最后配置LCD的复位管脚:


图十三

在CUBEMX中生成KEIL的代码,在main.c中添加针对 ILI9325 读写的函数:

main.c

#define LCD_Data_Addr ((uint32_t)0x60020000)     //写数据地址

#define LCD_Reg_Addr    ((uint32_t)0x60000000)  //写命令地址

//写索引(命令)寄存器

void LCD_WriteIndex(unsigned int index)

{

    *(volatile uint16_t *)(LCD_Reg_Addr) = index;

}

//读寄存器

uint16_t LCD_ReadReg(uint16_t reg)

{

    uint16_t ret;

    LCD_WriteIndex(reg);

    ret = *(volatile uint16_t *)(LCD_Data_Addr);

    return ret;

}

程序初始化之后,复位LCD,然后读取 ILI9325 的版本,如果能正确读出数据 “9325”,即表明FSMC配置正确:

//复位LCD

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET);

HAL_Delay(500);

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_SET);


//读

tmp = LCD_ReadReg(0x0000);    //0000为编码,详见 ILI9325手册

//tmp should be 0x9325 now!!!

if(tmp == 0x9325)

{

    //led1 on

    HAL_GPIO_WritePin(GPIOB , GPIO_PIN_8, GPIO_PIN_RESET);

} else

{

    //led2 on

     HAL_GPIO_WritePin(GPIOB , GPIO_PIN_9, GPIO_PIN_RESET);

}

printf("ret=0x%x\n", tmp);

//通过TM_SendChar() 在KEIL中观察变量数值,详见《STM32的ITM跟踪调试功能介绍及实现(一)KEIL篇》和《STM32的ITM跟踪调试功能介绍及实现(四)printf() 篇》。

......

运行结果:


图十四

本例只是为了说明如何配置FSMC,所以只实现了对 ILI9325 的读出数据。增加对 ILI9325 的初始化代码后,就可以容易地实现 ILI9325 显示图像。

有了FSMC配置的基础知识,将方便我们进一步理解 STM32F746G-DISCO 板子上使用FMC访问外部DRAM的配置过程,这个内容将在下一节中介绍 -- STM32硬件基础--FMC读写片外SDRAM

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容