[STM32F429-DISCO-HAL]2.先學會點亮LED和使用LCD。。。


  首先就簡單的一秒閃爍一次LED燈,進而類比推理其他外設的配置過程。然后呢我們就用上LCD吧,畢竟這塊板上占地面積最大的就是這個2.4’LCD了。

  先貼出簡潔的main函數。很干凈,比較容易看懂。

int main(void)
{
    
    /* STM32F4xx HAL library initialization:
       - Configure the Flash prefetch, Flash preread and Buffer caches
       - Systick timer is configured by default as source of time base, but user 
             can eventually implement his proper time base source (a general purpose 
             timer for example or other time source), keeping in mind that Time base 
             duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and 
             handled in milliseconds basis.
       - Low Level Initialization
     */
    HAL_Init();

    /* Configure the System clock to 180 MHz */
    SystemClock_Config();

    /* Infinite loop ,execute per 1s */
    while (1)
    {   
        LCD_TEXT_STRINGLINE("hello");
        BSP_LED_Toggle(LED3);
        BSP_LED_Toggle(LED4);
        HAL_Delay(1000);
    }
}

先說明一下,如果有疑問,多找\STM32F429DISCO\STM32Cube_FW_F4_V1.5.0\Drivers\STM32F4xx_HAL_Driver\STM32F439xx_User_Manual.chm

-大致過程是這樣的:

     HAL_Init():首先運行HAL_Init()函數。根據手冊上講的,這個函數是用來初始化HAL庫的,必須在main函數中最先執行(即調用其他HAL函數之前先執行),它做了這些事情:配置Flash的預存取,配置指令數據高速緩存,將Systick配制成1ms產生一次系統中斷(常用來做delay函數和OS時間基准),設置NVIC優先級4,調用HAL_MspInit()回調函數,這個函數就是我們初始化HAL底層硬件設備所用到的。

//File:stm32f4xx_hal_msp.c

void HAL_MspInit(void)
{
  /* NOTE : This function is generated automatically by MicroXplorer and eventually  
            modified by the user
   */ 
    bsp_config();
}

//File Config.c
void bsp_config(void)
{
    /* Initialize STM32F429I-DISCO's LEDs */
    BSP_LED_Init(LED3);
    BSP_LED_Init(LED4);
  
    /* Initializes the SDRAM device */
    BSP_SDRAM_Init();
      
    /* Initialize the Touch screen */
    BSP_TS_Init(240, 320);
    
    /* Initialize the LCD Screen*/
    LCD_Config();

    /* Enable the CRC Module */
    __HAL_RCC_CRC_CLK_ENABLE();
}

//File stm32f429i_discovery.c

void BSP_LED_Init(Led_TypeDef Led)
{
  GPIO_InitTypeDef  GPIO_InitStruct;
  
  /* Enable the GPIO_LED Clock */
  LEDx_GPIO_CLK_ENABLE(Led);

  /* Configure the GPIO_LED pin */
  GPIO_InitStruct.Pin = GPIO_PIN[Led];
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  
  HAL_GPIO_Init(GPIO_PORT[Led], &GPIO_InitStruct);
  
  HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_RESET); 
}

//File Config.c
void LCD_Config(void)
{  
    BSP_LCD_Init();
    
    /* Layer1 Init */
    BSP_LCD_LayerDefaultInit(LCD_BACKGROUND_LAYER, LCD_BACKGROUND_LAYER_FRAME_BUFFER);
    /* Set Foreground Layer */
    BSP_LCD_SelectLayer(LCD_BACKGROUND_LAYER);
    /* Layer2 Init */
    BSP_LCD_LayerDefaultInit(LCD_FOREGROUND_LAYER, LCD_FOREGROUND_LAYER_FRAME_BUFFER);
    /* Set Foreground Layer */
    BSP_LCD_SelectLayer(LCD_FOREGROUND_LAYER);
    /* Clear the LCD */
    BSP_LCD_Clear(LCD_COLOR_LIGHTBLUE);  
    
    BSP_LCD_SetTextColor(LCD_COLOR_BLACK);
    BSP_LCD_SetBackColor(LCD_COLOR_LIGHTBLUE);
 /* Enable The LCD */ 
 BSP_LCD_DisplayOn();     
}

    初衷是想在Config.c里配置外設。。但是為了演示一下,講配置函數bsp_config在回調函數HAL_MspInit()  中調用,  我們首先初始化了兩個LED指示燈,即配置相關IO口操作。SDRAM的配置和使用帶我后面娓娓道來。。我們這里用到它的目的是將它做為LCD顯示的Frame Buffe。Touch Screen和CRC校驗的配置是留作后面用的,這里沒用到。其次就是點亮LCD了,假定我們只初步實現只有文字顯示界面的功能。先初始化LCD…實際上就是配置ili9341外設來驅動LCD,底層實現過程在ili9341.c文件內。然后設定兩個層做為背景和前景。設置字體顏色,打開顯示。OK我們就可以顯示自己的文字了。

 

SystemClock_Config(); 其實么,這個函數就是配置了各個時鍾,在HAL_Init()配置完成之后,並沒有配置時鍾,默認的使用16MHSI時鍾,我們根據所使用的外設和內核速度來配置相關的時鍾,180MSYSCLK,嗯429還是挺快的哈,如果覺得亂,貼個圖來解釋一下看看就清晰了

image

   關於顯示文字,stm32f429i_discovery_lcd.c文件中定義好了很多關於打印文字,畫基本圖形等函數,我們可以簡單的封裝一下拿來用,

volatile uint8_t Disp_Line = 0;

void LCD_TEXT_STRINGLINE(char* s)
{
    if(Disp_Line > 12)
    {
        Disp_Line = 0;
        BSP_LCD_Clear(LCD_COLOR_LIGHTBLUE);
    }
        
    BSP_LCD_DisplayStringAtLine(Disp_Line++,(uint8_t*)s);
}

其中使用道德庫函數就是這個,第一個參數是指定行號,函數將行號乘以字體高度,自動計算出顯示位置。把char*轉換成uint8_t*是為了不出現警告而已。。

BSP_LCD_DisplayStringAtLine(Disp_Line++ ,(uint8_t*)s);

一屏大概13行,寫滿了就刷屏從第一行打印。。。這樣用起來就比較簡單了。1428809620765效果演示下。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM