首先就简单的一秒闪烁一次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还是挺快的哈,如果觉得乱,贴个图来解释一下看看就清晰了
关于显示文字,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); }
一屏大概13行,写满了就刷屏从第一行打印。。。这样用起来就比较简单了。效果演示下。。。