{"id":2085,"date":"2023-11-01T08:25:07","date_gmt":"2023-11-01T08:25:07","guid":{"rendered":"https:\/\/blog.embeddedexpert.io\/?p=2085"},"modified":"2023-11-12T13:10:35","modified_gmt":"2023-11-12T13:10:35","slug":"working-with-stm32f429-discovery-display-part-3-1-stmpe811-touch-controller","status":"publish","type":"post","link":"https:\/\/blog.embeddedexpert.io\/?p=2085","title":{"rendered":"Working with STM32F429-discovery Display Part 3.1: STMPE811 Touch Controller"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"672\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/F9093660-01.jpeg\" alt=\"\" class=\"wp-image-2086\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/F9093660-01.jpeg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/F9093660-01-300x197.jpeg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/F9093660-01-768x504.jpeg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/F9093660-01-750x492.jpeg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/F9093660-01-400x263.jpeg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/F9093660-01-250x164.jpeg 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>In the previous guide (<a rel=\"noreferrer noopener\" href=\"https:\/\/blog.embeddedexpert.io\/?p=2081\" data-type=\"URL\" data-id=\"https:\/\/blog.embeddedexpert.io\/?p=2081\" target=\"_blank\">here<\/a>), we have successfully initialized the LCD and filled the screen the color. In this guide, we shall take a look at the touch controller, it&#8217;s features and initialize the required peripherals.<\/p>\n\n\n\n<p>In this guide, we shall cover the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>STMPE811 Features.<\/li><li>STMPE811 Connection with STM32F429.<\/li><li>I2C Initializations.<\/li><li>Interrupt Initialization.<\/li><\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. STMPE811 Features:<\/h2>\n\n\n\n<p>8 GPIOs<\/p>\n\n\n\n<p>\u25a0 1.8 &#8211; 3.3 V operating voltage<\/p>\n\n\n\n<p>\u25a0 Integrated 4-wire touchscreen controller<\/p>\n\n\n\n<p>\u25a0 Interrupt output pin<\/p>\n\n\n\n<p>\u25a0 Wakeup feature on each I\/O<\/p>\n\n\n\n<p>2 \u25a0 SPI and I C interface<\/p>\n\n\n\n<p>\u25a0 Up to 2 devices sharing the same bus in I 2 C mode (1 address line)<\/p>\n\n\n\n<p>\u25a0 8-input 12-bit ADC<\/p>\n\n\n\n<p>\u25a0 128-depth buffer touchscreen controller<\/p>\n\n\n\n<p>\u25a0 Touchscreen movement detection algorithm<\/p>\n\n\n\n<p>\u25a0 25 kV air-gap ESD protection (system level)<\/p>\n\n\n\n<p>\u25a0 4 kV HBM ESD protection (device level)<\/p>\n\n\n\n<p>Applications<\/p>\n\n\n\n<p>\u25a0 Portable media players<\/p>\n\n\n\n<p>\u25a0 Game consoles<\/p>\n\n\n\n<p>\u25a0 Mobile and smartphones<\/p>\n\n\n\n<p>\u25a0 GPS<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>The STMPE811 is a GPIO (general purpose input\/output) port expander able to interface a main digital ASIC via the two-line bidirectional bus (I 2 C). A separate GPIO expander is often used in mobile multimedia platforms to solve the problems of the limited amount of GPIOs typically available on the digital engine.<\/p>\n\n\n\n<p>The STMPE811 offers great flexibility, as each I\/O can be configured as input, output or specific functions. The device has been designed with very low quiescent current and includes a wakeup feature for each I\/O, to optimize the power consumption of the device.<\/p>\n\n\n\n<p>A 4-wire touchscreen controller is built into the STMPE811. The touchscreen controller is enhanced with a movement tracking algorithm (to avoid excessive data), a 128 x 32 bit buffer and programmable active window feature.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Funcitonal Overview:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"806\" height=\"1024\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.43.29\u202fAM-806x1024.png\" alt=\"\" class=\"wp-image-2087\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.43.29\u202fAM-806x1024.png 806w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.43.29\u202fAM-236x300.png 236w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.43.29\u202fAM-768x976.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.43.29\u202fAM-1209x1536.png 1209w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.43.29\u202fAM-1150x1461.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.43.29\u202fAM-750x953.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.43.29\u202fAM-400x508.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.43.29\u202fAM-250x318.png 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.43.29\u202fAM.png 1480w\" sizes=\"(max-width: 806px) 100vw, 806px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. STMPE811 Connection with STM32F429:<\/h2>\n\n\n\n<p>From STM32F429-disco schematic documentation (MB1075), we can find the connection as following:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"369\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.24\u202fAM-1024x369.png\" alt=\"\" class=\"wp-image-2088\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.24\u202fAM-1024x369.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.24\u202fAM-300x108.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.24\u202fAM-768x277.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.24\u202fAM-1536x553.png 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.24\u202fAM-2048x738.png 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.24\u202fAM-1150x414.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.24\u202fAM-750x270.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.24\u202fAM-400x144.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.24\u202fAM-250x90.png 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>We can clearly see the connection with STM32F429 using I2C3 bus and we have touch interrupt output to indicate that there is a touch to the touch panel.<\/p>\n\n\n\n<p>Also, the pullup resistors which is mandatory for i2c are present, correct 3V3 is supplied and connected to the touch panel pins.<\/p>\n\n\n\n<p>Digging deeper, we can find exactly which pins as following:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"349\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.06\u202fAM-1024x349.png\" alt=\"\" class=\"wp-image-2089\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.06\u202fAM-1024x349.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.06\u202fAM-300x102.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.06\u202fAM-768x262.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.06\u202fAM-1536x524.png 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.06\u202fAM-2048x698.png 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.06\u202fAM-1150x392.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.06\u202fAM-750x256.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.06\u202fAM-400x136.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/11\/Screenshot-2023-11-01-at-8.46.06\u202fAM-250x85.png 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td>STM32F429<\/td><td>STMPE811<\/td><\/tr><tr><td>PA8 (I2C3 SCL)<\/td><td>SCLK<\/td><\/tr><tr><td>PC9 (I2C3 SDA)<\/td><td>SDATA<\/td><\/tr><tr><td>PA15 <\/td><td>INT (interrupt)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. I2C Initialization:<\/h2>\n\n\n\n<p>Since the touch controller is connected to I2C3, we shall initialize I2C3.<\/p>\n\n\n\n<p>You may refer to <a href=\"https:\/\/blog.embeddedexpert.io\/?p=416\" data-type=\"URL\" data-id=\"https:\/\/blog.embeddedexpert.io\/?p=416\" target=\"_blank\" rel=\"noreferrer noopener\">this guide <\/a>for how to initialize the I2C.<\/p>\n\n\n\n<p>Create new header file with name of i2c3.h <\/p>\n\n\n\n<p>The content of the header file:<\/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;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">#ifndef I2C3_H_\n#define I2C3_H_\n\n#include &quot;stdint.h&quot;\n\nvoid i2c3_init(void);\nvoid I2C3_WriteByte(uint8_t saddr,uint8_t maddr, uint8_t *data);\nvoid I2C3_ReadMultiByte(uint8_t saddr,uint8_t maddr, uint8_t* data, uint16_t n);\n\n#endif \/* I2C3_H_ *\/<\/pre><\/div>\n\n\n\n<p>Create new source file with name of i2c3.c.<\/p>\n\n\n\n<p>The content of the source file:<\/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;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">#include &quot;STM32F4xx.h&quot;\n\n#include &quot;i2c3.h&quot;\n\n\n#define AF04 0x04\n\nvoid i2c3_init(void)\n{\n\t\/*GPIO Configuration*\/\n\n\t\/*Enable Clock access to GPIOA and GPIOC*\/\n\tRCC-&gt;AHB1ENR|=RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIOCEN;\n\n\t\/*GPIOA configuration*\/\n\tGPIOA-&gt;MODER|=GPIO_MODER_MODE8_1;\n\tGPIOA-&gt;MODER&amp;=~GPIO_MODER_MODE8_0;\n\n\tGPIOA-&gt;OTYPER|=GPIO_OTYPER_OT8;\n\n\tGPIOA-&gt;AFR[1]|=(AF04&lt;&lt;GPIO_AFRH_AFSEL8_Pos);\n\n\t\/*GPIOC configuration*\/\n\tGPIOC-&gt;MODER|=GPIO_MODER_MODE9_1;\n\tGPIOC-&gt;MODER&amp;=~GPIO_MODER_MODE9_0;\n\n\tGPIOC-&gt;OTYPER|=GPIO_OTYPER_OT9;\n\n\tGPIOC-&gt;AFR[1]|=(AF04&lt;&lt;GPIO_AFRH_AFSEL9_Pos);\n\n\n\t\/*I2C3 Init*\/\n\n\tRCC-&gt;APB1ENR|=RCC_APB1ENR_I2C3EN;\n\n\tI2C3-&gt;CR1=I2C_CR1_SWRST;\/\/reset i2c\n\tI2C3-&gt;CR1&amp;=~I2C_CR1_SWRST;\/\/ release reset i2c\n\tI2C3-&gt;CR2|=0x2d;\/\/set clock source to 42MHz\n\tI2C3-&gt;CCR=0xe1 ;  \/\/based on calculation\n\tI2C3-&gt;TRISE=0x2e; \/\/output max rise\n\tI2C3-&gt;CR1|=I2C_CR1_PE; \/\/enable I2C\n\n}\n\nvoid I2C3_WriteByte(uint8_t saddr,uint8_t maddr, uint8_t *data)\n{\n\twhile(I2C3-&gt;SR2&amp;I2C_SR2_BUSY){;}          \/*wait until bus not busy*\/\n\tI2C3-&gt;CR1|=I2C_CR1_START;                 \/*generate start*\/\n\twhile(!(I2C3-&gt;SR1&amp;I2C_SR1_SB)){;}         \/*wait until start bit is set*\/\n\tI2C3-&gt;DR = saddr&lt;&lt; 1;                 \t \/* Send slave address*\/\n\twhile(!(I2C3-&gt;SR1&amp;I2C_SR1_ADDR)){;}      \/*wait until address flag is set*\/\n\t(void)I2C3-&gt;SR2; \t\t\t\t\t\t\t\/*clear SR2 by reading it *\/\n\twhile(!(I2C3-&gt;SR1&amp;I2C_SR1_TXE)){;}       \/*Wait until Data register empty*\/\n\tI2C3-&gt;DR = maddr;                        \/* send memory address*\/\n\twhile(!(I2C3-&gt;SR1&amp;I2C_SR1_TXE)){;}       \/*wait until data register empty*\/\n\tI2C3-&gt;DR = *data;\n\twhile (!(I2C3-&gt;SR1 &amp; I2C_SR1_BTF));      \/*wait until transfer finished*\/\n\tI2C3-&gt;CR1 |=I2C_CR1_STOP;\n}\n\nvoid I2C3_ReadMultiByte(uint8_t saddr,uint8_t maddr, uint8_t* data, uint16_t n)\n{\n\twhile (I2C3-&gt;SR2 &amp; I2C_SR2_BUSY){;}\n\tI2C3-&gt;CR1|=I2C_CR1_START;\n\twhile(!(I2C3-&gt;SR1 &amp; I2C_SR1_SB)){;}\n\tI2C3-&gt;DR=saddr&lt;&lt;1;\n\twhile(!(I2C3-&gt;SR1 &amp; I2C_SR1_ADDR)){;}\n\t(void)I2C3-&gt;SR2;\n\twhile(!(I2C3-&gt;SR1&amp;I2C_SR1_TXE)){;}\n\tI2C3-&gt;DR = maddr;\n\twhile(!(I2C3-&gt;SR1&amp;I2C_SR1_TXE)){;}\n\tI2C3-&gt;CR1|=I2C_CR1_START;\n\twhile(!(I2C3-&gt;SR1 &amp; I2C_SR1_SB)){;}\n\tI2C3-&gt;DR=saddr&lt;&lt;1|1;\n\twhile(!(I2C3-&gt;SR1 &amp; I2C_SR1_ADDR)){;}\n\ttemp=I2C3-&gt;SR2;\n\tI2C3-&gt;CR1|=I2C_CR1_ACK;\n\twhile(n&gt;0U)\n\t{\n\t\tif(n==1U)\n\t\t{\n\t\t\tI2C3-&gt;CR1&amp;=~I2C_CR1_ACK;\n\t\t\tI2C3-&gt;CR1|=I2C_CR1_STOP;\n\t\t\twhile(!(I2C3-&gt;SR1&amp;I2C_SR1_RXNE)){;}\n\t\t\t*data++=I2C3-&gt;DR;\n\t\t\tbreak;\n\t\t}\n\t\telse\n\t\t{\n\t\t\twhile(!(I2C3-&gt;SR1&amp;I2C_SR1_RXNE)){;}\n\t\t\t(*data++)=I2C3-&gt;DR;\n\t\t\tn--;\n\n\t\t}\n\t}\n}\n<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Interrupt Initialization:<\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p>To understand how to configure the EXTI, please refer to <a href=\"https:\/\/blog.embeddedexpert.io\/?p=482\" data-type=\"URL\" data-id=\"https:\/\/blog.embeddedexpert.io\/?p=482\" target=\"_blank\" rel=\"noreferrer noopener\">this guide<\/a>.<\/p>\n\n\n\n<p>Create new source file with name of EXTI.c.<\/p>\n\n\n\n<p>In the source file:<\/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;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">#include &quot;exti.h&quot;\n\n#include &quot;stm32f4xx.h&quot;\n\nvoid PA15_EXTI_Init(void)\n{\n\n\t__disable_irq();\n\n\tRCC-&gt;AHB1ENR|=RCC_AHB1ENR_GPIOAEN;\n\n\tGPIOA-&gt;MODER&amp;=~GPIO_MODER_MODE15;\n\n\tRCC-&gt;APB2ENR|=RCC_APB2ENR_SYSCFGEN;\n\n\tSYSCFG-&gt;EXTICR[3]|=SYSCFG_EXTICR4_EXTI15_PA;\n\n\tEXTI-&gt;IMR |=EXTI_IMR_IM15;\n\n\tEXTI-&gt;RTSR |=EXTI_RTSR_TR15;\n\n\tNVIC_EnableIRQ(EXTI15_10_IRQn);\n\n\t__enable_irq();\n\n}<\/pre><\/div>\n\n\n\n<p>Create new header file with name of EXTI.h.<\/p>\n\n\n\n<p>In the header file:<\/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;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">#ifndef EXTI_H_\n#define EXTI_H_\n\n#include &quot;stdint.h&quot;\n\nvoid PA15_EXTI_Init(void);\n\n\n#endif \/* EXTI_H_ *\/<\/pre><\/div>\n\n\n\n<p>In the second section, we shall handle the interrupt handler.<\/p>\n\n\n\n<p>Stay tuned.<\/p>\n\n\n\n<p>Happy coding \ud83d\ude42<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the previous guide (here), we have successfully initialized the LCD and filled the screen the color. In this guide, we shall take a look at the touch controller, it&#8217;s features and initialize the required peripherals. In this guide, we shall cover the following: STMPE811 Features. STMPE811 Connection with STM32F429. I2C Initializations. Interrupt Initialization. 1. [&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-2085","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\/2085"}],"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=2085"}],"version-history":[{"count":3,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/2085\/revisions"}],"predecessor-version":[{"id":2094,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/2085\/revisions\/2094"}],"wp:attachment":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2085"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2085"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2085"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}