{"id":3358,"date":"2025-04-03T09:32:41","date_gmt":"2025-04-03T09:32:41","guid":{"rendered":"https:\/\/blog.embeddedexpert.io\/?p=3358"},"modified":"2025-04-03T09:34:07","modified_gmt":"2025-04-03T09:34:07","slug":"using-micropython-for-stm32f411-timer-in-interrupt-mode","status":"publish","type":"post","link":"https:\/\/blog.embeddedexpert.io\/?p=3358","title":{"rendered":"Using Micropython for STM32F411: Timer in Interrupt Mode"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/image.png\" alt=\"\" class=\"wp-image-3359\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/image.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/image-300x300.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/image-150x150.png 150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/image-768x768.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/image-750x750.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/image-400x400.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/image-250x250.png 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>In this guide, we will explore how to use MicroPython on the STM32F411 Nucleo board for embedded development. We will specifically focus on configuring a hardware timer interrupt to execute tasks at precise intervals.<\/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>What is timer interrupt.<\/li>\n\n\n\n<li>Micropython firmware development.<\/li>\n\n\n\n<li>Results.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">1. What is Timer Interrupt:<\/h2>\n\n\n\n<p>A&nbsp;<strong>timer interrupt<\/strong>&nbsp;in a microcontroller is a mechanism where the microcontroller generates an interrupt signal based on events associated with a timer peripheral. These events can include reaching a specific count, an overflow, or a match between the timer count and a predefined value. The timer interrupt allows the microcontroller to execute a specific task (Interrupt Service Routine, ISR) in response to the timer event without continuously polling the timer status.<\/p>\n\n\n\n<p><strong>How Timer Interrupt Works<\/strong><\/p>\n\n\n\n<p>1.&nbsp;<strong>Timer Peripheral<\/strong>:<\/p>\n\n\n\n<p>\u2022 A timer is a hardware module in the microcontroller that increments or decrements a counter at a fixed rate, derived from the system clock or a prescaled clock.<\/p>\n\n\n\n<p>2.&nbsp;<strong>Event Generation<\/strong>:<\/p>\n\n\n\n<p>\u2022 As the timer runs, it can trigger events such as:<\/p>\n\n\n\n<p>\u2022 Overflow (counter rolls back to zero).<\/p>\n\n\n\n<p>\u2022 Match with a specific compare value.<\/p>\n\n\n\n<p>\u2022 A trigger input or external signal.<\/p>\n\n\n\n<p>3.&nbsp;<strong>Interrupt Request (IRQ)<\/strong>:<\/p>\n\n\n\n<p>\u2022 When the specified event occurs, the timer generates an interrupt request (IRQ) to the CPU.<\/p>\n\n\n\n<p>4.&nbsp;<strong>Interrupt Service Routine (ISR)<\/strong>:<\/p>\n\n\n\n<p>\u2022 The microcontroller pauses its main program to execute a small function (ISR) associated with the timer interrupt.<\/p>\n\n\n\n<p>5.&nbsp;<strong>Return to Main Program<\/strong>:<\/p>\n\n\n\n<p>\u2022 After the ISR finishes, the CPU resumes executing the main program from where it left off.<\/p>\n\n\n\n<p><strong>Why Use Timer Interrupts?<\/strong><\/p>\n\n\n\n<p>1.&nbsp;<strong>Precise Timing<\/strong>:<\/p>\n\n\n\n<p>\u2022 Timer interrupts provide highly accurate timing, independent of the program\u2019s execution state.<\/p>\n\n\n\n<p>2.&nbsp;<strong>Non-blocking Delays<\/strong>:<\/p>\n\n\n\n<p>\u2022 Unlike software delays, a timer interrupt allows the microcontroller to perform other tasks while waiting for the timer event.<\/p>\n\n\n\n<p>3.&nbsp;<strong>Periodic Tasks<\/strong>:<\/p>\n\n\n\n<p>\u2022 Execute tasks at regular intervals (e.g., sampling a sensor every 1 ms).<\/p>\n\n\n\n<p>4.&nbsp;<strong>Event Timing<\/strong>:<\/p>\n\n\n\n<p>\u2022 Measure durations or count specific events (e.g., pulses in an encoder).<\/p>\n\n\n\n<p><strong>Key Components of Timer Interrupts<\/strong><\/p>\n\n\n\n<p>1.&nbsp;<strong>Timer Counter<\/strong>:<\/p>\n\n\n\n<p>\u2022 The main register that counts up or down based on the timer\u2019s clock.<\/p>\n\n\n\n<p>2.&nbsp;<strong>Prescaler<\/strong>:<\/p>\n\n\n\n<p>\u2022 Divides the clock frequency to adjust the timer\u2019s counting speed.<\/p>\n\n\n\n<p>3.&nbsp;<strong>Compare Registers<\/strong>:<\/p>\n\n\n\n<p>\u2022 Define specific count values that trigger interrupts.<\/p>\n\n\n\n<p>4.&nbsp;<strong>Interrupt Flags<\/strong>:<\/p>\n\n\n\n<p>\u2022 Indicate the occurrence of a timer event and need to be cleared in the ISR.<\/p>\n\n\n\n<p>5.&nbsp;<strong>NVIC (Nested Vectored Interrupt Controller)<\/strong>:<\/p>\n\n\n\n<p>\u2022 Manages the priority and execution of interrupts.<\/p>\n\n\n\n<p><strong>Applications of Timer Interrupts<\/strong><\/p>\n\n\n\n<p>1.&nbsp;<strong>Real-Time Clock<\/strong>:<\/p>\n\n\n\n<p>\u2022 Generate accurate time intervals (e.g., 1-second ticks).<\/p>\n\n\n\n<p>2.&nbsp;<strong>PWM Generation<\/strong>:<\/p>\n\n\n\n<p>\u2022 Create precise Pulse Width Modulation signals for motor control or LED dimming.<\/p>\n\n\n\n<p>3.&nbsp;<strong>Frequency Measurement<\/strong>:<\/p>\n\n\n\n<p>\u2022 Measure signal frequency by counting pulses within a fixed time.<\/p>\n\n\n\n<p>4.&nbsp;<strong>Sensor Sampling<\/strong>:<\/p>\n\n\n\n<p>\u2022 Read data from sensors at regular intervals.<\/p>\n\n\n\n<p>5.&nbsp;<strong>Debouncing<\/strong>:<\/p>\n\n\n\n<p>\u2022 Avoid false triggers in button presses by implementing debouncing logic.<\/p>\n\n\n\n<p>6.&nbsp;<strong>Communication Protocols<\/strong>:<\/p>\n\n\n\n<p>\u2022 Time-critical operations like UART bit sampling or SPI communication.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Micropython Firmware Development:<\/h2>\n\n\n\n<p>First, we need to configure Thonny to work with STM32F411 Nucleo-64. Please refer to&nbsp;<a href=\"https:\/\/blog.embeddedexpert.io\/?p=3237\" target=\"_blank\" rel=\"noreferrer noopener\">this guide<\/a>&nbsp;for how to install and configure Thonny.<\/p>\n\n\n\n<p>After the setup has been completed, we start a new project. <\/p>\n\n\n\n<p>Start by improting pyb and machine 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;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">import pyb\nimport machine<\/pre><\/div>\n\n\n\n<p>Next declare two variable to handle state of the LED and if the timer has been triggered or not.<\/p>\n\n\n\n<p>Next, configure PA5 and output and name it LED:<\/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;&lt;br&gt;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">led = machine.Pin(&quot;PA5&quot;, machine.Pin.OUT)  # Define PA5 as output<\/pre><\/div>\n\n\n\n<p>Next, timer interrupt callback 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;}\"># Define the interrupt callback function\ndef timer_callback(t):\n    global state,Triggered\n    state = not state\n    Triggered=True\n    led.value(state)<\/pre><\/div>\n\n\n\n<p>The function shall do the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Not the current state (0 to 1 and 1 to 0).<\/li>\n\n\n\n<li>Set triggered to 1.<\/li>\n\n\n\n<li>Set the LED according to the state.<\/li>\n<\/ul>\n\n\n\n<p>Remember, to use global with the variable declared to be handled in the callback.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Next, create timer object using timer2 of the STM32 with frequency of 1Hz 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;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\"># Create Timer object (using Timer 2)\ntim = pyb.Timer(2, freq=1)  # 1 Hz (triggers every 1 second)<\/pre><\/div>\n\n\n\n<p>Next, attach the callback function to 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;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\"># Attach the callback function to the timer\ntim.callback(timer_callback)<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>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;}\">while True:\n    if Triggered == True:\n        Triggered = False\n        print(f&quot;State value = {state}&quot;)\n        \n    pyb.delay(1)<\/pre><\/div>\n\n\n\n<p>Just print the state value each time the timer interrupt has been triggered.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Hence, the 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;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">import pyb\nimport machine\n\nstate=0\nTriggered=False\n\nled = machine.Pin(&quot;PA5&quot;, machine.Pin.OUT)  # Define PA5 as output\n\n# Define the interrupt callback function\ndef timer_callback(t):\n    global state,Triggered\n    state = not state\n    Triggered=True\n    led.value(state)\n    \n    \n\n\n# Create Timer object (using Timer 2)\ntim = pyb.Timer(2, freq=1)  # 1 Hz (triggers every 1 second)\n\n# Attach the callback function to the timer\ntim.callback(timer_callback)\n\nwhile True:\n    if Triggered == True:\n        Triggered = False\n        print(f&quot;State value = {state}&quot;)\n        \n    pyb.delay(1)\n<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><span style=\"font-family: Roboto, sans-serif;font-size: 16px\">Thats all for the driver.<\/span><p style=\"font-family: Roboto, sans-serif;font-size: 16px;line-height: inherit;border: 0px;margin: 0px 0px 1.5em\">Click on run as following:<\/p><figure class=\"wp-block-image\" style=\"margin-bottom: 1.5em;border: 0px;padding: 0px;overflow: hidden;max-width: 100%;border-radius: 6px;font-family: Roboto, sans-serif;font-size: 16px\"><img decoding=\"async\" loading=\"lazy\" width=\"1024\" height=\"706\" class=\"wp-image-3246\" style=\"overflow: hidden;border-radius: 6px\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/02\/2025-02-15_15-36-02-1024x706.jpg\" alt=\"\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/02\/2025-02-15_15-36-02-1024x706.jpg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/02\/2025-02-15_15-36-02-300x207.jpg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/02\/2025-02-15_15-36-02-768x530.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/02\/2025-02-15_15-36-02-1536x1059.jpg 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/02\/2025-02-15_15-36-02-2048x1412.jpg 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/02\/2025-02-15_15-36-02-1150x793.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/02\/2025-02-15_15-36-02-750x517.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/02\/2025-02-15_15-36-02-400x276.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/02\/2025-02-15_15-36-02-250x172.jpg 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Results:<\/h2>\n\n\n\n<p>In the shell, you should notice that state is being printed each 1 second as following:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"281\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-03_12-24-01-1024x281.jpg\" alt=\"\" class=\"wp-image-3360\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-03_12-24-01-1024x281.jpg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-03_12-24-01-300x82.jpg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-03_12-24-01-768x211.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-03_12-24-01-1536x421.jpg 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-03_12-24-01-2048x562.jpg 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-03_12-24-01-1150x316.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-03_12-24-01-750x206.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-03_12-24-01-400x110.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-03_12-24-01-250x69.jpg 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Also, you should notice the LD2 on the board blink each second as following:<\/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=\"Blinking LED on STM32F411 Nucleo-64 Using Micropython\" width=\"1170\" height=\"658\" src=\"https:\/\/www.youtube.com\/embed\/AuDFC6nUgVI?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>Happy coding \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this guide, we will explore how to use MicroPython on the STM32F411 Nucleo board for embedded development. We will specifically focus on configuring a hardware timer interrupt to execute tasks at precise intervals. In this guide, we shall cover the following: 1. What is Timer Interrupt: A&nbsp;timer interrupt&nbsp;in a microcontroller is a mechanism where [&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-3358","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\/3358"}],"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=3358"}],"version-history":[{"count":2,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/3358\/revisions"}],"predecessor-version":[{"id":3362,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/3358\/revisions\/3362"}],"wp:attachment":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3358"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3358"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}