{"id":1871,"date":"2023-07-02T05:13:39","date_gmt":"2023-07-02T05:13:39","guid":{"rendered":"https:\/\/blog.embeddedexpert.io\/?p=1871"},"modified":"2023-09-17T05:31:15","modified_gmt":"2023-09-17T05:31:15","slug":"building-board-support-package-bsp-for-stm32f411-nucleo64-part2-core-frequency-configuration","status":"publish","type":"post","link":"https:\/\/blog.embeddedexpert.io\/?p=1871","title":{"rendered":"Building Board Support Package (BSP) for STM32F411-Nucleo64 Part2: Core Frequency Configuration"},"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\/2023\/07\/AdobeStock_128586024-1024x683.jpeg\" alt=\"\" class=\"wp-image-1872\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/AdobeStock_128586024-1024x683.jpeg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/AdobeStock_128586024-300x200.jpeg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/AdobeStock_128586024-768x512.jpeg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/AdobeStock_128586024-1536x1024.jpeg 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/AdobeStock_128586024-2048x1365.jpeg 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/AdobeStock_128586024-1150x767.jpeg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/AdobeStock_128586024-750x500.jpeg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/AdobeStock_128586024-400x267.jpeg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/AdobeStock_128586024-250x167.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=1858\" data-type=\"URL\" data-id=\"https:\/\/blog.embeddedexpert.io\/?p=1858\" target=\"_blank\">here<\/a>), we took a look at board support package and how to configure a pin to act as input and output. In this guide, we shall build board support package to set the frequency of the core.<\/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>Building the header file.<\/li><li>Building the source file.<\/li><li>Core configuration.<\/li><li>Code.<\/li><li>Results.<\/li><\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Building the header file:<\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p>From the previous guide, open bsp.h header file.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>We start off by declaring enum to hold AHB1 Prescaler values:<\/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=\"413\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.44.51-AM-1024x413.png\" alt=\"\" class=\"wp-image-1873\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.44.51-AM-1024x413.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.44.51-AM-300x121.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.44.51-AM-768x310.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.44.51-AM-1536x620.png 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.44.51-AM-2048x826.png 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.44.51-AM-1150x464.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.44.51-AM-750x303.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.44.51-AM-400x161.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.44.51-AM-250x101.png 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/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;}\">typedef enum\n{\n\tAHB1_Prescaler1=0,\n\tAHB1_Prescaler2=0x8,\n\tAHB1_Prescaler4=0x09,\n\tAHB1_Prescaler8=0x0A,\n\tAHB1_Prescaler16=0x0B,\n\tAHB1_Prescaler64=0x0C,\n\tAHB1_Prescaler128=0x0D,\n\tAHB1_Prescaler256=0x0E,\n\tAHB1_Prescaler512=0x0F\n\n}AHB1_Prescalers_Typedef;<\/pre><\/div>\n\n\n\n<p>Enum to hold the APB1 prescalers:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"289\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.46.05-AM-1024x289.png\" alt=\"\" class=\"wp-image-1874\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.46.05-AM-1024x289.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.46.05-AM-300x85.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.46.05-AM-768x217.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.46.05-AM-1536x434.png 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.46.05-AM-2048x579.png 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.46.05-AM-1150x325.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.46.05-AM-750x212.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.46.05-AM-400x113.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.46.05-AM-250x71.png 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/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;}\">typedef enum\n{\n\tAPB1_Prescaler1=0x00,\n\tAPB1_Prescaler2=0x04,\n\tAPB1_Prescaler4=0x05,\n\tAPB1_Prescaler8=0x06,\n\tAPB1_Prescaler16=0x07\n}APB1_Prescalers_Typedef;<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Similar to APB2:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"261\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.47.13-AM-1024x261.png\" alt=\"\" class=\"wp-image-1875\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.47.13-AM-1024x261.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.47.13-AM-300x77.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.47.13-AM-768x196.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.47.13-AM-1536x392.png 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.47.13-AM-2048x522.png 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.47.13-AM-1150x293.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.47.13-AM-750x191.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.47.13-AM-400x102.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.47.13-AM-250x64.png 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/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;}\">typedef enum\n{\n\tAPB2_Prescaler1=0x00,\n\tAPB2_Prescaler2=0x04,\n\tAPB2_Prescaler4=0x05,\n\tAPB2_Prescaler8=0x06,\n\tAPB2_Prescaler16=0x07\n}APB2_Prescalers_Typedef;<\/pre><\/div>\n\n\n\n<p>We also create enum to hold if we want to use the internal or external oscillator when we configure the core:<\/p>\n\n\n\n<p><\/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;}\">typedef enum\n{\n\tInternal_Oscillator=0,\n\tExternal_Oscillator=1\n}Clock_Source_Typedef;<\/pre><\/div>\n\n\n\n<p>When the core frequency is changed, you need to configure the flash latency. We shall create enum to hold all flash latency configurations 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=\"311\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.50.19-AM-1024x311.png\" alt=\"\" class=\"wp-image-1876\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.50.19-AM-1024x311.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.50.19-AM-300x91.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.50.19-AM-768x233.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.50.19-AM-1536x467.png 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.50.19-AM-1150x349.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.50.19-AM-750x228.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.50.19-AM-400x122.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.50.19-AM-250x76.png 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/Screenshot-2023-07-02-at-7.50.19-AM.png 2014w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/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;}\">typedef enum\n\n{\n\tZero_wait_state=0,\n\tOne_wait_state,\n\tTwo_wait_state,\n\tThree_wait_state,\n\tFour_wait_state,\n\tfive_wait_state,\n\tsix_wait_state,\n\tseven_wait_state,\n\teight_wait_state,\n\tnine_wait_state,\n\tTen_wait_state,\n\tEleven_wait_state,\n\tTwelve_wait_state,\n\tThirteen_wait_state,\n\tFourteen_wait_state,\n\tFifteen_wait_state\n}Flash_Latency_Typedef;<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Enum to hold if the setting the core was success or not:<\/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;}\">typedef enum\n{\n\tsuccess=0,\n\tfailed=1\n\n}Clock_Config_State_Typedef;<\/pre><\/div>\n\n\n\n<p>Create a new data structure to include the following variables:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Clock source.<\/li><li>PLL_M, PLL_N, PLL_P values.<\/li><li>flash latency value.<\/li><li>AHB1, APB1 and APB2 prescaler value.<\/li><\/ul>\n\n\n\n<p><\/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;}\">typedef struct\n{\n\tuint8_t clockSourc;\n\n\tuint16_t PLL_M;\n\tuint16_t PLL_N;\n\tuint16_t PLL_P;\n\n\tuint8_t flash_latency;\n\n\tuint8_t AHB1Prescaler;\n\tuint8_t APB1Prescaler;\n\tuint8_t APB2Prescaler;\n\n\n}Clock_Config_Typedef;<\/pre><\/div>\n\n\n\n<p>Create a function that returns Clock_Config_State_Typedef and takes pointer Clock_Config_Typedef data structure as an argument:<\/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;}\">Clock_Config_State_Typedef Clock_Confgiuration(Clock_Config_Typedef * config);<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Developing the source file:<\/h2>\n\n\n\n<p>For more details how to get, PLL_M, PLL_N and PLL_P, please refer to this guide <a href=\"https:\/\/blog.embeddedexpert.io\/?p=454\" data-type=\"URL\" data-id=\"https:\/\/blog.embeddedexpert.io\/?p=454\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a>.  <\/p>\n\n\n\n<p>Open bsp.c source file and include the following 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;&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">Clock_Config_State_Typedef  Clock_Confgiuration(Clock_Config_Typedef * config)<\/pre><\/div>\n\n\n\n<p>within the function, check if the clock source is the external or not:<\/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;}\">if (config-&gt;clockSourc==External_Oscillator)<\/pre><\/div>\n\n\n\n<p>If it is, enable the external oscillator:<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Before enable the oscillator, declare some variable to help determine if the external oscillator is enabled or timed out.<\/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__IO uint32_t StartUpCounter = 0, HSEStatus = 0;<\/pre><\/div>\n\n\n\n<p>Enable the external oscillator:<\/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;}\">RCC-&gt;CR |= RCC_CR_HSEON;<\/pre><\/div>\n\n\n\n<p>Wait until the external oscillator is enabled or timed out:<\/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\tdo\n\t\t{\n\t\t\tHSEStatus = RCC-&gt;CR &amp; RCC_CR_HSERDY;\n\t\t\tStartUpCounter++;\n\t\t} while((HSEStatus == 0) &amp;&amp; (StartUpCounter != 3000));<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Check if the oscillator is enabled, if it is, proceed to core configuration 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;}\">\t\t\tRCC-&gt;APB1ENR |= RCC_APB1ENR_PWREN; \/\/enable power regulator\n\t\t\tPWR-&gt;CR &amp;= (uint32_t)~(PWR_CR_VOS); \/\/reset VOS (mode 3 selected)\n\n\t\t\tRCC-&gt;CFGR |=(config-&gt;AHB1Prescaler&lt;&lt;RCC_CFGR_HPRE_Pos); \/*Configure AHB bus prescaler*\/\n\n\t\t\tRCC-&gt;CFGR |= (config-&gt;APB2Prescaler&lt;&lt;RCC_CFGR_PPRE2_Pos); \/*Configure APB2 bus prescaler*\/\n\n\t\t\tRCC-&gt;CFGR |= (config-&gt;APB1Prescaler&lt;&lt;RCC_CFGR_PPRE1_Pos); \/*Configure APB1 bus prescaler*\/\n\n\t\t    RCC-&gt;PLLCFGR = config-&gt;PLL_M | (config-&gt;PLL_N &lt;&lt; 6) | (((config-&gt;PLL_P &gt;&gt; 1) -1) &lt;&lt; 16) | \/\/set PLL_M,PLL_N,PLL_P\n\t\t                   (RCC_PLLCFGR_PLLSRC_HSE) \/*Set PLL clock source to be external oscillator*\/;\n\n\t\t    RCC-&gt;CR |= RCC_CR_PLLON; \/\/turn on the PLL\n\n\n\t\t    while((RCC-&gt;CR &amp; RCC_CR_PLLRDY) == 0) \/\/wait untill PLL is active\n\t\t    {\n\t\t    }\n\n\t\t    \/* Configure Flash prefetch, Instruction cache, Data cache and wait state *\/\n\t\t       FLASH-&gt;ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |(config-&gt;flash_latency&lt;&lt;FLASH_ACR_LATENCY_Pos);\n\n\t\t       \/* Select the main PLL as system clock source *\/\n\t\t       RCC-&gt;CFGR &amp;= (uint32_t)((uint32_t)~(RCC_CFGR_SW));\n\t\t       RCC-&gt;CFGR |= RCC_CFGR_SW_PLL;\n\n\t\t       \/* Wait till the main PLL is used as system clock source *\/\n\t\t       while ((RCC-&gt;CFGR &amp; (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL)\n\t\t       {;}<\/pre><\/div>\n\n\n\n<p>If the external oscillator failed to start, return failed:<\/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;}\">else\n\t\t{\n\t\t\treturn failed;\n\t\t}\n<\/pre><\/div>\n\n\n\n<p>If the internal one is selected, configure the clock and return success 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;}\">else\n\t{\n\t\tRCC-&gt;APB1ENR |= RCC_APB1ENR_PWREN; \/\/enable power regulator\n\t\tPWR-&gt;CR &amp;= (uint32_t)~(PWR_CR_VOS); \/\/reset VOS (mode 3 selected)\n\n\t\tRCC-&gt;CFGR |=(config-&gt;AHB1Prescaler&lt;&lt;RCC_CFGR_HPRE_Pos); \/*Configure AHB bus prescaler*\/\n\n\t\tRCC-&gt;CFGR |= (config-&gt;APB2Prescaler&lt;&lt;RCC_CFGR_PPRE2_Pos);\n\n\t\tRCC-&gt;CFGR |= (config-&gt;APB1Prescaler&lt;&lt;RCC_CFGR_PPRE1_Pos);\n\n\t\tRCC-&gt;PLLCFGR = config-&gt;PLL_M | (config-&gt;PLL_N &lt;&lt; 6) | (((config-&gt;PLL_P &gt;&gt; 1) -1) &lt;&lt; 16); \/\/set PLL_M,PLL_N,PLL_P\n\n\n\t\tRCC-&gt;CR |= RCC_CR_PLLON; \/\/turn on the PLL\n\n\n\t\twhile((RCC-&gt;CR &amp; RCC_CR_PLLRDY) == 0) \/\/wait untill PLL is active\n\t\t{\n\t\t}\n\n\t\t\/* Configure Flash prefetch, Instruction cache, Data cache and wait state *\/\n\t\tFLASH-&gt;ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |(config-&gt;flash_latency&lt;&lt;FLASH_ACR_LATENCY_Pos);\n\n\t\t\/* Select the main PLL as system clock source *\/\n\t\tRCC-&gt;CFGR &amp;= (uint32_t)((uint32_t)~(RCC_CFGR_SW));\n\t\tRCC-&gt;CFGR |= RCC_CFGR_SW_PLL;\n\n\t\t\/* Wait till the main PLL is used as system clock source *\/\n\t\twhile ((RCC-&gt;CFGR &amp; (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL)\n\t\t{;}\n\t}\n\n\n\n\treturn success;<\/pre><\/div>\n\n\n\n<p>Hence, the core configuration function 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;}\">Clock_Config_State_Typedef  Clock_Confgiuration(Clock_Config_Typedef * config)\n{\n\tif (config-&gt;clockSourc==External_Oscillator)\n\t{\n\t\t__IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n\n\t\tRCC-&gt;CR |= ((uint32_t)RCC_CR_HSEON);\n\n\n\t\tdo\n\t\t{\n\t\t\tHSEStatus = RCC-&gt;CR &amp; RCC_CR_HSERDY;\n\t\t\tStartUpCounter++;\n\t\t} while((HSEStatus == 0) &amp;&amp; (StartUpCounter != 3000));\n\n\t\tif ((RCC-&gt;CR &amp; RCC_CR_HSERDY) != RESET) \/\/HSE enabled\n\t\t{\n\t\t\tRCC-&gt;APB1ENR |= RCC_APB1ENR_PWREN; \/\/enable power regulator\n\t\t\tPWR-&gt;CR &amp;= (uint32_t)~(PWR_CR_VOS); \/\/reset VOS (mode 3 selected)\n\n\t\t\tRCC-&gt;CFGR |=(config-&gt;AHB1Prescaler&lt;&lt;RCC_CFGR_HPRE_Pos); \/*Configure AHB bus prescaler*\/\n\n\t\t\tRCC-&gt;CFGR |= (config-&gt;APB2Prescaler&lt;&lt;RCC_CFGR_PPRE2_Pos); \/*Configure APB2 bus prescaler*\/\n\n\t\t\tRCC-&gt;CFGR |= (config-&gt;APB1Prescaler&lt;&lt;RCC_CFGR_PPRE1_Pos); \/*Configure APB1 bus prescaler*\/\n\n\t\t    RCC-&gt;PLLCFGR = config-&gt;PLL_M | (config-&gt;PLL_N &lt;&lt; 6) | (((config-&gt;PLL_P &gt;&gt; 1) -1) &lt;&lt; 16) | \/\/set PLL_M,PLL_N,PLL_P\n\t\t                   (RCC_PLLCFGR_PLLSRC_HSE) \/*Set PLL clock source to be external oscillator*\/;\n\n\t\t    RCC-&gt;CR |= RCC_CR_PLLON; \/\/turn on the PLL\n\n\n\t\t    while((RCC-&gt;CR &amp; RCC_CR_PLLRDY) == 0) \/\/wait untill PLL is active\n\t\t    {\n\t\t    }\n\n\t\t    \/* Configure Flash prefetch, Instruction cache, Data cache and wait state *\/\n\t\t       FLASH-&gt;ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |(config-&gt;flash_latency&lt;&lt;FLASH_ACR_LATENCY_Pos);\n\n\t\t       \/* Select the main PLL as system clock source *\/\n\t\t       RCC-&gt;CFGR &amp;= (uint32_t)((uint32_t)~(RCC_CFGR_SW));\n\t\t       RCC-&gt;CFGR |= RCC_CFGR_SW_PLL;\n\n\t\t       \/* Wait till the main PLL is used as system clock source *\/\n\t\t       while ((RCC-&gt;CFGR &amp; (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL)\n\t\t       {;}\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn failed;\n\t\t}\n\n\n\n\t}\n\n\telse\n\t{\n\t\tRCC-&gt;APB1ENR |= RCC_APB1ENR_PWREN; \/\/enable power regulator\n\t\tPWR-&gt;CR &amp;= (uint32_t)~(PWR_CR_VOS); \/\/reset VOS (mode 3 selected)\n\n\t\tRCC-&gt;CFGR |=(config-&gt;AHB1Prescaler&lt;&lt;RCC_CFGR_HPRE_Pos); \/*Configure AHB bus prescaler*\/\n\n\t\tRCC-&gt;CFGR |= (config-&gt;APB2Prescaler&lt;&lt;RCC_CFGR_PPRE2_Pos);\n\n\t\tRCC-&gt;CFGR |= (config-&gt;APB1Prescaler&lt;&lt;RCC_CFGR_PPRE1_Pos);\n\n\t\tRCC-&gt;PLLCFGR = config-&gt;PLL_M | (config-&gt;PLL_N &lt;&lt; 6) | (((config-&gt;PLL_P &gt;&gt; 1) -1) &lt;&lt; 16); \/\/set PLL_M,PLL_N,PLL_P\n\n\n\t\tRCC-&gt;CR |= RCC_CR_PLLON; \/\/turn on the PLL\n\n\n\t\twhile((RCC-&gt;CR &amp; RCC_CR_PLLRDY) == 0) \/\/wait untill PLL is active\n\t\t{\n\t\t}\n\n\t\t\/* Configure Flash prefetch, Instruction cache, Data cache and wait state *\/\n\t\tFLASH-&gt;ACR = FLASH_ACR_ICEN |FLASH_ACR_DCEN |(config-&gt;flash_latency&lt;&lt;FLASH_ACR_LATENCY_Pos);\n\n\t\t\/* Select the main PLL as system clock source *\/\n\t\tRCC-&gt;CFGR &amp;= (uint32_t)((uint32_t)~(RCC_CFGR_SW));\n\t\tRCC-&gt;CFGR |= RCC_CFGR_SW_PLL;\n\n\t\t\/* Wait till the main PLL is used as system clock source *\/\n\t\twhile ((RCC-&gt;CFGR &amp; (uint32_t)RCC_CFGR_SWS ) != RCC_CFGR_SWS_PLL)\n\t\t{;}\n\t}\n\n\n\n\treturn success;\n}\n\n\n<\/pre><\/div>\n\n\n\n<p><\/p>\n\n\n\n<p>Thats all for the source file.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Core Configuration:<\/h2>\n\n\n\n<p>in main.c:<\/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;bsp.h&quot;\n\nGPIO_Output_Typedef LED;\n\n\nClock_Config_Typedef clockConfig;\n\nvoid delay(int ms)\n{\n\tSysTick-&gt;LOAD=100000-1;\n\tSysTick-&gt;VAL=0;\n\tSysTick-&gt;CTRL=0x5;\n\t\tfor (int i=0;i&lt;ms;i++)\n\t\t{\n\t\t\twhile(!(SysTick-&gt;CTRL &amp;0x10000)){}\n\t\t}\n\tSysTick-&gt;CTRL=0;\n}\n\n\n\nint main()\n{\n\n\n\n\tGPIOA_CLOCK_ENABLE();\n\t\n\tGPIO_Configure_Typedef LED_Config;\n\n\tLED_Config.PinNumber=pin5;\n\tLED_Config.Mode=OUTPUT;\n\n\tLED.pinNumber=pin5;\n\n\tGPIO_Initialization(GPIOA,&amp;LED_Config);\n\n\tclockConfig.PLL_M= 4;\n\tclockConfig.PLL_N= 200;\n\tclockConfig.PLL_P= 4;\n\n\tclockConfig.AHB1Prescaler=AHB1_Prescaler1;\n\tclockConfig.APB1Prescaler=APB1_Prescaler2;\n\tclockConfig.APB2Prescaler=APB2_Prescaler1;\n\n\tclockConfig.clockSourc=External_Oscillator;\n\tclockConfig.flash_latency= Three_wait_state;\n\n\tClock_Confgiuration(&amp;clockConfig);\n\n\twhile(1)\n\t{\n\n\t\tGPIO_TogglePin(GPIOA, &amp;LED);\n\t\tdelay(1000);\n\n\t}\n\n}\n\n\n<\/pre><\/div>\n\n\n\n<p>We used systick to confirm that we got 100MHz.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Code:<\/h2>\n\n\n\n<p><\/p>\n\n\n\n<p>You may download the source code from here:<\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/BSP-STM32F411_Nucleo64.zip\">BSP-STM32F411_Nucleo64<\/a><a href=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2023\/07\/BSP-STM32F411_Nucleo64.zip\" class=\"wp-block-file__button\" download>Download<\/a><\/div>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. 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=\"Board Support Pack of STM32F411: Core Configuration\" width=\"1170\" height=\"658\" src=\"https:\/\/www.youtube.com\/embed\/WWzam1Le-wc?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 the previous guide (here), we took a look at board support package and how to configure a pin to act as input and output. In this guide, we shall build board support package to set the frequency of the core. In this guide, we shall cover the following: Building the header file. Building the [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,2,11,12],"tags":[],"class_list":["post-1871","post","type-post","status-publish","format-standard","hentry","category-data-structures","category-embedded-systems","category-peripheral-drivers","category-stm32"],"_links":{"self":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/1871"}],"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=1871"}],"version-history":[{"count":2,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/1871\/revisions"}],"predecessor-version":[{"id":1987,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/1871\/revisions\/1987"}],"wp:attachment":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1871"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1871"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}