{"id":324,"date":"2022-07-17T08:40:58","date_gmt":"2022-07-17T07:40:58","guid":{"rendered":"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/?p=324"},"modified":"2022-07-17T20:30:22","modified_gmt":"2022-07-17T19:30:22","slug":"mise-en-oeuvre-de-ladc-avec-le-dma","status":"publish","type":"post","link":"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/?p=324","title":{"rendered":"Mise en \u0153uvre de l\u2019ADC avec le DMA"},"content":{"rendered":"<h1>Mise en oeuvre de l'ADC avec le DMA<\/h1>\n<h3>Mat\u00e9riel requis<\/h3>\n<ul>\n<li>un ordinateur avec un terminal (putty, termite,...)<\/li>\n<li>une carte nucleo-L073RZ ou STM32F446RE ou autre<\/li>\n<li>Un potentiom\u00e8tre de 10kOhm par exemple reli\u00e9 \u00e0 PA0 ou la carte IHM (mbed-application-shield)<\/li>\n<li><img decoding=\"async\" src=\"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/wp-content\/uploads\/2022\/07\/mbed_application_shield.jpeg\" alt=\"\" \/><\/li>\n<\/ul>\n<h2>Cr\u00e9ation du projet - C\u00f4t\u00e9 configuration<\/h2>\n<h4>Configuration USART<\/h4>\n<p>On configure l'USART2 en 115200 baud.<\/p>\n<h4>Configuration ADC<\/h4>\n<p><img decoding=\"async\" src=\"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/wp-content\/uploads\/2022\/07\/ADC_config_1.png\" alt=\"\" \/><\/p>\n<p>Les choses importantes ici sont la r\u00e9solution (12 bits), on aurait pu prendre moins.<br \/>\nLes param\u00e8tre Continous conversion Mode et Discontinuous Conversion Mode peuvent \u00eatre indiff\u00e9remment Enable ou Disable.<br \/>\nLe param\u00e8tre DMA Continuous Requests peut \u00eatre aussi indiff\u00e9remment Enable ou Disable.<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/wp-content\/uploads\/2022\/07\/ADC_config_params.png\" alt=\"\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/wp-content\/uploads\/2022\/07\/ADC_config_params_NVIC.png\" alt=\"\" \/><br \/>\nNotons que les \u00e9v\u00e9nements (interrupt) issues de l'ADC ne sont pas autoris\u00e9es. Ce sera le contr\u00f4leur DMA qui se chargera d'informer d'une fin de transfert d'un \u00e9chantillon vers l'emplacement m\u00e9moire o\u00f9 il sera stock\u00e9. <\/p>\n<h4>Configuration du DMA pour l'ADC<\/h4>\n<p>Comme dans cet exemple, on n'\u00e9chantillonne qu'une seule entr\u00e9e et on ne veut \u00e0 l'instant t qu'une seule valeur, on peut \u00eatre soit en mode Circular soit Normal, on peut cocher Increment Address ou non.<br \/>\nDans notre cas, on aura une pr\u00e9cision sur 12 bits donc on prend des word (16 bits).<br \/>\n<img decoding=\"async\" src=\"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/wp-content\/uploads\/2022\/07\/ADC_config_params_DMA.png\" alt=\"\" \/><\/p>\n<h2>Programmation - C\u00f4t\u00e9 code donc...<\/h2>\n<p>A rebrousse poil, cela donne :<\/p>\n<h3>R\u00e9cup\u00e9ration des \u00e9chantillons<\/h3>\n<p>Dans main.c et dans une section genre \/<em> USER CODE BEGIN 4 <\/em>\/<\/p>\n<pre><code class=\"language-c\">void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc){\n    ADC_FLAG=TRUE;\n}<\/code><\/pre>\n<p>Dans la fonction main de main.c :<\/p>\n<pre><code class=\"language-c\"> if (ADC_FLAG == TRUE)\n      {\n        ADC_FLAG = FALSE;\n        sprintf(message,&quot;%ld\\n\\r&quot;, \/*(uint16_t)*\/pdata); \/\/on peut caster mais pas oblig\u00e9\n        HAL_UART_Transmit(&amp;huart2, message , sizeof(message), HAL_MAX_DELAY);\n        HAL_ADC_Start_DMA(&amp;hadc, &amp;pdata, 1);\n\n      }\n<\/code><\/pre>\n<p>On aura \u00e9videmment fait auparavant : <\/p>\n<pre><code class=\"language-c\">uint8_t ADC_FLAG;\n#define TRUE 1\n#define FALSE 0\nuint32_t  pdata = 0; \/\/very important de le mettre en uint32_t\nuint8_t message[10]; \/\/\u00e7a c&#039;est pour envoyer une cha\u00eene au PC<\/code><\/pre>\n<p>et in fine dans le main de main.c<\/p>\n<pre><code class=\"language-c\">uint8_t welcomeMessage[]=&quot;Test ADC &amp; DMA sur PA0 8 bits 115200 bauds\\r\\n&quot;;  \/\/un message d&#039;accueil ne fait jamais de mal\n\n  HAL_UART_Transmit(&amp;huart2, welcomeMessage , sizeof(welcomeMessage), HAL_MAX_DELAY); \/\/et on le balance\n\n  HAL_ADC_Start_DMA(&amp;hadc, &amp;pdata, 1); \/\/on lance les hostivit\u00e9s\n\n  while (1)\n  {\n      if (ADC_FLAG == TRUE) \/\/sur fin de conversion (merci le callback AL_ADC_ConvCpltCallback)\n      {\n        ADC_FLAG = FALSE;\n        sprintf(message,&quot;%ld\\n\\r&quot;, \/*(uint16_t)*\/pdata); \/\/on peut caster mais pas oblig\u00e9\n        HAL_UART_Transmit(&amp;huart2, message , sizeof(message), HAL_MAX_DELAY);\n        HAL_ADC_Start_DMA(&amp;hadc, &amp;pdata, 1); \/\/ et rebelote\n\n      }\n  }\n}<\/code><\/pre>\n<h3>Attention !<\/h3>\n<p>Seule cet ordre fonctionne. Si on s'amuse \u00e0 mettre MX_DMA_Init(); apr\u00e8s MX_ADC_Init(); \u00e7a d\u00e9raille compl\u00e8tement, on n'est plus sur 12 bits mais sur 8... Bienvenue en STM32zarbie.<\/p>\n<pre><code class=\"language-c\">  MX_GPIO_Init();\n  MX_USART2_UART_Init();\n  MX_DMA_Init();\n  MX_ADC_Init();\n<\/code><\/pre>\n<h4>void MX_ADC_Init(void) (extrait)<\/h4>\n<p>Si on ne veut num\u00e9riser qu'un seul \u00e9chantillon sous 8 bits ou plus, alors on peut se mettre en circular buffer ou non.<br \/>\nAvoir \u00e0 l'esprit que les conversions seront lanc\u00e9es avec la fonction :<br \/>\nHAL_ADC_Start_DMA(&amp;hadc, &amp;pdata, 1);<br \/>\nCette fonction signifie que le contr\u00f4leur DMA va lancer la conversion dont l'\u00e9chantillon sera stock\u00e9e dans pdata.<\/p>\n<pre><code class=\"language-c\">    hadc.Init.ContinuousConvMode = DISABLE;\n    hadc.Init.DiscontinuousConvMode = DISABLE;\n    hadc.Init.DMAContinuousRequests = ENABLE;<\/code><\/pre>\n<h2>Et quand cela fonctionne : exemple de sortie sur Putty<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/wp-content\/uploads\/2022\/07\/ADC_putty.png\" alt=\"\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mise en oeuvre de l&rsquo;ADC avec le DMA Mat\u00e9riel requis un ordinateur avec un terminal (putty, termite,&#8230;) une carte nucleo-L073RZ ou STM32F446RE ou autre Un potentiom\u00e8tre de 10kOhm par exemple reli\u00e9 \u00e0 PA0 ou la carte IHM (mbed-application-shield) Cr\u00e9ation du projet &#8211; C\u00f4t\u00e9 configuration Configuration USART On configure l&rsquo;USART2 en 115200 baud. Configuration ADC Les &hellip; <a href=\"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/?p=324\" class=\"more-link\">Continuer la lecture de <span class=\"screen-reader-text\">Mise en \u0153uvre de l\u2019ADC avec le DMA<\/span>  <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[8,9,6,10],"class_list":["post-324","post","type-post","status-publish","format-standard","hentry","category-stm32","tag-adc","tag-microcontroleur","tag-stm32","tag-stm32cubeide"],"_links":{"self":[{"href":"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/index.php?rest_route=\/wp\/v2\/posts\/324","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=324"}],"version-history":[{"count":1,"href":"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/index.php?rest_route=\/wp\/v2\/posts\/324\/revisions"}],"predecessor-version":[{"id":325,"href":"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/index.php?rest_route=\/wp\/v2\/posts\/324\/revisions\/325"}],"wp:attachment":[{"href":"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=324"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=324"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.spacelabcachan.universite-paris-saclay.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=324"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}