a740090004 发表于 2019-5-15 16:40:07

用STM32Cubemx 驱动STME32F407的TFTLCD始终花屏,求帮助,谢谢

本帖最后由 a740090004 于 2019-5-17 10:06 编辑

我用的是原子的F4探索者开发板,用原子官方的寄存器版程序(去掉了里面的串口部分)能正常显示,但是用cubemx生成的初始代码,然后把原子的ILI93xx.c和lcd.h   和font.h文件复制进了相应的.c文件夹和.h文件夹,修改了下程序,发现就一直显示花屏。
以下是我配置的过程,请大神指点一下。


HSE配置

FSMC配置

GPIO配置,背光和LED灯

时钟树配置


然后以下是主函数
int main(void)
{
/* USER CODE BEGIN 1 */
      uint8_t x=0;
      uint8_t lcd_id;                              //存放LCD ID字符串
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();

/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_FSMC_Init();
/* USER CODE BEGIN 2 */
      LCD_Init();
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
      POINT_COLOR=RED;
while (1)
{
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
                switch(x)
                {
                        case 0:LCD_Clear(WHITE);break;
                        case 1:LCD_Clear(BLACK);break;
                        case 2:LCD_Clear(BLUE);break;
                        case 3:LCD_Clear(RED);break;
                        case 4:LCD_Clear(MAGENTA);break;
                        case 5:LCD_Clear(GREEN);break;
                        case 6:LCD_Clear(CYAN);break;
                        case 7:LCD_Clear(YELLOW);break;
                        case 8:LCD_Clear(BRRED);break;
                        case 9:LCD_Clear(GRAY);break;
                        case 10:LCD_Clear(LGRAY);break;
                        case 11:LCD_Clear(BROWN);break;
                }
                POINT_COLOR=RED;         
                LCD_ShowString(30,40,210,24,24,"Explorer STM32F4");      
                LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
                LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
                LCD_ShowString(30,110,200,16,16,lcd_id);                //显示LCD ID                                                      
                LCD_ShowString(30,130,200,12,12,"2014/5/4");                                                      
            x++;
                if(x==12)x=0;
                GPIOF->ODR ^= LED0_Pin|LED1_Pin;
                LL_mDelay(1000);
}
/* USER CODE END 3 */
}


下面是LCD_Init初始化函数,改动只有把GPIO和FSMC配置相关的程序注释掉了,然后去掉了串口,所有的延时函数都改成了LL库里的延时函数,微秒级的延时换成了一毫秒延时(也试过将原子的sys和delay文件添加进工程,直接使用原子的延时函数)。
//初始化lcd
//该初始化函数可以初始化各种型号的LCD(详见本.c文件最前面的描述)
void LCD_Init(void)
{         
//      RCC->AHB1ENR|=0XF<<3;            //使能PD,PE,PF,PG时钟
//      RCC->AHB1ENR|=1<<1;             //使能PB时钟
//      RCC->AHB3ENR|=1<<0;             //使能FSMC时钟
//      GPIO_Set(GPIOB,PIN15,GPIO_MODE_OUT,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);                                                      //PB15 推挽输出,控制背光
//      GPIO_Set(GPIOD,(3<<0)|(3<<4)|(7<<8)|(3<<14),GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);      //PD0,1,4,5,8,9,10,14,15 AF OUT
//      GPIO_Set(GPIOE,(0X1FF<<7),GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);                                                //PE7~15,AF OUT
//      GPIO_Set(GPIOF,PIN12,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);                                                      //PF12,FSMC_A6
//      GPIO_Set(GPIOG,PIN12,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);                                                      //PG12,FSMC_NE4
//         GPIO_AF_Set(GPIOD,0,12);      //PD0,AF12
//         GPIO_AF_Set(GPIOD,1,12);      //PD1,AF12
//         GPIO_AF_Set(GPIOD,4,12);      //PD4,AF12
//         GPIO_AF_Set(GPIOD,5,12);      //PD5,AF12
//         GPIO_AF_Set(GPIOD,8,12);      //PD8,AF12
//         GPIO_AF_Set(GPIOD,9,12);      //PD9,AF12
//         GPIO_AF_Set(GPIOD,10,12);      //PD10,AF12
//         GPIO_AF_Set(GPIOD,14,12);      //PD14,AF12
//         GPIO_AF_Set(GPIOD,15,12);      //PD15,AF12
//      
//         GPIO_AF_Set(GPIOE,7,12);      //PE7,AF12
//         GPIO_AF_Set(GPIOE,8,12);      //PE8,AF12
//         GPIO_AF_Set(GPIOE,9,12);      //PE9,AF12
//         GPIO_AF_Set(GPIOE,10,12);      //PE10,AF12
//         GPIO_AF_Set(GPIOE,11,12);      //PE11,AF12
//         GPIO_AF_Set(GPIOE,12,12);      //PE12,AF12
//         GPIO_AF_Set(GPIOE,13,12);      //PE13,AF12
//         GPIO_AF_Set(GPIOE,14,12);      //PE14,AF12
//         GPIO_AF_Set(GPIOE,15,12);      //PE15,AF12
//      
//         GPIO_AF_Set(GPIOF,12,12);      //PF12,AF12
//         GPIO_AF_Set(GPIOG,12,12);      //PG12,AF12
         
      //寄存器清零
      //bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
      //这里我们使用NE1 ,也就对应BTCR,。                                    
//      FSMC_Bank1->BTCR=0X00000000;
//      FSMC_Bank1->BTCR=0X00000000;
//      FSMC_Bank1E->BWTR=0X00000000;
//      //操作BCR寄存器      使用异步模式
//      FSMC_Bank1->BTCR|=1<<12;                //存储器写使能
//      FSMC_Bank1->BTCR|=1<<14;                //读写使用不同的时序
//      FSMC_Bank1->BTCR|=1<<4;               //存储器数据宽度为16bit            
//      //操作BTR寄存器      
//      //读时序控制寄存器                                                            
//      FSMC_Bank1->BTCR|=0<<28;                //模式A                                                                     
//      FSMC_Bank1->BTCR|=0XF<<0;         //地址建立时间(ADDSET)为15个HCLK 1/168M=6ns*15=90ns      
//      //因为液晶驱动IC的读数据的时候,速度不能太快,尤其是个别奇葩芯片。
//      FSMC_Bank1->BTCR|=60<<8;          //数据保存时间(DATAST)为60个HCLK      =6*60=360ns
//      //写时序控制寄存器
//      FSMC_Bank1E->BWTR|=0<<28;         //模式A                                                                     
//      FSMC_Bank1E->BWTR|=9<<0;                //地址建立时间(ADDSET)为9个HCLK=54ns
//         //9个HCLK(HCLK=168M),某些液晶驱动IC的写信号脉宽,最少也得50ns。         
//      FSMC_Bank1E->BWTR|=8<<8;         //数据保存时间(DATAST)为6ns*9个HCLK=54ns
//      //使能BANK1,区域4
//      FSMC_Bank1->BTCR|=1<<0;                //使能BANK1,区域1            
                        
      LL_mDelay(50); // delay 50 ms
      LCD_WriteReg(0x0000,0x0001);
      LL_mDelay(50); // delay 50 ms
          lcddev.id = LCD_ReadReg(0x0000);   


背光的置位也直接用寄存器改写了
GPIOB->ODR |= 1<<15;                        //点亮背光

重新定义了变量类型
#define u8 uint8_t
#define u16 uint16_t
#define u32 uint32_t
#define vu16 volatile int


程序编译没有错误和警告,但是试了很久,不管怎么复位或者重启开发板,都是始终花屏,LED灯能够循环闪烁。
HAL库也试过,也不行。


a740090004 发表于 2019-5-16 15:49:27

顶一下,求大神帮助

nbperson 发表于 2019-7-20 13:44:51

老哥,解决了吗,我也碰到了同样的问题
页: [1]
查看完整版本: 用STM32Cubemx 驱动STME32F407的TFTLCD始终花屏,求帮助,谢谢