{"id":489,"date":"2017-11-24T23:56:23","date_gmt":"2017-11-24T22:56:23","guid":{"rendered":"http:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=489"},"modified":"2017-12-30T19:39:38","modified_gmt":"2017-12-30T18:39:38","slug":"77-uart_dma-library-stm32f4","status":"publish","type":"page","link":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=489","title":{"rendered":"77-UART_DMA-Library (STM32F4)"},"content":{"rendered":"<p><div id=\"nav-below\" class=\"navigation\"><div class=\"nav-previous\"><a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=487\" title=\"76-LCD_N95_8GB-Library (STM32F4)\"><span class=\"meta-nav\">\u2190<\/span> 76-LCD_N95_8GB-Library (STM32F4)<\/a><\/div><\/div><!-- #nav-below --><div id=\"nav-below\" class=\"navigation\"><div class=\"nav-next\"><a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=491\" title=\"78-WS2812-Library (STM32F4)\">78-WS2812-Library (STM32F4) <span class=\"meta-nav\">&rarr;<\/span><\/a><\/div><\/div><!-- #nav-below --><\/p>\n<p>mit dieser Library wird eine UART im DMA-Mode betrieben (RX und TX)<\/p>\n<p>im H-File muss eingestellt werden welche UART benutzt werden soll und an welchen Pins der CPU sie angeschlossen ist. Und es muss auch die passende Einstellung vom DMA gew\u00e4hlt werden. (im RefManual stehen alle DMA-Streams)<\/p>\n<p>Die Gr\u00f6\u00dfe vom Puffer f\u00fcr RX und TX wird auch im H-File eingestellt und betrifft das senden und empfangen :<\/p>\n<pre lang=\"c\" line=\"1\">Sende-Puffer    =\u00a0UART_DMA.tx_buffer[UART_DMA_TX_BUF_SIZE]\r\nEmpfangs-Puffer =\u00a0UART_DMA.rx_buffer[UART_DMA_RX_BUF_SIZE]<\/pre>\n<p>1. Beim senden wird IMMER der komplette TX-Puffer gesendet<br \/>\n(also so viele Bytes wie im H-File als TX-Buffer-Size eingestellt sind)<\/p>\n<p>2. Vor dem senden muss der TX-Puffer mit Daten gef\u00fcllt werden<br \/>\n(nach der Initialisierung stehen alle Bytes auf 0\u00d700)<\/p>\n<p>3. Die Empfangs-Funktion liefert erst ein \u201cRX_DMA_READY\u201d wenn so viele Bytes empfangen wurden, wie im H-File als RX-Buffer-Size eingestellt worden ist.<\/p>\n<p>4. Wenn Daten empfangen wurden, stehen sie danach im RX-Puffer<\/p>\n<p>Das senden und empfangen wird per DMA verwaltet. Die Sendefunktion wartet vor dem senden falls notwendig bis der letzte Transfer abgeschlossen ist. Die Empfangsfunktion muss gepollt werden.<\/p>\n<p>im Beispiel wurde die UART so definert :<\/p>\n<pre lang=\"c\" line=\"1\">UART3 [TX=PC10], [RX=PC11] mit 115200 Baud\r\nDMA1, Channel4, Stream1+3<\/pre>\n<p><strong>Voraussetzungen :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">Benutzte Module der CooCox-IDE : GPIO, USART, DMA, MISC\r\nBenutzte Librarys : keine<\/pre>\n<p><strong>Enumerationen :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">typedef enum {\r\n  RX_DMA_EMPTY = 0,  \/\/ nichts empfangen\r\n  RX_DMA_READY,      \/\/ es steht was im Empfangspuffer\r\n  RX_DMA_OVF         \/\/ RX-Puffer ueberlauf\r\n}UART_RX_DMA_STATUS_t;<\/pre>\n<p><strong>Funktionen :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">void UB_Uart_DMA_Init(void);                          \/\/ zum init der UART\r\nvoid UB_Uart_DMA_SendBuffer(void);                    \/\/ zum senden per UART\r\nUART_RX_DMA_STATUS_t UB_UART_DMA_ReceiveBuffer(void); \/\/ zum empfangen per UART<\/pre>\n<p><strong>Beispiel :<\/strong><\/p>\n<pre lang=\"c\" line=\"1\">\/\/--------------------------------------------------------------\r\n\/\/ File     : main.c\r\n\/\/ Datum    : 05.03.2014\r\n\/\/ Version  : 1.0\r\n\/\/ Autor    : UB\r\n\/\/ EMail    : mc-4u(@)t-online.de\r\n\/\/ Web      : www.mikrocontroller-4u.de\r\n\/\/ CPU      : STM32F4\r\n\/\/ IDE      : CooCox CoIDE 1.7.4\r\n\/\/ GCC      : 4.7 2012q4\r\n\/\/ Module   : CMSIS_BOOT, M4_CMSIS_CORE\r\n\/\/ Funktion : Demo der UART-DMA Library\r\n\/\/ Hinweis  : Diese zwei Files muessen auf 8MHz stehen\r\n\/\/              \"cmsis_boot\/stm32f4xx.h\"\r\n\/\/              \"cmsis_boot\/system_stm32f4xx.c\"\r\n\/\/--------------------------------------------------------------\r\n\r\n#include \"main.h\"\r\n#include \"stm32_ub_uart_dma.h\"\r\n\r\nint main(void)\r\n{\r\n  uint32_t n;\r\n\r\n  SystemInit(); \/\/ Quarz Einstellungen aktivieren\r\n\r\n  \/\/ init der UART (per DMA)\r\n  UB_Uart_DMA_Init();\r\n\r\n  \/\/ Puffer zum senden f\u00fcllen\r\n  for(n=0;n&lt;UART_DMA_TX_BUF_SIZE;n++) {\r\n    UART_DMA.tx_buffer[n]=n;\r\n  }\r\n\r\n  \/\/ Daten senden\r\n  UB_Uart_DMA_SendBuffer();\r\n\r\n  while(1)\r\n  {\r\n    \/\/ check ob Daten empfangen wurden\r\n    \/\/ Hinweis : die Anzahl muss 50 Bytes sein !!\r\n    if(UB_UART_DMA_ReceiveBuffer()==RX_DMA_READY) {\r\n\r\n      \/\/ empfangene Daten kopieren\r\n      for(n=0;n&lt;UART_DMA_TX_BUF_SIZE;n++) {\r\n        UART_DMA.tx_buffer[n]=UART_DMA.rx_buffer[n];\r\n      }\r\n\r\n      \/\/ Daten als Echo zuruecksenden\r\n      UB_Uart_DMA_SendBuffer();\r\n    }\r\n  }\r\n}\r\n<\/pre>\n<p>Hier die Library zum\u00a0<strong>Download :<\/strong><\/p>\n<p><a href=\"http:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-content\/uploads\/2014\/03\/ub_stm32f4_uart_dma_v100.zip\">ub_stm32f4_uart_dma_v100<\/a><\/p>\n<p>Hier der komplette CooCox-Projektordner zum\u00a0<strong>Download :<\/strong><\/p>\n<p><a href=\"http:\/\/mikrocontroller.bplaced.net\/wordpress\/wp-content\/uploads\/2014\/03\/Demo_77_UART_DMA.zip\">Demo_77_UART_DMA<\/a><\/p>\n<hr \/>\n<h3 id=\"comments-title\">3 Antworten auf <em>77-UART_DMA-Library (STM32F4)<\/em><\/h3>\n<ol class=\"commentlist\">\n<li id=\"li-comment-2610\" class=\"comment even thread-even depth-1\">\n<div id=\"comment-2610\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/aa3becd243c4d027b0f77692b0f8e9ca?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Endy<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">2. Dezember 2014 um 17:56<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Hallo Uwe,<\/p>\n<p>erstmal vielen Dank f\u00fcr deine ganzen Librarys! Ich schreibe momentan meine Bachelorarbeit \u00fcber ein Thema, wo der STM32F4 zum Einsatz kommt, da ist dies wirklich ein super Einstieg!<\/p>\n<p>Ich habe mir mal die Library etwas unter die Lupe genommen und frage mich, warum der DMA-Stream bei dem TX-Kanal nach jedem mal senden immer wieder neu initialisiert wird. Muss das so sein und kostet das nicht wertvolle CPU-Zeit, die man doch grade durch die DMA sparen m\u00f6chte?<\/p>\n<p>Danke!<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/p>\n<ul class=\"children\">\n<li id=\"li-comment-2613\" class=\"comment byuser comment-author-admin_ub bypostauthor odd alt depth-2\">\n<div id=\"comment-2613\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/67426419ead44d5afa132e92685bb460?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">admin_ub<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">2. Dezember 2014 um 18:34<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>bin mir nicht mehr sicher. vlt um die startadresse wieder zur\u00fcckzusetzen. aber egal warum\u2026die 20 Zeilen code ben\u00f6tigen weniger Zeit als das senden von einem Bit per UART. aber du kannst ja gerne probieren ob es auch ohne deinit funktioniert.<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ul>\n<\/li>\n<li id=\"li-comment-2616\" class=\"comment even thread-odd thread-alt depth-1\">\n<div id=\"comment-2616\">\n<div class=\"comment-author vcard\"><img loading=\"lazy\" decoding=\"async\" class=\"avatar avatar-40 photo\" src=\"http:\/\/0.gravatar.com\/avatar\/aa3becd243c4d027b0f77692b0f8e9ca?s=40&amp;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D40&amp;r=G\" alt=\"\" width=\"40\" height=\"40\" \/><cite class=\"fn\">Endy<\/cite> <span class=\"says\">sagt:<\/span><\/div>\n<p><!-- .comment-author .vcard --><\/p>\n<div class=\"comment-meta commentmetadata\">2. Dezember 2014 um 21:49<\/div>\n<p><!-- .comment-meta .commentmetadata --><\/p>\n<div class=\"comment-body\">\n<p>Ich habe es ausprobiert. Bei mir reicht es, wenn man wieder senden will, einfach den Befehl:<br \/>\nDMA_Cmd(UART_DMA_TX_STREAM,ENABLE);<br \/>\nzu setzen. Die Adresse wird auch wieder automatisch auf Anfang gesetzt.<\/p>\n<p>Liebe Gr\u00fc\u00dfe<\/p>\n<\/div>\n<\/div>\n<p><!-- #comment-## --><\/li>\n<\/ol>\n","protected":false},"excerpt":{"rendered":"<p>mit dieser Library wird eine UART im DMA-Mode betrieben (RX und TX) im H-File muss eingestellt werden welche UART benutzt werden soll und an welchen Pins der CPU sie angeschlossen ist. Und es muss auch die passende Einstellung vom DMA &hellip; <a href=\"https:\/\/mikrocontroller.bplaced.net\/wordpress\/?page_id=489\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":144,"menu_order":77,"comment_status":"open","ping_status":"closed","template":"","meta":{"footnotes":""},"categories":[128],"tags":[149,9,7,93],"class_list":["post-489","page","type-page","status-publish","hentry","category-stm32f4","tag-dma","tag-library","tag-stm32f4","tag-uart"],"_links":{"self":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/489","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=489"}],"version-history":[{"count":3,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/489\/revisions"}],"predecessor-version":[{"id":1616,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/489\/revisions\/1616"}],"up":[{"embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=\/wp\/v2\/pages\/144"}],"wp:attachment":[{"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=489"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=489"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mikrocontroller.bplaced.net\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=489"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}