OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/FPGA开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 509|回复: 6

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

[复制链接]

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2019-5-15
在线时间
10 小时
发表于 2019-5-15 16:14:39 | 显示全部楼层 |阅读模式
8金钱
本帖最后由 XINRENYIMEI 于 2019-5-16 09:45 编辑

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

HSE配置 1.jpg

FSMC配置 2.jpg 3.jpg 4.jpg

GPIO配置,背光和LED灯 5.jpg

时钟树配置 6.jpg



然后下面是主函数
[mw_shl_code=c,true]int main(void)
{
  /* USER CODE BEGIN 1 */
        uint8_t x=0;
        uint8_t lcd_id[12];                                //存放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 0CD_Clear(WHITE);break;
                        case 1CD_Clear(BLACK);break;
                        case 2CD_Clear(BLUE);break;
                        case 3CD_Clear(RED);break;
                        case 4CD_Clear(MAGENTA);break;
                        case 5CD_Clear(GREEN);break;
                        case 6CD_Clear(CYAN);break;
                        case 7CD_Clear(YELLOW);break;
                        case 8CD_Clear(BRRED);break;
                        case 9CD_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 */
}[/mw_shl_code]


下面是LCD_Init初始化函数,改动只有把GPIO和FSMC配置相关的程序注释掉了,然后去掉了串口,所有的延时函数都改成了LL库里的延时函数,微秒级的延时换成了一毫秒延时(也试过将原子的sys和delay文件添加进工程,直接使用原子的延时函数)。
[mw_shl_code=applescript,true]//初始化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[0],[1]。                                    
//        FSMC_Bank1->BTCR[6]=0X00000000;
//        FSMC_Bank1->BTCR[7]=0X00000000;
//        FSMC_Bank1E->BWTR[6]=0X00000000;
//        //操作BCR寄存器        使用异步模式
//        FSMC_Bank1->BTCR[6]|=1<<12;                //存储器写使能
//        FSMC_Bank1->BTCR[6]|=1<<14;                //读写使用不同的时序
//        FSMC_Bank1->BTCR[6]|=1<<4;                 //存储器数据宽度为16bit            
//        //操作BTR寄存器        
//        //读时序控制寄存器                                                            
//        FSMC_Bank1->BTCR[7]|=0<<28;                //模式A                                                                     
//        FSMC_Bank1->BTCR[7]|=0XF<<0;         //地址建立时间(ADDSET)为15个HCLK 1/168M=6ns*15=90ns        
//        //因为液晶驱动IC的读数据的时候,速度不能太快,尤其是个别奇葩芯片。
//        FSMC_Bank1->BTCR[7]|=60<<8;          //数据保存时间(DATAST)为60个HCLK        =6*60=360ns
//        //写时序控制寄存器  
//        FSMC_Bank1E->BWTR[6]|=0<<28;         //模式A                                                                     
//        FSMC_Bank1E->BWTR[6]|=9<<0;                //地址建立时间(ADDSET)为9个HCLK=54ns
//         //9个HCLK(HCLK=168M),某些液晶驱动IC的写信号脉宽,最少也得50ns。           
//        FSMC_Bank1E->BWTR[6]|=8<<8;         //数据保存时间(DATAST)为6ns*9个HCLK=54ns
//        //使能BANK1,区域4
//        FSMC_Bank1->BTCR[6]|=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);   [/mw_shl_code]


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

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


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



TFTLCD_LL.zip

13 MB, 下载次数: 28

最佳答案

查看完整内容[请看2#楼]

原子哥半夜三点还每睡啊,问题找到了 这个类型错了,设成了带符号的了 #define vu16 volatile int 改成 #define vu16 volatile u16 就好了
回复

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2019-5-15
在线时间
10 小时
 楼主| 发表于 2019-5-15 16:14:40 | 显示全部楼层

原子哥半夜三点还每睡啊,问题找到了
这个类型错了,设成了带符号的了
#define vu16 volatile int
改成
#define vu16 volatile u16
就好了
回复

使用道具 举报

548

主题

10万

帖子

32

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
143046
金钱
143046
注册时间
2010-12-1
在线时间
1544 小时
发表于 2019-5-16 02:27:31 | 显示全部楼层
帮顶
回复

使用道具 举报

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2019-5-15
在线时间
10 小时
 楼主| 发表于 2019-5-16 09:52:30 | 显示全部楼层

请问原子哥,像这样始终显示花屏可能是哪的问题,能够花屏说明初始化应该没有问题把,LED能够循环闪烁说明程序没有卡死,但是无法清屏
回复

使用道具 举报

548

主题

10万

帖子

32

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
143046
金钱
143046
注册时间
2010-12-1
在线时间
1544 小时
发表于 2019-5-17 02:24:47 | 显示全部楼层
XINRENYIMEI 发表于 2019-5-16 09:52
请问原子哥,像这样始终显示花屏可能是哪的问题,能够花屏说明初始化应该没有问题把,LED能够循环闪烁说 ...

先看能读ID不吧
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

11

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
471
金钱
471
注册时间
2015-11-28
在线时间
117 小时
发表于 2019-7-1 15:54:04 | 显示全部楼层
你应该是用的探索板吧? 我想你对这个cubeMX应该还是比较熟悉的吧。想请教一下你:这个cubeMX有没有办法生成初始化代码的时候不把这些同类的(如GPIO FSMC RCC等等)初始化代码都初始化到同一个函数内,而是根据用户自定义相应的label之类的东西来初始化到不同的函数中去? 如MX_FSMC1_Init();MX_FSMC2_Init();之类的。请指教!
回复

使用道具 举报

0

主题

20

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2019-7-14
在线时间
1 小时
发表于 2019-7-14 10:35:55 | 显示全部楼层
顶一个
回复

使用道具 举报

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

本版积分规则



关闭

正点原子T100智能焊台强势面市上一条 /1 下一条

正点原子公众号

QQ|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2019-7-22 07:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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