你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
a740090004 提问时间:2019-5-15 16:40 /
本帖最后由 a740090004 于 2019-5-17 10:06 编辑

我用的是原子的F4探索者开发板,用原子官方的寄存器版程序(去掉了里面的串口部分)能正常显示,但是用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

然后以下是主函数
  1. int main(void)
  2. {
  3.   /* USER CODE BEGIN 1 */
  4.         uint8_t x=0;
  5.         uint8_t lcd_id[12];                                //存放LCD ID字符串
  6.   /* USER CODE END 1 */
  7.   /* MCU Configuration--------------------------------------------------------*/
  8.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  9.   HAL_Init();
  10.   /* USER CODE BEGIN Init */
  11.   /* USER CODE END Init */
  12.   /* Configure the system clock */
  13.   SystemClock_Config();

  14.   /* USER CODE BEGIN SysInit */
  15.   /* USER CODE END SysInit */
  16.   /* Initialize all configured peripherals */
  17.   MX_GPIO_Init();
  18.   MX_FSMC_Init();
  19.   /* USER CODE BEGIN 2 */
  20.         LCD_Init();
  21.   /* USER CODE END 2 */

  22.   /* Infinite loop */
  23.   /* USER CODE BEGIN WHILE */
  24.         POINT_COLOR=RED;
  25.   while (1)
  26.   {
  27.     /* USER CODE END WHILE */

  28.     /* USER CODE BEGIN 3 */
  29.                 switch(x)
  30.                 {
  31.                         case 0:LCD_Clear(WHITE);break;
  32.                         case 1:LCD_Clear(BLACK);break;
  33.                         case 2:LCD_Clear(BLUE);break;
  34.                         case 3:LCD_Clear(RED);break;
  35.                         case 4:LCD_Clear(MAGENTA);break;
  36.                         case 5:LCD_Clear(GREEN);break;
  37.                         case 6:LCD_Clear(CYAN);break;
  38.                         case 7:LCD_Clear(YELLOW);break;
  39.                         case 8:LCD_Clear(BRRED);break;
  40.                         case 9:LCD_Clear(GRAY);break;
  41.                         case 10:LCD_Clear(LGRAY);break;
  42.                         case 11:LCD_Clear(BROWN);break;
  43.                 }
  44.                 POINT_COLOR=RED;         
  45.                 LCD_ShowString(30,40,210,24,24,"Explorer STM32F4");        
  46.                 LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
  47.                 LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
  48.                 LCD_ShowString(30,110,200,16,16,lcd_id);                //显示LCD ID                                                      
  49.                 LCD_ShowString(30,130,200,12,12,"2014/5/4");                                                      
  50.             x++;
  51.                 if(x==12)x=0;
  52.                 GPIOF->ODR ^= LED0_Pin|LED1_Pin;
  53.                 LL_mDelay(1000);
  54.   }
  55.   /* USER CODE END 3 */
  56. }
复制代码


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


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


重新定义了变量类型
  1. #define u8 uint8_t
  2. #define u16 uint16_t
  3. #define u32 uint32_t
  4. #define vu16 volatile int
复制代码



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

7.jpg

<
收藏 1 评论2 发布时间:2019-5-15 16:40

举报

2个回答
a740090004 回答时间:2019-5-16 15:49:27
顶一下,求大神帮助
nbperson 回答时间:2019-7-20 13:44:51
老哥,解决了吗,我也碰到了同样的问题
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版