{"id":4309,"date":"2026-03-26T09:42:18","date_gmt":"2026-03-26T09:42:18","guid":{"rendered":"https:\/\/blog.embeddedexpert.io\/?p=4309"},"modified":"2026-03-26T09:42:20","modified_gmt":"2026-03-26T09:42:20","slug":"stm32f429-discovery-display-guide-part-2-display-initialization-and-draw-pixel","status":"publish","type":"post","link":"https:\/\/blog.embeddedexpert.io\/?p=4309","title":{"rendered":"STM32F429 Discovery Display Guide \u2013 Part 2: Display Initialization and Draw Pixel"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/ChatGPT-Image-Mar-19-2026-at-10_15_45-AM-1-1024x683.png\" alt=\"\" class=\"wp-image-4310\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/ChatGPT-Image-Mar-19-2026-at-10_15_45-AM-1-1024x683.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/ChatGPT-Image-Mar-19-2026-at-10_15_45-AM-1-300x200.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/ChatGPT-Image-Mar-19-2026-at-10_15_45-AM-1-768x512.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/ChatGPT-Image-Mar-19-2026-at-10_15_45-AM-1-1150x767.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/ChatGPT-Image-Mar-19-2026-at-10_15_45-AM-1-750x500.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/ChatGPT-Image-Mar-19-2026-at-10_15_45-AM-1-400x267.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/ChatGPT-Image-Mar-19-2026-at-10_15_45-AM-1-250x167.png 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/ChatGPT-Image-Mar-19-2026-at-10_15_45-AM-1.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Part 2 focuses on initializing the display controller and establishing reliable communication between the STM32F429 and the ILI9341 over SPI. It then introduces the fundamental draw pixel routine, forming the basis for all higher-level graphics operations.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>In this guide, we shall cover the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Creating source and header file.<\/li>\n\n\n\n<li>Developing the header file.<\/li>\n\n\n\n<li>Developing the source file.<\/li>\n\n\n\n<li>Main.c code.<\/li>\n\n\n\n<li>Results.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Creating Source and Header File:<\/h2>\n\n\n\n<p>First, we need to create new source and header files.<\/p>\n\n\n\n<p>To create Source file, right click on Src folder and add new source file as following:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"753\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_12-18-08-1024x753.jpg\" alt=\"\" class=\"wp-image-4311\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_12-18-08-1024x753.jpg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_12-18-08-300x221.jpg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_12-18-08-768x565.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_12-18-08-1536x1130.jpg 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_12-18-08-1150x846.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_12-18-08-750x552.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_12-18-08-400x294.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_12-18-08-250x184.jpg 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_12-18-08.jpg 1770w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Give a name for the source file, we shall name it as ILI9341.c as following:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"734\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-28-1024x734.jpg\" alt=\"\" class=\"wp-image-4312\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-28-1024x734.jpg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-28-300x215.jpg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-28-768x550.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-28-1150x824.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-28-750x538.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-28-400x287.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-28-250x179.jpg 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-28.jpg 1172w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>In similar manner, right click on Inc folder and add new header file with name of ILI9341.h as follows:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"734\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-14-1024x734.jpg\" alt=\"\" class=\"wp-image-4313\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-14-1024x734.jpg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-14-300x215.jpg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-14-768x550.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-14-1150x824.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-14-750x538.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-14-400x287.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-14-250x179.jpg 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2026\/03\/2026-03-26_10-06-14.jpg 1172w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Developing the Header File:<\/h2>\n\n\n\n<p>Open ILI9341 header file.<\/p>\n\n\n\n<p>We start by including the main.h and spi.h as follows:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">#include &quot;main.h&quot;\n\n#include &quot;spi.h&quot;<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Next, declare the following enumeration to handle screen rotation as follows:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">typedef enum {\n\tROTATE_0,\n\tROTATE_90,\n\tROTATE_180,\n\tROTATE_270\n} LCD_Horizontal_t;<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Next, declare the following two functions:<\/p>\n\n\n\n<p>A function that initialize the LCD and set the desired rotation<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">void ILI9341_Init(LCD_Horizontal_t rot);<\/pre><\/div>\n\n\n\n<p>A function that will draw a single pixel and takes the pixel coordinates and the color as follows:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">void ILI9341_WritePixel(uint16_t x, uint16_t y, uint16_t color);<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Hence, the header file as follows:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">#ifndef INC_ILI9341_H_\n#define INC_ILI9341_H_\n\n#include &quot;main.h&quot;\n\n#include &quot;spi.h&quot;\n\ntypedef enum {\n\tROTATE_0,\n\tROTATE_90,\n\tROTATE_180,\n\tROTATE_270\n} LCD_Horizontal_t;\n\nvoid ILI9341_Init(LCD_Horizontal_t rot);\n\nvoid ILI9341_WritePixel(uint16_t x, uint16_t y, uint16_t color);\n\n#endif \/* INC_ILI9341_H_ *\/<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Developing the Source File:<\/h2>\n\n\n\n<p>Open ILI9341.c source file.<\/p>\n\n\n\n<p>Include the ILI9341 header file as follows:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">#include &quot;ILI9341.h&quot;<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Next, declare the following functions that will handle CS, DC, RST as follows:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">static void CS_Deselect()\n{\n\tHAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, SET);\n}\n\nstatic void CS_Select()\n{\n\tHAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, RESET);\n}\n\nstatic void RST_HIGH()\n{\n\tHAL_GPIO_WritePin(RST_GPIO_Port, RST_Pin, SET);\n}\n\nstatic void RST_LOW()\n{\n\tHAL_GPIO_WritePin(RST_GPIO_Port, RST_Pin, RESET);\n}\n\nstatic void DC_HIGH()\n{\n\tHAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, SET);\n}\n\nstatic void DC_LOW()\n{\n\tHAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, RESET);\n}<\/pre><\/div>\n\n\n\n<p>Next, hardware reset for the display, the function as follows:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">static void Reset(void)\n{\n\tRST_HIGH();\n    HAL_Delay(100);\n    RST_LOW();\n    HAL_Delay(100);\n    RST_HIGH();\n    HAL_Delay(100);\n}<\/pre><\/div>\n\n\n\n<p>Next, write data, command and 16-bit data functions as follows:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">static void WriteData(uint8_t data)\n{\n\tCS_Select();\n\tDC_HIGH();\n\n\tHAL_SPI_Transmit(&amp;hspi5, &amp;data, 1, 10);\n\n\tCS_Deselect();\n\n}\n\nstatic void WriteCommand(uint8_t Command)\n{\n\tCS_Select();\n\tDC_LOW();\n\n\tHAL_SPI_Transmit(&amp;hspi5, &amp;Command, 1, 10);\n\n\tCS_Deselect();\n\n}\n\nstatic void WriteData16Bit(uint16_t data)\n{\n\tCS_Select();\n\tDC_HIGH();\n\n\tuint8_t data16_bit[2]={(data&gt;&gt;8)&amp;0xFF, data&amp;0xFF};\n\n\tHAL_SPI_Transmit(&amp;hspi5, data16_bit, 2, 10);\n\n\tCS_Deselect();\n\n}<\/pre><\/div>\n\n\n\n<p>These functions are identical for any LCD driver such as ILI9341, ST7789 etc.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Next, the function that shall set the rotation of the display:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">static void LCD_direction(LCD_Horizontal_t direction)\n{\n\tswitch (direction) {\n\tcase ROTATE_0:\n\t\tWriteCommand(0x36);\n\t\tWriteData(0x48);\n\t\tbreak;\n\tcase ROTATE_90:\n\t\tWriteCommand(0x36);\n\t\tWriteData(0x28);\n\t\tbreak;\n\tcase ROTATE_180:\n\t\tWriteCommand(0x36);\n\t\tWriteData(0x88);\n\t\tbreak;\n\tcase ROTATE_270:\n\t\tWriteCommand(0x36);\n\t\tWriteData(0xE8);\n\t\tbreak;\n\t}\n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Display initialization function:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">void ILI9341_Init(LCD_Horizontal_t rot)\n{\n\tReset();\n\tHAL_Delay(800);\n\n\t\/* Power Control A *\/\n\tWriteCommand(0xCB);\n\tWriteData(0x39);\n\tWriteData(0x2C);\n\tWriteData(0x00);\n\tWriteData(0x34);\n\tWriteData(0x02);\n\t\/* Power Control B *\/\n\tWriteCommand(0xCF);\n\tWriteData(0x00);\n\tWriteData(0xC1);\n\tWriteData(0x30);\n\t\/* Driver timing control A *\/\n\tWriteCommand(0xE8);\n\tWriteData(0x85);\n\tWriteData(0x00);\n\tWriteData(0x78);\n\t\/* Driver timing control B *\/\n\tWriteCommand(0xEA);\n\tWriteData(0x00);\n\tWriteData(0x00);\n\t\/* Power on Sequence control *\/\n\tWriteCommand(0xED);\n\tWriteData(0x64);\n\tWriteData(0x03);\n\tWriteData(0x12);\n\tWriteData(0x81);\n\t\/* Pump ratio control *\/\n\tWriteCommand(0xF7);\n\tWriteData(0x20);\n\t\/* Power Control 1 *\/\n\tWriteCommand(0xC0);\n\tWriteData(0x10);\n\t\/* Power Control 2 *\/\n\tWriteCommand(0xC1);\n\tWriteData(0x10);\n\t\/* VCOM Control 1 *\/\n\tWriteCommand(0xC5);\n\tWriteData(0x3E);\n\tWriteData(0x28);\n\t\/* VCOM Control 2 *\/\n\tWriteCommand(0xC7);\n\tWriteData(0x86);\n\t\/* VCOM Control 2 *\/\n\tWriteCommand(0x36);\n\tWriteData(0x48);\n\t\/* Pixel Format Set *\/\n\tWriteCommand(0x3A);\n\tWriteData(0x55);    \/\/16bit\n\tWriteCommand(0xB1);\n\tWriteData(0x00);\n\tWriteData(0x18);\n\n\t\/* Display Function Control *\/\n\tWriteCommand(0xB6);\n\tWriteData(0x08);\n\tWriteData(0x82);\n\tWriteData(0x27);\n\t\/* 3GAMMA FUNCTION DISABLE *\/\n\tWriteCommand(0xF2);\n\tWriteData(0x00);\n\t\/* GAMMA CURVE SELECTED *\/\n\tWriteCommand(0x26); \/\/Gamma set\n\tWriteData(0x01); \t\/\/Gamma Curve (G2.2)\n\t\/\/Positive Gamma  Correction\n\tWriteCommand(0xE0);\n\tWriteData(0x0F);\n\tWriteData(0x31);\n\tWriteData(0x2B);\n\tWriteData(0x0C);\n\tWriteData(0x0E);\n\tWriteData(0x08);\n\tWriteData(0x4E);\n\tWriteData(0xF1);\n\tWriteData(0x37);\n\tWriteData(0x07);\n\tWriteData(0x10);\n\tWriteData(0x03);\n\tWriteData(0x0E);\n\tWriteData(0x09);\n\tWriteData(0x00);\n\t\/\/Negative Gamma  Correction\n\tWriteCommand(0xE1);\n\tWriteData(0x00);\n\tWriteData(0x0E);\n\tWriteData(0x14);\n\tWriteData(0x03);\n\tWriteData(0x11);\n\tWriteData(0x07);\n\tWriteData(0x31);\n\tWriteData(0xC1);\n\tWriteData(0x48);\n\tWriteData(0x08);\n\tWriteData(0x0F);\n\tWriteData(0x0C);\n\tWriteData(0x31);\n\tWriteData(0x36);\n\tWriteData(0x0F);\n\t\/\/EXIT SLEEP\n\tWriteCommand(0x11);\n\n\tHAL_Delay(120);\n\n\t\/\/TURN ON DISPLAY\n\tWriteCommand(0x29);\n\tHAL_Delay(10);\n\tWriteData(0x2C);\n\tHAL_Delay(10);\n\tLCD_direction(rot);\n\n}<\/pre><\/div>\n\n\n\n<p>The initialization sequence has been taken from <a href=\"https:\/\/github.com\/MaJerle\/stm32f429\/blob\/main\/00-STM32F429_LIBRARIES\/tm_stm32f4_ili9341.c\" data-type=\"link\" data-id=\"https:\/\/github.com\/MaJerle\/stm32f429\/blob\/main\/00-STM32F429_LIBRARIES\/tm_stm32f4_ili9341.c\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.<\/p>\n\n\n\n<p>Next, setWindow function:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">static void ILI9341_SetWindow(uint16_t start_x, uint16_t start_y, uint16_t end_x, uint16_t end_y)\n{\n\t\/\/ Set Window\n\tWriteCommand(0x2a);\n\tWriteData(start_x &gt;&gt; 8);\n\tWriteData(0xFF &amp; start_x);\n\tWriteData(end_x &gt;&gt; 8);\n\tWriteData(0xFF &amp; end_x);\n\n\tWriteCommand(0x2b);\n\tWriteData(start_y &gt;&gt; 8);\n\tWriteData(0xFF &amp; start_y);\n\tWriteData(end_y &gt;&gt; 8);\n\tWriteData(0xFF &amp; end_y);\n\n}<\/pre><\/div>\n\n\n\n<p>The\u00a0<strong>set window<\/strong>\u00a0(also called\u00a0<em>address window<\/em>\u00a0or\u00a0<em>drawing region<\/em>) function is critical because it defines\u00a0<strong>exactly where in the display\u2019s GRAM the incoming pixel data will be written<\/strong>. On controllers like the ILI9341, you don\u2019t send X\/Y coordinates for every pixel\u2014instead, you configure a rectangular region once, and then stream pixel data sequentially, which the controller automatically maps across that area.<\/p>\n\n\n\n<p>Next, draw pixel function:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">void ILI9341_WritePixel(uint16_t x, uint16_t y, uint16_t color)\n{\n\tILI9341_SetWindow(x, y, x, y);\n\n\tWriteCommand(0x2c);\n\n\tWriteData16Bit(color);\n\n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Hence, the source file as follows:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">#include &quot;ILI9341.h&quot;\n\n\n\nstatic void CS_Deselect()\n{\n\tHAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, SET);\n}\n\nstatic void CS_Select()\n{\n\tHAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, RESET);\n}\n\nstatic void RST_HIGH()\n{\n\tHAL_GPIO_WritePin(RST_GPIO_Port, RST_Pin, SET);\n}\n\nstatic void RST_LOW()\n{\n\tHAL_GPIO_WritePin(RST_GPIO_Port, RST_Pin, RESET);\n}\n\nstatic void DC_HIGH()\n{\n\tHAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, SET);\n}\n\nstatic void DC_LOW()\n{\n\tHAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, RESET);\n}\n\nstatic void Reset(void)\n{\n\tRST_HIGH();\n    HAL_Delay(100);\n    RST_LOW();\n    HAL_Delay(100);\n    RST_HIGH();\n    HAL_Delay(100);\n}\n\nstatic void WriteData(uint8_t data)\n{\n\tCS_Select();\n\tDC_HIGH();\n\n\tHAL_SPI_Transmit(&amp;hspi5, &amp;data, 1, 10);\n\n\tCS_Deselect();\n\n}\n\nstatic void WriteCommand(uint8_t Command)\n{\n\tCS_Select();\n\tDC_LOW();\n\n\tHAL_SPI_Transmit(&amp;hspi5, &amp;Command, 1, 10);\n\n\tCS_Deselect();\n\n}\n\nstatic void WriteData16Bit(uint16_t data)\n{\n\tCS_Select();\n\tDC_HIGH();\n\n\tuint8_t data16_bit[2]={(data&gt;&gt;8)&amp;0xFF, data&amp;0xFF};\n\n\tHAL_SPI_Transmit(&amp;hspi5, data16_bit, 2, 10);\n\n\tCS_Deselect();\n\n}\n\n\n\n\nstatic void LCD_direction(LCD_Horizontal_t direction)\n{\n\tswitch (direction) {\n\tcase ROTATE_0:\n\t\tWriteCommand(0x36);\n\t\tWriteData(0x48);\n\t\tbreak;\n\tcase ROTATE_90:\n\t\tWriteCommand(0x36);\n\t\tWriteData(0x28);\n\t\tbreak;\n\tcase ROTATE_180:\n\t\tWriteCommand(0x36);\n\t\tWriteData(0x88);\n\t\tbreak;\n\tcase ROTATE_270:\n\t\tWriteCommand(0x36);\n\t\tWriteData(0xE8);\n\t\tbreak;\n\t}\n}\n\n\nvoid ILI9341_Init(LCD_Horizontal_t rot)\n{\n\tReset();\n\tHAL_Delay(800);\n\n\t\/* Power Control A *\/\n\tWriteCommand(0xCB);\n\tWriteData(0x39);\n\tWriteData(0x2C);\n\tWriteData(0x00);\n\tWriteData(0x34);\n\tWriteData(0x02);\n\t\/* Power Control B *\/\n\tWriteCommand(0xCF);\n\tWriteData(0x00);\n\tWriteData(0xC1);\n\tWriteData(0x30);\n\t\/* Driver timing control A *\/\n\tWriteCommand(0xE8);\n\tWriteData(0x85);\n\tWriteData(0x00);\n\tWriteData(0x78);\n\t\/* Driver timing control B *\/\n\tWriteCommand(0xEA);\n\tWriteData(0x00);\n\tWriteData(0x00);\n\t\/* Power on Sequence control *\/\n\tWriteCommand(0xED);\n\tWriteData(0x64);\n\tWriteData(0x03);\n\tWriteData(0x12);\n\tWriteData(0x81);\n\t\/* Pump ratio control *\/\n\tWriteCommand(0xF7);\n\tWriteData(0x20);\n\t\/* Power Control 1 *\/\n\tWriteCommand(0xC0);\n\tWriteData(0x10);\n\t\/* Power Control 2 *\/\n\tWriteCommand(0xC1);\n\tWriteData(0x10);\n\t\/* VCOM Control 1 *\/\n\tWriteCommand(0xC5);\n\tWriteData(0x3E);\n\tWriteData(0x28);\n\t\/* VCOM Control 2 *\/\n\tWriteCommand(0xC7);\n\tWriteData(0x86);\n\t\/* VCOM Control 2 *\/\n\tWriteCommand(0x36);\n\tWriteData(0x48);\n\t\/* Pixel Format Set *\/\n\tWriteCommand(0x3A);\n\tWriteData(0x55);    \/\/16bit\n\tWriteCommand(0xB1);\n\tWriteData(0x00);\n\tWriteData(0x18);\n\n\t\/* Display Function Control *\/\n\tWriteCommand(0xB6);\n\tWriteData(0x08);\n\tWriteData(0x82);\n\tWriteData(0x27);\n\t\/* 3GAMMA FUNCTION DISABLE *\/\n\tWriteCommand(0xF2);\n\tWriteData(0x00);\n\t\/* GAMMA CURVE SELECTED *\/\n\tWriteCommand(0x26); \/\/Gamma set\n\tWriteData(0x01); \t\/\/Gamma Curve (G2.2)\n\t\/\/Positive Gamma  Correction\n\tWriteCommand(0xE0);\n\tWriteData(0x0F);\n\tWriteData(0x31);\n\tWriteData(0x2B);\n\tWriteData(0x0C);\n\tWriteData(0x0E);\n\tWriteData(0x08);\n\tWriteData(0x4E);\n\tWriteData(0xF1);\n\tWriteData(0x37);\n\tWriteData(0x07);\n\tWriteData(0x10);\n\tWriteData(0x03);\n\tWriteData(0x0E);\n\tWriteData(0x09);\n\tWriteData(0x00);\n\t\/\/Negative Gamma  Correction\n\tWriteCommand(0xE1);\n\tWriteData(0x00);\n\tWriteData(0x0E);\n\tWriteData(0x14);\n\tWriteData(0x03);\n\tWriteData(0x11);\n\tWriteData(0x07);\n\tWriteData(0x31);\n\tWriteData(0xC1);\n\tWriteData(0x48);\n\tWriteData(0x08);\n\tWriteData(0x0F);\n\tWriteData(0x0C);\n\tWriteData(0x31);\n\tWriteData(0x36);\n\tWriteData(0x0F);\n\t\/\/EXIT SLEEP\n\tWriteCommand(0x11);\n\n\tHAL_Delay(120);\n\n\t\/\/TURN ON DISPLAY\n\tWriteCommand(0x29);\n\tHAL_Delay(10);\n\tWriteData(0x2C);\n\tHAL_Delay(10);\n\tLCD_direction(rot);\n\n}\n\nstatic void ILI9341_SetWindow(uint16_t start_x, uint16_t start_y, uint16_t end_x, uint16_t end_y)\n{\n\t\/\/ Set Window\n\tWriteCommand(0x2a);\n\tWriteData(start_x &gt;&gt; 8);\n\tWriteData(0xFF &amp; start_x);\n\tWriteData(end_x &gt;&gt; 8);\n\tWriteData(0xFF &amp; end_x);\n\n\tWriteCommand(0x2b);\n\tWriteData(start_y &gt;&gt; 8);\n\tWriteData(0xFF &amp; start_y);\n\tWriteData(end_y &gt;&gt; 8);\n\tWriteData(0xFF &amp; end_y);\n\n}\n\nvoid ILI9341_WritePixel(uint16_t x, uint16_t y, uint16_t color)\n{\n\tILI9341_SetWindow(x, y, x, y);\n\n\tWriteCommand(0x2c);\n\n\tWriteData16Bit(color);\n\n}<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Main.c File:<\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p>Open main.c file.<\/p>\n\n\n\n<p>In main.c file, include the ILI9341 header file in user code begin includes as follows:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">#include &quot;ILI9341.h&quot;<\/pre><\/div>\n\n\n\n<p>In user code begin 2 in main function:<\/p>\n\n\n\n<p>Initialize the display with rotation of 90 as follows:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">ILI9341_Init(ROTATE_90);<\/pre><\/div>\n\n\n\n<p>In user code begin 3 in while 1 loop:<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">for (int i=0;i&lt;320;i++)\n\t{\n\t\tfor (int j=0;j&lt;240;j++)\n\t\t{\n\t\t\tILI9341_WritePixel(i,j,0xf800);\n\n\t\t}\n\t}\n\n\tfor (int i=0;i&lt;320;i++)\n\t{\n\t\tfor (int j=0;j&lt;240;j++)\n\t\t{\n\t\t\tILI9341_WritePixel(i,j,0x07e0);\n\n\t\t}\n\t}\n\n\tfor (int i=0;i&lt;320;i++)\n\t{\n\t\tfor (int j=0;j&lt;240;j++)\n\t\t{\n\t\t\tILI9341_WritePixel(i,j,0x001f);\n\n\t\t}\n\t}\n\n\tfor (int i=0;i&lt;320;i++)\n\t{\n\t\tfor (int j=0;j&lt;240;j++)\n\t\t{\n\t\t\tILI9341_WritePixel(i,j,0x4a4c);\n\n\t\t}\n\t}<\/pre><\/div>\n\n\n\n<p>This will fill the display with red, green, blue and some color one after the other.<\/p>\n\n\n\n<p>Thats all.<\/p>\n\n\n\n<p>Save the project, build it and run it on your board as following:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"28\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/10\/image-5-1024x28.png\" alt=\"\" class=\"wp-image-3917\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/10\/image-5-1024x28.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/10\/image-5-300x8.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/10\/image-5-768x21.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/10\/image-5-1536x43.png 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/10\/image-5-1150x32.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/10\/image-5-750x21.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/10\/image-5-400x11.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/10\/image-5-250x7.png 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/10\/image-5.png 1734w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">9. Results:<\/h2>\n\n\n\n<p>You should get the following as shown in the video:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"ILI9341 Demo on STM32F429-Discovery board\" width=\"1170\" height=\"658\" src=\"https:\/\/www.youtube.com\/embed\/w1AO4NjrEPY?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>In part 3, we shall start draw images on the display.<\/p>\n\n\n\n<p>Stay tuned.<\/p>\n\n\n\n<p>Happy coding \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Part 2 focuses on initializing the display controller and establishing reliable communication between the STM32F429 and the ILI9341 over SPI. It then introduces the fundamental draw pixel routine, forming the basis for all higher-level graphics operations. In this guide, we shall cover the following: 5. Creating Source and Header File: First, we need to create [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,19,11,12],"tags":[],"class_list":["post-4309","post","type-post","status-publish","format-standard","hentry","category-embedded-systems","category-lcd","category-peripheral-drivers","category-stm32"],"_links":{"self":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/4309"}],"collection":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4309"}],"version-history":[{"count":1,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/4309\/revisions"}],"predecessor-version":[{"id":4314,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/4309\/revisions\/4314"}],"wp:attachment":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4309"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4309"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4309"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}