收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
2. 引脚连接
LCD显示屏处的排针:
开发板上对应的LCD接口:(FSMC_8080模式)
对应引脚连接:
| 控制引脚 | ||
| CS | PG12 | FSMC_NE4 |
| #RS | PE2 | |
| FSMC_A23 | ||
| #WR | PD5 | FSMC_NWE |
| #RD | PD4 | |
| FSMC_NOE | ||
| 复位和背光引脚 | ||
| RES | PG11 | 复位 |
| #BK | PG6 | 背光 |
| 数据引脚 | ||
| DB0 | PD14 | FSMC_D0 |
| DB1 | PD15 | FSMC_D1 |
| DB2 | PD0 | FSMC_D2 |
| DB3 | PD1 | FSMC_D3 |
| DB4 | PE7 | FSMC_D4 |
| DB5 | PE8 | FSMC_D5 |
| DB6 | PE9 | FSMC_D6 |
| DB7 | PE10 | FSMC_D7 |
| DB8 | PE11 | FSMC_D8 |
| DB9 | PE12 | FSMC_D9 |
| DB10 | PE13 | FSMC_D10 |
| DB11 | PE14 | FSMC_D11 |
| DB12 | PE15 | FSMC_D12 |
| DB13 | PD8 | FSMC_D13 |
| DB14 | PD9 | FSMC_D14 |
| DB15 | PD10 | FSMC_D15 |
在引脚连接时,特地将LCD的控制引脚和数据引脚与MCU的FSMC外设连接,在使用FSMC模拟8080时序时,这些引脚便可交由FSMC控制,只需将FSMC配置好就可以了。当然,也可使用模拟SPI对这些引脚进行控制。所以在编写代码时,除了读写接口函数配置不同以外,两种控制方式的其他带啊吗都可相同。
3. FSMC与“8080”
如果说你问我:你怎么知道FSMC可以模拟8080?
我只能回答:我也是听别人说的。
首先我们先对比8080与FSMC二者时序的异同。
LCD 8080时序
注:①写命令;②写数据。
FSMC写NOR时序(模式B)
| LCD 8080时序 | FSMC 写NOR | ||
| #CS | 片选 | #NEx | 片选 |
| RDX | 读使能 | #NOE | 读使能 |
| WRX | 写使能 | #NWE | 写使能 |
| D/CX | 数据#命令 | A[25:0] | 地址线 |
| D[17:0] | 数据引脚 | D[15:0] | 数据引脚 |
如图可见,LCD的8080时序与FSMC写NOR(模式B)时序近乎相同,数据引脚选用16位模式。
不同的则是FSMC没有数据命令选择引脚,只有地址线,我们可选择地址线中的一根地址线充当数据命令控制引脚即可(0表示命令模式,1表示数据模式)。因此,只要配置好FSMC,便可模拟8080时序驱动LCD屏幕实现数据显示。
3.1 FSMC设备地址
FSMC 存储块
如图所示,NOR/PSRAM的地址范围为 0x60000000~0x6FFFFFFF。NOR/PSRAM又分为4个存储块,如下图所示,存储块的选择由地址的26和27位控制。
60000000H二进制表示为:0110 0000 0000 0000 0000 0000 0000 0000
[27:26]↑↑
HADDR[27:26]=00表示选择了NOR/PSRAM 1,即起始地址为60000000H
HADDR[27:26]=01表示选择了NOR/PSRAM 2,即起始地址为64000000H
HADDR[27:26]=10表示选择了NOR/PSRAM 3,即起始地址为68000000H
HADDR[27:26]=11表示选择了NOR/PSRAM 4,即起始地址为6C000000H
注意:NOR存储区划分了四个区并有四个专用的片选FSMC_NE[4:1]
那么就以为着我选择NOR/PSRAM 1就需要使用FSMC_NE1对应的片选线。
外部存储地址:地址位对应地址线
对于控制LCD屏而言,我们采取的数据宽度为16位即【RGB565】,地址线FSMC_A[24:0]对应着存储器地址HADDR[25:1]。假设我们使用FSMC_A0地址线作为数据命令控制线,选择的存储块为NOR/PSRAM 1 时,地址设置为0x60000000,地址线A0上的电平输出为低电平,表示命令模式;地址设置为0x60000002,地址线A0上的电平输出为高电平,表示数据模式。
而本次使用的开发板与8080数据命令引脚连接的引脚为PE2(FSMC_A23),对应地址位为HADDR[24]。片选引脚为FSMC_NE4,HADDR[27:26]=11。存储块为NOR/PSRAM 4 ,令地址位的第24位为0时表示命令模式,即0x6C000000;数据模式:0x6D000000。
当我们在该地址上写入数据时,FSMC便会控制数据线输出对应的数据,读取数据时,也可直接读取对应的地址即可。
3.2 FSMC-NOR/PSRAM配置
API(接口函数):
void FSMC_NORSRAMInit(FSMC_NORSRAMInitTypeDef* FSMC_NORSRAMInitStruct)
FSMC_NORSRAMInitTypeDef 初始化结构体
结构体原型:
/**
* @brief FSMC NOR/SRAM Init structure definition
*/
typedef struct
{
uint32_t FSMC_Bank; //选择控制存储块
uint32_t FSMC_DataAddressMux; //地址总线与数据总线是否复用
uint32_t FSMC_MemoryType; //存储器类型
uint32_t FSMC_MemoryDataWidth; //设置存储器数据宽度
uint32_t FSMC_BurstAccessMode; //设置是否支持突发访问模式
uint32_t FSMC_AsynchronousWait; //设置同步等待传输时的等待信号
uint32_t FSMC_WaitSignalPolarity;//设置等待信号极性
uint32_t FSMC_WrapMode; //设置是否支持对齐的突发模式
uint32_t FSMC_WaitSignalActive; //配置等待信号在等待前有效还是等待期间有效
uint32_t FSMC_WriteOperation; //设置写使能
uint32_t FSMC_WaitSignal; //设置等待状态插入使能
uint32_t FSMC_ExtendedMode; //设置扩展模式使能
uint32_t FSMC_WriteBurst; //设置突发模式使能
/*当不使用扩展模式时,本参数用于配置读写时序,否则用于配置读时序*/
FSMC_NORSRAMTimingInitTypeDef* FSMC_ReadWriteTimingStruct;
/*当使用扩展模式时,本参数用于配置写时序*/
FSMC_NORSRAMTimingInitTypeDef* FSMC_WriteTimingStruct;
}FSMC_NORSRAMInitTypeDef;
FSMC_NORSRAMTimingInitTypeDef
时序结构体:
/**
* @brief Timing parameters For NOR/SRAM Banks
*/
typedef struct
{
uint32_t FSMC_AddressSetupTime; //地址建立时间
uint32_t FSMC_AddressHoldTime; //地址保持时间
uint32_t FSMC_DataSetupTime; //数据建立时间
uint32_t FSMC_BusTurnAroundDuration; //总线转换周期
uint32_t FSMC_CLKDivision; //时钟分频因子(异步模式下无效)
uint32_t FSMC_DataLatency; //数据延迟时间(异步模式下无效)
uint32_t FSMC_AccessMode; //设置访问模式
}FSMC_NORSRAMTimingInitTypeDef;
3.3 配置FSMC
时钟和中断优先级的配置都在main.c中做统一配置。
引脚配置:除了RES和BK引脚以为,其他引脚都配置为复用输出模式。这里为了减少代码行数,就直接使用16进制代替GPIO_Pin。
void ILI9341_GPIO_Config(void)
{
//复位和背光引脚:通用推挽输出
GPIO_InitTypeDef ILI9341_GPIO;
ILI9341_GPIO.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_11;
ILI9341_GPIO.GPIO_Mode = GPIO_Mode_Out_PP;
ILI9341_GPIO.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG,&ILI9341_GPIO);
//数据引脚和控制引脚:复用推挽输出
//GPIOD
ILI9341_GPIO.GPIO_Pin = 0xC733;
ILI9341_GPIO.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD,&ILI9341_GPIO);
//GPIOE
ILI9341_GPIO.GPIO_Pin = 0xFF84;//PE 2、7~15
GPIO_Init(GPIOE,&ILI9341_GPIO);
//GPIOG
ILI9341_GPIO.GPIO_Pin = GPIO_Pin_12;
GPIO_Init(GPIOG,&ILI9341_GPIO);
}
**FSMC配置:**此处就不做过多解释,详情参考STM32F10x用户手册。
void ILI9341_FSMC_Config(void)
{
FSMC_NORSRAMDeInit(FSMC_Bank1_NORSRAM4); //复位存储块NOR/PSRAM 4
FSMC_NORSRAMInitTypeDef ili9341_FSMC={0}; //NOR初始化结构体
/*时序配置*/
FSMC_NORSRAMTimingInitTypeDef FSMC_ReadWrite_Timing={0};//时序结构体
FSMC_ReadWrite_Timing.FSMC_AddressSetupTime = 0x01;//地址建立时间
FSMC_ReadWrite_Timing.FSMC_DataSetupTime = 0x04;//数据建立时间
FSMC_ReadWrite_Timing.FSMC_AccessMode = FSMC_AccessMode_B;//访问模式:模式B
/*以下配置与模式B无关*/
FSMC_ReadWrite_Timing.FSMC_AddressHoldTime = 0x00;//地址保持时间
//仅适用于总线复用模式的NOR闪存操作
FSMC_ReadWrite_Timing.FSMC_BusTurnAroundDuration = 0x00;//总线转换周期
//在访问异步NOR闪存、SRAM或ROM时,这个参数不起作用
FSMC_ReadWrite_Timing.FSMC_CLKDivision = 0x00;//时钟分频因子
FSMC_ReadWrite_Timing.FSMC_DataLatency = 0x00;//数据延迟时间
/*NOR初始化配置*/
ili9341_FSMC.FSMC_Bank = FSMC_Bank1_NORSRAM4; // NOR/PSRAM 4
ili9341_FSMC.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;//地址数据总线不复用
ili9341_FSMC.FSMC_MemoryType = FSMC_MemoryType_NOR;
ili9341_FSMC.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
ili9341_FSMC.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;//同步突发模式
ili9341_FSMC.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;//不使能等待
ili9341_FSMC.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
ili9341_FSMC.FSMC_WrapMode = FSMC_WrapMode_Disable;//不支持对齐突发模式
ili9341_FSMC.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;//等待信号在等待前有效
ili9341_FSMC.FSMC_WriteOperation = FSMC_WriteOperation_Enable;//写使能
ili9341_FSMC.FSMC_WaitSignal = FSMC_WaitSignal_Disable;//不使能等待状态插入
ili9341_FSMC.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;//不使能扩展模式
ili9341_FSMC.FSMC_WriteBurst = FSMC_WriteBurst_Disable;//不使能写突发模式
ili9341_FSMC.FSMC_ReadWriteTimingStruct = &FSMC_ReadWrite_Timing;
ili9341_FSMC.FSMC_WriteTimingStruct = &FSMC_ReadWrite_Timing;
FSMC_NORSRAMInit(&ili9341_FSMC);
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4,ENABLE);//使能FSMC
}
接下来就是写数据、写命令和读数据函数。由于使用了FSMC外设,所以读写数据都可直接对地址操作。这里我定义的地址为:
#define FSMC_ADDR_CMD() *(volatile uint16_t *)0x6C000000
#define FSMC_ADDR_DATA() *(volatile uint16_t *)0x6D000000
改地址为32位地址,因为我们读取的数据位数为16位,所以做了个地址对齐并使用volatile对这段地址进行防止被优化。再取个*表示值,可读取和改变这个值。
/*
\brief: 写指令
\param: cmd: ili9341控制指令
\retval: none
*/
void ILI9341_WriteCmd(uint16_t cmd)
{
FSMC_ADDR_CMD() = cmd;
}
/*
\brief: 写数据
\param: data: 写入的数据
\retval: none
*/
void ILI9341_WriteData(uint16_t data)
{
FSMC_ADDR_DATA() = data;
}
/*
\brief: 读数据
\param: none
\retval: none
*/
uint16_t ILI9341_ReadData(void)
{
return FSMC_ADDR_DATA();
}
在此,对FSMC的操作已经结束,重要的就是用到这三个函数对ILI9341进行读写操作,换言之,使用SPI也是用到读写函数。
4. 4线SPI
此处先略。
5. LCD配置
驱动LCD屏的关键是在屏幕任意位置画一个点,相对于OLED的画点只是一个位表示亮和不亮,这里的画点,一个点表示一个16位的RGB像素点。
5.1 获取LCD显示屏ID
读取ID指令为04H,在未对屏幕进行任何配置前,可用该指令验证编写好的读写函数是否可行。
/*
\brief: 读显示ID信息
\param: none
\retval: ID信息
*/
uint16_t Read_LCD_ID(void)
{
uint16_t id=0;
ILI9341_WriteCmd(0x04);//读显示ID信息
ILI9341_ReadData();
ILI9341_ReadData();//LCD制造商ID
id = ILI9341_ReadData();//驱动版文号ID
id <<= 8;
id |= (ILI9341_ReadData()&0x00FF);//驱动ID
return id;
}
读取ID信息,首先需要使用发送命令函数发送指令0x04,随后直接读取ID信息。这里我只需要后两个ID数据,前两个字节数据就不做保存。ILI9341的16位ID号为9341,ST7789V的ID号为8552。
根据ID号配置LCD屏初始化序列,当然,在知道自己所用LCD型号时不需要根据ID配置。
/*
\brief: ILI9341初始化序列配置(寄存器配置)
\param: none
\retval: none
*/
void ILI9341_InitSequence(void)
{
if(Read_LCD_ID() == 0x9341)
{
/* Power control B (CFh) */
ILI9341_WriteCmd ( 0xCF );
ILI9341_WriteData ( 0x00 );
ILI9341_WriteData ( 0x81 );
ILI9341_WriteData ( 0x30 );
/* Power on sequence control (EDh) */
ILI9341_WriteCmd ( 0xED );
ILI9341_WriteData ( 0x64 );
ILI9341_WriteData ( 0x03 );
ILI9341_WriteData ( 0x12 );
ILI9341_WriteData ( 0x81 );
/* Driver timing control A (E8h) */
ILI9341_WriteCmd ( 0xE8 );
ILI9341_WriteData ( 0x85 );
ILI9341_WriteData ( 0x10 );
ILI9341_WriteData ( 0x78 );
/* Power control A (CBh) */
ILI9341_WriteCmd ( 0xCB );
ILI9341_WriteData ( 0x39 );
ILI9341_WriteData ( 0x2C );
ILI9341_WriteData ( 0x00 );
ILI9341_WriteData ( 0x34 );
//ILI9341_WriteData ( 0x02 );
ILI9341_WriteData ( 0x06 ); //原来是0x02改为0x06可防止液晶显示白屏时有条纹的情况
/* Pump ratio control (F7h) */
ILI9341_WriteCmd ( 0xF7 );
ILI9341_WriteData ( 0x20 );
/* Driver timing control B */
ILI9341_WriteCmd ( 0xEA );
ILI9341_WriteData ( 0x00 );
ILI9341_WriteData ( 0x00 );
/* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */
ILI9341_WriteCmd ( 0xB1 );
ILI9341_WriteData ( 0x00 );
ILI9341_WriteData ( 0x1B );
/* Display Function Control (B6h) */
ILI9341_WriteCmd ( 0xB6 );
ILI9341_WriteData ( 0x0A );
ILI9341_WriteData ( 0xA2 );
/* Power Control 1 (C0h) */
ILI9341_WriteCmd ( 0xC0 );
ILI9341_WriteData ( 0x35 );
/* Power Control 2 (C1h) */
ILI9341_WriteCmd ( 0xC1 );
ILI9341_WriteData ( 0x11 );
/* VCOM Control 1 (C5h) */
ILI9341_WriteCmd ( 0xC5 );
ILI9341_WriteData ( 0x45 );
ILI9341_WriteData ( 0x45 );
/* VCOM Control 2 (C7h) */
ILI9341_WriteCmd ( 0xC7 );
ILI9341_WriteData ( 0xA2 );
/* Enable 3G (F2h) */
ILI9341_WriteCmd ( 0xF2 );
ILI9341_WriteData ( 0x00 );
/* Gamma Set (26h) */
ILI9341_WriteCmd ( 0x26 );
ILI9341_WriteData ( 0x01 );
/* Positive Gamma Correction */
ILI9341_WriteCmd ( 0xE0 ); //Set Gamma
ILI9341_WriteData ( 0x0F );
ILI9341_WriteData ( 0x26 );
ILI9341_WriteData ( 0x24 );
ILI9341_WriteData ( 0x0B );
ILI9341_WriteData ( 0x0E );
ILI9341_WriteData ( 0x09 );
ILI9341_WriteData ( 0x54 );
ILI9341_WriteData ( 0xA8 );
ILI9341_WriteData ( 0x46 );
ILI9341_WriteData ( 0x0C );
ILI9341_WriteData ( 0x17 );
ILI9341_WriteData ( 0x09 );
ILI9341_WriteData ( 0x0F );
ILI9341_WriteData ( 0x07 );
ILI9341_WriteData ( 0x00 );
/* Negative Gamma Correction (E1h) */
ILI9341_WriteCmd ( 0XE1 ); //Set Gamma
ILI9341_WriteData ( 0x00 );
ILI9341_WriteData ( 0x19 );
ILI9341_WriteData ( 0x1B );
ILI9341_WriteData ( 0x04 );
ILI9341_WriteData ( 0x10 );
ILI9341_WriteData ( 0x07 );
ILI9341_WriteData ( 0x2A );
ILI9341_WriteData ( 0x47 );
ILI9341_WriteData ( 0x39 );
ILI9341_WriteData ( 0x03 );
ILI9341_WriteData ( 0x06 );
ILI9341_WriteData ( 0x06 );
ILI9341_WriteData ( 0x30 );
ILI9341_WriteData ( 0x38 );
ILI9341_WriteData ( 0x0F );
/* memory access control set */
ILI9341_WriteCmd ( 0x36 );
ILI9341_WriteData ( 0xC8 ); /*竖屏 左上角到 (起点)到右下角 (终点)扫描方式*/
/* column address control set */
ILI9341_WriteCmd ( 0x2A );
ILI9341_WriteData ( 0x00 );
ILI9341_WriteData ( 0x00 );
ILI9341_WriteData ( 0x00 );
ILI9341_WriteData ( 0xEF );
/* page address control set */
ILI9341_WriteCmd ( 0x2B );
ILI9341_WriteData ( 0x00 );
ILI9341_WriteData ( 0x00 );
ILI9341_WriteData ( 0x01 );
ILI9341_WriteData ( 0x3F );
/* Pixel Format Set (3Ah) */
ILI9341_WriteCmd ( 0x3a );
ILI9341_WriteData ( 0x55 );
/* Sleep Out (11h) */
ILI9341_WriteCmd ( 0x11 );
Delay_ms(120);
/* Display ON (29h) */
ILI9341_WriteCmd ( 0x29 );
}
if(Read_LCD_ID() == 0x8552)
{
/* Power control B (CFh) */
ILI9341_WriteCmd ( 0xCF );
ILI9341_WriteData ( 0x00 );
ILI9341_WriteData ( 0xC1 );
ILI9341_WriteData ( 0x30 );
/* Power on sequence control (EDh) */
ILI9341_WriteCmd ( 0xED );
ILI9341_WriteData ( 0x64 );
ILI9341_WriteData ( 0x03 );
ILI9341_WriteData ( 0x12 );
ILI9341_WriteData ( 0x81 );
/* Driver timing control A (E8h) */
ILI9341_WriteCmd ( 0xE8 );
ILI9341_WriteData ( 0x85 );
ILI9341_WriteData ( 0x10 );
ILI9341_WriteData ( 0x78 );
/* Power control A (CBh) */
ILI9341_WriteCmd ( 0xCB );
ILI9341_WriteData ( 0x39 );
ILI9341_WriteData ( 0x2C );
ILI9341_WriteData ( 0x00 );
ILI9341_WriteData ( 0x34 );
ILI9341_WriteData ( 0x02 );
/* Pump ratio control (F7h) */
ILI9341_WriteCmd ( 0xF7 );
ILI9341_WriteData ( 0x20 );
/* Driver timing control B */
ILI9341_WriteCmd ( 0xEA );
ILI9341_WriteData ( 0x00 );
ILI9341_WriteData ( 0x00 );
/* Power Control 1 (C0h) */
ILI9341_WriteCmd ( 0xC0 ); //Power control
ILI9341_WriteData ( 0x21 ); //VRH[5:0]
/* Power Control 2 (C1h) */
ILI9341_WriteCmd ( 0xC1 ); //Power control
ILI9341_WriteData ( 0x11 ); //SAP[2:0];BT[3:0]
/* VCOM Control 1 (C5h) */
ILI9341_WriteCmd ( 0xC5 );
ILI9341_WriteData ( 0x2D );
ILI9341_WriteData ( 0x33 );
/* VCOM Control 2 (C7h) */
// ILI9341_WriteCmd ( 0xC7 );
// ILI9341_WriteData ( 0XC0 );
/* memory access control set */
ILI9341_WriteCmd ( 0x36 ); //Memory Access Control
ILI9341_WriteData ( 0x00 ); /*竖屏 左上角到 (起点)到右下角 (终点)扫描方式*/
ILI9341_WriteCmd(0x3A);
ILI9341_WriteData(0x55);
/* Frame Rate Control (In Normal Mode/Full Colors) (B1h) */
ILI9341_WriteCmd ( 0xB1 );
ILI9341_WriteData ( 0x00 );
ILI9341_WriteData ( 0x17 );
/* Display Function Control (B6h) */
ILI9341_WriteCmd ( 0xB6 );
ILI9341_WriteData ( 0x0A );
ILI9341_WriteData ( 0xA2 );
ILI9341_WriteCmd(0xF6);
ILI9341_WriteData(0x01);
ILI9341_WriteData(0x30);
/* Enable 3G (F2h) */
ILI9341_WriteCmd ( 0xF2 );
ILI9341_WriteData ( 0x00 );
/* Gamma Set (26h) */
ILI9341_WriteCmd ( 0x26 );
ILI9341_WriteData ( 0x01 );
/* Positive Gamma Correction */
ILI9341_WriteCmd(0xe0); //Positive gamma
ILI9341_WriteData(0xd0);
ILI9341_WriteData(0x00);
ILI9341_WriteData(0x02);
ILI9341_WriteData(0x07);
ILI9341_WriteData(0x0b);
ILI9341_WriteData(0x1a);
ILI9341_WriteData(0x31);
ILI9341_WriteData(0x54);
ILI9341_WriteData(0x40);
ILI9341_WriteData(0x29);
ILI9341_WriteData(0x12);
ILI9341_WriteData(0x12);
ILI9341_WriteData(0x12);
ILI9341_WriteData(0x17);
/* Negative Gamma Correction (E1h) */
ILI9341_WriteCmd(0xe1); //Negative gamma
ILI9341_WriteData(0xd0);
ILI9341_WriteData(0x00);
ILI9341_WriteData(0x02);
ILI9341_WriteData(0x07);
ILI9341_WriteData(0x05);
ILI9341_WriteData(0x25);
ILI9341_WriteData(0x2d);
ILI9341_WriteData(0x44);
ILI9341_WriteData(0x45);
ILI9341_WriteData(0x1c);
ILI9341_WriteData(0x18);
ILI9341_WriteData(0x16);
ILI9341_WriteData(0x1c);
ILI9341_WriteData(0x1d);
/* Sleep Out (11h) */
ILI9341_WriteCmd ( 0x11 ); //Exit Sleep
Delay_ms(120);
/* Display ON (29h) */
ILI9341_WriteCmd ( 0x29 ); //Display on
ILI9341_WriteCmd(0x2c);
}
}
为了快速使用,直接复制官方提供的初始化序列。也可自行查看寄存器进行配置。
5.2 初始化LCD
/*
\brief: ILI9341驱动LCD屏初始化配置
\param: none
\retval: none
*/
void ILI9341_LCD_InitConfig(void)
{
ILI9341_GPIO_Config(); //引脚配置
ILI9341_FSMC_Config(); //FSMC外设配置
//复位
ILI9341_RES(Bit_RESET); //开始复位
Delay_ms(5);
ILI9341_RES(Bit_SET); //结束复位
Delay_ms(5);
ILI9341_InitSequence(); //配置初始化序列
ILI9341_BK(Bit_RESET); //打开背光
}
(1)配置GPIO工作模式;
(2)配置FSMC外设;
(3)复位LCD;
(4)配置LCD初始化序列;
(5)打开背光。
5.3 画点函数(重要)
在控制LCD显示时,没有配置LCD存储器的扫描方式,即保持初始化序列中的配置(从上到下,从左到右),(0,0)为屏幕左上角的顶点。
5.3.1 设置坐标
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!