{"id":146,"date":"2018-02-08T16:32:23","date_gmt":"2018-02-08T16:32:23","guid":{"rendered":"http:\/\/marcjuneau.ca\/?p=146"},"modified":"2018-02-08T17:19:59","modified_gmt":"2018-02-08T17:19:59","slug":"comment-utiliser-le-port-serie-virtuel-du-nucleo","status":"publish","type":"post","link":"https:\/\/marcjuneau.ca\/?p=146","title":{"rendered":"Comment utiliser le port s\u00e9rie virtuel du Nucl\u00e9o"},"content":{"rendered":"<p>Lorsque le Nucl\u00e9o est reli\u00e9 au PC \u00e0 l&rsquo;aide du port USB, il cr\u00e9\u00e9 un port s\u00e9rie virtuel qui permet d&rsquo;\u00e9changer des donn\u00e9es (ou messages). Pour voir le nom du port s\u00e9rie dans Windows, il suffit d&rsquo;aller dans <em><strong>P\u00e9riph\u00e9riques et imprimantes<\/strong><\/em>. Vous verrez alors un p\u00e9riph\u00e9rique du nom de <em><strong>STM32 STlink<\/strong><\/em>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-147 aligncenter\" src=\"http:\/\/marcjuneau.ca\/wp-content\/uploads\/2018\/02\/devices_all.png\" alt=\"\" width=\"800\" height=\"600\" srcset=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2018\/02\/devices_all.png 800w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2018\/02\/devices_all-300x225.png 300w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2018\/02\/devices_all-768x576.png 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/p>\n<p>Dans les propri\u00e9t\u00e9s de ce p\u00e9riph\u00e9rique, vous verrez l&rsquo;ensemble des fonctions de ce dernier, dont <em><strong>Virtual COM Port<\/strong><\/em>. Sur mon ordinateur, il appara\u00eet sur le COM6.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-148 aligncenter\" src=\"http:\/\/marcjuneau.ca\/wp-content\/uploads\/2018\/02\/devices.png\" alt=\"\" width=\"414\" height=\"510\" srcset=\"https:\/\/marcjuneau.ca\/wp-content\/uploads\/2018\/02\/devices.png 414w, https:\/\/marcjuneau.ca\/wp-content\/uploads\/2018\/02\/devices-244x300.png 244w\" sizes=\"auto, (max-width: 414px) 100vw, 414px\" \/><\/p>\n<p>Comme pour le Arduino, c&rsquo;est le UART qui est reli\u00e9 \u00e0 D0 et D1 qui est utilis\u00e9. Dans le cas du Nucl\u00e9o F446RE, c&rsquo;est le UART2 avec les pins A2 et A3 qu&rsquo;il faut utiliser.<\/p>\n<p>Pour utiliser des p\u00e9riph\u00e9riques du microcontr\u00f4leur, il faut d&rsquo;abord activer l&rsquo;horloge. Nous allons donc d\u00e9buter par activer l&rsquo;horloge sur UART2 et le port A.<\/p>\n<pre> \/* Active le clock sur UART2 et GPIOA *\/\r\n RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);\r\n RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);<\/pre>\n<p>Ensuite, nous allons configurer A2 et A3 qui sont respectivement TX et RX pour le UART2. Cette assignation est une fonction alternative de A2 et A3. Nous allons donc sp\u00e9cifier qu&rsquo;ils utilisent une fonction alternative (AF) puis nous allons sp\u00e9cifier que la fonction alternative est UART2.<\/p>\n<pre>\u00a0 \/* Configuration des GPIO*\/\r\n GPIO_InitTypeDef GPIO_InitStructure;\r\n GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; \r\n GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r\n GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r\n GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r\n GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;\r\n GPIO_Init(GPIOA, &amp;GPIO_InitStructure);\r\n GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);\r\n GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);<\/pre>\n<p>La prochaine \u00e9tape consiste \u00e0 configurer UART2. Dans cette exemple, la configuration sera 115200 bauds, 8 bits de donn\u00e9es, aucune parit\u00e9 et 1 stop bit. La derni\u00e8re ligne active le UART2.<\/p>\n<pre> \/* Configuration du UART2 *\/\r\n USART_InitTypeDef USART_InitStructure;\r\n USART_InitStructure.USART_BaudRate = 115200;\r\n USART_InitStructure.USART_WordLength = USART_WordLength_8b;\r\n USART_InitStructure.USART_StopBits = USART_StopBits_1;\r\n USART_InitStructure.USART_Parity = USART_Parity_No;\r\n USART_InitStructure.USART_HardwareFlowControl =          USART_HardwareFlowControl_None;\r\n USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;\r\n USART_Init(USART2, &amp;USART_InitStructure);\r\n USART_Cmd(USART2, ENABLE);<\/pre>\n<p>Afin de v\u00e9rifier le fonctionnement du programme, voici une fonction qui affiche envoie une cha\u00eene de caract\u00e8res. La boucle v\u00e9rifie que le caract\u00e8re courant est diff\u00e9rent de z\u00e9ro (le caract\u00e8re de fin). Elle attend ensuite que le transmetteur soit libre, puis elle envoie un caract\u00e8re et repositionne le curseur pour le prochain caract\u00e8re.<\/p>\n<pre>void uart2Puts(char *s)\r\n{\r\n while(*s)\r\n {\r\n while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);\r\n USART_SendData(USART2, *s++);\r\n }\r\n}<\/pre>\n<p>Le programme suivant envoie le message \u00ab\u00a0Bonjour le mode\u00a0\u00bb puis il retourne en \u00e9cho les caract\u00e8res qu&rsquo;il re\u00e7oit. La fonction <strong><em>uart2Init()<\/em> <\/strong>regroupe l&rsquo;ensemble du code d&rsquo;initialisation pr\u00e9sent\u00e9 au d\u00e9but de cet article.<\/p>\n<pre>int main(void)\r\n{\r\n uart2Init();\r\n uart2Puts(\"Bonjour le monde \\r\\n\");\r\n while(1) \/\/ Faire un \u00e9cho \u00e0 l'infini\r\n {\r\n   uint16_t rxData;\r\n   while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);\r\n   rxData = USART_ReceiveData(USART2);\r\n   while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);\r\n   USART_SendData(USART2, rxData);\r\n }\r\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Lorsque le Nucl\u00e9o est reli\u00e9 au PC \u00e0 l&rsquo;aide du port USB, il cr\u00e9\u00e9 un port s\u00e9rie virtuel qui permet d&rsquo;\u00e9changer des donn\u00e9es (ou messages). Pour voir le nom du port s\u00e9rie dans Windows, il suffit d&rsquo;aller dans P\u00e9riph\u00e9riques et imprimantes. Vous verrez alors un p\u00e9riph\u00e9rique du nom de STM32<span class=\"more-link\"><a href=\"https:\/\/marcjuneau.ca\/?p=146\">Continue Reading<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,10,13],"tags":[],"class_list":["entry","author-mjuneau","post-146","post","type-post","status-publish","format-standard","category-cc","category-stm32","category-stm32-nucleo"],"_links":{"self":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts\/146","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=146"}],"version-history":[{"count":4,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts\/146\/revisions"}],"predecessor-version":[{"id":152,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts\/146\/revisions\/152"}],"wp:attachment":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=146"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=146"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=146"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}