|
本帖最后由 Nino 于 2023-7-23 11:52 编辑
问题情况:
同样的代码, 在仿真模式下(加入断点)可以正常工作, 但是烧录进MCU后便无效, ST7789初始化不成功
void LCD_Init(void) {
LCD_RES_Clr();
osDelay(1);
LCD_RES_Set();
osDelay(200);
//************* Start Initial Sequence **********//
LCD_WR_REG(0x11); //第一个断点
//osDelay(200); //Delay 120ms
//************* Start Initial Sequence **********//
// LCD_WR_REG(0Xf0);
// LCD_WR_DATA8(0xc3);
// LCD_WR_REG(0Xf0);
// LCD_WR_DATA8(0x96);
LCD_WR_REG(0x36); // Memory Access Control
if (USE_HORIZONTAL == 0)LCD_WR_DATA8(0x48);
else if (USE_HORIZONTAL == 1)LCD_WR_DATA8(0x88);
else if (USE_HORIZONTAL == 2)LCD_WR_DATA8(0x28);
else LCD_WR_DATA8(0xE8);
LCD_WR_REG(0x3A);
LCD_WR_DATA8(0x65);
/* Porch Setting */
LCD_WR_REG(0xB2);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x00);
LCD_WR_DATA8(0x33);
LCD_WR_DATA8(0x33);
/* Gate Control */
LCD_WR_REG(0xB7);
LCD_WR_DATA8(0x72);
/* VCOM Setting */
LCD_WR_REG(0xBB);
LCD_WR_DATA8(0x3D); //Vcom=1.625V
/* LCM Control */
LCD_WR_REG(0xC0);
LCD_WR_DATA8(0x2C);
/* VDV and VRH Command Enable */
LCD_WR_REG(0xC2);
LCD_WR_DATA8(0x01);
/* VRH Set */
LCD_WR_REG(0xC3);
LCD_WR_DATA8(0x19);
/* VDV Set */
LCD_WR_REG(0xC4);
LCD_WR_DATA8(0x20);
/* Frame Rate Control in Normal Mode */
LCD_WR_REG(0xC6);
LCD_WR_DATA8(0x0F);
/* Power Control 1 */
LCD_WR_REG(0xD0);
LCD_WR_DATA8(0xA4);
LCD_WR_DATA8(0xA1);
/* Positive Voltage Gamma Control */
LCD_WR_REG(0xE0);
LCD_WR_DATA8(0xD0);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x13);
LCD_WR_DATA8(0x2B);
LCD_WR_DATA8(0x3F);
LCD_WR_DATA8(0x54);
LCD_WR_DATA8(0x4C);
LCD_WR_DATA8(0x18);
LCD_WR_DATA8(0x0D);
LCD_WR_DATA8(0x0B);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x23);
/* Negative Voltage Gamma Control */
LCD_WR_REG(0xE1);
LCD_WR_DATA8(0xD0);
LCD_WR_DATA8(0x04);
LCD_WR_DATA8(0x0C);
LCD_WR_DATA8(0x11);
LCD_WR_DATA8(0x13);
LCD_WR_DATA8(0x2C);
LCD_WR_DATA8(0x3F);
LCD_WR_DATA8(0x44);
LCD_WR_DATA8(0x51);
LCD_WR_DATA8(0x2F);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x1F);
LCD_WR_DATA8(0x20);
LCD_WR_DATA8(0x23);
/* Display Inversion On */
//LCD_WR_REG(0x21);
LCD_WR_REG(0x29);//第二个断点
//osDelay(100);
LCD_Address_Set(0, 0, LCD_W - 1, LCD_H - 1);
LCD_Fill(0, 0, LCD_W - 1, LCD_H - 1, BLACK);
}
猜测原因:
1. 时序问题, 但是调节分频系数后, 将硬件SPI速率降低至12M时依旧无效
2. 初始化时需要一定延时来保证运行稳定, 如代码处 在打断点的地方加入了一定时长的延时,无法正常工作
3. 优先级问题. 但目前没有给SPI加入中断处理, 在RTOS的任务中, LCD初始化/显示的任务也是最高优先级, 但个人认为不是这个问题, 因为仿真下可以正常运行
|
|