{"id":4213,"date":"2021-02-03T20:00:34","date_gmt":"2021-02-03T19:00:34","guid":{"rendered":"https:\/\/msalamon.pl\/?p=4213"},"modified":"2025-12-27T16:07:08","modified_gmt":"2025-12-27T15:07:08","slug":"what-did-creating-an-stm32-course-for-beginners-teach-me","status":"publish","type":"post","link":"https:\/\/msalamon.pl\/en\/what-did-creating-an-stm32-course-for-beginners-teach-me\/","title":{"rendered":"What Did Creating an STM32 Course for Beginners Teach Me?"},"content":{"rendered":"\n<p>I\u2019ve just finished producing all the planned materials for my <a href=\"https:\/\/kursstm32.pl\/?utm_source=blog&amp;utm_medium=post&amp;utm_campaign=kurs_po_1edycji&amp;utm_content=Text\" target=\"_blank\" rel=\"noopener\">STM32 Course for Beginners<\/a> (the course content is conducted in Polish). This is the perfect time to summarize what I\u2019ve accomplished so far. I also learned a lot while creating this course. Here\u2019s my little summary.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p><strong>The second edition of the course starts in February. Sign up at <a href=\"https:\/\/kursstm32.pl\/?utm_source=blog&amp;utm_medium=post&amp;utm_campaign=kurs_po_1edycji&amp;utm_content=Text\" target=\"_blank\" rel=\"noopener\">KURSSTM32.PL<\/a> (the course content is conducted in Polish) so you don\u2019t miss the launch!<\/strong><\/p>\n\n\n\n<h1 class=\"wp-block-heading\">The idea for the course<\/h1>\n\n\n\n<p>I came up with the idea of creating the course in spring 2019. The course launched in October 2020, so quite a lot of time passed from the idea to execution. Now \u2013 in January 2021 \u2013 I\u2019ve completed the basic scope of the course that I had planned. So you could say that <strong>I worked on the course for about two years<\/strong>.<\/p>\n\n\n\n<p>I selected the course topics based on my experience, and by talking with interested people. I had tons of private conversations. I sent out several surveys with questions about what people actually need.<\/p>\n\n\n\n<p>While creating the course, the thought that guided me was that <strong>I\u2019m creating a course for you, not for myself.<\/strong> I already know how to program \ud83d\ude42<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Course topics<\/h2>\n\n\n\n<p>Across the whole curriculum we go through the <strong>basic interfaces of the <a href=\"https:\/\/sklep.msalamon.pl\/produkt\/stm32f411ret6\/?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=podsumwanie_kursu&amp;utm_content=Text\">STM32F411RE<\/a> microcontroller<\/strong>. Of course, we used the <a href=\"https:\/\/sklep.msalamon.pl\/produkt\/nucleo-f411re\/?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=podsumwanie_kursu&amp;utm_content=Text\">NUCLEO-F411RE<\/a> board for this. <strong><a href=\"https:\/\/sklep.msalamon.pl\/kategoria-produktu\/dev-boardy\/stm32-nucleo\/?utm_source=blog&amp;utm_medium=article&amp;utm_campaign=podsumwanie_kursu&amp;utm_content=Text\">ST\u2019s eval boards<\/a> make learning incredibly easier.<\/strong><\/p>\n\n\n\n<p>In the course we covered only the basic interfaces. These are:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GPIO<\/li>\n\n\n\n<li>UART<\/li>\n\n\n\n<li>ADC<\/li>\n\n\n\n<li>I2C<\/li>\n\n\n\n<li>SPI<\/li>\n\n\n\n<li>USB<\/li>\n\n\n\n<li>SDIO<\/li>\n<\/ul>\n\n\n\n<p>Some of them in combination with DMA, like ADC, which in my opinion is made for that kind of work.<\/p>\n\n\n\n<p>We also got to know Low Power modes, which allow us to build battery-powered devices.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Code blocking<\/h3>\n\n\n\n<p>The biggest pain for beginners is code blocking. Usually it happens through excessive use of Delays in our programs.<\/p>\n\n\n\n<p><strong>In the course I showed two simple methods to avoid blocking.<\/strong><\/p>\n\n\n\n<p>These are a <strong>software timer and a state machine<\/strong>.<\/p>\n\n\n\n<p>We wrote a simple \u201cscheduler\u201d based on software timers, which triggered the required actions accordingly. For example, taking a measurement from the BMP280, or refreshing the OLED.<\/p>\n\n\n\n<p>For button handling I used a state machine. Thanks to it, debouncing is unnoticeable both for us and for the microcontroller.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">UART + DMA = &lt;3<\/h3>\n\n\n\n<p>Internet forums are bursting with questions on how to do it! Some time ago I wrote two articles about it:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"http:\/\/msalamon.pl\/odbieranie-uart-po-dma-to-bulka-z-maslem-lekcja-z-kursu-stm32\/\">Receiving UART via DMA is a piece of cake (a lesson from the STM32 Course)<\/a><\/li>\n\n\n\n<li><a href=\"http:\/\/msalamon.pl\/odbieranie-uart-z-dma-na-f103-to-rowniez-jest-proste\/\">Receiving UART with DMA on the F103? It\u2019s also simple!<\/a><\/li>\n<\/ul>\n\n\n\n<p>In the course, I explained in more detail how to handle it. Together with decoding messages that arrive on UART.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Other peripherals<\/h3>\n\n\n\n<p>With the other peripherals, I also show other important aspects of embedded programming.<\/p>\n\n\n\n<p>How to <strong>write a library from scratch<\/strong> based on documentation?<\/p>\n\n\n\n<p>How to <strong>port a ready-made library from Arduino?<\/strong><\/p>\n\n\n\n<p><strong>Do I need a level shifter for I2C?<\/strong><\/p>\n\n\n\n<p>Why is displaying on a TFT so slow? <strong>How to speed it up?<\/strong><\/p>\n\n\n\n<p>Using an <strong>SD card in your project.<\/strong><\/p>\n\n\n\n<p><strong>USB communication:<\/strong> VCOM, mass storage, HID<\/p>\n\n\n\n<p>\u2026and many others.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FreeRTOS<\/h2>\n\n\n\n<p>Many times, interested people asked me to cover FreeRTOS in the course. I decided to do it. Contrary to some opinions, writing under RTOS control is not easy, which I also showed in the course.<\/p>\n\n\n\n<p><strong>The module dedicated to FreeRTOS turned out to be the longest module and at this moment it contains 8 hours of materials.<\/strong><\/p>\n\n\n\n<p>I didn\u2019t just show how individual FreeRTOS components work. We built a project that uses it. Many courses show FreeRTOS from the perspective of blinking LEDs and printing to UART\u2026<\/p>\n\n\n\n<p>But our projects always do more! It turns out that <strong>adding two devices on one I2C, and an ADC measurement heavily complicates <\/strong>\u2013 for us as beginners \u2013 <strong>the use of FreeRTOS. I showed in the course how to deal with these problems.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What did I, as the creator, take away from the course?<\/h2>\n\n\n\n<p>Even though in the course I teach STM32 programming, I also took a lot from it.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>It taught me to organize my thoughts.<\/strong> Organizing such a huge project required many hours of planning and sorting out topics. My future materials on the blog or in other new places on the Internet will certainly be better structured.<\/li>\n\n\n\n<li><strong>Working with the camera.<\/strong> My students can see firsthand how experience affects on-camera results. With each module my work in front of the lens gets better and better. I speak more and more freely. I\u2019m also quite relaxed already when talking to the lens. Working with the camera was an important learning point for me.<\/li>\n\n\n\n<li><strong>You can always teach someone something.<\/strong> People who are afraid to start sharing publicly always have the same thoughts\u2026 \u201cwhat if I know too little\u201d or \u201csomeone more experienced will eat me alive with their knowledge\u201d. I had these thoughts when starting the blog. I had these thoughts when starting the store. I had these thoughts when coming up with the idea for the course! I will have these thoughts before every next project. The truth is one.<strong>If you know even 1% more than others in some topic, you can teach them exactly that 1%.<\/strong> That blockage is only in your head. If there\u2019s someone who knows more \u2013 they simply won\u2019t read\/watch you. But a lot of other people will benefit from your knowledge!<\/li>\n\n\n\n<li><strong>Plans and execution are two different things.<\/strong> We know this, for example, from all our own projects or from work. After all, sales or marketing will always promise something \u201cin two weeks\u201d, when the engineering team knows perfectly well it will take a month. It\u2019s an eternal battle :)I remember that I planned to release the course in half a year. It took 2 years. It was supposed to fit into a maximum of 20 hours. It turned into 40. It was supposed to last, or rather I was supposed to release it over 12 weeks. In the end there was so much material that I released it over 16 weeks.I think most people tend to underestimate. I\u2019m the same \ud83d\ude42<\/li>\n\n\n\n<li><strong>Hardware is your enemy.\u00a0<\/strong>I program hardware and I like hardware. However, when you have to use it, problems appear. Both hardware-related and user-related. A few of my mishaps like that:You forget to charge all the camera batteries. Or you didn\u2019t anticipate that when recording with a phone \u2013 it will start overheating after an hour.Or a microphone connected to a laptop records differently than when connected to a PC. Or sometimes you won\u2019t start recording on the camera or on the microphone and you talk for half an hour \u201cfor nothing\u201d, or you try to filter the audio recorded by the camera so you don\u2019t lose a few hours of material (Can the students tell in which module this happened to me? \ud83d\ude1b ).Or the laptop starts dropping audio samples and you have chunks of silence in the recording.Or on the last possible day of the week to record you break two light bulbs for lighting :)Or you didn\u2019t record your microphone on a LIVE Call. Or the next time you recorded only yourself, but not the other participants ;)There\u2019s quite a lot of that, and as I expand my course-making workshop, this list of mishaps unfortunately grows. Checklists or procedures help, but unfortunately not with everything.<\/li>\n\n\n\n<li><strong>I met a lot of great people!<\/strong> As part of the course we have a closed discussion group. We also organize recurring LIVE Calls, where we talk not only about the basics of STM32 programming.Among my students there are amazing people with knowledge from different fields. After all, it\u2019s not only embedded programmers who want to learn STM32! I met people who are familiar with various topics such as: electronics design, web programming, IoT. There are also versatile people who can answer any question by citing the right book that explains it :)This is an invaluable \u201cBonus\u201d of the course and I\u2019m very proud of it!<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<p>I think the course turned out great! This was only the first edition, so there\u2019s still a huge field for improvement.<\/p>\n\n\n\n<p><strong>In the first edition<\/strong>, all the way to the end, <strong>a total of AS MANY AS 205 people participated!&nbsp;<\/strong>I say \u201cto the end\u201d because with me you can always count on a full refund if you don\u2019t like the course (within the first 30 days).<\/p>\n\n\n\n<p>I\u2019m also planning bonus recordings of new things. Some lessons I want to record again, expanding the topic a bit.<\/p>\n\n\n\n<p>In February I\u2019m launching the second edition! You\u2019ll have a chance to join us. Don\u2019t miss registration and join the waiting list.<\/p>\n\n\n\n<p><strong>You can join here: <a href=\"https:\/\/kursstm32.pl\/?utm_source=blog&amp;utm_medium=post&amp;utm_campaign=kurs_po_1edycji&amp;utm_content=Text\" target=\"_blank\" rel=\"noopener\">KURSSTM32.PL<\/a><\/strong> (the course content is conducted in Polish)<\/p>\n\n\n\n<p>The course will start exactly on February 15, and we\u2019ll begin with a free webinar titled \u201cHow to get started with STM32 in 2021?\u201d Come and see what I\u2019ve prepared for you!<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;4213&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;0&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;0&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;0&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;0\\\/5 - (0 votes)&quot;,&quot;size&quot;:&quot;24&quot;,&quot;title&quot;:&quot;What Did Creating an STM32 Course for Beginners Teach Me?&quot;,&quot;width&quot;:&quot;0&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} - ({count} {votes})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 0px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 0px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 24px; height: 24px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 19.2px;\">\n            <span class=\"kksr-muted\"><\/span>\n    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>I\u2019ve just finished producing all the planned materials for my STM32 Course for Beginners (the course content is conducted in Polish). This is the perfect time to summarize what I\u2019ve accomplished so far. I also learned a lot while creating this course. Here\u2019s my little summary.<\/p>\n","protected":false},"author":1,"featured_media":3565,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_links_to":"","_links_to_target":""},"categories":[160],"tags":[178,176,174,177],"class_list":["post-4213","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-stm32","tag-kursstm32","tag-programming","tag-stm32","tag-stm32cubemx"],"_links":{"self":[{"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/posts\/4213","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/comments?post=4213"}],"version-history":[{"count":3,"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/posts\/4213\/revisions"}],"predecessor-version":[{"id":4216,"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/posts\/4213\/revisions\/4216"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/media\/3565"}],"wp:attachment":[{"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/media?parent=4213"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/categories?post=4213"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/msalamon.pl\/en\/wp-json\/wp\/v2\/tags?post=4213"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}