zoukankan      html  css  js  c++  java
  • [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);
        }
    }

    先说明一下,如果有疑问,多找STM32F429DISCOSTM32Cube_FW_F4_V1.5.0DriversSTM32F4xx_HAL_DriverSTM32F439xx_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效果演示下。。。

  • 相关阅读:
    堆排序
    归并排序
    Distinct Subsequences——Leetcode
    Longest Consecutive Sequence——Leetcode
    Different Ways to Add Parentheses——Leetcode
    Haproxy 安装配置详解
    Saltstack常用模块
    SaltStack之安装
    tcpcopy复制线上流量
    nginx配置详解与优化
  • 原文地址:https://www.cnblogs.com/priestyoyo/p/4419233.html
Copyright © 2011-2022 走看看