查看: 2629|回复: 0

【NUCLEO-F767ZI】 FMC驱动TFT彩屏(代码)

[复制链接] qrcode

38

主题

47

帖子

137

积分

注册会员

Rank: 2

积分
137
发表于 2016-8-12 12:33 AM | 显示全部楼层 |阅读模式
本帖最后由 ihalin 于 2016-8-12 23:33 编辑


经过一段时间琢磨STM32F767用fmc来驱动屏幕发现老是不成功,后来发现原来是 F7直接用FSMC驱动MCU接口的屏会有问题的!因为Cache在搞鬼!使用MPU(内存保护单元)对SRAM区做保护才可以驱动MCU屏还有一个原因是我是用杜邦线连接屏幕的干扰大,要在读数据的时候延时2到10us就可以。还有USART3的引脚 PD9 PD8和FMC的数据引脚有冲突,要断开桥接


下面是介绍FMC
FMC是FSMC的基础上支持SDRAM的升级版本
可变存储控制器 (FMC) 包括以下 3 个存储控制器:
NOR/PSRAM 存储控制器
NAND 存储控制器
同步 DRAM (SDRAM/Mobile LPSDR SDRAM) 控制器
FMC  主要特性
FMC 功能块可连接:同步/异步静态存储器、SDRAM 存储器和 NAND Flash。其主要用途有:
将 AHB 数据通信事务转换为适当的外部器件协议
满足外部存储器器件的访问时间要求
所有外部存储器共享地址、数据和控制信号, 但有各自的片选信号。FMC 一次只能访问一
个外部器件。
FMC 控制器的主要特性如下:
连接静态存储器映射的器件:
– 静态随机访问存储器 (SRAM)
– NOR Flash/OneNAND Flash
– PSRAM(4 个存储区域)
– 带有硬件 ECC 的 NAND Flash 存储器,可检查多达 8 KB 的数据
连接同步 DRAM (SDRAM/Mobile LPSDR SDRAM) 存储器
支持突发模式,能够更快速地访问同步器件(如 NOR Flash、PSRAM 和 SDRAM)
可编程连续时钟输出以支持异步和同步访问
具有 8 位、16 位或 32 位宽的数据总线
每个存储区域有独立的片选控制
每个存储区域可独立配置
写使能和字节通道选择输出,可配合 PSRAM、SRAM 和 SDRAM 器件使用
外部异步等待控制
16 x 32 位深度写 FIFO
SDRAM 控制器具有可缓存的 6 x 32 位深度读 FIFO(6 x 14 位地址标记)。
写 FIFO 由所有存储控制器所共用,包括:
写数据 FIFO,用于存储要写入存储器的 AHB 数据(最多 32 位)以及 AHB 传输的一个
控制位(突发或非连续模式)。
写地址 FIFO,用于存储 AHB 地址(最多 28 位)以及 AHB 数据大小(最多 2 位)。
在突发模式下工作时,将仅存储起始地址,但越过页边界时除外(适用于 PSRAM 和
SDRAM)。在此情况下,AHB 突发传输将分成两个 FIFO 条目。
通过将 FMC_BCR1 寄存器中的 WFDIS 位置 1 可禁止写 FIFO。
启动时,必须通过用户应用程序对 FMC 引脚进行配置。应用程序未使用的 FMC I/O 引脚可
用于其它用途。
定义外部器件类型和其特性的 FMC 寄存器通常在启动时进行设置,并且在下次上电或复位
前保持不变。但是,可随时更改设置。

下面是自己用的是 TFT ILI9341
fmc 接口
FMC_D15——>D10
FMC_D14——>D9
FMC_D13——>D8
FMC_D12——>E15
FMC_D11——>E14
FMC_D10——>E13
FMC_D9  ——>E12
FMC_D8  ——>E11
FMC_D7  ——>E10
FMC_D6  ——>E9
FMC_D5  ——>E8
FMC_D4  ——>E7
FMC_D3  ——>D1
FMC_D2  ——>D0
FMC_D1  ——>D15
FMC_D0  ——>D14
LCD(背光)---->B5
LCD_CS——>FMC_NE4
LCD_RS——>FMC_A21(这里A21作为数据命令区分线,在16位数据总线时STM32内部地址会右移一位对齐  A21的偏移量计算:
Bank(x).region(y) + 2 * (2^n)     
Bank(x).region(y)为控制块的首地址
n为你所接的地址管脚号)
0x60000000 + 2 * (2的21次方) = 0x6000 0000 + 0x0040 0000
通过A21 = 0 作为RS=0; 0x6000 0000+0x003F FFFE
通过A21 =1 作为 RS=1; 0x6000 0000+0x0040 0000
0011 FFFF FFFF FFFF FFFF FFFF  对应 A21=0 ---->RS=0
0100 0000 0000 0000 0000 0000  对应 A21=1 ---->RS=1
RS的高低电平,决定了是数据还是命令
所以定义//LCD地址结构体
typedef struct
{
        vu16 LCD_REG;
        vu16 LCD_RAM;
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector1,地址位HADDR[27,26]=00 A21作为数据命令区分线
//注意设置时STM32内部会右移一位对其!                              
#define LCD_BASE        ((u32)(0x60000000 | 0x003FFFFE))
#define LCD             ((LCD_TypeDef *) LCD_BASE)
还要注意的是:
F7直接用FSMC驱动MCU接口的屏会有问题的!因为Cache在搞鬼!使用MPU(内存保护单元)对SRAM区做保护才可以驱动MCU屏
1.不初始化Cache
MPU设置:void MPU_Config(void)
{
  MPU_Region_InitTypeDef MPU_InitStruct;
  

  HAL_MPU_Disable();
  MPU_InitStruct.Enable = MPU_REGION_ENABLE;
  MPU_InitStruct.BaseAddress = 0x20010000;
  MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;
  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
  MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;
  MPU_InitStruct.Number = MPU_REGION_NUMBER0;
  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
  MPU_InitStruct.SubRegionDisable = 0x00;
  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;


  HAL_MPU_ConfigRegion(&MPU_InitStruct);

  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}
下面是LCD的驱动:   [记录]


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表