Brandywine

Hey dol,merry dol! ring along dillo! Ring a dong!hop along!fal lal the willow! Tom Bom,jolly Tom,Tom Bombadillo!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

  首先就简单的一秒闪烁一次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效果演示下。。。

posted on 2015-04-12 11:35  Brandywine  阅读(3204)  评论(2编辑  收藏  举报