{"id":10445,"date":"2015-12-20T04:54:30","date_gmt":"2015-12-20T09:54:30","guid":{"rendered":"http:\/\/embedded-lab.com\/blog\/?p=10445"},"modified":"2023-04-20T23:09:48","modified_gmt":"2023-04-21T03:09:48","slug":"stm32-digital-analogue-converter-dac","status":"publish","type":"post","link":"https:\/\/embedded-lab.com\/blog\/stm32-digital-analogue-converter-dac\/","title":{"rendered":"STM32 Digital-to-Analogue Converter (DAC)"},"content":{"rendered":"<p>After having played with <b><i>Analogue-to-Digital Converter (ADC)<\/i><\/b> of STM32 micros, the obvious next internal hardware block to deal with is the <b><i>Digital-to-Analogue Converter (DAC)<\/i><\/b>. As the name suggests this block has just the complementary function of ADC. It converts digital binary values to analogue voltage outputs. The DAC block has several uses including audio generation, waveform generation, etc. Typically in most 8-bit micros, this block is unavailable and its need is somewhat loosely met with <b><i>Pulse Width Modulation (PWM)<\/i><\/b> block. This is partly because of their relatively less hardware resources and operating speeds. All STM32 micros also have PWM blocks but large capacity STM32s have DAC blocks too. The STM32 DAC block is not very complex and has similarity with the ADC block in terms of operating principle. The simplified block diagram below shows the major components of the STM32 DAC block.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Block-Diagram.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10446 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Block-Diagram-580x468.jpg\" alt=\"Block Diagram\" width=\"580\" height=\"468\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Block-Diagram-580x468.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Block-Diagram.jpg 606w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><!--more--><br \/>\n<\/a><\/p>\n<p>Once again please note that low density STM32 micros do not have any built-in DAC. For this issue I used Waveshare\u2019s Port103Z (<a href=\"http:\/\/www.wvshare.com\/product\/Port103Z.htm\">http:\/\/www.wvshare.com\/product\/Port103Z.htm<\/a>) development board featuring STM32F103ZET6 micro. This STM32 micro has two DAC channels with separate converters and packs a great deal of other hardware resources. Most high-end micros like this one comes with at least two DAC channels. Two DAC channels are what is needed for stereo audio generation \u2013 a very common DAC-based application. The development board is cleverly designed as such that the DAC outputs are connected to LEDs for directly visualizing the DAC outputs.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2014\/09\/20140918_201254.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-9150 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2014\/09\/20140918_201254-550x290.jpg\" alt=\"20140918_201254\" width=\"550\" height=\"290\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2014\/09\/20140918_201254-550x290.jpg 550w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2014\/09\/20140918_201254-1024x540.jpg 1024w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2014\/09\/20140918_201254.jpg 1369w\" sizes=\"auto, (max-width: 550px) 100vw, 550px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_223827.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10494 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_223827-580x488.jpg\" alt=\"20150619_223827\" width=\"580\" height=\"488\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_223827-580x488.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_223827.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h4>Key Feature of STM32 DAC Block<\/h4>\n<ul>\n<li>The DAC block of STM32 micros can be operated in either with 8-bit or 12-bit resolution. The latter has greater precision while the former performs faster than latter.<\/li>\n<\/ul>\n<ul>\n<li>Each channel has its own converter and is not dependent on others. In STM32F103ZET6, there are two DAC channel outputs with two separate converters.<\/li>\n<\/ul>\n<ul>\n<li>Unlike the DAC of other micros, the DAC of STM32 micros has two additional features and these are pseudo-random noise and triangular waveform generation capabilities. These features aid in signal processing and custom signal generations.<\/li>\n<\/ul>\n<ul>\n<li>To enhance precision and control output voltage further, the DAC blocks can be tied with a reference voltage source, usually between 2.4V to 3.3V DC.<\/li>\n<\/ul>\n<ul>\n<li>Both left and right justified inputs can be used.<\/li>\n<\/ul>\n<ul>\n<li>DA conversion can be event triggered. This feature has lot of applications.<\/li>\n<\/ul>\n<ul>\n<li>Just like any other hardware the DAC also has DMA capability.<\/li>\n<\/ul>\n<ul>\n<li>The DAC block integrates output buffers that can be used to reduce the output impedance, and to drive external loads directly without having to add an external operational amplifier. Buffering ensures that the original signal is not attenuated or distorted due to loading effects.<span style=\"font-size: 0.95em;line-height: 1.6em\">\u00a0<\/span><\/li>\n<\/ul>\n<ul>\n<li>Independent or dual mode of operation possible.<\/li>\n<\/ul>\n<h4>Functional Description<\/h4>\n<p>The DAC of STM32 micros can be operated in a number of ways. As stated we can use it in independent and dual mode. Apart from this we can also trigger these DACs with external events. If no triggering option is used, the DAC outputs are updated after one clock cycle. If any triggering option is used, the outputs are updated after 3 \u2013 4 clock cycles. The outputs of the DAC block can be independently or simultaneously updated. The DAC has a maximum resolution of 12-bits. The formula for voltage output from the DAC is as follows:<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Formula.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-10493 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Formula.png\" alt=\"Formula\" width=\"436\" height=\"101\" \/><\/a><\/p>\n<p>where n is the number of bits.<\/p>\n<p>Unless triggering is used, operating the DAC is pretty easy. We will have to turn on the desired output channel and just write the digital data value. However when it is the other way around, lot of possibilities arise. STM32F10x reference manual states all of these possibilities in dual mode operation section. Though I will not be going to detail all of these operations, the operations are easy.<\/p>\n<p>The outputs can be internally buffered to avoid the need for an external op-amp buffer, thereby reducing both external component count and cost. I highly recommend using internals buffers in order to ensure and maintain accuracy while avoid output loading issues.<\/p>\n<p>The other two toys that come with the STM32 DAC block are the white noise and triangular waveform generator. At first these feature may surprize you or may even make you feel that they are unnecessary. However these stuffs come handy when we need to generate arbitrary waveforms for various applications including music, tones, etc. or inject noise in a signal for debugging. Literally we can simulate a real life noisy electronic circuit environment. The triangular waveform generator can be used to add a variable amplitude triangular waveform component to a given signal. More details here: <a href=\"http:\/\/www.st.com\/web\/en\/resource\/technical\/document\/application_note\/CD00259245.pdf\">http:\/\/www.st.com\/web\/en\/resource\/technical\/document\/application_note\/CD00259245.pdf<\/a>.<\/p>\n<p>In STM32F103ZET6, the DAC output 1 and 2 pins are located at GPIOA <i>PA4<\/i> and <i>PA5<\/i> respectively. Though these pins are used as outputs when used with the DAC block, ST recommends that they should be set as analogue inputs to avoid parasitic consumption \u2013 an important point to consider.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/DAC-Output-Pins.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10448 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/DAC-Output-Pins-580x419.png\" alt=\"DAC Output Pins\" width=\"580\" height=\"419\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/DAC-Output-Pins-580x419.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/DAC-Output-Pins.png 658w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h4>Registers<\/h4>\n<p>In STM32 micros, we just need to deal with three registers &#8211; one for configuration, one for selecting software trigger and the other for setting the DAC outputs. We do not have any other register to deal with.<\/p>\n<p>The <b><i>DAC Control Register (DAC_CR)<\/i><\/b> is the one and only register that we will need to configure the DAC. Configuring this register allows us to enable\/disable DAC channels, set output type, enable DMA support and do the other things. Both DACs of STM32 micro are configured using this register alone.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/DAC_CR-Register.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10449 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/DAC_CR-Register-580x159.png\" alt=\"DAC_CR Register\" width=\"580\" height=\"159\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/DAC_CR-Register-580x159.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/DAC_CR-Register.png 1017w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><br \/>\n<\/a><\/p>\n<p>The next set of registers are data registers. These are the places where we will be writing digital data that will be ultimately converted to scaled analogue outputs. The DAC data registers can accept data in three integer formats &#8211; 8-bit, 12-bit right aligned and 12-bit left aligned. There are dedicated registers for these. Checkout <b><i>DAC Data Holding Registers (DAC_DHRx)<\/i><\/b>. For dual mode DAC checkout <b><i>DAC_DHRD<\/i><\/b> registers. Data in <b><i>DAC_DHRx<\/i><\/b> registers is then loaded to <b><i>DAC_DORx <\/i><\/b>registers one or several cycles later depending on if any trigger is used or not. The <b><i>DAC_DORx<\/i><\/b> registers cannot be directly written.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/DAC_DHR.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-10450 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/DAC_DHR.png\" alt=\"DAC_DHR\" width=\"471\" height=\"220\" \/><br \/>\n<\/a><\/p>\n<p>Finally there is a register called <b><i>DAC software trigger register (DAC_SWTRIGR)<\/i><\/b><b> <\/b>for setting up software trigger.<\/p>\n<p>Just like previously we no longer need to deal with registers as I have integrated my version of SPL with the code examples. I would still recommend readers to have a glimpse of them.<\/p>\n<h4>Hardware Connection<\/h4>\n<p>The diagram below outlines the GPIO pins we will be using in the code examples.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Hardware-Pin-Map.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-10451 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Hardware-Pin-Map.png\" alt=\"Hardware Pin Map\" width=\"577\" height=\"506\" \/><\/a><\/p>\n<h4>Code Examples<\/h4>\n<p>Please note that as with any other internal block of the STM32 micro, we need to enable the DAC block\u2019s peripheral clock first then configure desired operations by setting the correct registers and finally enable the required hardware. This is the sequence we should always maintain. Required GPIO port pins should be enabled and configured as recommended prior to setting the DAC itself. Check out the clock configuration I used in all of the examples.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Clock-Configuration.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10447 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Clock-Configuration-580x274.png\" alt=\"Clock Configuration\" width=\"580\" height=\"274\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Clock-Configuration-580x274.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Clock-Configuration-1024x484.png 1024w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Clock-Configuration.png 1114w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<h6><b><br \/>\nDAC Basic Demo<\/b><\/h6>\n<p>This is the rawest demo of the STM32\u2019s DAC. No triggering is used. The DAC pins output reference-shifted sine and cosine waveforms. Since the DAC\u2019s reference source in my examples is the same as that of the supply (VDD) \u2013 3.3V, the outputs are shifted by 1.65V to cover the entire sinusoidal variation. MikroC\u2019s C Math library is used for the trigonometric function. LEDs connected with DAC output pins fade and glow smoothly, showing a smooth change in voltage across them.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"DAC.h\"<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"GPIO.h\"<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define radian_per_degree\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0.0174532925<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void DAC_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void main() <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 signed int temp1 = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 signed int temp2 = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 unsigned int degree = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 while(1)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(degree = 0; degree &lt; 360; degree++)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp1 = (2047 * cos(radian_per_degree * degree));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp1 = (2048 - temp1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DAC_DHR12R1 = ((unsigned int)temp1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp2 = (2047 * sin(radian_per_degree * degree));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 temp2 = (2048 - temp2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DAC_DHR12R2 = ((unsigned int)temp2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(6);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 };<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 GPIO_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 DAC_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOA(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 4, analog_input);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 5, analog_input);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void DAC_setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_DAC(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 DAC_reset();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_DAC1_buffer(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_DAC2_buffer(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_DAC1_channel(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_DAC2_channel(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_224458.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10478 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_224458-580x313.jpg\" alt=\"20150619_224458\" width=\"580\" height=\"313\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_224458-580x313.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_224458.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_224110.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10477 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_224110-580x271.jpg\" alt=\"20150619_224110\" width=\"580\" height=\"271\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_224110-580x271.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_224110.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_224056.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10476 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_224056-580x265.jpg\" alt=\"20150619_224056\" width=\"580\" height=\"265\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_224056-580x265.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_224056.jpg 583w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><br \/>\nVideo Link: <a href=\"https:\/\/www.youtube.com\/watch?v=JW6e-oHBCPQ\">https:\/\/www.youtube.com\/watch?v=JW6e-oHBCPQ<\/a>.<\/p>\n<h6><b style=\"color: #222222;font-size: 1em;line-height: 1em\" data-darkreader-inline-color=\"\">Triangular Waveform Generation<\/b><\/h6>\n<p>One of the cool and exceptional feature of the STM32 DAC block is its ability to generate symmetrical triangular waveforms. This waveform can be superimposed on other slow waveforms or steady DC signals. There is no need for any wave table or equation for generating the triangular wave. An internal counter takes care of generating the waveform. We can set the amplitude or peak point of the triangle wave as per our need. In order to use triangle waveform, we need to set wave type and triggering options in the <b><i>DAC_CR<\/i><\/b> register. The frequency of the triangular waveform is dependent on two things \u2013 amplitude of the waveform and the frequency of trigger. In case of software trigger, we need to consider delays inside a code. These delays include delay function calls, code execution time and other factors. So far I noticed that the formula below seems to give the approximate time period of the output waveform:<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Formula1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10495 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Formula1-580x26.png\" alt=\"Formula1\" width=\"580\" height=\"26\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Formula1-580x26.png 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Formula1.png 960w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>The <b><i>2<\/i><\/b> in the above equation is due to the fact that the DAC count starts from min or 0 to max amplitude count and then reaches min count in the same way it rose. Thus from the above formula we can deduce frequency of the triangular waveform.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Formula2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-10496 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Formula2.png\" alt=\"Formula2\" width=\"130\" height=\"82\" \/><\/a><\/p>\n<p>For instance, let us consider a case where we will be using software trigger as such that the trigger is being called every 60\u00b5s and the maximum DAC count amplitude is 2047. In this case the time period of the triangular wave is<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Formula3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-10497 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/Formula3.png\" alt=\"math\" width=\"363\" height=\"145\" \/><\/a><\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"DAC.h\"<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"GPIO.h\"<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void DAC_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void main() <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 bit time;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 unsigned long peak = Triangle_Amplitude_equal_to_4095;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 while(1)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_DAC1_software_trigger(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_DAC2_software_trigger(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(get_input(GPIOF_IDR, 14) == 0)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_input(GPIOF_IDR, 14) == 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 peak++;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(peak &gt; Triangle_Amplitude_equal_to_4095)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 peak = Triangle_Amplitude_equal_to_1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_DAC1_channel(false);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_DAC2_channel(false);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_DAC1_triangle_waveform_amplitude(peak);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_DAC2_triangle_waveform_amplitude(peak);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_DAC1_channel(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 enable_DAC2_channel(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(get_input(GPIOF_IDR, 13) == 0)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(get_input(GPIOF_IDR, 13) == 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 time = ~time;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 switch(time)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 case 1:<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_us(600);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 default:<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_us(60);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 break;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 };<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 GPIO_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 DAC_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void DAC_setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_DAC(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 DAC_reset();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_DAC1_buffer(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_DAC1_trigger(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 select_DAC1_trigger_source(Software_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 select_DAC1_wave_type(triangle_wave_generation_enabled);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_DAC1_triangle_waveform_amplitude(Triangle_Amplitude_equal_to_4095);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_DAC1_channel(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_DAC2_buffer(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_DAC2_trigger(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 select_DAC2_trigger_source(Software_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 select_DAC2_wave_type(triangle_wave_generation_enabled);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_DAC2_triangle_waveform_amplitude(Triangle_Amplitude_equal_to_4095);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_DAC2_channel(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOA(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOF(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 4, analog_input);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 5, analog_input);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOF_CRH, 13, digital_input);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOF_CRH, 14, digital_input);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pull_up_enable(GPIOF_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pull_up_enable(GPIOF_ODR, 14);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p>In this demo we can vary the amplitude of the triangular waveform coming out from both DAC output channels using a button connected to GPIO PF14 pin. A button connected to GPIO PF13 pin can be used to select time period.<\/p>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231157.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-10479 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231157.jpg\" alt=\"20150619_231157\" width=\"577\" height=\"387\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231209.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10480 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231209-580x347.jpg\" alt=\"20150619_231209\" width=\"580\" height=\"347\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231209-580x347.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231209.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231227.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10481 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231227-580x379.jpg\" alt=\"20150619_231227\" width=\"580\" height=\"379\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231227-580x379.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231227.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>Video link: <a href=\"https:\/\/www.youtube.com\/watch?v=eX3zRjr8bQo\">https:\/\/www.youtube.com\/watch?v=eX3zRjr8bQo<\/a>.<\/p>\n<h6><b>White Noise Generation<\/b><\/h6>\n<p>The white noise generation module has similar settings as that of the triangular waveform generator. The only thing different apart from waveform is the algorithm that generates white noise. This is not in my scope of explanation. We just need to know that we can use this module to generate variable amplitude pseudo random noise. For better understanding please check this out <a href=\"https:\/\/en.wikipedia.org\/wiki\/Linear_feedback_shift_register\">https:\/\/en.wikipedia.org\/wiki\/Linear_feedback_shift_register<\/a>. All we need is to mask the LFSR as per our need.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"DAC.h\"<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"GPIO.h\"<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void DAC_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void main()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 while(1)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_DAC2_software_trigger(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_us(10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 };<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 GPIO_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 DAC_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void DAC_setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_DAC(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 DAC_reset();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_DAC2_buffer(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_DAC2_trigger(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 select_DAC2_trigger_source(Software_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 select_DAC2_wave_type(noise_wave_generation_enabled);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_DAC2_LFSR_mask(0x3FF);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_DAC2_channel(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOA(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 5, analog_input);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_225551.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10482 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_225551-580x219.jpg\" alt=\"20150619_225551\" width=\"580\" height=\"219\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_225551-580x219.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_225551.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_225545.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10483 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_225545-580x211.jpg\" alt=\"20150619_225545\" width=\"580\" height=\"211\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_225545-580x211.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_225545.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>Video link: <a href=\"https:\/\/www.youtube.com\/watch?v=ylxTQXLa-D4\">https:\/\/www.youtube.com\/watch?v=ylxTQXLa-D4<\/a>.<\/p>\n<h6><b>8-bit DAC vs 12-bit DAC<\/b><\/h6>\n<p>This example is meant to show resolution, speed and precision and their impact. DAC1 is configured as a 12-bit DAC while DAC2 is configured as an 8-bit DAC. I tried to show that for the same output 12-bits resolution will be more precise but it will be slower than less precise 8-bit one. You\u2019ll notice for the same time interval and output, the 8-bit output saturates well before the 12-bit output. If you notice the snapshots, you\u2019ll see that both of these outputs have different slopes and this is where precision and speed comes into play.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"DAC.h\"<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"GPIO.h\"<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void DAC_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void main()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 signed int temp = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 while(1)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(temp = 0; temp &lt; 4096; temp++)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DAC_DHR12R1 = temp;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((temp &gt; 0) &amp;&amp; (temp &lt; 256))<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DAC_DHR8R2 = temp;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_us(90);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(temp = 4095; temp &gt; -1; temp--)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DAC_DHR12R1 = temp;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if((temp &gt; 0) &amp;&amp; (temp &lt; 256))<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0DAC_DHR8R2 = temp;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_us(90);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 };<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 GPIO_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 DAC_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOA(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 4, analog_input);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 5, analog_input);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void DAC_setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_DAC(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 DAC_reset();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_DAC1_buffer(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_DAC2_buffer(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_DAC1_channel(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_DAC2_channel(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_222943.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10489 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_222943-580x270.jpg\" alt=\"20150619_222943\" width=\"580\" height=\"270\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_222943-580x270.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_222943.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_222933.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10488 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_222933-580x329.jpg\" alt=\"20150619_222933\" width=\"580\" height=\"329\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_222933-580x329.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_222933.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<p>Video link: <a href=\"https:\/\/www.youtube.com\/watch?v=jBfzgFGs7JM\">https:\/\/www.youtube.com\/watch?v=jBfzgFGs7JM<\/a>.<\/p>\n<h6><b>Dual Mode DAC<\/b><\/h6>\n<p>Dual mode DAC opens a pathway to a number of possibilities. STM32F10x reference manual discusses various ways of operating the DAC in dual mode. What I felt makes it much simpler. We just need to treat two DAC channels separately. If both DACs have common trigger source then they are said to update simultaneously or synchronously, otherwise they are independent. Both DACs can output same or different waveforms depending on how they are configured.<br \/>\nIn this example I configured one DAC to output triangular wave superimposed on a variable DC component while the other DAC is configured to output white noise signal when invoked by an external interrupt on <i>GPIO PA9<\/i> pin.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"DAC.h\"<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"GPIO.h\"<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"AFIO.h\"<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"Ex_Int.h\"<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void AFIO_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void DAC_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void ext_int() <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>iv IVT_INT_EXTI9_5 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>ics ICS_AUTO<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 if(read_pending_reg(9) != 0)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pending_clr(9);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bit_clr(GPIOA_ODR, 6);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(200);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bit_set(GPIOA_ODR, 6);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void main()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 signed int value = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 while(1)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(get_input(GPIOF_IDR, 13) == 0)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value++;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(get_input(GPIOF_IDR, 14) == 0)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value--;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(value &gt; 2047)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = 2047;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(value &lt; 0)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_DAC1_software_trigger(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DAC_DHR12RD = (((unsigned int)value) | 0x00FF0000);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 };<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 GPIO_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 AFIO_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 DAC_setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 enable_GPIOA(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 4, analog_input);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 5, analog_input);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 6, (output_mode_low_speed | GPIO_PP_output));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 enable_GPIOF(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 pin_configure_high(GPIOF_CRH, 13, digital_input);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 pin_configure_high(GPIOF_CRH, 14, digital_input);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 pull_up_enable(GPIOF_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 pull_up_enable(GPIOF_ODR, 14);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void AFIO_setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 AFIO_enable(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 pin_configure_high(GPIOA_CRH, 9, digital_input);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 pull_up_enable(GPIOA_ODR, 9);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 bit_set(GPIOA_ODR, 6);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 set_EXTI8_11(9, PA_pin);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 falling_edge_selector(9);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 interrupt_mask(9);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 NVIC_IntEnable(IVT_INT_EXTI9_5);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 EnableInterrupts();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void DAC_setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 enable_DAC(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 DAC_reset();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 set_DAC1_buffer(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 enable_DAC1_trigger(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 select_DAC1_trigger_source(Software_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 select_DAC1_wave_type(triangle_wave_generation_enabled);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 set_DAC1_triangle_waveform_amplitude(Triangle_Amplitude_equal_to_511);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 enable_DAC1_channel(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 set_DAC2_buffer(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 enable_DAC2_trigger(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 select_DAC2_trigger_source(EXTI9_event);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 select_DAC2_wave_type(noise_wave_generation_enabled);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 set_DAC2_LFSR_mask(0x3AA);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 enable_DAC2_channel(true);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 DAC_DHR12RD = 0x00FF0000;<\/i><\/span><\/pre>\n<pre><i><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}<\/span><\/i><i><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">\u00a0<\/span>\u00a0<\/i><\/pre>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230553.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10484 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230553-580x319.jpg\" alt=\"20150619_230553\" width=\"580\" height=\"319\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230553-580x319.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230553.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230633.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10485 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230633-580x238.jpg\" alt=\"20150619_230633\" width=\"580\" height=\"238\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230633-580x238.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230633.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230643.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10486 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230643-580x232.jpg\" alt=\"20150619_230643\" width=\"580\" height=\"232\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230643-580x232.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230643.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230658.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10487 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230658-580x260.jpg\" alt=\"20150619_230658\" width=\"580\" height=\"260\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230658-580x260.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_230658.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><br \/>\n<\/a><\/p>\n<p>Video link: <a href=\"https:\/\/www.youtube.com\/watch?v=2rQQXBaYLMk\">https:\/\/www.youtube.com\/watch?v=2rQQXBaYLMk<\/a>.<\/p>\n<h6><b>MikroC DAC Library Example<\/b><\/h6>\n<p>Taking into account that many ARM-based micros have built-in DAC blocks, Mikroelektronika also integrated an easy to use DAC library with MikroC compiler. This library supports most of the functions typically found in a STM32 micro with DAC block and that\u2019s what makes it a code-saver. A few functions as mentioned below are what are needed to configure and use the DAC.<\/p>\n<ul>\n<li><a href=\"\/dac_library.htm#dacx_init\">DACx_Init<\/a><\/li>\n<li><a href=\"\/dac_library.htm#dacx_advanced_chy_output\">DACx_Advanced_Chy_Output<\/a><\/li>\n<li><a href=\"\/dac_library.htm#dacx_chy_output\">DACx_Chy_Output<\/a><\/li>\n<li><a href=\"\/dac_library.htm#dac1_dual_output\">DAC1_Dual_Output<\/a><\/li>\n<li><a href=\"\/dac_library.htm#dacx_deinit\">DACx_Deinit<\/a><\/li>\n<\/ul>\n<p>The functions are explained in details in their compiler\u2019s manual and help document.<\/p>\n<p>In my example I also used MikroC\u2019s GPIO library \u2013 another useful library for configuring GPIO pins. In this final example I demonstrated a raw use of the DAC. I used two buttons to alternately increase and decrease the brightness of two LEDs connected to DAC outputs.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void main()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 signed int value = 2047;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 while(1)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(GPIOF_IDRbits.IDR13 == 0)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value++;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(GPIOF_IDRbits.IDR14 == 0)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value--;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(value &gt;= 4095)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = 4095;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if(value &lt;= 0)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 {<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DAC1_Ch1_Output(value);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DAC1_Ch2_Output((4095 - value));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 };<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 GPIO_Clk_Enable(&amp;GPIOA_BASE);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 GPIO_Clk_Enable(&amp;GPIOF_BASE);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 GPIO_Config(&amp;GPIOA_BASE, (_GPIO_PINMASK_4 | _GPIO_PINMASK_5), _GPIO_CFG_MODE_ANALOG);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 GPIO_Config(&amp;GPIOF_BASE, (_GPIO_PINMASK_13 | _GPIO_PINMASK_14), (_GPIO_CFG_MODE_INPUT | _GPIO_CFG_PULL_UP));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 DAC1_Init(_DAC_DUAL_MODE_ENABLE);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231408.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10490 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231408-580x328.jpg\" alt=\"20150619_231408\" width=\"580\" height=\"328\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231408-580x328.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231408.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231352.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10491 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231352-580x335.jpg\" alt=\"20150619_231352\" width=\"580\" height=\"335\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231352-580x335.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231352.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><\/a> <a href=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231400.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-10492 aligncenter\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231400-580x328.jpg\" alt=\"20150619_231400\" width=\"580\" height=\"328\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231400-580x328.jpg 580w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/06\/20150619_231400.jpg 590w\" sizes=\"auto, (max-width: 580px) 100vw, 580px\" \/><br \/>\n<\/a><\/p>\n<p>Video link: <a href=\"https:\/\/www.youtube.com\/watch?v=nhgQxpTulhU\">https:\/\/www.youtube.com\/watch?v=nhgQxpTulhU<\/a>.<\/p>\n<p><span style=\"font-size: 0.95em;line-height: 1.6em\">References: STM32F10x Reference Manual.<\/span><\/p>\n<p>Happy coding.<\/p>\n<p><i>\u00a0<\/i><\/p>\n<p>Repository: <a href=\"https:\/\/github.com\/sshahryiar\/STM32-Tutorials\">https:\/\/github.com\/sshahryiar\/STM32-Tutorials<\/a><\/p>\n<p><i>Author: Shawon M. Shahryiar<br \/>\n<\/i><\/p>\n<p><a href=\"https:\/\/www.youtube.com\/c\/sshahryiar\">https:\/\/www.youtube.com\/c\/sshahryiar<\/a><\/p>\n<p><a href=\"https:\/\/github.com\/sshahryiar\">https:\/\/github.com\/sshahryiar<\/a><\/p>\n<p><a href=\"mailto:sshahryiar@gmail.com\"><i>sshahryiar@gmail.com<\/i><\/a><i><\/i><i>\u00a0 \u00a0 \u00a0 \u00a0 <\/i><\/p>\n","protected":false},"excerpt":{"rendered":"<p>After having played with Analogue-to-Digital Converter (ADC) of STM32 micros, the obvious next internal hardware block to deal with is the Digital-to-Analogue Converter (DAC). As the name suggests this block has just the complementary function of ADC. It converts digital binary values to analogue voltage outputs. The DAC block has several uses including audio generation, waveform generation, etc. Typically in most 8-bit micros, this block is unavailable and its need is somewhat loosely met with Pulse Width Modulation (PWM) block. This is partly because of their relatively less hardware resources and operating speeds. All STM32 micros also have PWM blocks<\/p>\n","protected":false},"author":5,"featured_media":10446,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[733,1474,1466],"tags":[798,799,803,1099,804,1319,1213,1125,850],"class_list":["post-10445","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-stm32","category-stm32-tutorials","category-tutorials","tag-32-bit-microcontroller","tag-advanced-embedded-systems","tag-arm-microcontrollers","tag-dac","tag-mikroc-pro-for-arm","tag-stm32","tag-stm32f103zet6","tag-stm32f10x-series","tag-stmicroelectronics"],"_links":{"self":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/10445","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/comments?post=10445"}],"version-history":[{"count":11,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/10445\/revisions"}],"predecessor-version":[{"id":15167,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/10445\/revisions\/15167"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/media\/10446"}],"wp:attachment":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/media?parent=10445"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/categories?post=10445"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/tags?post=10445"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}