stm32驱动液晶(ILI9320) 源自正点原子(笔记)

FSMC笔记:

STM32 FSMC 存储块 1Bank1)被分为 4 个区,每个区管理 64M 字节空间,每个区都有独立的寄存器对所连接的存储器进行配置。 Bank1 256M 字节空间由 28 根地址线( HADDR[27:0])寻址。这里 HADDR 是内部 AHB 地址 总线,其 中 HADDR[25:0] 来自外部存储器地 址FSMC_A[25:0],而 HADDR[26:27] 4 个区进行寻址

Bank1 接的是 16 位宽度存储器的时候: HADDR[25:1] 指向 FSMC[24:0] 。因此HADDR需要左移一位,才能使 HADDR[24:0] 指向 FSMC[24:0] 。因为HADDR增加或者减少是从最低位开始的, HADDR[25:1] 指向 FSMC[24:0] ,所以HADDR[24:0] 指向 FSMC[24:0]需要向左移动一位    

Bank1 接的是 8 位宽度存储器的时候:   HADDR[25:0] 指向 FSMC[25:0]  

stm32驱动液晶(ILI9320) 源自正点原子(笔记)_第1张图片

内部的AHB总线(通过HADDR)控制外部存储器地 址FSMC_A[27:0]。。。。。。。



液晶模块通过RS信号来判断是输入的数据还是命令,这点正点原子是这样处理的。让FSMC_A[10]连接到RS,块1区4的地址为0x6c00,0000 FSMC_A[10]的偏移地址是:

0x6c00,0000|(1<<(10+1))=0x6c00,0800。

stm32驱动液晶(ILI9320) 源自正点原子(笔记)_第2张图片

stm32驱动液晶(ILI9320) 源自正点原子(笔记)_第3张图片

LCD->LCD_REG=CMD; //写命令     这时FSMC_A[10]=0;
LCD->LCD_RAM=DATA; //写数据   这时FSMC_A[10]=1;
而读的时候反过来操作就可以了,如下所示:
CMD= LCD->LCD_REG; //LCD 寄存器
DATA = LCD->LCD_RAM; //LCD 数据 

下面是相关的7个基本函数:

//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(u16 regval)
{
LCD->LCD_REG=regval; //
写入要写的寄存器序号
}
//
LCD 数据
//data:要写入的值
void LCD_WR_DATA(u16 data)
{
LCD->LCD_RAM=data;
}
 

// LCD 数据
// 返回值 : 读到的值
u16 LCD_RD_DATA(void)
{

vu16 ram; // 防止被优化
ram=LCD->LCD_RAM;
return ram;
}


// 写寄存器
//LCD_Reg: 寄存器地址
//LCD_RegValue: 要写入的数据
void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue)
{
LCD->LCD_REG = LCD_Reg; //
写入要写的寄存器序号         写过寄存器后,再往ram里写数据,数据最终会被写到寄存器里面。
LCD->LCD_RAM = LCD_RegValue; // 写入数据     //LCD->LCD_REG = LCD_Reg; //写入要写的寄存器序号相当于一个选择开关,这个开关会打开各个寄存器,使数据总线数据连上相应被打开的寄存器
}
//
读寄存器
//LCD_Reg: 寄存器地址
// 返回值 : 读到的数据
u16 LCD_ReadReg(u16 LCD_Reg)
{
LCD_WR_REG(LCD_Reg); //
写入要读的寄存器序号                    我做这个笔记的主要目的是因为这个延时函数的存在,写过寄存器序号后,过5us寄存器的值会被加载到数据总线
delay_us(5);
return LCD_RD_DATA(); //
返回读到的值
}
//
开始写 GRAM
void LCD_WriteRAM_Prepare(void)
{
LCD->LCD_REG=lcddev.wramcmd;
}
//LCD
GRAM
//RGB_Code:
颜色值
void LCD_WriteRAM(u16 RGB_Code)
{
LCD->LCD_RAM = RGB_Code;//
写十六位 GRAM
}


完毕

你可能感兴趣的:(stm32驱动液晶(ILI9320) 源自正点原子(笔记))