{"id":1973,"date":"2023-09-14T14:17:16","date_gmt":"2023-09-14T14:17:16","guid":{"rendered":"https:\/\/blog.embeddedexpert.io\/?p=1973"},"modified":"2023-09-14T14:17:19","modified_gmt":"2023-09-14T14:17:19","slug":"emulating-parallel-port-using-timer-and-dma-part-1-output","status":"publish","type":"post","link":"https:\/\/blog.embeddedexpert.io\/?p=1973","title":{"rendered":"Emulating Parallel Port using Timer and DMA Part 1: Output"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/AdobeStock_92843412-1024x1024.jpeg\" alt=\"\" class=\"wp-image-1974\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/AdobeStock_92843412-1024x1024.jpeg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/AdobeStock_92843412-300x300.jpeg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/AdobeStock_92843412-150x150.jpeg 150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/AdobeStock_92843412-768x768.jpeg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/AdobeStock_92843412-1536x1536.jpeg 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/AdobeStock_92843412-2048x2048.jpeg 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/AdobeStock_92843412-1150x1150.jpeg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/AdobeStock_92843412-750x750.jpeg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/AdobeStock_92843412-400x400.jpeg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/AdobeStock_92843412-250x250.jpeg 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>In this guide, we shall emulate the parallel output that had been used before to communicate with printers which eventually replaced with serial port and USB. This guide focuses on the output which will be useful in upcoming guide.<\/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\"><li>What is Parallel Port.<\/li><li>Developing the parallel output driver.<\/li><li>LEDs connection<\/li><li>Results.<\/li><\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. What is Parallel Port:<\/h2>\n\n\n\n<p>In\u00a0computing, a\u00a0<strong>parallel port<\/strong>\u00a0is a type of\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Hardware_interface\" data-type=\"URL\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Hardware_interface\">interface<\/a>\u00a0found on early\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Computer\">computers<\/a>\u00a0(<a href=\"https:\/\/en.wikipedia.org\/wiki\/Personal_computer\">personal<\/a>\u00a0and otherwise) for connecting\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Peripheral\">peripherals<\/a>. The name refers to the way the data is sent; parallel ports send multiple\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Bit\">bits<\/a>\u00a0of data at once (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Parallel_communication\">parallel communication<\/a>), as opposed to\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Serial_communication\">serial communication<\/a>, in which bits are sent one at a time. To do this, parallel ports require multiple data lines in their cables and\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Computer_port_(hardware)\">port<\/a>\u00a0connectors and tend to be larger than contemporary\u00a0<a href=\"https:\/\/en.wikipedia.org\/wiki\/Serial_port\">serial ports<\/a>, which only require one data line. (From Wikipedia <a href=\"https:\/\/en.wikipedia.org\/wiki\/Parallel_port\" data-type=\"URL\" data-id=\"https:\/\/en.wikipedia.org\/wiki\/Parallel_port\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>).<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Developing the Parallel  Output Driver:<\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p>Before heading into developing the driver, take a look at <a href=\"https:\/\/blog.embeddedexpert.io\/?p=1680\" data-type=\"URL\" data-id=\"https:\/\/blog.embeddedexpert.io\/?p=1680\" target=\"_blank\" rel=\"noreferrer noopener\">this<\/a> guide to have understand how to configure the timer to work with DMA and toggle a GPIO pin.<\/p>\n\n\n\n<p>We start off by declaring the following macro: <\/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;}\">#define data_size \t5<\/pre><\/div>\n\n\n\n<p>This macro will indicate the size of the array.<\/p>\n\n\n\n<p>Declare the array which holds the data to be sent:<\/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;}\">uint32_t gpio_pattern[data_size];<\/pre><\/div>\n\n\n\n<p>Since we are dealing with parallel port, we shall use Pin0 to Pin7 of PortC of STM32F411 Nucleo-64.<\/p>\n\n\n\n<p>In main function:<\/p>\n\n\n\n<p>Enable clock access to GPIOC:<\/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;}\">\t\/*Enable clock access to GPIOA*\/\n\tRCC-&gt;AHB1ENR|=RCC_AHB1ENR_GPIOCEN;<\/pre><\/div>\n\n\n\n<p>Set Pin0 to Pin7 as output:<\/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;}\">\t\/*Set PC0 to PC7 as output*\/\n\tGPIOC-&gt;MODER|=GPIO_MODER_MODE0_0|GPIO_MODER_MODE1_0|GPIO_MODER_MODE2_0\n\t\t\t|GPIO_MODER_MODE3_0|GPIO_MODER_MODE4_0|GPIO_MODER_MODE5_0|\n\t\t\tGPIO_MODER_MODE6_0|GPIO_MODER_MODE7_0;\n\n\tGPIOC-&gt;MODER&amp;=~(GPIO_MODER_MODE0_1|GPIO_MODER_MODE1_1|GPIO_MODER_MODE2_1\n\t\t\t|GPIO_MODER_MODE3_1|GPIO_MODER_MODE4_1|GPIO_MODER_MODE5_1\n\t\t\t|GPIO_MODER_MODE6_1|GPIO_MODER_MODE7_1);<\/pre><\/div>\n\n\n\n<p>For timer configuration:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Enable DMA request when update (overflow) occurs.<\/li><li>Set the prescaller to 16000-1.<\/li><li>Set the ARR to 100 to achieve toggle rate of 10Hz.<\/li><\/ul>\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;}\">\t\/*Timer configuration*\/\n\n\tRCC-&gt;APB2ENR  |=  RCC_APB2ENR_TIM1EN;\n\n\tTIM1-&gt;DIER=TIM_DIER_UDE;\n\n\tTIM1-&gt;PSC=16000-1; \/*16 000 000 \/ 16 000 =1 000*\/\n\tTIM1-&gt;ARR=100-1; \/*1 000 \/ 1 000 = 1HZ*\/<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>DMA configuration as following:<\/p>\n\n\n\n<p>Configure the DMA with the following parameters:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Channel 6.<\/li><li>Memory and Peripheral size to be word size (32-bit).<\/li><li>Memory increment mode.<\/li><li>Circular mode.<\/li><li>Direction: Memory to peripheral.<\/li><\/ul>\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;}\">\t\/*DMA configuration*\/\n\n\n\tRCC-&gt;AHB1ENR|=RCC_AHB1ENR_DMA2EN;\n\n\tDMA2_Stream5-&gt;CR&amp;=DMA_SxCR_EN;\n\n\twhile((DMA2_Stream5-&gt;CR)&amp;DMA_SxCR_EN){;}\n\n\tDMA2_Stream5-&gt;CR|=(CH6&lt;&lt;DMA_SxCR_CHSEL_Pos)|DMA_SxCR_MSIZE|DMA_SxCR_PSIZE|\n\t\t\tDMA_SxCR_MINC|DMA_SxCR_CIRC|DMA_SxCR_DIR_0;\n\n\tDMA2_Stream5-&gt;NDTR=(uint32_t)data_size;\n\n\tDMA2_Stream5-&gt;PAR=(uint32_t)(&amp;GPIOC-&gt;ODR);\n\n\tDMA2_Stream5-&gt;M0AR=(uint32_t)(gpio_pattern);<\/pre><\/div>\n\n\n\n<p>Enable the DMA channel:<\/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;}\">\t\/*Launch DMA*\/\n\tDMA2_Stream5-&gt;CR|=DMA_SxCR_EN;<\/pre><\/div>\n\n\n\n<p>Launch the timer:<\/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;}\">\t\/*Launch Timer*\/\n\tTIM1-&gt;CR1     |= TIM_CR1_CEN;<\/pre><\/div>\n\n\n\n<p>In while 1 loop:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Wait a little by wasting CPU cycles.<\/li><li>Randomise the values in the array.<\/li><\/ul>\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;}\">\t\tfor (int j=0;j&lt;100000;j++);\n\t\t\/*Fill the array with random data*\/\n\t\tfor (int i=0; i&lt;data_size;i++)\n\t\t{\n\t\t\tgpio_pattern[i]=random()%256;\n\t\t}<\/pre><\/div>\n\n\n\n<p>This will provide randomness to be observed.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Hence, the entire code as following:<\/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#include &quot;stdint.h&quot;\n\n#include &quot;stdlib.h&quot;\n\n#define data_size \t5\n#define CH6 \t\t0x06\n\nuint32_t gpio_pattern[data_size];\n\n\n\nint main(void)\n{\n\t\/*GPIO Configuration*\/\n\n\t\/*Enable clock access to GPIOA*\/\n\tRCC-&gt;AHB1ENR|=RCC_AHB1ENR_GPIOCEN;\n\n\t\/*Set PC0 to PC7 as output*\/\n\tGPIOC-&gt;MODER|=GPIO_MODER_MODE0_0|GPIO_MODER_MODE1_0|GPIO_MODER_MODE2_0\n\t\t\t|GPIO_MODER_MODE3_0|GPIO_MODER_MODE4_0|GPIO_MODER_MODE5_0|\n\t\t\tGPIO_MODER_MODE6_0|GPIO_MODER_MODE7_0;\n\n\tGPIOC-&gt;MODER&amp;=~(GPIO_MODER_MODE0_1|GPIO_MODER_MODE1_1|GPIO_MODER_MODE2_1\n\t\t\t|GPIO_MODER_MODE3_1|GPIO_MODER_MODE4_1|GPIO_MODER_MODE5_1\n\t\t\t|GPIO_MODER_MODE6_1|GPIO_MODER_MODE7_1);\n\n\n\n\n\t\/*Timer configuration*\/\n\n\tRCC-&gt;APB2ENR  |=  RCC_APB2ENR_TIM1EN;\n\n\tTIM1-&gt;DIER=TIM_DIER_UDE;\n\n\tTIM1-&gt;PSC=16000-1; \/*16 000 000 \/ 16 000 =1 000*\/\n\tTIM1-&gt;ARR=100-1; \/*1 000 \/ 1 000 = 1HZ*\/\n\n\n\t\/*DMA configuration*\/\n\n\n\tRCC-&gt;AHB1ENR|=RCC_AHB1ENR_DMA2EN;\n\n\tDMA2_Stream5-&gt;CR&amp;=DMA_SxCR_EN;\n\n\twhile((DMA2_Stream5-&gt;CR)&amp;DMA_SxCR_EN){;}\n\n\tDMA2_Stream5-&gt;CR|=(CH6&lt;&lt;DMA_SxCR_CHSEL_Pos)|DMA_SxCR_MSIZE|DMA_SxCR_PSIZE|\n\t\t\tDMA_SxCR_MINC|DMA_SxCR_CIRC|DMA_SxCR_DIR_0;\n\n\tDMA2_Stream5-&gt;NDTR=(uint32_t)data_size;\n\n\tDMA2_Stream5-&gt;PAR=(uint32_t)(&amp;GPIOC-&gt;ODR);\n\n\tDMA2_Stream5-&gt;M0AR=(uint32_t)(gpio_pattern);\n\n\n\t\/*Launch DMA*\/\n\tDMA2_Stream5-&gt;CR|=DMA_SxCR_EN;\n\n\t\/*Launch Timer*\/\n\tTIM1-&gt;CR1     |= TIM_CR1_CEN;\n\n\twhile(1)\n\t{\n\t\tfor (int j=0;j&lt;100000;j++);\n\t\t\/*Fill the array with random data*\/\n\t\tfor (int i=0; i&lt;data_size;i++)\n\t\t{\n\t\t\tgpio_pattern[i]=random()%256;\n\t\t}\n\t}\n\n}\n<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. LEDs connection:<\/h2>\n\n\n\n<p>This guide requires the following extra components:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Breadboard.<\/li><li>8LEDs.<\/li><li>8 270Ohm resistors.<\/li><li>Hookup wires.<\/li><\/ul>\n\n\n\n<p>Connect the LEDs as following:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1019\" height=\"1024\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/Screenshot-2023-09-14-at-4.32.09-PM-1019x1024.png\" alt=\"\" class=\"wp-image-1975\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/Screenshot-2023-09-14-at-4.32.09-PM-1019x1024.png 1019w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/Screenshot-2023-09-14-at-4.32.09-PM-300x300.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/Screenshot-2023-09-14-at-4.32.09-PM-150x150.png 150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/Screenshot-2023-09-14-at-4.32.09-PM-768x771.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/Screenshot-2023-09-14-at-4.32.09-PM-1150x1155.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/Screenshot-2023-09-14-at-4.32.09-PM-750x753.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/Screenshot-2023-09-14-at-4.32.09-PM-400x402.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/Screenshot-2023-09-14-at-4.32.09-PM-250x250.png 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/09\/Screenshot-2023-09-14-at-4.32.09-PM.png 1322w\" sizes=\"(max-width: 1019px) 100vw, 1019px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Results:<\/h2>\n\n\n\n<p><\/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=\"Emulating Parallel Port: Output\" width=\"1170\" height=\"658\" src=\"https:\/\/www.youtube.com\/embed\/yEoHXQtK6Qk?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Happy coding \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this guide, we shall emulate the parallel output that had been used before to communicate with printers which eventually replaced with serial port and USB. This guide focuses on the output which will be useful in upcoming guide. In this guide, we shall cover the following: What is Parallel Port. Developing the parallel output [&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,11,12],"tags":[],"class_list":["post-1973","post","type-post","status-publish","format-standard","hentry","category-embedded-systems","category-peripheral-drivers","category-stm32"],"_links":{"self":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/1973"}],"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=1973"}],"version-history":[{"count":1,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/1973\/revisions"}],"predecessor-version":[{"id":1976,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/1973\/revisions\/1976"}],"wp:attachment":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1973"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1973"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1973"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}