HAL library 12- LCD for STM32Fxxx
LCD is first big library provided from me. It’s the same as SDRAM, it works on STM32F429-Discovery, STM32F439-EVAL and STM32F7-Discovery boards. With one library you can control 3 boards just by selecting proper define in your target.
Library can be extended to other boards. Library requires FMC peripheral for SDRAM for display memory, DMA2D for fastest graphic accelerations and LTDC for transferring layers to LCD.
Library
Features
- Supports STM32F429-Discovery board
- Supports STM32F439-EVAL board
- Supports STM32F7-Discovery board
- Supports DMA2D graphic acceleration for fastest drawing operations
- Supports screen rotation
- Supports multiple fonts
- And more
Dependencies
- HAL
- TM
- STM32Fxxx HAL
- defines.h
- TM GPIO
- TM SDRAM
- TM DMA2D GRAPHIC
- TM FONTS
- TM SPI when STM32F429-Discovery is used
Board pinouts
LCDÂ pins are different for different board. Using proper defines (explained below) you can select which board is used.
For full pinout list, download and open LCDÂ library and check header file with description.
Board selection
The most important thing is to tell library, which board is used in target system. There are 2 possible ways to do that. One (and I prefer it) is to check my DISCO library and follow instructions which define you have to set for proper board, and another, explained below.
If you choose option one, then you will have no worries in my future libraries where library needs to know exactly which board is used!
The second option (I don’t prefer it) is, to set define only for this library. Copy define corresponding to your board into defines.h file or make a global defines in compiler’s settings. I made global defines in Keil uVision under “Options for Target” -> “C/C++” tab.
1 2 3 4 5 6 7 8 |
//Use LCD on STM32F439-EVAL board #define LCD_USE_STM32F439_EVAL //Use LCD on STM32F7-Discovery board #define LCD_USE_STM32F7_DISCOVERY //Use LCD on STM32F429-Discovery board #define LCD_USE_STM32F429_DISCOVERY |
Functions and enumerations
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 |
/** * @brief LCD result enumeration */ typedef enum _TM_LCD_Result_t { TM_LCD_Result_Ok = 0x00, /*!< Everything OK */ TM_LCD_Result_Error, /*!< An error occurred */ TM_LCD_Result_SDRAM_Error /*!< SDRAM initialization has failed */ } TM_LCD_Result_t; /** * @} */ /** * @defgroup TM_LCD_Functions * @brief Library Functions * @{ */ /** * @brief Initializes LCD * @note This function must be called at the beginning of LCD operations * @param None * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_Init(void); /** * @brief Fills currently active layer with desired color * @note To select active layer, use @ref TM_LCD_SetLayer1() or @ref TM_LCD_SetLayer2() functions * @param color: Color index in RGB565 format * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_Fill(uint32_t color); /** * @brief Sets display ON * @note This function is already called inside @ref TM_LCD_Init() function * @param None * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_DisplayOn(void); /** * @brief Sets display OFF * @param None * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_DisplayOff(void); /** * @brief Gets LCD width in unit of pixels * @param None * @retval LCD width in unit of pixels */ uint16_t TM_LCD_GetWidth(void); /** * @brief Gets LCD height in unit of pixels * @param None * @retval LCD width in unit of pixels */ uint16_t TM_LCD_GetHeight(void); /** * @brief Gets location where LCD buffer is located * @param None * @retval Location in memory where LCD buffer is located */ uint32_t TM_LCD_GetFrameBuffer(void); /** * @brief Sets LCD orientation * @param orientation: LCD orientation you wanna use, values 0 to 3 are available * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_SetOrientation(uint8_t orientation); /** * @brief Gets LCD orientation * @retval LCD orientation */ uint8_t TM_LCD_GetOrientation(void); /** * @defgroup TM_LCD_String_Functions * @brief String functions * @{ */ /** * @brief Sets X and Y location for character drawings * @param X: X coordinate for character drawings * @param Y: Y coordinate for character drawings * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_SetXY(uint16_t X, uint16_t Y); /** * @brief Sets active font for character drawings * @param *Font: Pointer to @ref TM_FONT_t structure with font * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_SetFont(TM_FONT_t* Font); /** * @brief Sets foreground and background colors for character drawings * @param Foreground: Foreground color for characters * @param Background: Background color for characters * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_SetColors(uint32_t Foreground, uint32_t Background); /** * @brief Puts single character to LCD * @note To set X and Y coordinate, use @ref TM_LCD_SetXY function * @param c: Character to be written on LCD * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_Putc(char c); /** * @brief Puts string to LCD * @note To set X and Y coordinate, use @ref TM_LCD_SetXY function * @param *str: String to be written on LCD * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_Puts(char* str); /** * @} */ /** * @defgroup TM_LCD_GRAPHIC_Functions * @brief Library Functions * @{ */ /** * @brief Draws single pixel to LCD * @param X: X coordinate for pixel * @param Y: Y coordinate for pixel * @param color: Color index in RGB565 mode * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_DrawPixel(uint16_t X, uint16_t Y, uint32_t color); /** * @brief Gets pixel index at specific coordinate * @param X: X coordinate for pixel * @param Y: Y coordinate for pixel * @retval Pixel index in RGB565 format */ uint32_t TM_LCD_GetPixel(uint16_t X, uint16_t Y); /** * @brief Draws line between 2 coordinates * @param x0: First point X location * @param y0: First point Y location * @param x1: Second point X location * @param y1: Second point Y location * @param color: Color index for line in RGB565 format * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_DrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t color); /** * @brief Draws rectangle on LCD * @param x0: Top left X location * @param y0: Top left Y location * @param Width: Rectangle width in unit of pixels * @param Height: Rectangle height in unit of pixels * @param color: Color index in RGB565 format * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_DrawRectangle(uint16_t x0, uint16_t y0, uint16_t Width, uint16_t Height, uint32_t color); /** * @brief Draws filled rectangle on LCD * @param x0: Top left X location * @param y0: Top left Y location * @param Width: Rectangle width in unit of pixels * @param Height: Rectangle height in unit of pixels * @param color: Color index in RGB565 format * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_DrawFilledRectangle(uint16_t x0, uint16_t y0, uint16_t Width, uint16_t Height, uint32_t color); /** * @brief Draws rounded rectangle on LCD * @param x0: Top left X location * @param y0: Top left Y location * @param Width: Rectangle width in unit of pixels * @param Height: Rectangle height in unit of pixels * @param r: Radius in unit of pixels in each corner * @param color: Color index in RGB565 format * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_DrawRoundedRectangle(uint16_t x0, uint16_t y0, uint16_t Width, uint16_t Height, uint16_t r, uint32_t color); /** * @brief Draws filled rounded rectangle on LCD * @param x0: Top left X location * @param y0: Top left Y location * @param Width: Rectangle width in unit of pixels * @param Height: Rectangle height in unit of pixels * @param r: Radius in unit of pixels in each corner * @param color: Color index in RGB565 format * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_DrawFilledRoundedRectangle(uint16_t x0, uint16_t y0, uint16_t Width, uint16_t Height, uint16_t r, uint32_t color); /** * @brief Draws circle on LCD * @param x0: X coordinate of circle's center location * @param y0: Y coordinate of circle's center location * @param r: Radius in unit of pixels * @param color: Color index in RGB565 format * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_DrawCircle(int16_t x0, int16_t y0, int16_t r, uint32_t color); /** * @brief Draws filled circle on LCD * @param x0: X coordinate of circle's center location * @param y0: Y coordinate of circle's center location * @param r: Radius in unit of pixels * @param color: Color index in RGB565 format * @retval Member of @ref TM_LCD_Result_t enumeration */ TM_LCD_Result_t TM_LCD_DrawFilledCircle(int16_t x0, int16_t y0, int16_t r, uint32_t color); /** * @} */ /** * @defgroup TM_LCD_LAYER_Functions * @brief Library Functions * @{ */ /** * @brief Sets layer 1 as active layer for drawing on LCD * @param None * @retval None */ TM_LCD_Result_t TM_LCD_SetLayer1(void); /** * @brief Sets layer 2 as active layer for drawing on LCD * @param None * @retval None */ TM_LCD_Result_t TM_LCD_SetLayer2(void); /** * @brief Sets layer 1 alpha value * @param opacity: Alpha value as 8-bit parameter * @retval None */ TM_LCD_Result_t TM_LCD_SetLayer1Opacity(uint8_t opacity); /** * @brief Sets layer 2 alpha value * @param opacity: Alpha value as 8-bit parameter * @retval None */ TM_LCD_Result_t TM_LCD_SetLayer2Opacity(uint8_t opacity); /** * @brief Changes currently visible layer on LCD * @param None * @retval None */ TM_LCD_Result_t TM_LCD_ChangeLayers(void); /** * @brief Copies content from layer 2 to layer 1 * @param None * @retval None */ TM_LCD_Result_t TM_LCD_Layer2To1(void); /** * @brief Copies content from layer 1 to layer 2 * @param None * @retval None */ TM_LCD_Result_t TM_LCD_Layer1To2(void); /** * @} */ /** * @} */ |
Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
/** * Keil project example for LCD * * Before you start, select your target, on the right of the "Load" button * * @author Tilen Majerle * @email tilen@majerle.eu * @website http://stm32f4-discovery.net * @ide Keil uVision 5 * @conf PLL parameters are set in "Options for Target" -> "C/C++" -> "Defines" * @packs STM32F4xx/STM32F7xx Keil packs are requred with HAL driver support * @stdperiph STM32F4xx/STM32F7xx HAL drivers required */ /* Include core modules */ #include "stm32fxxx_hal.h" /* Include my libraries here */ #include "defines.h" #include "tm_stm32_disco.h" #include "tm_stm32_delay.h" #include "tm_stm32_lcd.h" /* Font size structure */ TM_FONT_SIZE_t FontSize; /* String to draw on LCD */ #if defined(STM32F7_DISCOVERY) char str[] = "This is LCD driver for F7-Discovery board"; #elif defined(STM32F439_EVAL) char str[] = "This is LCD driver for F439-Eval board"; #elif defined(STM32F429_DISCOVERY) char str[] = "F429-Discovery board"; #endif int main(void) { /* Init system clock for maximum system speed */ TM_RCC_InitSystem(); /* Init HAL layer */ HAL_Init(); /* Init LCD */ TM_LCD_Init(); /* Fill LCD with color */ TM_LCD_Fill(0x4321); /* Put string on the middle of LCD */ TM_LCD_SetFont(&TM_Font_11x18); /* Get width and height of string */ TM_FONT_GetStringSize(str, &FontSize, &TM_Font_11x18); /* Calculate middle of LCD */ TM_LCD_SetXY((TM_LCD_GetWidth() - FontSize.Width) / 2, (TM_LCD_GetHeight() - FontSize.Height) / 2); /* Put string to LCD */ TM_LCD_Puts(str); while (1) { /* Do nothing */ } } |
Project is available on Github, download all libraries below.
STM32 libraries based on STM32Fxxx HAL drivers.
Recent comments