最近有同学像我请教他的LCD屏幕无法使用。首先的现象是屏幕已经亮了,但是无法显示字符或者其他操作。

看似是没有点亮屏幕, 其实这是一个非常关键的现象 !屏幕的这个亮度,其实已经说明了LCD被驱动成功了!肯定是因为其他的原因导致程序死机了。

而我收到这个屏幕的时候,仅有STlink用来供电和下载(其实我拿到的时候已经猜到是什么问题了)

于是我打开他发给我的驱动。

可以看到,驱动非常完备,编程习惯优秀且美观,可以肯定这是一款移植性非常好的驱动。

并且其初始化函数中,也会根据LCD ID的不同对不同设备进行不同的初始化操作。

可以说这份代码做的非常的优秀。

那么朋友们看到这里还没有意识到问题嘛?

没错,其初始化函数中调用printf函数,而这个函数必须依赖于串口重定向还需要打开魔术棒中的特殊设置。

不然就会导致整个程序出现死机。

所以最好的解决办法就是去掉printf函数或者正确的配置串口并进行初始化

可以看到,正确的初始化之后我们可以显示我们的字符,所以破案,由于没有进行串口重定向而导致的串口卡死的问题。

其实这里还有一个问题。

按理来说画笔的默认颜色是红色,但是我发现我写的时候没有用,然后我就把画笔的颜色改为了黑色,发现就可以用了,就非常的奇怪。


int main(void)
{
  /* USER CODE BEGIN 1 */

  /* 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();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
  TFTLCD_Init();
  POINT_COLOR = BLACK;
  LCD_ShowString(10,10,300,100,24,"Hello World");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

所以大家在使用STM32的时候,出现了许多问题实际上是有迹可循的,非常考验大家的编程功底。

例如当我LCD接上电发现可以亮的时候。其实我就已经明白了估计并不是LCD的问题,而当我看到没有使用串口的时候就已经能大致猜到和串口卡死有关系了。

所以如果我们习惯性的使用LED的闪烁来判断程序有没有卡死,就会明白我们的程序有没有卡死。

所以优秀的编程习惯可以节省我们大量的时间,帮我更好的完成我们的任务。

而这就需要我们平时的经验积累,例如知道这种库函数会使用printf调用,串口重定向没处理好会导致程序死机,屏幕白色说明初始化已经成功了(不成功大部分就是黑色)出现了雪花屏幕和白色就说明是已经成功了的,不过白色大部分的原因都是屏幕大小没有设置好。

嘉立创PCB

还没有评论,抢个沙发!