{"id":234,"date":"2018-02-01T21:09:05","date_gmt":"2018-02-01T20:09:05","guid":{"rendered":"http:\/\/www.electronic-idea.de\/wordpress\/?p=234"},"modified":"2018-09-19T12:26:04","modified_gmt":"2018-09-19T11:26:04","slug":"stm32-erste-schritte-mit-sw4stm32-und-der-blue-pill","status":"publish","type":"post","link":"https:\/\/www.electronic-idea.de\/wordpress\/stm32-erste-schritte-mit-sw4stm32-und-der-blue-pill\/","title":{"rendered":"STM32: Erste Schritte mit SW4STM32 und der &#8222;Blue Pill&#8220;"},"content":{"rendered":"<p>Oder: <em>Eine LED zum Blinken bringen in 78 einfachen Schritten<\/em><\/p>\r\n<p>Wenn man so ziemlich alles mit einem Arduino gemacht hat, was man mit einem Arduino machen kann, sehnt man sich vielleicht nach etwas mehr Power oder anderen Funktionen. Bei der Suche wird man um Controller mit ARM-Prozessor nicht herumkommen. Weit vorne liegen dabei die STM32-Controller von ST.<\/p>\r\n<p>Der Vorteil: Aus China bekommt man f\u00fcr extrem wenig Geld die ben\u00f6tigte Hardware. Ein Board mit dem\u00a0STM32F103C8 kostet etwa 2\u20ac, ein Programmierger\u00e4t liegt bei etwa 1,50\u20ac. Der Programmer ist ST-Link V2 kompatibel und funktioniert damit problemlos mit allen offiziellen ST-Tools.<\/p>\r\n<p><!--more--><\/p>\r\n<h2>Technische Daten<\/h2>\r\n<ul>\r\n<li>STM32F103C8<\/li>\r\n<li>ARM\u00ae32-bit Cortex\u00ae-M3 CPU Core mit bis zu 72MHz<\/li>\r\n<li>64Kbyte Flash<\/li>\r\n<li>20Kbyte SRAM<\/li>\r\n<li>Ext. 4&#8230;16MHz Clock + 32kHz RTC<\/li>\r\n<li>Int. Clock-Optionen inkl. PLL<\/li>\r\n<li>2 12bit ADCs mit insg. 16 Kan\u00e4len<\/li>\r\n<li>7 Timer ( 3x 16bit, 16bit Motor-PWM, 2x Watchdog, 1x 24bit Systick)<\/li>\r\n<li>CAN, USB, I2C, UART, SPI,&#8230;<\/li>\r\n<\/ul>\r\n<p>F\u00fcr 2\u20ac gibt es schon ordentlich bang for the buck und die Community und Software-Unterst\u00fctzung ist auch gut.<\/p>\r\n<p>Auf der &#8222;Blue Pill&#8220; ist ein minimalistisches System mit den n\u00f6tigsten Komponenten aufgebaut. Neben einem 8MHz Hauptquarz, einem 32.768kHz RTC-Quarz gibt es einen USB-Anschluss, einen Reset-Taster und BOOT-Jumper, auf die ich im n\u00e4chsten Kapitel n\u00e4her eingehen werde.<\/p>\r\n<h2>Hardware<\/h2>\r\n<h2><!-- \/wp:post-content -->\r\n\r\n<!-- wp:paragraph --><\/h2>\r\n<p>Mit der Platine und dem Programmer ist die Hardware f\u00fcr den ersten Test eigentlich schon vollst\u00e4ndig. Praktischerweise liegen bei den China-ST-Links auch gleich noch die Verbindungsleitungen zum Controller mit bei. Das sch\u00f6ne ist, dass das Programmierinterface, SWD (Serial Wire Debug) mit nur zwei Leitungen, SWCLK und SWDIO auskommt. Dazu dann noch GND und bei Bedarf 3.3V. Die Testschaltung ist also binnen weniger Sekunden zusammengesteckt und einsatzbereit.<\/p>\r\n<h2><!-- \/wp:paragraph -->\r\n\r\n<!-- wp:image {\"id\":298} --><\/h2>\r\n<figure class=\"wp-block-image\">\r\n<div id=\"attachment_298\" style=\"width: 730px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/09\/bluepillhw.jpg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-298\" class=\"wp-image-298 size-large\" src=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/09\/bluepillhw-1024x683.jpg\" alt=\"\" width=\"720\" height=\"480\" srcset=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/09\/bluepillhw-1024x683.jpg 1024w, https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/09\/bluepillhw-300x200.jpg 300w, https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/09\/bluepillhw-768x512.jpg 768w, https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/09\/bluepillhw.jpg 1600w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/a><p id=\"caption-attachment-298\" class=\"wp-caption-text\">BluePill mit STLink verbunden<\/p><\/div>\r\n<figcaption><\/figcaption>\r\n<\/figure>\r\n<p>Auff\u00e4llig auf dem Board sind die beiden gelben Jumper \u00fcber dem Reset-Taster. Hierbei handelt es sich um die beiden Pins <em>BOOT0<\/em> und <em>BOOT1.\u00a0<\/em>Mit den beiden Pins kann ausgew\u00e4hlt werden, von welchem Speicher der Controller nach einem Reset oder einem Wake-Up startet.<\/p>\r\n<p><a href=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/bootmodesstm.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-323\" src=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/bootmodesstm-1024x310.png\" alt=\"\" width=\"687\" height=\"208\" srcset=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/bootmodesstm-1024x310.png 1024w, https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/bootmodesstm-300x91.png 300w, https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/bootmodesstm-768x233.png 768w, https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/bootmodesstm.png 1323w\" sizes=\"auto, (max-width: 687px) 100vw, 687px\" \/><\/a><\/p>\r\n<p>Wichtig ist der Main Flash Memory, in dem das User-Programm liegt. Mit dieser Boot-Option startet der Controller direkt mit dem normalen Programm.<\/p>\r\n<p>Die Boot-Konfiguration f\u00fcr den System Memory, also den serienm\u00e4\u00dfigen Bootloader ist praktisch, wenn man bei der Software-Erstellung einen kleinen Fehler begangen hat. Mehr dazu sp\u00e4ter.<\/p>\r\n<h2>Ben\u00f6tigte Software<\/h2>\r\n<p>Mit der Hardware alleine ist es nicht getan. Als Entwicklungsumgebung nutze ich System Workbench for STM32 (SW4STM32) von ac6 Tools, welches auf Eclipse basiert.<\/p>\r\n<p>[Screens SW]<\/p>\r\n<p>Zus\u00e4tzlich zur eigentlichen IDE bietet es sich an, die Projekte mit STM32CubeMX zu erstellen. Mit dieser Software von ST ist es m\u00f6glich, den Controller komplett zu konfigurieren und einen HAL (Hardware Abstraction Layer) mit vordefinierten Funktionen einf\u00fcgen. Der HAL erm\u00f6glicht es, die Hardware ohne Software\u00e4nderungen anzupassen oder auszutauschen. Pin-Funktionen k\u00f6nnen zugewiesen werden, Kommunikationsschnittstellen, Timer und die Takterzeugung k\u00f6nnen grafisch konfiguriert werden, ohne, dass man den Quelltext selber anpassen muss. Dadurch l\u00e4sst sich das Projekt sogar sehr leicht auf einen anderen Controller portieren. Dadurch sind Hard- und Software gewisserma\u00dfen voneinander getrennt, oder eben abstrahiert. CubeMX kann <a href=\"https:\/\/www.st.com\/en\/development-tools\/stm32cubemx.html\" target=\"_blank\" rel=\"noopener\">hier<\/a> heruntergeladen werden.<\/p>\r\n<!-- wp:image {\"id\":293,\"linkDestination\":\"media\"} -->\r\n<div id=\"attachment_312\" style=\"width: 730px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/stm32_cube_clockdiagram.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-312\" class=\"size-large wp-image-312\" src=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/stm32_cube_clockdiagram-1024x553.png\" alt=\"\" width=\"720\" height=\"389\" srcset=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/stm32_cube_clockdiagram-1024x553.png 1024w, https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/stm32_cube_clockdiagram-300x162.png 300w, https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/stm32_cube_clockdiagram-768x415.png 768w, https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/stm32_cube_clockdiagram.png 1679w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/a><p id=\"caption-attachment-312\" class=\"wp-caption-text\">Der Reiter f\u00fcr die Takterzeugung<\/p><\/div>\r\n<p>Gerade die Optionen f\u00fcr die Takterzeugung sind komplex und vielseitig. Da m\u00f6chte man definitiv nicht auf Fu\u00dfpilzebene in den Konfigurationsregistern rumfummeln. Freundlicherweise erkennt CubeMX auch Probleme bei der Takterzeugung, wenn z.B. der Takt f\u00fcr die USB-Kommunikation nicht korrekt erzeugt werden kann, und schl\u00e4gt L\u00f6sungen daf\u00fcr vor.<\/p>\r\n<h2>Das erste Projekt<\/h2>\r\n<p>Die Hardware steht und CubeMX und SW4STM32 sind installiert? Dann kann es ja losgehen!<\/p>\r\n<p>Zun\u00e4chst starten wir CubeMX und erstellen ein neues Projekt, w\u00e4hlen unseren Controller, den\u00a0STM32F103C8, aus und haben nun die M\u00f6glichkeit, die Hardware-Funktionen des Controllers zu konfigurieren. Insofern CubeMX nicht noch fehlende Pakete herunterladen und installieren m\u00f6chte.<\/p>\r\n<div id=\"attachment_310\" style=\"width: 730px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/stm32_cube_controller.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-310\" class=\"size-large wp-image-310\" src=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/stm32_cube_controller-1024x743.png\" alt=\"\" width=\"720\" height=\"522\" srcset=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/stm32_cube_controller-1024x743.png 1024w, https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/stm32_cube_controller-300x218.png 300w, https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/stm32_cube_controller-768x557.png 768w, https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/stm32_cube_controller.png 1089w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/a><p id=\"caption-attachment-310\" class=\"wp-caption-text\">STM32CubeMX mit den grundlegenden Einstellungen f\u00fcr die BluePill<\/p><\/div>\r\n<p>Einstellungen f\u00fcr die Blue Pill:<\/p>\r\n<ul>\r\n<li>Unter <strong>RCC<\/strong> k\u00f6nnen f\u00fcr HS-Clock und LS-Clock jeweils die externen Quarze ausgew\u00e4hlt werden<\/li>\r\n<li>Unter <strong>USB<\/strong> kann die USB-Device-Funktion aktiviert werden<\/li>\r\n<li>Unter <strong>SYS<\/strong> muss &#8222;Serial Wire&#8220; als Debug-Interface ausgew\u00e4hlt werden<\/li>\r\n<\/ul>\r\n<p>Der letzte Punkt ist wichtig. W\u00e4hlt man in in der Option keine Debug-Schnittstelle aus, so sind die beiden SWD-Pins, Clock und IO, als normale GPIOs geschaltet und nach dem Flashen \u00fcber SWD ohne Debug-Interface kann \u00fcber SWD kein weiteres Programm geladen werden, da die Pins zum Programmieren deaktiviert sind.<\/p>\r\n<p>Sollte das einmal passieren, kommen der BOOT0- und der BOOT1-Jumper zum Einsatz. Mit BOOT0 auf 0 und BOOT1 auf 1 startet der Controller nach einem Reset mit dem seriellen Bootloader und wartet auf Daten \u00fcber SWD. Nachdem man dann eine Firmware mit aktiviertem SWD geflasht hat, m\u00fcssen beide Jumper wieder auf 0 gesetzt werden, damit unser Programm wie gewohnt startet.<\/p>\r\n<p>Mit einem Rechtsklick auf einen Pin kann dieser als Ein- oder Ausgang definiert werden und es kann ein Name vergeben werden, mit dem im Quelltext dann der Pin einfach angesprochen werden kann.<\/p>\r\n<p>[Bild Rechtsklickoptionen]<\/p>\r\n<p>Nachdem alle Konfigurationen durchgef\u00fchrt wurden, kann man mit einem Klick auf\u00a0<a href=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/generate_code.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone  wp-image-326\" src=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/02\/generate_code.png\" alt=\"\" width=\"21\" height=\"21\" \/><\/a>\u00a0der Code generiert werden. Im folgenden Fenster kann dann ein SW4STM32-Projekt daraus angelegt werden.<\/p>\r\n<p>[Screen Export]<\/p>\r\n<div id=\"attachment_300\" style=\"width: 867px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/09\/debugger_options.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-300\" class=\"size-full wp-image-300\" src=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/09\/debugger_options.png\" alt=\"\" width=\"857\" height=\"644\" srcset=\"https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/09\/debugger_options.png 857w, https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/09\/debugger_options-300x225.png 300w, https:\/\/www.electronic-idea.de\/wordpress\/wp-content\/uploads\/2018\/09\/debugger_options-768x577.png 768w\" sizes=\"auto, (max-width: 857px) 100vw, 857px\" \/><\/a><p id=\"caption-attachment-300\" class=\"wp-caption-text\">Debugger-Option zur Reset-Auswahl<\/p><\/div>\r\n<p>[Zusammenfassung CubeMX]<br \/>[Source erzeugen, in SW4STM32 \u00f6ffnen]<br \/>[Source]<\/p>\r\n<p>\n\n<div class=\"codecolorer-container c default\" style=\"overflow:auto;white-space:nowrap;\"><table cellspacing=\"0\" cellpadding=\"0\"><tbody><tr><td class=\"line-numbers\"><div>1<br \/>2<br \/>3<br \/>4<br \/>5<br \/><\/div><\/td><td><div class=\"c codecolorer\"><span class=\"sy0\">&lt;\/<\/span>p<span class=\"sy0\">&gt;<\/span><br \/>\n<span class=\"sy0\">&lt;<\/span>p<span class=\"sy0\">&gt;<\/span><span class=\"coMULTI\">\/* USER CODE BEGIN WHILE *\/<\/span><span class=\"sy0\">&lt;<\/span>br <span class=\"sy0\">\/&gt;<\/span><span class=\"kw1\">while<\/span> <span class=\"br0\">&#40;<\/span><span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">&lt;<\/span>br <span class=\"sy0\">\/&gt;<\/span><span class=\"br0\">&#123;<\/span><span class=\"sy0\">&lt;\/<\/span>p<span class=\"sy0\">&gt;<\/span><br \/>\n<span class=\"sy0\">&lt;<\/span>p<span class=\"sy0\">&gt;<\/span><span class=\"coMULTI\">\/* USER CODE END WHILE *\/<\/span><span class=\"sy0\">&lt;<\/span>br <span class=\"sy0\">\/&gt;<\/span>HAL_GPIO_WritePin<span class=\"br0\">&#40;<\/span>ONBOARD_LED_GPIO_Port<span class=\"sy0\">,<\/span> ONBOARD_LED_Pin<span class=\"sy0\">,<\/span> GPIO_PIN_RESET<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;&lt;<\/span>br <span class=\"sy0\">\/&gt;<\/span>HAL_Delay<span class=\"br0\">&#40;<\/span><span class=\"nu0\">100<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;&lt;<\/span>br <span class=\"sy0\">\/&gt;<\/span>HAL_GPIO_WritePin<span class=\"br0\">&#40;<\/span>ONBOARD_LED_GPIO_Port<span class=\"sy0\">,<\/span> ONBOARD_LED_Pin<span class=\"sy0\">,<\/span> GPIO_PIN_SET<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;&lt;<\/span>br <span class=\"sy0\">\/&gt;<\/span>HAL_Delay<span class=\"br0\">&#40;<\/span><span class=\"nu0\">500<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;&lt;<\/span>br <span class=\"sy0\">\/&gt;<\/span><span class=\"coMULTI\">\/* USER CODE BEGIN 3 *\/<\/span><span class=\"sy0\">&lt;\/<\/span>p<span class=\"sy0\">&gt;<\/span><br \/>\n<span class=\"sy0\">&lt;<\/span>p<span class=\"sy0\">&gt;<\/span><span class=\"br0\">&#125;<\/span><span class=\"sy0\">&lt;<\/span>br <span class=\"sy0\">\/&gt;<\/span><span class=\"coMULTI\">\/* USER CODE END 3 *\/<\/span><span class=\"sy0\">&lt;\/<\/span>p<span class=\"sy0\">&gt;<\/span><br \/>\n<span class=\"sy0\">&lt;<\/span>p<span class=\"sy0\">&gt;<\/span><\/div><\/td><\/tr><\/tbody><\/table><\/div>\n\n<\/p>\r\n<p>&nbsp;<\/p>\r\n<h2>Resourcen<\/h2>\r\n<p>https:\/\/wiki.stm32duino.com\/index.php?title=Blue_Pill<\/p>\r\n<p>&nbsp;<\/p>\r\n<!-- \/wp:image -->\r\n\r\n<!-- wp:heading -->\r\n<figure class=\"wp-block-image\"><\/figure>\r\n<!-- \/wp:heading -->","protected":false},"excerpt":{"rendered":"<p>Oder: Eine LED zum Blinken bringen in 78 einfachen Schritten Wenn man so ziemlich alles mit einem Arduino gemacht hat, was man mit einem Arduino machen kann, sehnt man sich vielleicht nach etwas mehr Power oder anderen Funktionen. Bei der Suche wird man um Controller mit ARM-Prozessor nicht herumkommen. Weit vorne liegen dabei die STM32-Controller [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":244,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[],"class_list":["post-234","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials"],"_links":{"self":[{"href":"https:\/\/www.electronic-idea.de\/wordpress\/wp-json\/wp\/v2\/posts\/234","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.electronic-idea.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.electronic-idea.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.electronic-idea.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.electronic-idea.de\/wordpress\/wp-json\/wp\/v2\/comments?post=234"}],"version-history":[{"count":31,"href":"https:\/\/www.electronic-idea.de\/wordpress\/wp-json\/wp\/v2\/posts\/234\/revisions"}],"predecessor-version":[{"id":327,"href":"https:\/\/www.electronic-idea.de\/wordpress\/wp-json\/wp\/v2\/posts\/234\/revisions\/327"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.electronic-idea.de\/wordpress\/wp-json\/wp\/v2\/media\/244"}],"wp:attachment":[{"href":"https:\/\/www.electronic-idea.de\/wordpress\/wp-json\/wp\/v2\/media?parent=234"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.electronic-idea.de\/wordpress\/wp-json\/wp\/v2\/categories?post=234"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.electronic-idea.de\/wordpress\/wp-json\/wp\/v2\/tags?post=234"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}