{"id":10116,"date":"2015-12-18T09:38:53","date_gmt":"2015-12-18T14:38:53","guid":{"rendered":"http:\/\/embedded-lab.com\/blog\/?p=10116"},"modified":"2023-04-20T23:08:52","modified_gmt":"2023-04-21T03:08:52","slug":"stm32-adc-2","status":"publish","type":"post","link":"https:\/\/embedded-lab.com\/blog\/stm32-adc-2\/","title":{"rendered":"STM32 Analogue-to-Digital Converter (ADC)"},"content":{"rendered":"<p>Most of us who have experienced 8-bit MCUs previously know how much important it is to have an <b><i>Analogue-to-Digital Converter (ADC)<\/i><\/b> built-in with a microcontroller. Apart from other hardware extensions unavailable in the early era microcontrollers, many former 8051 microcontroller users shifted primarily to more robust Atmel AVRs and Microchip PICs just for this important peripheral. I don\u2019t feel it necessary to restate the advantages of having such a peripheral embedded in a micro. In traditional 8-bit MCUs aforementioned, the ADC block is somewhat incomplete and users have to work out tricky methods to solve certain problems. The ADC block of STM32 micros is one of the most advanced and sophisticated element to deal with in the entire STM32 arena. There are way too many options for this block in a STM32 micro. In this issue, we will explore this block. <a href=\"http:\/\/embedded-lab.com\/blog\/stm32-adc-2\/adc-hardware-block-diagram\/\" rel=\"attachment wp-att-10131\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10131\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/ADC-Hardware-Block-Diagram.jpg\" alt=\"ADC Hardware Block Diagram\" width=\"421\" height=\"600\" \/><!--more--><\/a><\/p>\n<h4>A Simplified Overview of STM32\u2019s ADC Block<\/h4>\n<p>The block diagram shown above might look a bit complex at first but it still worth having a look. It shows us the interfaces that are related to the ADC block and some key features. It seems that some external interrupt pins and internal timer peripherals have some kind of relation with the ADC block. Well these hardware peripherals can trigger ADC conversion. The more we go forward, the more we explore. In short I would like to point out some key features of a typical STM32 ADC:<\/p>\n<ul>\n<li>12-bit successive approximation ADC.<\/li>\n<li>Maximum ADC conversion rate is 1MHz and more than 2MHz in some STM32 families.<\/li>\n<li>A\/D conversion range: 0 \u2013 3.6V DC.<\/li>\n<li>ADC power supply operating range: 2.4V \u2013 3.6V DC.<\/li>\n<li>ADC input range: (V_Ref- and V_Ref+\u00a0pins are available only in some devices and packages).<\/li>\n<li>Different modes of operation available for different measurement cases.<\/li>\n<li>Dual mode conversion on devices with at least 2 ADC units. Some devices have more than 2 ADCs.<\/li>\n<li>An integrated ADC sequencer ranks channels according to order.<\/li>\n<li>Channel-by-channel sample time programmability. Having this feature is an advantage because we can set different sampling time for different channels and the ADC block need not to be stopped for making such changes.<\/li>\n<li>Several external input channels are available. 10 external channels in STM32F103C8T6.<\/li>\n<li>Two internal ADC channels available with ADC1 (aka. <i>Master ADC<\/i>). These channels are connected to an internal band gap voltage reference source and an on-chip temperature sensor.<\/li>\n<li>An Analogue Watchdog (AWD) unit can detect if an ADC channel(s) is operating within a predefined ADC count window.<\/li>\n<li>DMA-based fast data transferability.<\/li>\n<li>Several hardware interrupts are available to flag important events.<\/li>\n<\/ul>\n<h4>The Basics of the STM32 ADC Block<\/h4>\n<p>The words <i>mode<\/i> and <i>conversion<\/i> in STM32 documentations are somewhat ambiguous unless you get them straight. Down to the basics, there are two modes of operation primarily. These are:<\/p>\n<ul>\n<li><span style=\"color: #ff6600\" data-darkreader-inline-color=\"\"><b><i>Independent mode<\/i><\/b><i>.<\/i><\/span> It is just as the typical ADC use. Each ADC unit is operating on its own and without any mutual dependency.<\/li>\n<li><span style=\"color: #ff6600\" data-darkreader-inline-color=\"\"><b><i>Dual mode.<\/i><\/b> <\/span> In this mode two ADCs are converted simultaneously or with some (literally negligible) delay. Two ADC units mutually working together as if they are a single unit.<\/li>\n<\/ul>\n<p>A\/D conversion can be:<\/p>\n<ul>\n<li><b><i><span style=\"color: #339966\" data-darkreader-inline-color=\"\">Single Conversion.<\/span> <\/i><\/b>One sample conversion at a given instant.<\/li>\n<li><b><i><span style=\"color: #339966\" data-darkreader-inline-color=\"\">Continuous Conversion.<\/span> <\/i><\/b>Non-stop sample collection and conversion.<\/li>\n<li><b><i><span style=\"color: #339966\" data-darkreader-inline-color=\"\">Discontinuous Conversion.<\/span> <\/i><\/b>Sequential conversion of some channels in a group.<\/li>\n<li><span style=\"color: #339966\" data-darkreader-inline-color=\"\"><b><i>Scan Conversion.<\/i><\/b><\/span> Sequential sampling and converting of an array of channels one after another.<\/li>\n<\/ul>\n<p>To start A\/D conversion, an ADC unit needs to be stimulated with a trigger signal:<\/p>\n<ul>\n<li><b><i><span style=\"color: #cc99ff\" data-darkreader-inline-color=\"\">Software Trigger.<\/span> <\/i><\/b>A\/D conversion as per demand from coded program.<\/li>\n<li><b><i><span style=\"color: #cc99ff\" data-darkreader-inline-color=\"\">Hardware Trigger.\u00a0<\/span> <\/i><\/b>A\/D conversion as per hardware events like external interrupts or timer events.<\/li>\n<\/ul>\n<p>A\/D conversions are done in groups. Group members are ADC channels and need not to be multiple channels. A group may consist of only one channel. Within these groups ADC channels are converted on a scheduled round-robin basis. The good stuff is the fact that unlike most micros we can program which channels belong in a group and with which sequence the A\/D conversion is commenced. We can also set the sampling time for each channel separately. ADC groups can be categorized as follows:<\/p>\n<ul>\n<li><b><i><span style=\"color: #00ccff\" data-darkreader-inline-color=\"\">Regular Group.<\/span> <\/i><\/b>A given fixed group of ADC channels are regularly converted. Up to 16 channels can be present in a regular group. A regular group is similar to a code running in the main loop. <a style=\"font-size: 0.95em;line-height: 1.6em\" href=\"https:\/\/embedded-lab.com\/blog\/regular-group-conversion\/\" rel=\"attachment wp-att-10105\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10105\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Regular-Group-Conversion.png\" alt=\"Regular Group Conversion\" width=\"279\" height=\"68\" \/><\/a><b><i><\/i><\/b><\/li>\n<li><b><i><span style=\"color: #00ccff\" data-darkreader-inline-color=\"\">Injected Group.<\/span> <\/i><\/b>This group can interrupt a regular group conversion as it has a higher priority over the former. Up to 4 channels can be present in an injected group. When an injected group is present or injected over a regular group, all regular group conversions are halted temporarily. The injected group is processed first and then the regular groups are resumed. An injected group is analogous to having an interrupt over a running code. Alone without a regular group present, an injected group will behave like a regular group. <a href=\"https:\/\/embedded-lab.com\/blog\/injected-group-conversion\/\" rel=\"attachment wp-att-10088\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10088\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Injected-Group-Conversion.png\" alt=\"Injected Group Conversion\" width=\"422\" height=\"126\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Injected-Group-Conversion.png 703w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Injected-Group-Conversion-550x164.png 550w\" sizes=\"auto, (max-width: 422px) 100vw, 422px\" \/><\/a><\/li>\n<\/ul>\n<p><!--nextpage--><\/p>\n<h4>ADC Clock<\/h4>\n<p>Shown below is the STM32F10x clock tree. Notice some areas are highlighted. Check them out because these are related to the ADC block.<\/p>\n<div id=\"attachment_10130\" style=\"width: 609px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/embedded-lab.com\/blog\/stm32-adc-2\/stm32-clock-tree\/\" rel=\"attachment wp-att-10130\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-10130\" class=\"wp-image-10130 size-full\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/STM32-Clock-Tree.jpg\" alt=\"STM32 Clock Tree\" width=\"599\" height=\"584\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/STM32-Clock-Tree.jpg 599w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/STM32-Clock-Tree-550x536.jpg 550w\" sizes=\"auto, (max-width: 599px) 100vw, 599px\" \/><\/a><p id=\"caption-attachment-10130\" class=\"wp-caption-text\">STM32 ADC Clock Tree<\/p><\/div>\n<p>We can clearly see that the ADC peripheral is connected to the APB2 peripheral bus. If you can recall from my earlier post on STM32\u2019s clock options then you\u2019ll remember that APB2 can run at 72MHz speed which is by the way the maximum operating speed for STM32F10x series MCUs. ST recommends that the ADC be feed with no more than a 14MHz clock. Thus we should make sure that ADC clock is in the range of 600 kHz to 14MHz. Since it takes about 14 cycles to process ADC data the maximum possible number of conversions per second is one million. I previously pointed out in one of my posts that MikroC\u2019s IDE provided an easy to use tool to configure clocks for various STM32 peripheral buses. I recommend using this tool to configure peripheral clocks rather than coding them on your own. Pay attention particularly to APB1, APB2 and PCLK2 clocks when setting clock for the ADC block. Wrong settings will lead to unpredictable\/erratic behaviours. <a href=\"https:\/\/embedded-lab.com\/blog\/mikroc-clock-configuration-tool\/\" rel=\"attachment wp-att-10094\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10094\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/MikroC-Clock-Configuration-Tool.png\" alt=\"MikroC Clock Configuration Tool\" width=\"801\" height=\"506\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/MikroC-Clock-Configuration-Tool.png 801w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/MikroC-Clock-Configuration-Tool-550x347.png 550w\" sizes=\"auto, (max-width: 801px) 100vw, 801px\" \/><\/a> Additionally you can use STM32CubeMX to verify if your clock configuration is okay. You can also use this software to check which I\/O pins belong to which ADC channels and much more. However be aware, STM32CubeMX is not yet compatible with MikroC compiler. Personally I rarely use it. <a href=\"https:\/\/embedded-lab.com\/blog\/stm32cubemx-clock-configuration-tool\/\" rel=\"attachment wp-att-10111\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-10111\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/STM32CubeMX-Clock-Configuration-Tool-1024x472.png\" alt=\"STM32CubeMX Clock Configuration Tool\" width=\"860\" height=\"396\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/STM32CubeMX-Clock-Configuration-Tool-1024x472.png 1024w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/STM32CubeMX-Clock-Configuration-Tool-550x253.png 550w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/STM32CubeMX-Clock-Configuration-Tool.png 1120w\" sizes=\"auto, (max-width: 860px) 100vw, 860px\" \/><\/a><\/p>\n<h4>The ADC Registers<\/h4>\n<p>There are several registers associated with each ADC unit. At first you may feel like getting lost in an ocean of 32-bit registers. However things aren\u2019t so. Of these there are two ADC control registers called <b><i>ADC_CR1 <\/i><\/b>and <b><i>ADC_CR2<\/i><\/b> that set ADC properties and mode of operation. There\u2019s a status register, <b><i>ADC_SR<\/i><\/b> which flags important ADC events like end of a conversion, etc. These are the most important ones. I\u2019m not going to explain every bit because they are well explained in the reference manual. <a href=\"http:\/\/embedded-lab.com\/blog\/stm32-adc-2\/adc-registers\/\" rel=\"attachment wp-att-10132\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10132\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/ADC-Registers.png\" alt=\"ADC Registers\" width=\"603\" height=\"303\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/ADC-Registers.png 603w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/ADC-Registers-550x276.png 550w\" sizes=\"auto, (max-width: 603px) 100vw, 603px\" \/><\/a> The next set of registers are responsible for specifying channel sequence, sequence length, sampling times, offset and holding ADC conversion results. While dealing with the STM32 ADC block, you\u2019ll come across the letter <b><i>J<\/i><\/b> before many stuffs. These stuffs signify that they are related to in<b><i>J<\/i><\/b>ected group channels only. The rest of the stuffs are mostly related to regular groups and common uses. <b><i>ADC_SQRx<\/i><\/b> registers specify channel sequences. There are three of these registers and of them <b><i>ADC_SQR1<\/i><\/b> also specifies the number of channels in a regular sequence. <b><i>ADC_SQR3<\/i><\/b> through <b><i>ADC_SQR1<\/i><\/b> are sequentially feed with channel numbers according to position in a given sequence. The injected group equivalent of the <b><i>ADC_SQRx<\/i><\/b> is the single <b><i>ADC_JSQR<\/i><\/b> register. <b><i>ADC_SMPR1<\/i><\/b> and <b><i>ADC_SMPR2<\/i><\/b> registers specify the sampling times of each channel. The sampling time is common to both regular and injected groups. <b><i>ADC_LTR<\/i><\/b> and <b><i>ADC_HTR<\/i><\/b> registers hold the lower and upper analogue watchdog ADC count limits respectively. Again these are common for both groups. <b><i>ADC_JOFRx<\/i><\/b> registers hold offset values for injected channels. The values in them are automatically subtracted from injected channel ADC conversion results. Lastly the <b><i>ADC_DR<\/i><\/b> and <b><i>ADC_JDRx<\/i><\/b> registers hold ADC conversion results for regular and injected groups respectively. <b><i>ADC_DR<\/i><\/b> is common for all regular group channels. There are four <b><i>ADC_JDRx<\/i><\/b> registers for four injected channels. Recall that there can be up to four ADC channels for an injected group. When coding there\u2019s no need to follow any specific sequence for programming registers. Just make sure you coded for the required ones correctly.<\/p>\n<h4>My Version of Standard Peripheral Library<\/h4>\n<p>Unlike any of my previous posts on STM32, I\u2019m moving a bit faster toward coding section rather than giving detailed explanations at all steps. To fully realize the ADC block\u2019s various functionalities you need to code and experience it right after you have understood it. As I stated earlier, this block is a very complex one. It was not possible for me to give examples of every possible combination of operating modes. I\u2019m here presenting only the basics needed to get started with STM32\u2019s ADC. I would highly recommend readers to read this document from ST: <a href=\"http:\/\/www.st.com\/web\/en\/resource\/technical\/document\/application_note\/CD00258017.pdf\">http:\/\/www.st.com\/web\/en\/resource\/technical\/document\/application_note\/CD00258017.pdf<\/a> and read the reference manual for STM32F10x series for more details. Even after all these, this is a mega post. None of my previous posts on STM32 is so long. We all know that when it comes to handling 32-bit registers of 32-bit micros, programming turns into tiles of a tricky puzzle. Another big headache for programmers is the coding of registers with numeric jargons. I don\u2019t know for sure if it is for these reasons or for some others that most STM32 users are SPL dependent. Almost no one codes STM32s at raw level. MikroC compiler simplifies things a lot of stuffs in several areas. It is easy to get started with it no matter if you are an expert or a novice. Personally I like MikroC compiler more than any other compiler for several reasons. I didn\u2019t want to change it when I planned to play with STM32-based ARM micros. When I finally chose MikroC for ARM over other more popular and widely used compilers like Keil and Coocox, I was aware of SPL\u2019s advantages and what I would go through next for selecting so. I wondered how to get rid of handling 32-bit registers effectively and at the same time develop a strategy to avoid memorizing the functional uses and names of different registers. I was looking for something similar to SPL that can be easily integrated with MikroC compiler. Personally I don\u2019t like to use ST\u2019s SPL and so I coded my version of SPL. From now on I\u2019ll be sharing my version of SPL codes with my posts. I recommend readers to check them out before using them. Just for demo, check out my basic library for GPIO configuration:<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\/\/I\/O Modes<\/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 input_mode\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0   0x00<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define output_mode_low_speed\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0              0x02<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define output_mode_medium_speed\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0                   0x01<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define output_mode_high_speed\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0              0x03<\/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>\/\/I\/O Configurations<\/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 GPIO_PP_output\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0      0x00<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define GPIO_open_drain_output\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0             0x04<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define AFIO_PP_output\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0      0x08<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define AFIO_open_drain_output\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0            0x0C<\/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 analog_input\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0   0x00<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define floating_input\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0  0x04<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define input_without_pull_resistors\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0            0x04<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define digital_input\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x08<\/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>\/\/Pull Resistor Configurations<\/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 pull_down\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0x00<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define pull_up\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x01<\/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>\/\/Miscellaneous<\/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 enable\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x01<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define disable\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a00x00<\/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>\/\/CR Register Configuration Macro<\/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 pin_configure_low(reg, pin_no, io_type)\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0<\/i><i>do{reg &amp;= (~(0xF &lt;&lt; (pin_no &lt;&lt; 2))); reg |= (io_type &lt;&lt; (pin_no &lt;&lt; 2));}while(0)<\/i><i><\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define pin_configure_high(reg, pin_no, io_type)\u00a0\u00a0\u00a0\u00a0 \u00a0<\/i><i>do{reg &amp;= (~(0xF &lt;&lt; ((pin_no - 8) &lt;&lt; 2))); reg |= (io_type &lt;&lt; ((pin_no - 8) &lt;&lt; 2));}while(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>\/\/Bitwise Operations for GPIOs<\/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 bit_set(reg, bit_value)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(reg |= (1 &lt;&lt; bit_value))<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define bit_clr(reg, bit_value)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(reg &amp;= (~(1 &lt;&lt; bit_value)))<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define get_bits(reg, mask)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(reg &amp; mask)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define get_input(reg, bit_value)\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(reg &amp; (1 &lt;&lt; bit_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>\/\/Pull Resistor Functions<\/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 pull_up_enable(reg, pin_no)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(reg |= (1 &lt;&lt; pin_no))<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define pull_down_enable(reg, pin_no)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0(reg &amp;= (~(1 &lt;&lt; pin_no)))<\/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>\/\/GPIO Enabling Functions<\/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 enable_GPIOA(mode)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0RCC_APB2ENRbits.IOPAEN = mode<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define enable_GPIOB(mode)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0RCC_APB2ENRbits.IOPBEN = mode<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define enable_GPIOC(mode)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0RCC_APB2ENRbits.IOPCEN = mode<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define enable_GPIOD(mode)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0RCC_APB2ENRbits.IOPDEN = mode<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define enable_GPIOE(mode)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 RCC_APB2ENRbits.IOPEEN = mode<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define enable_GPIOF(mode)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0RCC_APB2ENRbits.IOPFEN = mode<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define enable_GPIOG(mode)\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0            RCC_APB2ENRbits.IOPGEN = mode<\/i><\/span><\/pre>\n<p>Now suppose you want to configure GPIO pins with this library. You can do so like this:<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>pin_configure_low(GPIOA_CRL, 6, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><i><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">pin_configure_high(GPIOB_CRH, 15, (GPIO_PP_output | output_mode_low_speed));\u00a0<\/span>\u00a0 <\/i><\/pre>\n<p>Now you can see that you don\u2019t need to handle 32-bit registers, bit positions and possible combinations of bit values. In fact sometimes you won\u2019t have remember the names of registers at all. All of these things are replaced with something more meaningful and easy to understand. Unlike ST\u2019s SPL you don\u2019t even have to be a programming wiz to use these libraries. Please check the header files for better understanding. At this point I must specify that I single headedly developed this idea and the libraries themselves. It took several months to develop, code, test and implement them. I tried my level best to keep things error-free and as per reference manuals. There could be some unintentional flaws in them. Should you spot one please notify me for correction.<\/p>\n<p><!--nextpage--><\/p>\n<h4>Coding and Explanations<\/h4>\n<p>The more we code, the better picture we\u2019ll get about the STM32\u2019s ADC. At some point, you\u2019ll feel that the codes are self-explanatory. For demo purposes I used a STM32F103C8T6 micro embedded in a cheap STM32 test board. The basic connection looks like this: <a href=\"https:\/\/embedded-lab.com\/blog\/connection-diagram\/\" rel=\"attachment wp-att-10084\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10084\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Connection-Diagram.png\" alt=\"Connection Diagram\" width=\"900\" height=\"513\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Connection-Diagram.png 900w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Connection-Diagram-550x313.png 550w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a>\u00a0All of the stuffs above except the connections for the ADC inputs and the LCD exist in most development boards. ADC pins are typically attached with GPIOA port.<\/p>\n<h6><em>MikroC ADC Library\u00a0<\/em><\/h6>\n<p>Obviously the first example is based on MikroC\u2019s ADC library. MikroC compiler provided an easy to use ADC library. With this library you can do basic ADC readings and set up ADC units easily with minimum coding. MikroC\u2019s built-in ADC library functions are as follows:<\/p>\n<ul>\n<li><a href=\"\/adc_library.htm#adcx_init\"><i>ADCx_Init<\/i><\/a><i> <\/i><\/li>\n<li><a href=\"\/adc_library.htm#adcx_init_advanced\"><i>ADCx_Init_Advanced<\/i><\/a><i> <\/i><\/li>\n<li><a href=\"\/adc_library.htm#adc_set_input_channel\"><i>ADC_Set_Input_Channel<\/i><\/a><i> <\/i><\/li>\n<li><a href=\"\/adc_library.htm#adcx_get_sample\"><i>ADCx_Get_Sample<\/i><\/a><i> <\/i><\/li>\n<li><a href=\"\/adc_library.htm#adcx_read\"><i>ADCx_Read<\/i><\/a><i> <\/i><\/li>\n<\/ul>\n<p>MikroC IDE\u2019s help section explains the purpose of these function.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_RS at GPIOB_ODR.B1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_EN at GPIOB_ODR.B2;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D4 at GPIOB_ODR.B12;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D5 at GPIOB_ODR.B13;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D6 at GPIOB_ODR.B14;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D7 at GPIOB_ODR.B15;<\/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>unsigned int adc_avg(unsigned char no_of_samples, unsigned char channel);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>float map(float v, float x_min, float x_max, float y_min, float y_max);<\/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 unsigned char s = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 register unsigned int adc_data = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 float v = 0.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 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 while(1)<\/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 for(s = 0; s &lt;= 1; s++)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 adc_data = adc_avg(10, s);<\/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 v = map(adc_data, 0, 4095, 0, 3300);<\/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 lcd_print(5, (s + 1), adc_data);<\/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 lcd_print(11, (s + 1), v);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 GPIOC_ODRbits.ODR13 ^= 1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(600);<\/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 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_Clk_Enable(&amp;GPIOA_BASE);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 GPIO_Clk_Enable(&amp;GPIOB_BASE);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 GPIO_Clk_Enable(&amp;GPIOC_BASE);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 GPIO_Config(&amp;GPIOA_BASE, (_GPIO_PINMASK_0 | _GPIO_PINMASK_1), (_GPIO_CFG_MODE_ANALOG | _GPIO_CFG_PULL_NO));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 GPIO_Config(&amp;GPIOC_BASE, _GPIO_PINMASK_13, (_GPIO_CFG_MODE_OUTPUT | _GPIO_CFG_SPEED_MAX | _GPIO_CFG_OTYPE_PP));<\/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 ADC1_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CLEAR);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CURSOR_OFF);<\/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 lcd_out(1, 1, \"A0:\");<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 lcd_out(2, 1, \"A1:\");<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 lcd_out(1, 15, \"mV\");<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 lcd_out(2, 15, \"mV\");<\/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>unsigned int adc_avg(unsigned char no_of_samples, unsigned char channel)<\/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\u00a0 unsigned long avg = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0 unsigned char samples = no_of_samples;<\/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 while(samples &gt; 0)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 avg += ADC1_Get_Sample(channel);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 samples--;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0 avg \/= no_of_samples;<\/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 return avg;<\/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 lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value)<\/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 unsigned char tmp = 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 tmp = (value \/ 1000);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, x_pos, (tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 100) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 10) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = (value % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/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>float map(float v, float x_min, float x_max, float y_min, float y_max)<\/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 return (y_min + (((y_max - y_min)\/(x_max - x_min)) * (v - x_min)));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p>In this demo I just showed how to use MikroC\u2019s built-in ADC library functions to initialize, get average ADC counts from two ADC channels and show both ADC counts and voltage levels of each channel on a LCD display. Just a piece of cake. Not much to explain. <a href=\"https:\/\/embedded-lab.com\/blog\/mikroc-library-2-2\/\" rel=\"attachment wp-att-10096\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10096\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/MikroC-Library-2.jpg\" alt=\"MikroC Library (2)\" width=\"600\" height=\"375\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/MikroC-Library-2.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/MikroC-Library-2-550x343.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> <a href=\"https:\/\/embedded-lab.com\/blog\/mikroc-library-1-2\/\" rel=\"attachment wp-att-10095\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10095\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/MikroC-Library-1.jpg\" alt=\"MikroC Library (1)\" width=\"600\" height=\"378\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/MikroC-Library-1.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/MikroC-Library-1-550x346.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> Demo video:\u00a0<a href=\"https:\/\/www.youtube.com\/watch?v=TwMTOLkWt-Q\">https:\/\/www.youtube.com\/watch?v=TwMTOLkWt-Q<\/a>.<\/p>\n<p><iframe loading=\"lazy\" width=\"860\" height=\"484\" src=\"https:\/\/www.youtube.com\/embed\/xMDIaEq-Q8o?feature=oembed\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<h6><em>Analogue Watchdog<\/em><\/h6>\n<p>One of the cool feature of STM32 micros is the <b><i>Analogue Watchdog (AWD)<\/i><\/b> unit. In traditional micros, a programmer needs to add an <i>if-else<\/i> clause to monitor if the ADC readouts are within some predefined limits. There are, therefore, some coding and resource involved. The AWD unit of STM32 micros can monitor if an ADC channel or all ADC channels are exceeding or within predefine upper and lower ADC count limits. In this way we can effectively set an analogue voltage level window for the ADC block. Thus this unit allows users to easily implement signal level monitors, zero-crossing detectors, analogue comparators and many other stuffs. Thanks to ST for hardcoding this useful feature with the ADC block. <a href=\"https:\/\/embedded-lab.com\/blog\/adc-awd-unit\/\" rel=\"attachment wp-att-10079\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10079\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/ADC-AWD-Unit.png\" alt=\"ADC AWD Unit\" width=\"620\" height=\"233\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/ADC-AWD-Unit.png 620w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/ADC-AWD-Unit-550x206.png 550w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/a> The upper and lower limit 12-bit values are stored in the <b><i>High Threshold (HTR) and Lower Threshold (LTR) <\/i><\/b>registers respectively. When the analogue input to be monitored is within these limits or inside guarded zone the AWD unit stays idle. When it is the other way around, the AWD wakes up. An AWD event interrupt can be generated if the AWD interrupt is enabled. <a href=\"https:\/\/embedded-lab.com\/blog\/awd\/\" rel=\"attachment wp-att-10083\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10083\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/AWD.png\" alt=\"AWD\" width=\"451\" height=\"156\" \/><\/a> \u00a0 Setting <b><i>AWDSGL bit, AWDEN bit <\/i><\/b>and<b><i> JAWDEN bit<\/i><\/b> in the <b><i>ADC_CR1 <\/i><\/b>select which channel types the AWD unit would monitor. The demo code for AWD is just same as the previous one but this time the AWD is also used to monitor all regular ADC channels. If the ADC readings exceed the guarded zone of 400 to 3695 ADC counts, the AWD fires. This mark starts to blink a LED connected to PC13, indicating an AWD event.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_RS at GPIOB_ODR.B1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_EN at GPIOB_ODR.B2;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D4 at GPIOB_ODR.B12;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D5 at GPIOB_ODR.B13;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D6 at GPIOB_ODR.B14;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D7 at GPIOB_ODR.B15;<\/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 high_level\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 3695<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define low_level\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 400<\/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>unsigned int adc_avg(unsigned char no_of_samples, unsigned char channel);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>float map(float v, float x_min, float x_max, float y_min, float y_max);<\/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 unsigned char s = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 register unsigned int adc_data = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 float v = 0.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 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 while(1)<\/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 for(s = 0; s &lt; 2; s++)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 adc_data = adc_avg(20, s);<\/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 v = map(adc_data, 0, 4095, 0, 3300);<\/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 lcd_print(5, (s + 1), adc_data);<\/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 lcd_print(11, (s + 1), v);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 if(ADC1_SRbits.AWD == 1)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 GPIOC_ODRbits.ODR13 ^= 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 ADC1_SRbits.AWD = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 else<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 GPIOC_ODRbits.ODR13 = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 delay_ms(400);<\/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 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_Clk_Enable(&amp;GPIOA_BASE);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 GPIO_Clk_Enable(&amp;GPIOB_BASE);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 GPIO_Clk_Enable(&amp;GPIOC_BASE);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 GPIO_Config(&amp;GPIOA_BASE, (_GPIO_PINMASK_0 | _GPIO_PINMASK_1), (_GPIO_CFG_MODE_ANALOG | _GPIO_CFG_PULL_NO));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 GPIO_Config(&amp;GPIOC_BASE, _GPIO_PINMASK_13, (_GPIO_CFG_MODE_OUTPUT | _GPIO_CFG_SPEED_MAX | _GPIO_CFG_OTYPE_PP));<\/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 ADC1_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC1_LTR = low_level;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC1_HTR = high_level;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC1_CR1bits.AWDEN = 1;<\/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 LCD_Init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CLEAR);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CURSOR_OFF);<\/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 lcd_out(1, 1, \"A0:\");<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 lcd_out(2, 1, \"A1:\");<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 lcd_out(1, 15, \"mV\");<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 lcd_out(2, 15, \"mV\");<\/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>unsigned int adc_avg(unsigned char no_of_samples, unsigned char channel)<\/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\u00a0 register unsigned long avg = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0 unsigned char samples = no_of_samples;<\/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 while(samples &gt; 0)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 avg += ADC1_Get_Sample(channel);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 samples--;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0 }<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0 avg \/= no_of_samples;<\/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 return avg;<\/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 lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value)<\/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 unsigned char tmp = 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 tmp = (value \/ 1000);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, x_pos, (tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 100) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 10) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = (value % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/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>float map(float v, float x_min, float x_max, float y_min, float y_max)<\/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 return (y_min + (((y_max - y_min)\/(x_max - x_min)) * (v - x_min)));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"https:\/\/embedded-lab.com\/blog\/awd-2\/\" rel=\"attachment wp-att-10082\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10082\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/AWD-2.jpg\" alt=\"AWD (2)\" width=\"600\" height=\"405\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/AWD-2.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/AWD-2-550x371.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> <a href=\"https:\/\/embedded-lab.com\/blog\/awd-1\/\" rel=\"attachment wp-att-10081\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10081\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/AWD-1.jpg\" alt=\"AWD (1)\" width=\"600\" height=\"397\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/AWD-1.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/AWD-1-550x363.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> \u00a0 <span style=\"font-size: 0.95em;line-height: 1.6em\">Demo video link: <\/span><a style=\"font-size: 0.95em;line-height: 1.6em\" href=\"https:\/\/www.youtube.com\/watch?v=xMDIaEq-Q8o\">https:\/\/www.youtube.com\/watch?v=xMDIaEq-Q8o<\/a><span style=\"font-size: 0.95em;line-height: 1.6em\">.\u00a0<\/span><br \/>\n<!--nextpage--><\/p>\n<h6><em>Interrupt-Driven Single Channel Continuous Conversion Mode<\/em><\/h6>\n<p>Many of us may overlook one feature of STM32 micros and that is no other than the presence of an on-chip temperature sensor. All STM32 micros have this sensor. Although it is not recommended for precise temperature measurements, it can be used to estimate PCB or surrounding temperatures around a STM32 micro. The single channel continuous conversion mode is one of the most basic ADC mode. In this mode, once an ADC is triggered a single channel associated with it is continuously converted. In this demo, the single channel is the temperature sensor. The end of conversion interrupt is used to extract ADC conversion result after a conversion finishes. In this way, the CPU is not busy waiting for the ADC to finish conversion. After the end of a conversion, the entire process is repeated and this makes it continuous. From this example onwards you\u2019ll mostly see me incorporating header file from my own SPL with my codes. Take this into account. In the reference manual for STM32F10x series, there\u2019s an entire section dedicated to this temperature sensor. I suggest that you check it out first before trying to understand the code example.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"ADC.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 V25\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1430<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#define T_offset\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 17.5<\/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>sbit LCD_RS at GPIOB_ODR.B1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_EN at GPIOB_ODR.B2;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D4 at GPIOB_ODR.B12;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D5 at GPIOB_ODR.B13;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D6 at GPIOB_ODR.B14;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D7 at GPIOB_ODR.B15;<\/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>register unsigned int adc_data = 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>const char symbol[8] = {0x00, 0x06, 0x09, 0x09, 0x06, 0x00, 0x00, 0x00};<\/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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void CustomChar(unsigned char y_pos, unsigned char x_pos);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value, unsigned char disp_type);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>float map(float v, float x_min, float x_max, float y_min, float y_max);<\/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 ADC_ISR() <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>iv IVT_INT_ADC1_2 <\/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\u00a0 adc_data = (ADC1_DR &amp; 0x0FFF);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 bit_set(GPIOC_ODR, 13);<\/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 register float t = 0.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 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 while(1)<\/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 t = map(adc_data, 0, 4095, 0, 3300);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 t = (((V25 - t) \/ 4.3) + 25);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 t -=\u00a0 T_offset;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 t *= 100;<\/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 if(t &lt;= 0)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 t = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 if(t &gt;= 9999)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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\u00a0t = 9999;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 lcd_print(13, 1, adc_data, 1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(12, 2, t, 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 bit_clr(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(90);<\/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 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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Init();<\/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 LCD_Cmd(_LCD_CLEAR);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CURSOR_OFF);<\/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 lcd_out(1, 1, \"CH16:\");<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 lcd_out(2, 1, \"T\/ C:\");<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 CustomChar(2, 3);<\/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_init()<\/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_GPIOB(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOC(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOC_CRH, 13, (GPIO_PP_output | output_mode_low_speed));<\/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 ADC_init()<\/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 ADC1_Enable();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 clr_ADC1_settings();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC_mode(independent_mode);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_data_alignment(right_alignment);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_scan_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_continuous_conversion_mode(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_external_trigger_regular_conversion_edge(SWSTART_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_number_of_conversions(1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_sample_time(sample_time_13_5_cycles, 16);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_sequence(1, 16);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_reference_and_temperature_sensor(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_end_of_conversion_interrupt(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 NVIC_IntEnable(IVT_INT_ADC1_2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 EnableInterrupts;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC1_calibrate();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 start_ADC1();<\/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 CustomChar(unsigned char y_pos, unsigned char x_pos)<\/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 unsigned char i = 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 Lcd_Cmd(64);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 for (i = 0; i &lt; 8; i += 1)<\/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 Lcd_Chr_CP(symbol[i]);<\/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 Lcd_Cmd(_LCD_RETURN_HOME);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 Lcd_Chr(y_pos, x_pos, 0);<\/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 lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value, unsigned char disp_type)<\/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 unsigned char tmp = 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 tmp = (value \/ 1000);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, x_pos, (tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 100) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 switch(disp_type)<\/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 case 0:<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 lcd_chr_cp(46);<\/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 break;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 case 1:<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 break;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 10) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = (value % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/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>float map(float v, float x_min, float x_max, float y_min, float y_max)<\/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 return (y_min + (((y_max - y_min)\/(x_max - x_min)) * (v - x_min)));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"https:\/\/embedded-lab.com\/blog\/internal-temperature-sensor-1\/\" rel=\"attachment wp-att-10092\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10092\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Internal-Temperature-Sensor-1.jpg\" alt=\"Internal Temperature Sensor (1)\" width=\"600\" height=\"316\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Internal-Temperature-Sensor-1.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Internal-Temperature-Sensor-1-550x289.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> <a href=\"https:\/\/embedded-lab.com\/blog\/internal-temperature-sensor-2\/\" rel=\"attachment wp-att-10093\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10093\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Internal-Temperature-Sensor-2.jpg\" alt=\"Internal Temperature Sensor (2)\" width=\"600\" height=\"333\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Internal-Temperature-Sensor-2.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Internal-Temperature-Sensor-2-550x305.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> <span style=\"font-size: 0.95em;line-height: 1.6em\"> Demo video link: <\/span><a style=\"font-size: 0.95em;line-height: 1.6em\" href=\"https:\/\/www.youtube.com\/watch?v=01sV-vgegtk\">https:\/\/www.youtube.com\/watch?v=01sV-vgegtk<\/a><span style=\"font-size: 0.95em;line-height: 1.6em\">.\u00a0<\/span><\/p>\n<h6><em>Interrupt-Driven Single Channel Single Conversion Mode<\/em><\/h6>\n<p>STM32 micros have an internal bandgap voltage reference source. The internal voltage reference source is not used by the ADC unlike other micros. It can, however, be used as a comparator input for zero-crossing detection. It may also be possible to use it to calibrate external readings or the V_Ref+ pin. The single channel single conversion mode is another basic ADC mode. In this mode a single channel (the internal reference source as in this example) is converted once when triggered. A single software trigger is used to invoke one ADC conversion. The end of conversion interrupt is used to notify the completion of ADC conversion and then the ADC stops. The only difference between the previous example and this one is how often the ADC conversion is done.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"ADC.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>sbit LCD_RS at GPIOB_ODR.B1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_EN at GPIOB_ODR.B2;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D4 at GPIOB_ODR.B12;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D5 at GPIOB_ODR.B13;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D6 at GPIOB_ODR.B14;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D7 at GPIOB_ODR.B15;<\/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>register unsigned int adc_data = 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>void setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>float map(float v, float x_min, float x_max, float y_min, float y_max);<\/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 ADC_ISR() <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>iv IVT_INT_ADC1_2 <\/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\u00a0 adc_data = (ADC1_DR &amp; 0x0FFF);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 bit_clr(GPIOC_ODR, 13);<\/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 register float V = 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 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 while(1)<\/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 set_ADC1_regular_conversions(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bit_set(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 V = map(adc_data, 0, 4095, 0, 3300);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(13, 1, adc_data);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(13, 2, V);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(90);<\/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>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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Init();<\/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 LCD_Cmd(_LCD_CLEAR);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CURSOR_OFF);<\/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 lcd_out(1, 1, \"CH17:\");<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 lcd_out(2, 1, \"Vref\/mV:\");<\/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_init()<\/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_GPIOB(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOC(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOC_CRH, 13, (GPIO_PP_output | output_mode_low_speed));<\/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 ADC_init()<\/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 ADC1_Enable();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 clr_ADC1_settings();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC_mode(independent_mode);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_data_alignment(right_alignment);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_scan_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_continuous_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_external_trigger_regular_conversion_edge(SWSTART_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_number_of_conversions(1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_sample_time(sample_time_13_5_cycles, 17);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_sequence(1, 17);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_reference_and_temperature_sensor(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_end_of_conversion_interrupt(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 NVIC_IntEnable(IVT_INT_ADC1_2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 EnableInterrupts();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC1_calibrate();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 start_ADC1();<\/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 lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value)<\/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 unsigned char tmp = 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 tmp = (value \/ 1000);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, x_pos, (tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 100) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 10) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = (value % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/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>float map(float v, float x_min, float x_max, float y_min, float y_max)<\/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 return (y_min + (((y_max - y_min)\/(x_max - x_min)) * (v - x_min)));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"https:\/\/embedded-lab.com\/blog\/internal-reference-source\/\" rel=\"attachment wp-att-10091\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10091\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Internal-Reference-Source.jpg\" alt=\"Internal Reference Source\" width=\"600\" height=\"320\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Internal-Reference-Source.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Internal-Reference-Source-550x293.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> Demo video link: <a href=\"https:\/\/www.youtube.com\/watch?v=BpiCa0ANWVI\">https:\/\/www.youtube.com\/watch?v=BpiCa0ANWVI<\/a>.<br \/>\n<!--nextpage--><\/p>\n<div>\n<h6><em>Single Channel Continuous Conversion Mode<\/em><\/h6>\n<\/div>\n<p>This is similar to the third ADC example but this one is based on polling method rather than end of conversion interrupt-based one. This example is another basic example but I would prefer interrupt-based ADC conversion rather than this one as it will slow down other tasks.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"ADC.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>sbit LCD_RS at GPIOB_ODR.B1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_EN at GPIOB_ODR.B2;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D4 at GPIOB_ODR.B12;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D5 at GPIOB_ODR.B13;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D6 at GPIOB_ODR.B14;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D7 at GPIOB_ODR.B15;<\/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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>unsigned int read_ADC1();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>float map(float v, float x_min, float x_max, float y_min, float y_max);<\/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 unsigned int adc_data = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 float V = 0.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 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 while(1)<\/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 bit_set(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 adc_data = read_ADC1();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 V = map(adc_data, 0, 4095, 0, 3300);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(13, 1, adc_data);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(13, 2, V);<\/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 bit_clr(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(90);<\/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 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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Init();<\/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 LCD_Cmd(_LCD_CLEAR);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CURSOR_OFF);<\/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 lcd_out(1, 1, \"CH02:\");<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 lcd_out(2, 1, \"V\/mV:\");<\/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_init()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>{\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 enable_GPIOA(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOB(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOC(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 2, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOC_CRH, 13, (GPIO_PP_output | output_mode_low_speed));<\/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 ADC_init()<\/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 ADC1_Enable();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 clr_ADC1_settings();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC_mode(independent_mode);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_data_alignment(right_alignment);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_scan_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_continuous_conversion_mode(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_number_of_conversions(1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_sample_time(sample_time_41_5_cycles, 2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_sequence(1, 2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_external_trigger_regular_conversion_edge(SWSTART_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC1_calibrate();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 start_ADC1();<\/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>unsigned int read_ADC1()<\/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 while(ADC1_SRbits.EOC == 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 return (ADC1_DR &amp; 0x0FFF);<\/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 lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value)<\/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 unsigned char tmp = 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 tmp = (value \/ 1000);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, x_pos, (tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 100) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 10) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = (value % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/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>float map(float v, float x_min, float x_max, float y_min, float y_max)<\/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 return (y_min + (((y_max - y_min)\/(x_max - x_min)) * (v - x_min)));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"https:\/\/embedded-lab.com\/blog\/single-channel-continuous-conversion-mode-2\/\" rel=\"attachment wp-att-10107\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10107\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Single-Channel-Continuous-Conversion-Mode-2.jpg\" alt=\"Single Channel Continuous Conversion Mode (2)\" width=\"600\" height=\"349\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Single-Channel-Continuous-Conversion-Mode-2.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Single-Channel-Continuous-Conversion-Mode-2-550x319.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> <a href=\"https:\/\/embedded-lab.com\/blog\/single-channel-continuous-conversion-mode-1\/\" rel=\"attachment wp-att-10106\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10106\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Single-Channel-Continuous-Conversion-Mode-1.jpg\" alt=\"Single Channel Continuous Conversion Mode (1)\" width=\"600\" height=\"346\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Single-Channel-Continuous-Conversion-Mode-1.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Single-Channel-Continuous-Conversion-Mode-1-550x317.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> Demo video link: <a href=\"https:\/\/www.youtube.com\/watch?v=8fh1-rkpFAw\">https:\/\/www.youtube.com\/watch?v=8fh1-rkpFAw<\/a>.<\/p>\n<h6><em>Multi-Single Channel Single Conversion Mode<\/em><\/h6>\n<p>This example is similar to the 4<sup>th<\/sup> example of this post but instead of reading a single channel multiple single channels with different sampling times are read. It is useful when you need to read multiple channels without scanning them.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"ADC.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>sbit LCD_RS at GPIOB_ODR.B1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_EN at GPIOB_ODR.B2;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D4 at GPIOB_ODR.B12;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D5 at GPIOB_ODR.B13;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D6 at GPIOB_ODR.B14;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D7 at GPIOB_ODR.B15;<\/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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>unsigned int read_ADC1(unsigned char channel, unsigned char sample_time);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int 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\u00a0\u00a0\u00a0\u00a0\u00a0\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 unsigned int ch_a = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 unsigned int ch_b = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 unsigned int ch_c = 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 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 while(1)<\/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 ch_a = read_ADC1(1, sample_time_239_5_cycles);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch_b = read_ADC1(3, sample_time_1_5_cycles);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ch_c = read_ADC1(2, sample_time_28_5_cycles);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 lcd_print(1, 2, ch_a);\u00a0\u00a0\u00a0\u00a0\u00a0\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 lcd_print(7, 2, ch_b);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(13, 2, ch_c);<\/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 bit_set(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 bit_clr(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(90);<\/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 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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Init();<\/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 LCD_Cmd(_LCD_CLEAR);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CURSOR_OFF);<\/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 lcd_out(1, 1, \"CH01\u00a0 CH03\u00a0 CH02\");<\/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_init()<\/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(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOB(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOC(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 1, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 2, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 3, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOC_CRH, 13, (GPIO_PP_output | output_mode_low_speed));<\/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 ADC_init()<\/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 ADC1_Enable();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 clr_ADC1_settings();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC_mode(independent_mode);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_data_alignment(right_alignment);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_continuous_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_number_of_conversions(1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_external_trigger_regular_conversion_edge(SWSTART_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC1_calibrate();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 start_ADC1();<\/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>unsigned int read_ADC1(unsigned char channel, unsigned char sample_time)<\/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 ADC1_JSQR = 0x00000000;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC1_SQR1 = 0x00000000;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC1_SQR2 = 0x00000000;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC1_SQR3 = 0x00000000;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC1_SMPR1 = 0x00000000;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC1_SMPR2 = 0x00000000;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_sequence(1, channel);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_sample_time(sample_time, channel);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_conversions(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 while(ADC1_SRbits.EOC == reset);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 return (0x0FFF &amp; ADC1_DR);<\/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 lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value)<\/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 unsigned char tmp = 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 tmp = (value \/ 1000);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, x_pos, (tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 100) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 10) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0 \u00a0\u00a0\u00a0tmp = (value % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"https:\/\/embedded-lab.com\/blog\/multiple-injected-channels-in-scan-conversion-mode-2\/\" rel=\"attachment wp-att-10100\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10100\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Scan-Conversion-Mode-2.jpg\" alt=\"Multiple Injected Channels in Scan Conversion Mode (2)\" width=\"600\" height=\"350\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Scan-Conversion-Mode-2.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Scan-Conversion-Mode-2-550x320.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> <a href=\"https:\/\/embedded-lab.com\/blog\/multi-single-channel-single-conversion-mode-1\/\" rel=\"attachment wp-att-10101\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10101\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multi-Single-Channel-Single-Conversion-Mode-1.jpg\" alt=\"Multi-Single Channel Single Conversion Mode (1)\" width=\"600\" height=\"373\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multi-Single-Channel-Single-Conversion-Mode-1.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multi-Single-Channel-Single-Conversion-Mode-1-550x341.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> Demo video link: <a href=\"https:\/\/www.youtube.com\/watch?v=hcGHQFFkdfs\">https:\/\/www.youtube.com\/watch?v=hcGHQFFkdfs<\/a>.<\/p>\n<h6><em>External Interrupt Triggered Single Channel Single Conversion Mode<\/em><\/h6>\n<p>Up till now the ADC trigger was given from the software end. However STM32 micros can perform ADC conversions when triggered externally by some other hardware. In this example, an external interrupt pin is used to trigger a single ADC conversion. After completing an ADC conversion the ADC halts. We can also use timer events as trigger sources too.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"ADC.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>sbit LCD_RS at GPIOB_ODR.B1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_EN at GPIOB_ODR.B2;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D4 at GPIOB_ODR.B12;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D5 at GPIOB_ODR.B13;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D6 at GPIOB_ODR.B14;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D7 at GPIOB_ODR.B15;<\/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>register unsigned int adc_data = 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>void setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void interrupts_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>float map(float v, float x_min, float x_max, float y_min, float y_max);<\/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 void EXTI11_ISR()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>iv IVT_INT_EXTI15_10<\/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(11) != 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 bit_set(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 bit_clr(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 pending_clr(11);<\/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 void ADC1_ISR()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>iv IVT_INT_ADC1_2<\/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 adc_data = (ADC1_DR &amp; 0x0FFF);<\/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 float v = 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 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 while(1)<\/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 v = map(adc_data, 0, 4095, 0, 3300);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(13, 1, adc_data);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(13, 2, v);<\/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 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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 interrupts_init();<\/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 LCD_Cmd(_LCD_CLEAR);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CURSOR_OFF);<\/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 lcd_out(1, 1, \"CH01:\");<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 lcd_out(2, 1, \"V\/mV:\");<\/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_init()<\/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(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOB(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOC(enable);<\/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 pin_configure_low(GPIOA_CRL, 1, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOC_CRH, 13, (GPIO_PP_output | output_mode_medium_speed));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOB_CRH, 11, (digital_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pull_up_enable(GPIOB_ODR, 11);<\/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 ADC_init()<\/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 ADC1_Enable();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 clr_ADC1_settings();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC_mode(independent_mode);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_data_alignment(right_alignment);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_scan_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_continuous_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_sample_time(sample_time_71_5_cycles, 1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_external_trigger_regular_conversion_edge(EXTI_11_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_number_of_conversions(1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_sequence(1, 1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_end_of_conversion_interrupt(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC1_calibrate();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 start_ADC1();<\/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 interrupts_init()<\/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 AFIO_enable(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 falling_edge_selector(11);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_EXTI8_11(11, PB_pin);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 interrupt_mask(11);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 NVIC_IntEnable(IVT_INT_EXTI15_10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 NVIC_IntEnable(IVT_INT_ADC1_2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\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 lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value)<\/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 unsigned char tmp = 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 tmp = (value \/ 1000);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, x_pos, (tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 100) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 10) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = (value % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/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>float map(float v, float x_min, float x_max, float y_min, float y_max)<\/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 return (y_min + (((y_max - y_min)\/(x_max - x_min)) * (v - x_min)));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"https:\/\/embedded-lab.com\/blog\/external-interrupt-triggered-single-channel-single-conversion-mode-2\/\" rel=\"attachment wp-att-10087\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10087\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/External-Interrupt-Triggered-Single-Channel-Single-Conversion-Mode-2.jpg\" alt=\"External Interrupt Triggered Single Channel Single Conversion Mode (2)\" width=\"600\" height=\"383\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/External-Interrupt-Triggered-Single-Channel-Single-Conversion-Mode-2.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/External-Interrupt-Triggered-Single-Channel-Single-Conversion-Mode-2-550x351.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> <a href=\"https:\/\/embedded-lab.com\/blog\/external-interrupt-triggered-single-channel-single-conversion-mode-1\/\" rel=\"attachment wp-att-10086\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10086\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/External-Interrupt-Triggered-Single-Channel-Single-Conversion-Mode-1.jpg\" alt=\"External Interrupt Triggered Single Channel Single Conversion Mode (1)\" width=\"600\" height=\"376\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/External-Interrupt-Triggered-Single-Channel-Single-Conversion-Mode-1.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/External-Interrupt-Triggered-Single-Channel-Single-Conversion-Mode-1-550x344.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> Demo video link: <a href=\"https:\/\/www.youtube.com\/watch?v=dT5wkXKs42E\">https:\/\/www.youtube.com\/watch?v=dT5wkXKs42E<\/a>.<br \/>\n<!--nextpage--><\/p>\n<h6><em>Single Injected Channel Continuous Conversion Mode<\/em><\/h6>\n<p>Previously I stated that injected groups are no different than regular groups when used alone. They will behave like regular groups if regular groups are absent. In this demo there\u2019s no regular group channel and you\u2019ll see that the injected group channel is behaving like a regular group channel.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"ADC.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>sbit LCD_RS at GPIOB_ODR.B1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_EN at GPIOB_ODR.B2;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D4 at GPIOB_ODR.B12;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D5 at GPIOB_ODR.B13;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D6 at GPIOB_ODR.B14;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D7 at GPIOB_ODR.B15;<\/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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>unsigned int read_ADC1();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>float map(float v, float x_min, float x_max, float y_min, float y_max);<\/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 register unsigned int adc_data = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 float V = 0.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 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 while(1)<\/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 bit_set(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 adc_data = read_ADC1();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 V = map(adc_data, 0, 4095, 0, 3300);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(13, 1, adc_data);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(13, 2, V);<\/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 bit_clr(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(90);<\/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 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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Init();<\/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 LCD_Cmd(_LCD_CLEAR);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CURSOR_OFF);<\/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 lcd_out(1, 1, \"CH03:\");<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 lcd_out(2, 1, \"V\/mV:\");<\/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_init()<\/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(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOB(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOC(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 3, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOC_CRH, 13, (GPIO_PP_output | output_mode_low_speed));<\/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 ADC_init()<\/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 ADC1_Enable();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 clr_ADC1_settings();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC_mode(independent_mode);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_data_alignment(right_alignment);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_scan_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_continuous_conversion_mode(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_injected_number_of_conversions(1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_sample_time(sample_time_239_5_cycles, 3);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_injected_sequence(4, 3);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_external_trigger_injected_conversion_edge(JSWSTART_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC1_calibrate();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 start_ADC1();<\/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>unsigned int read_ADC1()<\/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 set_ADC1_injected_conversions(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 while(ADC1_SRbits.JEOC == 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 return (ADC1_JDR1 &amp; 0x0FFF);<\/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 lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value)<\/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 unsigned char tmp = 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 tmp = (value \/ 1000);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, x_pos, (tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 100) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 10) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = (value % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/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>float map(float v, float x_min, float x_max, float y_min, float y_max)<\/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 return (y_min + (((y_max - y_min)\/(x_max - x_min)) * (v - x_min)));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}\u00a0<\/i><\/span><\/pre>\n<p><a href=\"https:\/\/embedded-lab.com\/blog\/single-channel-continuous-conversion-mode-2\/\" rel=\"attachment wp-att-10107\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10107\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Single-Channel-Continuous-Conversion-Mode-2.jpg\" alt=\"Single Channel Continuous Conversion Mode (2)\" width=\"600\" height=\"349\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Single-Channel-Continuous-Conversion-Mode-2.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Single-Channel-Continuous-Conversion-Mode-2-550x319.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> <a href=\"https:\/\/embedded-lab.com\/blog\/single-channel-continuous-conversion-mode-1\/\" rel=\"attachment wp-att-10106\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10106\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Single-Channel-Continuous-Conversion-Mode-1.jpg\" alt=\"Single Channel Continuous Conversion Mode (1)\" width=\"600\" height=\"346\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Single-Channel-Continuous-Conversion-Mode-1.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Single-Channel-Continuous-Conversion-Mode-1-550x317.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> <span style=\"font-size: 0.95em;line-height: 1.6em\">Demo video link: <\/span><a style=\"font-size: 0.95em;line-height: 1.6em\" href=\"https:\/\/www.youtube.com\/watch?v=R1MuJaWrfn8\">https:\/\/www.youtube.com\/watch?v=R1MuJaWrfn8<\/a><span style=\"font-size: 0.95em;line-height: 1.6em\">.\u00a0<\/span><\/p>\n<h6><em>Multiple Injected Channels in Discontinuous Conversion Mode\u00a0<\/em><\/h6>\n<p>In discontinuous mode, each injected group channel is converted according to a sequence and after each channel conversion an injected channel end of conversion flag is set. Since there can be four channels in an injected group, their conversion results are stored in four separate data registers. We just need to read those data registers when valid data values are ready. To use discontinuous mode we must specify the number of channels in the discontinuous mode apart from how many channels that are actually present in the group.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"ADC.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>sbit LCD_RS at GPIOB_ODR.B1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_EN at GPIOB_ODR.B2;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D4 at GPIOB_ODR.B12;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D5 at GPIOB_ODR.B13;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D6 at GPIOB_ODR.B14;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D7 at GPIOB_ODR.B15;<\/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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void read_ADC1_injected(unsigned int temp_data[3]);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int 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>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 unsigned int channel_data[3];<\/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 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 while(1)<\/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 read_ADC1_injected(channel_data);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(1, 2, channel_data[0]);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(7, 2, channel_data[1]);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(13, 2, channel_data[2]);<\/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 bit_set(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 bit_clr(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(90);<\/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 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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Init();<\/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 LCD_Cmd(_LCD_CLEAR);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CURSOR_OFF);<\/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 lcd_out(1, 1, \"CH00\u00a0 CH01\u00a0 CH02\");<\/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_init()<\/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(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOB(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOC(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 0, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 1, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 2, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOC_CRH, 13, (GPIO_PP_output | output_mode_low_speed));<\/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 ADC_init()<\/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 ADC1_Enable();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 clr_ADC1_settings();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC_mode(independent_mode);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_data_alignment(right_alignment);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_scan_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_continuous_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_injected_number_of_conversions(3);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_sample_time(sample_time_28_5_cycles, 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_sample_time(sample_time_41_5_cycles, 1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_sample_time(sample_time_13_5_cycles, 2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_injected_sequence(1, 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_injected_sequence(2, 2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_injected_sequence(3, 1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_number_of_discontinuous_conversions(3);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_external_trigger_injected_conversion_edge(JSWSTART_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_discontinuous_conversion_mode_in_injected_mode(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC1_calibrate();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 start_ADC1();<\/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 read_ADC1_injected(unsigned int temp_data[3])<\/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 set_ADC1_injected_conversions(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 while(ADC1_SRbits.JEOC == 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 temp_data[0] = (ADC1_JDR3 &amp; 0x0FFF);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_injected_conversions(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 while(ADC1_SRbits.JEOC == 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 temp_data[1] = (ADC1_JDR2 &amp; 0x0FFF);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_injected_conversions(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 while(ADC1_SRbits.JEOC == 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 temp_data[2] = (ADC1_JDR1 &amp; 0x0FFF);<\/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 lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value)<\/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 unsigned char tmp = 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 tmp = (value \/ 1000);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, x_pos, (tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 100) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 10) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = (value % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"https:\/\/embedded-lab.com\/blog\/multiple-injected-channels-in-discontinuous-conversion-mode-2\/\" rel=\"attachment wp-att-10098\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10098\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Discontinuous-Conversion-Mode-2.jpg\" alt=\"Multiple Injected Channels in Discontinuous Conversion Mode (2)\" width=\"600\" height=\"399\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Discontinuous-Conversion-Mode-2.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Discontinuous-Conversion-Mode-2-550x365.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> <a href=\"https:\/\/embedded-lab.com\/blog\/multiple-injected-channels-in-discontinuous-conversion-mode-1\/\" rel=\"attachment wp-att-10097\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10097\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Discontinuous-Conversion-Mode-1.jpg\" alt=\"Multiple Injected Channels in Discontinuous Conversion Mode (1)\" width=\"600\" height=\"410\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Discontinuous-Conversion-Mode-1.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Discontinuous-Conversion-Mode-1-550x375.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a>Demo video link: <a href=\"https:\/\/www.youtube.com\/watch?v=YwymJs8LlNU\">https:\/\/www.youtube.com\/watch?v=YwymJs8LlNU<\/a>.<\/p>\n<h6><em>Multiple Injected Channels in Scan Conversion Mode<\/em><\/h6>\n<p>Scan mode is another interesting mode. In scan mode all ADC channels are scanned as per sequence. One conversion is performed for each channel. After having completed a scan an injected channel end of conversion flag is set. If interrupt is used then an end of conversion interrupt is issued. Scan mode is useful when we need to monitor several ADC channels, for example temperature and relative humidity. There\u2019s a word of caution for using scan mode. STM32 reference manual states it like this:<\/p>\n<address><span style=\"color: #ff0000\" data-darkreader-inline-color=\"\"><i>Unlike a regular conversion sequence, if JL[1:0] length is less than four, the channels<\/i><\/span><\/address>\n<address><span style=\"color: #ff0000\" data-darkreader-inline-color=\"\"><i>are converted in a sequence starting from (4-JL). Example: ADC_JSQR[21:0] = 10<\/i><\/span><\/address>\n<address><span style=\"color: #ff0000\" data-darkreader-inline-color=\"\"><i>00011 00011 00111 00010 means that a scan conversion will convert the following<\/i><\/span><\/address>\n<address><span style=\"color: #ff0000\" data-darkreader-inline-color=\"\"><i>channel sequence: 7, 3, 3. (not 2, 7, 3)<\/i><\/span><\/address>\n<p>This is why you\u2019ll see some anomalies in this code example:<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>set_ADC2_injected_sequence(3, 4);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>set_ADC2_injected_sequence(4, 6);<\/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 ADC1_2_ISR() <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>iv IVT_INT_ADC1_2 <\/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\u00a0 ADC2_SRbits.JEOC = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 channel_data[0] = (ADC2_JDR1 &amp; 0x0FFF);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 channel_data[1] = (ADC2_JDR2 &amp; 0x0FFF);<\/i><\/span><\/pre>\n<pre><i><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\">}\u00a0 <\/span>\u00a0<\/i><\/pre>\n<p>Notice the sequence order and how the data is actually extracted. Keep this in mind while coding for injected groups in scan mode. Also note that in this code I used ADC2 instead of ADC1. This is not mandatory. I did so just to show that you can also use ADC2 rather than ADC1. For regular group channels the scan mode is DMA dependent because for regular group channels there\u2019s only one data register for all the regular channels. I didn\u2019t find a good way to avoid using the DMA unit. Of course using DMA is a much more clever approach. Since I won\u2019t be discussing about DMA in this issue, I\u2019m skipping this part for future.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"ADC.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>sbit LCD_RS at GPIOB_ODR.B1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_EN at GPIOB_ODR.B2;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D4 at GPIOB_ODR.B12;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D5 at GPIOB_ODR.B13;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D6 at GPIOB_ODR.B14;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D7 at GPIOB_ODR.B15;<\/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>unsigned int channel_data[2];\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>void setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int 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>void ADC1_2_ISR() <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>iv IVT_INT_ADC1_2 <\/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\u00a0 ADC2_SRbits.JEOC = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 channel_data[0] = (ADC2_JDR1 &amp; 0x0FFF);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 channel_data[1] = (ADC2_JDR2 &amp; 0x0FFF);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}\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>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 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 while(1)<\/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 bit_set(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_ADC2_injected_conversions(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 lcd_print(1, 2, channel_data[0]);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(13, 2, channel_data[1]);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 bit_clr(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(90);<\/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 setup()\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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>{<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 GPIO_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC_init();<\/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 LCD_Cmd(_LCD_CLEAR);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CURSOR_OFF);<\/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 lcd_out(1, 1, \"CH04\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CH06\");<\/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_init()<\/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(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOB(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOC(enable);<\/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 | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 6, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOC_CRH, 13, (GPIO_PP_output | output_mode_low_speed));<\/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 ADC_init()<\/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 ADC2_Enable();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 clr_ADC2_settings();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC_mode(independent_mode);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_data_alignment(right_alignment);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_scan_conversion_mode(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_continuous_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_sample_time(sample_time_1_5_cycles, 4);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_sample_time(sample_time_13_5_cycles, 6);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_external_trigger_injected_conversion_edge(JSWSTART_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_injected_number_of_conversions(2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_injected_sequence(3, 4);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_injected_sequence(4, 6);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_injected_end_of_conversion_interrupt(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 NVIC_IntEnable(IVT_INT_ADC1_2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 EnableInterrupts();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC2_calibrate();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 start_ADC2();<\/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 lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value)<\/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 unsigned char tmp = 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 tmp = (value \/ 1000);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, x_pos, (tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 100) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 10) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = (value % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"https:\/\/embedded-lab.com\/blog\/multiple-injected-channels-in-scan-conversion-mode-2\/\" rel=\"attachment wp-att-10100\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10100\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Scan-Conversion-Mode-2.jpg\" alt=\"Multiple Injected Channels in Scan Conversion Mode (2)\" width=\"600\" height=\"350\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Scan-Conversion-Mode-2.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Scan-Conversion-Mode-2-550x320.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> <a href=\"https:\/\/embedded-lab.com\/blog\/multiple-injected-channels-in-scan-conversion-mode-1\/\" rel=\"attachment wp-att-10099\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10099\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Scan-Conversion-Mode-1.jpg\" alt=\"Multiple Injected Channels in Scan Conversion Mode (1)\" width=\"600\" height=\"332\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Scan-Conversion-Mode-1.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Multiple-Injected-Channels-in-Scan-Conversion-Mode-1-550x304.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a>Demo video link: <a href=\"https:\/\/www.youtube.com\/watch?v=Mjax8dwClGE\">https:\/\/www.youtube.com\/watch?v=Mjax8dwClGE<\/a>.<br \/>\n<!--nextpage--><\/p>\n<h6><em>Regular Group Channels Discontinuous in Mode<\/em><\/h6>\n<p>This example is similar to the one I coded for injected group channels. It is somewhat an alternative of scan mode for regular group though technically they are not same. You can use this mode to monitor several ADC channels in a systematic order.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"ADC.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>sbit LCD_RS at GPIOB_ODR.B1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_EN at GPIOB_ODR.B2;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D4 at GPIOB_ODR.B12;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D5 at GPIOB_ODR.B13;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D6 at GPIOB_ODR.B14;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D7 at GPIOB_ODR.B15;<\/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>unsigned char channel_no = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>unsigned int ch_data[3] = {0x0000, 0x0000, 0x0000};<\/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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int 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>void ADC1_2_ISR() <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>iv IVT_INT_ADC1_2 <\/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 ADC2_SRbits.EOC = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ch_data[channel_no] = (ADC2_DR &amp; 0x0FFF);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 channel_no++;<\/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 unsigned char s = 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 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 while(1)<\/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 bit_set(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 set_ADC2_regular_conversions(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 while(channel_no &lt; 3);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 channel_no = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 for(s = 0 ; s &lt; 3; s++)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 lcd_print(((s * 6) + 1), 2, ch_data[s]);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 bit_clr(GPIOC_ODR, 13);<\/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 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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Init();<\/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 LCD_Cmd(_LCD_CLEAR);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CURSOR_OFF);<\/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 lcd_out(1, 1, \"CH02\u00a0 CH00\u00a0 CH01\");<\/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_init()<\/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(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOB(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOC(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 0, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 1, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 2, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOC_CRH, 13, (GPIO_PP_output | output_mode_low_speed));<\/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 ADC_init()<\/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 ADC2_Enable();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 clr_ADC2_settings();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC_mode(independent_mode);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_data_alignment(right_alignment);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_scan_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_continuous_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_regular_number_of_conversions(3);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_number_of_discontinuous_conversions(3);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_sample_time(sample_time_41_5_cycles, 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_sample_time(sample_time_13_5_cycles, 1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_sample_time(sample_time_28_5_cycles, 2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_regular_sequence(1, 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_regular_sequence(2, 1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_regular_sequence(3, 2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_external_trigger_regular_conversion_edge(SWSTART_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_discontinuous_conversion_mode_in_regular_mode(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_regular_end_of_conversion_interrupt(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 NVIC_IntEnable(IVT_INT_ADC1_2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 EnableInterrupts();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC2_calibrate();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 start_ADC2();<\/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 lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value)<\/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 unsigned char tmp = 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 tmp = (value \/ 1000);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, x_pos, (tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 100) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 10) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = (value % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"https:\/\/embedded-lab.com\/blog\/regular-group-channels-discontinuous-in-mode-1\/\" rel=\"attachment wp-att-10103\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10103\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Regular-Group-Channels-Discontinuous-in-Mode-1.jpg\" alt=\"Regular Group Channels Discontinuous in Mode (1)\" width=\"600\" height=\"395\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Regular-Group-Channels-Discontinuous-in-Mode-1.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Regular-Group-Channels-Discontinuous-in-Mode-1-550x362.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> <a href=\"https:\/\/embedded-lab.com\/blog\/regular-group-channels-discontinuous-in-mode-2\/\" rel=\"attachment wp-att-10104\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10104\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Regular-Group-Channels-Discontinuous-in-Mode-2.jpg\" alt=\"Regular Group Channels Discontinuous in Mode (2)\" width=\"600\" height=\"391\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Regular-Group-Channels-Discontinuous-in-Mode-2.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Regular-Group-Channels-Discontinuous-in-Mode-2-550x358.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> Demo video link: <a href=\"https:\/\/www.youtube.com\/watch?v=pz-y_W2Lxr8\">https:\/\/www.youtube.com\/watch?v=pz-y_W2Lxr8<\/a>.<\/p>\n<h6><em>Dual Conversion Mode<\/em><\/h6>\n<p>One of the cool feature of STM32\u2019s ADC is its ability to simultaneous convert two ADC channels. This ability is sometimes highly demanded in some applications. For example in an energy meter you\u2019ll need to measure both voltage and current simultaneous if you want precision. Applications like such demand the use of dual ADC mode. Please note that this feature is available only in those STM32 micros that have at least two ADC units. Fortunately there are only a few STM32 micros that have only one ADC unit. ST provided several sub modes for dual ADC modes but none attracted me much because those seemed to my achievable using one ADC and some programming tricks. It\u2019s just my instinct. I could be wrong. To use dual ADC mode, we need to configure two ADC units separately. They\u2019ll have some common setups. The individual ADCs are configured as such that as if they are configured for single ADC operation. The common settings are just ADC mode of operation setting and interrupt configuration. The results of ADC conversions of both channels are stored in ADC1_DR register Please note that ST recommends that we set the DMA bit for ADC1 even if we don\u2019t use the DMA block itself.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"ADC.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>sbit LCD_RS at GPIOB_ODR.B1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_EN at GPIOB_ODR.B2;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D4 at GPIOB_ODR.B12;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D5 at GPIOB_ODR.B13;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D6 at GPIOB_ODR.B14;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D7 at GPIOB_ODR.B15;<\/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>register unsigned long adc_data = 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>void setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup_ADC1();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup_ADC2();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void setup_common_ADC_settings();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int 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>void ADC1_2_ISR() <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>iv IVT_INT_ADC1_2 <\/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 ADC1_SRbits.EOC = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC2_SRbits.EOC = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 adc_data = adc1_dr;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 bit_set(GPIOC_ODR, 13);<\/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 unsigned int adc1_data = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 unsigned int adc2_data = 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 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 while(1)<\/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 set_ADC1_regular_conversions(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 adc1_data = (adc_data &amp; 0x00000FFF);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 adc2_data = ((adc_data &amp; 0x0FFF0000) &gt;&gt; 16);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 lcd_print(1, 2, adc1_data);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(13, 2, adc2_data);<\/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 bit_clr(GPIOC_ODR, 13);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 delay_ms(90);<\/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 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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Init();<\/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 LCD_Cmd(_LCD_CLEAR);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CURSOR_OFF);<\/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 lcd_out(1, 1, \"CH00\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CH01\");<\/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_init()<\/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(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOB(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOC(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 0, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 1, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOC_CRH, 13, (GPIO_PP_output | output_mode_low_speed));<\/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 ADC_init()<\/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_ADC1();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 setup_ADC2();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 setup_common_ADC_settings();<\/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_ADC1()<\/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 ADC1_Enable();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 clr_ADC1_settings();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_data_alignment(right_alignment);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_scan_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_continuous_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_sample_time(sample_time_41_5_cycles, 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_external_trigger_regular_conversion_edge(SWSTART_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_number_of_conversions(1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_sequence(1, 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_end_of_conversion_interrupt(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC1_calibrate();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 start_ADC1();<\/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_ADC2()<\/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 ADC2_Enable();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 clr_ADC2_settings();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_data_alignment(right_alignment);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_scan_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_continuous_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_sample_time(sample_time_41_5_cycles, 1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_external_trigger_regular_conversion_edge(SWSTART_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_regular_number_of_conversions(1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_regular_sequence(1, 1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC2_regular_end_of_conversion_interrupt(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC2_calibrate();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 start_ADC2();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\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>}<\/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_common_ADC_settings()<\/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 set_ADC1_DMA(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC_mode(regular_simultaneous_mode_only);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 NVIC_IntEnable(IVT_INT_ADC1_2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\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 lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value)<\/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 unsigned char tmp = 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 tmp = (value \/ 1000);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, x_pos, (tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 100) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 10) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = (value % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"https:\/\/embedded-lab.com\/blog\/dual-adc-mode\/\" rel=\"attachment wp-att-10085\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10085\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Dual-ADC-Mode.jpg\" alt=\"Dual ADC Mode\" width=\"600\" height=\"377\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Dual-ADC-Mode.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Dual-ADC-Mode-550x345.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a>Demo video link: <a href=\"https:\/\/www.youtube.com\/watch?v=sSGJUkX-mSg\">https:\/\/www.youtube.com\/watch?v=sSGJUkX-mSg<\/a>.<br \/>\n<!--nextpage--><\/p>\n<h6><em>Injected Group vs. Regular Group<\/em><\/h6>\n<p>Till now we saw regular and injected groups independently. In this example we\u2019ll see them together. There are two ADC channels. One of them belongs to regular group while the other belongs to injected group. We\u2019ll see that the injected channel will override the conversion of regular channel. Both of these groups are triggered externally. A flashing LED is indicated which conversion is going on. Please check the video for better understanding.<\/p>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>#include \"ADC.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>sbit LCD_RS at GPIOB_ODR.B1;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_EN at GPIOB_ODR.B2;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D4 at GPIOB_ODR.B12;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D5 at GPIOB_ODR.B13;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D6 at GPIOB_ODR.B14;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>sbit LCD_D7 at GPIOB_ODR.B15;<\/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>register unsigned int regular_adc_data = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>register unsigned int injected_adc_data = 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>void setup();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void GPIO_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void exeternal_interrupt_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>void lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int 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>void ADC1_2_ISR() <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>iv IVT_INT_ADC1_2 <\/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(ADC1_SRbits.EOC)<\/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 ADC1_SRbits.EOC = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 regular_adc_data = (ADC1_DR &amp; 0x0FFF);<\/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 if(ADC1_SRbits.JEOC)<\/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 ADC1_SRbits.JEOC = 0;<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 injected_adc_data = (ADC1_JDR1 &amp; 0x0FFF);<\/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 void EXTI11_ISR()<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>iv IVT_INT_EXTI15_10<\/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 unsigned char s = 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 if(read_pending_reg(15) != 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 for(s = 0; s &lt; 3; s++)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 bit_set(GPIOC_ODR, 13);<\/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 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 bit_clr(GPIOC_ODR, 13);<\/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 delay_ms(10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 pending_clr(15);<\/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 <\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 if(read_pending_reg(11) != 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 for(s = 0; s &lt; 6; s++)<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 bit_set(GPIOC_ODR, 13);<\/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 delay_ms(90);<\/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 bit_clr(GPIOC_ODR, 13);<\/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 delay_ms(90);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\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 pending_clr(11);<\/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 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 while(1)<\/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 lcd_print(2, 2, regular_adc_data);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 lcd_print(12, 2, injected_adc_data);<\/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 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_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 ADC_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 exeternal_interrupt_init();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Init();<\/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 LCD_Cmd(_LCD_CLEAR);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 LCD_Cmd(_LCD_CURSOR_OFF);<\/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 lcd_out(1, 1, \"CH00 R\");<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0 lcd_out(1, 11, \"CH01 I\");<\/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_init()<\/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(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOB(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 enable_GPIOC(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 0, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_low(GPIOA_CRL, 1, (analog_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOB_CRH, 11, (digital_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOC_CRH, 15, (digital_input | input_mode));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pin_configure_high(GPIOC_CRH, 13, (GPIO_PP_output | output_mode_low_speed));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pull_up_enable(GPIOB_ODR, 11);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 pull_up_enable(GPIOC_ODR, 15);<\/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 ADC_init()<\/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 ADC1_Enable();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 clr_ADC1_settings();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC_mode(independent_mode);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_data_alignment(right_alignment);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_scan_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_continuous_conversion_mode(disable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_sample_time(sample_time_239_5_cycles, 0);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_sample_time(sample_time_239_5_cycles, 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 set_ADC1_injected_sequence(4, 1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_injected_number_of_conversions(1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_external_trigger_injected_conversion_edge(EXTI_15_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_injected_end_of_conversion_interrupt(enable);<\/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_ADC1_regular_sequence(1, 1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_number_of_conversions(1);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_external_trigger_regular_conversion_edge(EXTI_11_trigger);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_ADC1_regular_end_of_conversion_interrupt(enable);<\/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 NVIC_IntEnable(IVT_INT_ADC1_2);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 EnableInterrupts();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 ADC1_calibrate();<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 start_ADC1();<\/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 exeternal_interrupt_init()<\/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 AFIO_enable(enable);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 falling_edge_selector(11);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 falling_edge_selector(15);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_EXTI8_11(11, PB_pin);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 set_EXTI12_15(15, PC_pin);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 interrupt_mask(11);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 interrupt_mask(15);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 NVIC_IntEnable(IVT_INT_EXTI15_10);<\/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 lcd_print(unsigned char x_pos, unsigned char y_pos, unsigned int value)<\/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 unsigned char tmp = 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 tmp = (value \/ 1000);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr(y_pos, x_pos, (tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 100) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = ((value \/ 10) % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 tmp = (value % 10);<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>\u00a0\u00a0\u00a0\u00a0 lcd_chr_cp((tmp + 48));<\/i><\/span><\/pre>\n<pre><span style=\"color: #0000ff\" data-darkreader-inline-color=\"\"><i>}<\/i><\/span><\/pre>\n<p><a href=\"https:\/\/embedded-lab.com\/blog\/injected-vs-regular-1\/\" rel=\"attachment wp-att-10089\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10089\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Injected-vs-Regular-1.jpg\" alt=\"Injected vs Regular (1)\" width=\"600\" height=\"408\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Injected-vs-Regular-1.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Injected-vs-Regular-1-550x374.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> <a href=\"https:\/\/embedded-lab.com\/blog\/injected-vs-regular-2\/\" rel=\"attachment wp-att-10090\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-10090\" src=\"http:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Injected-vs-Regular-2.jpg\" alt=\"Injected vs Regular (2)\" width=\"600\" height=\"421\" srcset=\"https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Injected-vs-Regular-2.jpg 600w, https:\/\/embedded-lab.com\/blog\/wp-content\/uploads\/2015\/03\/Injected-vs-Regular-2-550x385.jpg 550w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a> <span style=\"font-size: 0.95em;line-height: 1.6em\">Demo video link: <\/span><a style=\"font-size: 0.95em;line-height: 1.6em\" href=\"https:\/\/www.youtube.com\/watch?v=K5XTYtVEoSo\">https:\/\/www.youtube.com\/watch?v=K5XTYtVEoSo<\/a><span style=\"font-size: 0.95em;line-height: 1.6em\">.\u00a0<\/span><\/p>\n<h4>Common Pitfalls<\/h4>\n<p>When dealing with new stuffs, we often make some silly mistakes. In the case of STM32 ADC, the following mistakes are pretty much common:<\/p>\n<ul>\n<li>ADC not powered.<\/li>\n<li>ADC not calibrated.<\/li>\n<li>ADC settings not cleared\/reset to defaults.<\/li>\n<li>Incorrect GPIO port selection and configuration. If a pin is to be set for an analogue input channel then it should be either kept floating or configured as analogue input.<\/li>\n<li>Wrong mode of operation selected.<\/li>\n<li>Incorrect peripheral clock selection.<\/li>\n<li>Same channels configured for different ADCs, for example CH0 configured for ADC1 and 2.<\/li>\n<li>Different sampling times for two simultaneous channels in dual conversion mode.<\/li>\n<li>Interrupts not enabled when using them. MikroC\u2019s interrupt assistant feature should be used to avoid such mistakes. The interrupt assistant also help in code generation.<\/li>\n<li>Improper selection of regular and injected modes.<\/li>\n<li>Incorrect data alignment. Right alignment should always be used unless needed otherwise.<\/li>\n<li>Wrong variable type declaration. If the resulting data from a conversion is signed then signed integers should be used.<\/li>\n<li>Wrong ADC channel sequencing with incorrect channel order.<\/li>\n<\/ul>\n<h4>Final Words<\/h4>\n<p>There are many ways to meet a specific measurement case with STM32 ADCs. Imagination is the limit for so. As I stated earlier it is not possible for me to show all ADC operations in this post. Thus I would like readers to try and experiment whatever I showed. If you can take the challenge and if you have understood the basics then I would suggest that you experiment those stuffs which I didn\u2019t cover. Finally there\u2019s a saying<\/p>\n<p align=\"center\"><i>ADC + DMA = Unbeatable Assets<\/i><\/p>\n<p>Of course the DMA block is an asset and when there\u2019s an ADC-DMA collaboration, the result is a revolution in measurement. This issue was not regarding DMA and so when I cover the DMA block, I\u2019ll show more about ADC. For now this post is enough to introduce the basics of STM32 ADC.<\/p>\n<p>Happy coding.<\/p>\n<address><i><i><br \/>\n<\/i><\/i>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<\/address>\n","protected":false},"excerpt":{"rendered":"<p>Most of us who have experienced 8-bit MCUs previously know how much important it is to have an Analogue-to-Digital Converter (ADC) built-in with a microcontroller. Apart from other hardware extensions unavailable in the early era microcontrollers, many former 8051 microcontroller users shifted primarily to more robust Atmel AVRs and Microchip PICs just for this important peripheral. I don\u2019t feel it necessary to restate the advantages of having such a peripheral embedded in a micro. In traditional 8-bit MCUs aforementioned, the ADC block is somewhat incomplete and users have to work out tricky methods to solve certain problems. The ADC block<\/p>\n","protected":false},"author":5,"featured_media":10130,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[733,1474,1466],"tags":[44,1127,803,1319,1126,1125],"class_list":["post-10116","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-stm32","category-stm32-tutorials","category-tutorials","tag-adc","tag-analogue-to-digital-converter","tag-arm-microcontrollers","tag-stm32","tag-stm32f103c8t6","tag-stm32f10x-series"],"_links":{"self":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/10116","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=10116"}],"version-history":[{"count":40,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/10116\/revisions"}],"predecessor-version":[{"id":15166,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/posts\/10116\/revisions\/15166"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/media\/10130"}],"wp:attachment":[{"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/media?parent=10116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/categories?post=10116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/embedded-lab.com\/blog\/wp-json\/wp\/v2\/tags?post=10116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}