{"id":421088,"date":"2024-06-30T03:52:30","date_gmt":"2024-06-30T03:52:30","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=421088"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=421088","title":{"rendered":"<span>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 libopencm3: \u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442 (\u0427\u0430\u0441\u0442\u044c 2). \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 GPIO, SPI, \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 GDB<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dfa\/18b\/507\/dfa18b507d6b4092e066c03858824358.png\" width=\"723\" height=\"400\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dfa\/18b\/507\/dfa18b507d6b4092e066c03858824358.png\"\/><\/figure>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/auriga\/articles\/728270\/\">\u0427\u0430\u0441\u0442\u044c 1. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 libopencm3<\/a><br \/>\u0427\u0430\u0441\u0442\u044c 2. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 GPIO, SPI, \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 GDB<br \/>\u0427\u0430\u0441\u0442\u044c 3. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 USART, \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f\u043c\u0438, I2C \u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u0430\u043c\u0438<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u0441\u0440\u0435\u0434\u0443 \u0434\u043b\u044f \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434 STM32. \u041f\u043e\u0440\u0430 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043c.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p>STM32F103 Programming reference. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 &#171;Medium-density STM32F103xx pin definitions&#187; \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 28<br \/><a href=\"https:\/\/www.google.ru\/url?sa=i&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;ved=0CAQQw7AJahcKEwjghtmWoK_-AhUAAAAAHQAAAAAQAw&amp;url=https%3A%2F%2Fwww.st.com%2Fresource%2Fen%2Fdatasheet%2Fstm32f103cb.pdf&amp;psig=AOvVaw2B85wm0e0klOfPbL1GXKBW&amp;ust=1681763708986767\">https:\/\/www.st.com\/resource\/en\/datasheet\/stm32f103cb.pdf<\/a><\/p>\n<\/li>\n<li>\n<p>STM32F1 Reference manual. \u041f\u043e\u043b\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 STM32F1x <br \/><a href=\"https:\/\/www.google.ru\/url?sa=i&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;cad=rja&amp;uact=8&amp;ved=0CAQQw7AJahcKEwi4ieSjoa_-AhUAAAAAHQAAAAAQAw&amp;url=https%3A%2F%2Fwww.st.com%2Fresource%2Fen%2Freference_manual%2Fcd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf&amp;psig=AOvVaw0zskB8WWXPzzI32gZSIftr&amp;ust=1681764005854111\">https:\/\/www.st.com\/resource\/en\/reference_manual\/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf<\/a><\/p>\n<\/li>\n<li>\n<p>STM32F411 Programming reference. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 &#171;Alternate function mapping&#187; \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 47<br \/><a href=\"https:\/\/www.google.ru\/url?sa=i&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;cad=rja&amp;uact=8&amp;ved=0CAQQw7AJahcKEwiYv53Noa_-AhUAAAAAHQAAAAAQAw&amp;url=https%3A%2F%2Fwww.st.com%2Fresource%2Fen%2Fdatasheet%2Fstm32f411re.pdf&amp;psig=AOvVaw13K_mI5M159SzJ85scI1Ym&amp;ust=1681764091851047\">https:\/\/www.st.com\/resource\/en\/datasheet\/stm32f411re.pdf<\/a><\/p>\n<\/li>\n<li>\n<p>STM32F4 Reference manual. \u041f\u043e\u043b\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 STM32F4 <br \/><a href=\"https:\/\/www.google.ru\/url?sa=i&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;cad=rja&amp;uact=8&amp;ved=0CAQQw7AJahcKEwiQ1Pb8oa_-AhUAAAAAHQAAAAAQAg&amp;url=https%3A%2F%2Fwww.st.com%2Fresource%2Fen%2Freference_manual%2Frm0383-stm32f411xce-advanced-armbased-32bit-mcus-stmicroelectronics.pdf&amp;psig=AOvVaw3FiOddN7YOfv_bLKhDQ-UV&amp;ust=1681764192520897\">https:\/\/www.st.com\/resource\/en\/reference_manual\/rm0383-stm32f411xce-advanced-armbased-32bit-mcus-stmicroelectronics.pdf<\/a><\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0430 libopencm3<br \/><a href=\"http:\/\/libopencm3.org\/docs\/latest\/html\/index.html\">http:\/\/libopencm3.org\/docs\/latest\/html\/index.html<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0435 \u043b\u0438\u0448\u043d\u0438\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u044d\u0442\u0438 2 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0441 \u043f\u043b\u0430\u0442\u0430\u043c\u0438:<\/p>\n<details class=\"spoiler\">\n<summary>STM32F103 Blue Pill<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/07a\/78d\/8d8\/07a78d8d861f4cfc849008d7b23e7a76.jpg\" width=\"1622\" height=\"1106\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/07a\/78d\/8d8\/07a78d8d861f4cfc849008d7b23e7a76.jpg\" data-blurred=\"true\"\/><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>STM32F411 BlackPill<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/355\/e47\/99c\/355e4799ccde731a8d8483f1551e239e.png\" width=\"1600\" height=\"1077\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/355\/e47\/99c\/355e4799ccde731a8d8483f1551e239e.png\"\/><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c.<\/p>\n<h2>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442: \u043c\u043e\u0440\u0433\u0430\u0435\u043c \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u043c (GPIO &amp; DWT)<\/h2>\n<p>\u041a\u0430\u043a \u0438 \u043d\u0430 \u043c\u043d\u043e\u0433\u0438\u0445 \u043a\u0443\u0440\u0441\u0430\u0445 \u043f\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432, \u043c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, \u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f GPIO.<\/p>\n<p><strong>\u0426\u0435\u043b\u044c: \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0440\u0433\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u043c \u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0439 \u043a \u043d\u043e\u0436\u043a\u0435 PC13.<\/strong><\/p>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043c\u0441\u044f \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u044b (BluePill \u0438\u043b\u0438 BlackPill) \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code>$ .\/make_project.sh ex1_gpio_blink<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043c\u0441\u044f \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 ex1_gpio_blink \u0438 \u0438\u0437\u0443\u0447\u0438\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d. \u041e\u0442\u043a\u0440\u043e\u0435\u043c \u0444\u0430\u0439\u043b ex1_gpio_blink.c:<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include \"ex1_gpio_blink.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);         rcc_periph_clock_enable(RCC_GPIOA); }   int main(void) {         clock_setup()         while(1); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>STM32F4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include \"ex1_gpio_blink.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_25mhz_3v3[RCC_CLOCK_3V3_96MHZ]);         rcc_periph_clock_enable(RCC_GPIOA); }   int main(void) {         clock_setup();         while(1); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b c \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 RCC (Reset and Clock Control), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430.<\/p>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u0437\u043b\u043e\u0436\u0435\u043d\u0430 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e clock_setup, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u0430 GPIOA. \u0418\u0437\u0443\u0447\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <strong>rcc_clock_setup_pll<\/strong> \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0434\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 rcc_clock_scale (\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043b\u044f <a href=\"http:\/\/libopencm3.org\/docs\/latest\/stm32f1\/html\/structrcc__clock__scale.html\">F1<\/a> \u0438 <a href=\"http:\/\/libopencm3.org\/docs\/latest\/stm32f4\/html\/structrcc__clock__scale.html\">F4<\/a>), \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0437\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0434\u0435\u043b\u0435\u043d\u0438\u044f\/\u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>libopencm3 \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u0441\u0445\u0435\u043c \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 (\u0434\u043b\u044f F1 <a href=\"http:\/\/libopencm3.org\/docs\/latest\/stm32f1\/html\/rcc_8c_source.html#l00061\">\u0437\u0434\u0435\u0441\u044c<\/a> \u0438 \u0434\u043b\u044f F4 <a href=\"http:\/\/libopencm3.org\/docs\/latest\/stm32f4\/html\/rcc_8c_source.html#l00332\">\u0437\u0434\u0435\u0441\u044c<\/a>).<\/p>\n<p>\u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 STM32F1 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u0432\u0430\u0440\u0446\u0430 8 \u041c\u0433\u0446 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0448\u0438\u043d\u044b AHB 72 \u041c\u0433\u0446, \u0430 \u0434\u043b\u044f STM32F4 \u2013 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u0432\u0430\u0440\u0446\u0430 25 \u041c\u0433\u0446 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0448\u0438\u043d\u044b AHB 96 \u041c\u0433\u0446. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u043a\u0430\u043a\u043e\u0439 \u043a\u0432\u0430\u0440\u0446 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0430 \u0432\u0430\u0448\u0435\u0439 \u043f\u043b\u0430\u0442\u0435, \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 GPIO, \u0437\u0430\u0442\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0435 \u0432 \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0440\u0442\u0430 GPIOA \u043d\u0430 \u043f\u043e\u0440\u0442 GPIOC.  \u0414\u0430\u043b\u0435\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u0438\u043d\u043e\u0432 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u0437\u0430\u0434\u0430\u0435\u043c \u043d\u043e\u0436\u043a\u0435 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 PC13 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e: \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434, \u0440\u0435\u0436\u0438\u043c \u00abpush-pull\u00bb.<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include &lt;libopencm3\/stm32\/gpio.h> #include \"ex1_gpio_blink.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);         rcc_periph_clock_enable(RCC_GPIOC); }   int main(void) {         clock_setup();         gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_50_MHZ,  GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);         while(1);   }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>STM32F4 <\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include &lt;libopencm3\/stm32\/gpio.h> #include \"ex1_gpio_blink.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_25mhz_3v3[RCC_CLOCK_3V3_96MHZ]);         rcc_periph_clock_enable(RCC_GPIOC); }   int main(void) {         clock_setup();         gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO13);         while(1); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u043e\u0436\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 libopencm3 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043d\u0430\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u043f\u043e\u0440\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><strong>gpio_set()<\/strong> &#8212; \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u0432 \u00ab1\u00bb<\/p>\n<\/li>\n<li>\n<p><strong>gpio_clear()<\/strong> &#8212; \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u0432 \u00ab0\u00bb<\/p>\n<\/li>\n<li>\n<p><strong>gpio_toggle()<\/strong> &#8212; \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u0430<\/p>\n<\/li>\n<li>\n<p><strong>gpio_port_write()<\/strong> &#8212; \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u043f\u043e\u0440\u0442\u0430 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0431\u0438\u0442\u0430\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e 16-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c gpio_toggle():<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include &lt;libopencm3\/stm32\/gpio.h> #include \"ex1_gpio_blink.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);         rcc_periph_clock_enable(RCC_GPIOC); }   int main(void) {         clock_setup();         gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_50_MHZ,  GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);         while(1){                 for (i = 0; i &lt; 1000000; i++) {                         __asm__(\"nop\");                 }                 gpio_toggle(GPIOC, GPIO13);         } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>STM32F4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include &lt;libopencm3\/stm32\/gpio.h> #include \"ex1_gpio_blink.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_25mhz_3v3[RCC_CLOCK_3V3_96MHZ]);         rcc_periph_clock_enable(RCC_GPIOC); }          int main(void) {         clock_setup();         gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO13);         while(1){                 for (i = 0; i &lt; 1000000; i++) {                         __asm__(\"nop\");                 }                 gpio_toggle(GPIOC, GPIO13);         } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><strong>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/strong>! \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0431\u0443\u0442\u043b\u043e\u0430\u0434\u0435\u0440, \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u043f\u0446\u0438\u0438 \u043b\u0438\u043d\u043a\u0435\u0440\u0430. \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 Makefile \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e LDSCRIPT \u043d\u0430:   <\/p>\n<pre><code>$ LDSCRIPT = ..\/bluepill-bootloader.ld<\/code><\/pre>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c make-\u0444\u0430\u0439\u043b\u0443 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 (bin, hex \u0438\u043b\u0438  elf). \u042f \u0441\u043e\u0431\u0435\u0440\u0443 \u0432 bin.<\/p>\n<pre><code>$ make clean &amp;&amp; make bin<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0448\u044c\u0435\u043c \u0444\u0430\u0439\u043b. \u042f \u0431\u0443\u0434\u0443 \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 StLinkV2. Make \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0432\u0437\u044f\u043b\u0438 \u0438\u0437 libopencm3-examples, \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043e\u043f\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 st-util \u0438 BMP. \u0415\u0441\u043b\u0438 \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 (\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 USART \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e stm32-flash \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 DFU), \u0442\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u043d\u0430 \u0444\u0430\u0439\u043b <a href=\"https:\/\/github.com\/bsdmry\/stm_dev\/blob\/master\/rules.mk\">rules.mk<\/a>. \u041e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0422\u0430\u043c \u0432\u0441\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 STLinkV2:<\/p>\n<pre><code>$ make ex1_gpio_blink.stlink-flash<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043c\u043e\u0440\u0433\u0430\u044e\u0449\u0438\u0439 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u043e\u0448\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u043d\u0430 BluePill, \u0438 \u043d\u0430 BlackPill, \u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043c\u043e\u0440\u0433\u0430\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432 \u043d\u0430 \u043f\u043b\u0430\u0442\u0430\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f. \u042d\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0430\u0448\u0430 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430 \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c 1 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u043f\u0443\u0441\u0442\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u044b. \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 STM32 \u043a\u0430\u043a DWT (Data Watchpoint Trigger), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f DWT \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u00abClock cycle\u00bb. \u041f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u00ab\u0442\u0438\u043a\u0435\u00bb \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443. \u0417\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0447\u0435\u0440\u0435\u0437 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u00ab\u0442\u0438\u043a\u043e\u0432\u00bb \u0438\u0441\u0442\u0435\u0447\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0443 DWT, \u0441\u043e\u0437\u0434\u0430\u0432 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0412 \u043d\u0435\u0439 \u043c\u044b \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 dwt_enable_cycle_counter(). \u0414\u0430\u043b\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043f\u0430\u0440\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438 \u0443\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043d\u0435 \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e, \u0442.\u0435. \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0435\u0433\u043e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442.<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1 &amp; STM32F4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">static uint32_t dwt_setup(void) {         dwt_enable_cycle_counter();         __asm volatile (\"nop\");                                               __asm volatile (\"nop\");                     __asm volatile (\"nop\");        if(dwt_read_cycle_counter())      {                        return 0;                              }                 else                                         {                                         return 1;   }                                         }   <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u0430\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443:<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1 &amp; STM32F4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">static void dwt_delay_us(uint32_t microseconds)                                                                           {                                                                                                                                               uint32_t initial_ticks = dwt_read_cycle_counter();                                                                                 uint32_t us_count_tics = microseconds * (rcc_ahb_frequency \/ 1000000);                                                                                    while ((dwt_read_cycle_counter() - initial_ticks) &lt; us_count_tics);                                         }                                                                                                                                         static void dwt_delay_ms(uint32_t milliseconds)                                                                                  {                                                                                                                                               uint32_t initial_ticks = dwt_read_cycle_counter();                                                                                 uint32_t ms_count_tics = milliseconds * (rcc_ahb_frequency \/ 1000);                                                                                       while ((dwt_read_cycle_counter() - initial_ticks) &lt; ms_count_tics); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u043d\u043e\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0435 \u0437\u0430\u0431\u044b\u0432 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b dwt.h:<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include &lt;libopencm3\/stm32\/gpio.h> #include &lt;libopencm3\/cm3\/dwt.h> #include \"ex1_gpio_blink.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);         rcc_periph_clock_enable(RCC_GPIOC); }   static uint32_t dwt_setup(void) {         dwt_enable_cycle_counter();         __asm volatile (\"nop\");         __asm volatile (\"nop\");         __asm volatile (\"nop\");        if(dwt_read_cycle_counter())      {        return 0;      }      else   {     return 1;   } }   static void dwt_delay_us(uint32_t microseconds){         uint32_t initial_ticks = dwt_read_cycle_counter();         uint32_t us_count_tics = microseconds * (rcc_ahb_frequency \/ 1000000);         while ((dwt_read_cycle_counter() - initial_ticks) &lt; us_count_tics); }   static void dwt_delay_ms(uint32_t milliseconds){         uint32_t initial_ticks = dwt_read_cycle_counter();         uint32_t ms_count_tics = milliseconds * (rcc_ahb_frequency \/ 1000);         while ((dwt_read_cycle_counter() - initial_ticks) &lt; ms_count_tics); }     int main(void) {         clock_setup();         dwt_setup();         gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_50_MHZ,  GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);         while(1){                 dwt_delay_ms(1000);                 gpio_toggle(GPIOC, GPIO13);         } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>STM32F4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include &lt;libopencm3\/stm32\/gpio.h> #include &lt;libopencm3\/cm3\/dwt.h> #include \"ex1_gpio_blink.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_25mhz_3v3[RCC_CLOCK_3V3_96MHZ]);         rcc_periph_clock_enable(RCC_GPIOC); }   static uint32_t dwt_setup(void) {         dwt_enable_cycle_counter();         __asm volatile (\"nop\");         __asm volatile (\"nop\");         __asm volatile (\"nop\");        if(dwt_read_cycle_counter())      {        return 0;      }      else   {     return 1;   } }   static void dwt_delay_us(uint32_t microseconds){         uint32_t initial_ticks = dwt_read_cycle_counter();         uint32_t us_count_tics = microseconds * (rcc_ahb_frequency \/ 1000000);         while ((dwt_read_cycle_counter() - initial_ticks) &lt; us_count_tics); }   static void dwt_delay_ms(uint32_t milliseconds){         uint32_t initial_ticks = dwt_read_cycle_counter();         uint32_t ms_count_tics = milliseconds * (rcc_ahb_frequency \/ 1000);         while ((dwt_read_cycle_counter() - initial_ticks) &lt; ms_count_tics); }     int main(void) {         clock_setup();         dwt_setup();         gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO13);         while(1){                 dwt_delay_ms(1000);                 gpio_toggle(GPIOC, GPIO13);         } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e\u0448\u0438\u0432\u0430\u0435\u043c \u0432\u043d\u043e\u0432\u044c, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0432\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0442\u043e\u0447\u043d\u043e \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443.<\/p>\n<p>\u041d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0440\u043e\u0448\u0438\u0442 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0414\u0432\u0438\u0433\u0430\u0435\u043c\u0441\u044f \u0434\u0430\u043b\u0435\u0435.<\/p>\n<h2>\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442: \u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 SPI<\/h2>\n<p>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b SPI \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0439\u043d\u044b\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438.<\/p>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c SPI \u0432 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445 STM32 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u0436\u0438\u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043a\u0430\u043a 8 \u0431\u0438\u0442, \u0442\u0430\u043a \u0438 16 \u0431\u0438\u0442. \u0421\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 SPI \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u0430 \u0438 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0443 \u0442\u0435\u0445, \u043a\u0442\u043e \u0438\u043c\u0435\u043b \u0434\u0435\u043b\u043e \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c \u043d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u0445. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043d\u044e\u0430\u043d\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u0443\u0442\u0430\u0442\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0435\u0433\u043e \u2013 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0438\u043d\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u0430 \u043b\u0438\u043d\u0438\u044e CS (chip select).<\/p>\n<p><strong>\u0426\u0435\u043b\u044c: \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435\u0445\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u044b\u0439 \u0441\u0435\u043c\u0438\u0441\u0435\u0433\u043c\u0435\u043d\u0442\u043d\u044b\u0439 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0443 \u00ab1234\u00bb, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u0441 \u043d\u0438\u043c \u0447\u0435\u0440\u0435\u0437 \u0434\u0440\u0430\u0439\u0432\u0435\u0440 MAX7219. \u041c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 SPI2 \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043c\u0430\u0441\u0442\u0435\u0440\u0430.<\/strong><\/p>\n<p>\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043f\u043b\u0430\u0442\u044b \u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0432 \u043d\u0435\u0433\u043e:<\/p>\n<pre><code>$ .\/make_project.sh ex2_spi $ cd ex2_spi<\/code><\/pre>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u043d\u0430\u0448\u0443 \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f GPIO \u0438 SPI, \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 SPI2, \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u043f\u043e\u0440\u0442 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 GPIOA \u043d\u0430 GPIOB (\u0441\u0432\u0435\u0440\u0438\u0432\u0448\u0438\u0441\u044c \u0441 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u043e\u0439 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 SPI2 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0438\u043d\u044b PB12 \u2013 PB15):<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h>  #include &lt;libopencm3\/stm32\/gpio.h> #include &lt;libopencm3\/stm32\/spi.h> #include \"ex2_spi.h\"    static void clock_setup(void) {                rcc_clock_setup_pll(&amp;rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);         rcc_periph_clock_enable(RCC_GPIOB);         rcc_periph_clock_enable(RCC_SPI2); }   int main(void) {         clock_setup();         while(1); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>STM32F4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include &lt;libopencm3\/stm32\/gpio.h> #include &lt;libopencm3\/stm32\/spi.h> #include \"ex2_spi.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_25mhz_3v3[RCC_CLOCK_3V3_96MHZ]);         rcc_periph_clock_enable(RCC_GPIOB);         rcc_periph_clock_enable(RCC_SPI2); }   int main(void) {         clock_setup();         while(1); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 SPI. \u0412 \u043d\u0435\u0439 \u043c\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0437\u043e\u0432\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 SPI co \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p>\u0427\u0430\u0441\u0442\u043e\u0442\u0430 SPI Clock \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 \u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u0435, \u043f\u043e\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u043d\u0430 128<\/p>\n<\/li>\n<li>\n<p>\u0412 \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 \u043f\u0438\u043d CLK \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 low<\/p>\n<\/li>\n<li>\n<p>\u0421\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u043c \u0444\u0440\u043e\u043d\u0442\u0435 \u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u0438\u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438 \u0440\u0430\u0432\u043d\u0430 16 \u0431\u0438\u0442\u0430\u043c<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u043c<\/p>\n<\/li>\n<\/ul>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043e\u0442\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435. \u0415\u0441\u043b\u0438 \u0432\u044b \u0443\u0436\u0435 \u0438\u043c\u0435\u043b\u0438 \u0434\u0435\u043b\u043e \u0441 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u043c SPI, \u0442\u043e \u0437\u043d\u0430\u0435\u0442\u0435: \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043b\u0438\u043d\u0438\u044e CS (chip select) \u0434\u043b\u044f \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0435\u0434\u043e\u043c\u043e\u043c\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443, \u0447\u0442\u043e \u043a \u043d\u0435\u043c\u0443 \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043c\u0430\u0441\u0442\u0435\u0440-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e. \u041c\u0430\u0441\u0442\u0435\u0440-\u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043c\u043e\u0436\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043b\u0438\u043d\u0438\u0435\u0439 CS \u043a\u0430\u043a \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e, \u0442\u0430\u043a \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e. \u042f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043e\u0431\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u0430\u043a \u0434\u043b\u044f \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e.<\/p>\n<p><u>SPI \u0441 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u043e\u0436\u043a\u043e\u0439 CS<\/u><\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u043e\u0436\u0435\u043a \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430.<\/p>\n<p>\u0412 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 SPI \u043c\u044b \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u00absoftware slave management\u00bb \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u00abslave select output\u00bb. \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435! \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u043d\u0430\u0448 \u043c\u043e\u0434\u0443\u043b\u044c SPI, \u043d\u043e\u0436\u043a\u0430 GPIO12 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0442 \u0432 \u043d\u0438\u0437\u043a\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u044f \u0432\u0435\u0434\u043e\u043c\u043e\u043c\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u043e \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u0417\u043d\u0430\u044f \u044d\u0442\u043e, \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0443\u044e \u0438\u0437 3 \u0448\u0430\u0433\u043e\u0432: \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c SPI, \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c SPI. \u0418\u043d\u0430\u0447\u0435 \u0433\u043e\u0432\u043e\u0440\u044f, \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f SPI \u0432\u043e\u0437\u044c\u043c\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0435\u0434\u043e\u043c\u043e\u043c\u0443 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0438 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043a \u043f\u0440\u0438\u0435\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0445\u043e\u0447\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e libopencm3 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 3 \u0440\u0430\u0437\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 SPI:<\/p>\n<ul>\n<li>\n<p>spi_write() &#8212; \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 SPI<\/p>\n<\/li>\n<li>\n<p>spi_send() &#8212; \u0436\u0434\u0435\u0442 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 (\u0435\u0441\u043b\u0438 \u043e\u043d\u0430 \u0431\u044b\u043b\u0430), \u0438 \u0437\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 SPI<\/p>\n<\/li>\n<li>\n<p>spi_xfer() &#8212; \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 SPI \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438, \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0435\u043c\u0430 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043f\u0440\u0438\u043d\u044f\u0442\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0435\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0434\u0430\u043d\u043d\u044b\u0445, \u044f \u0440\u0435\u0448\u0438\u043b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 spi_xfer(), \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u044b \u043c\u0438\u043a\u0440\u043e\u0441\u0445\u0435\u043c\u043e\u0439 \u0434\u0440\u0430\u0439\u0432\u0435\u0440\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">static void spi_setup(void){         gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO12 | GPIO13 | GPIO15 ); \/\/CS, SCK, MOSI         gpio_set_mode(GPIOB, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, GPIO14); \/\/MISO           spi_disable(SPI2);         spi_init_master(SPI2, SPI_CR1_BAUDRATE_FPCLK_DIV_128, SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE, SPI_CR1_CPHA_CLK_TRANSITION_1, SPI_CR1_DFF_16BIT, SPI_CR1_MSBFIRST);         spi_disable_software_slave_management(SPI2);         spi_enable_ss_output(SPI2);   }     static void spi_transmit(uint16_t data){         spi_enable(SPI2);         spi_xfer(SPI2, data);         spi_disable(SPI2); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>STM32F4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">static void spi_setup(void){                                                                                                                    gpio_mode_setup(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO12 | GPIO13 | GPIO14 | GPIO15 ); \/\/CS, SCK, MISO, MOSI                         gpio_set_af(GPIOB, GPIO_AF5, GPIO12 | GPIO13 | GPIO14 | GPIO15);                                                                        gpio_set_output_options(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO12 | GPIO13  | GPIO15);                                              spi_disable(SPI2);                                                                                                                      spi_init_master(SPI2, SPI_CR1_BAUDRATE_FPCLK_DIV_128, SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE, SPI_CR1_CPHA_CLK_TRANSITION_1, SPI_CR1_DFF_16BIT, SPI_CR1_MSBFIRST);         spi_disable_software_slave_management(SPI2);                                                                                            spi_enable_ss_output(SPI2); }     static void spi_transmit(uint16_t data){                                                                                                      spi_enable(SPI2);         spi_xfer(SPI2, data);                                                                                                                   spi_disable(SPI2); }  <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><u>SPI \u0441 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u043e\u0436\u043a\u043e\u0439 CS<\/u><\/p>\n<p>\u0420\u0430\u0437\u043e\u0431\u0440\u0430\u0432\u0448\u0438\u0441\u044c \u0441 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043d\u043e\u0436\u043a\u043e\u0439 CS, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435. \u041e\u043d\u043e \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c. \u0415\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0432\u0435\u0434\u043e\u043c\u044b\u043c\u0438 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438, \u0432\u044b\u0434\u0435\u043b\u044f\u044f \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043b\u0438\u043d\u0438\u044e CS, \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0439 GPIO \u043f\u043e\u0440\u0442 \u043a\u0430\u043a CS.<\/p>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f SPI \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u0430\u043c:<\/p>\n<ul>\n<li>\n<p>\u041d\u043e\u0436\u043a\u0430 GPIO12, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 CS, \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 push-pull \u0438 \u043f\u0435\u0440\u0435\u0432\u0435\u0434\u0435\u043d\u0430 \u0432 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c<\/p>\n<\/li>\n<li>\n<p>\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 CS<\/p>\n<\/li>\n<li>\n<p> \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0438\u0442 SSI (slave select input)\u00a0\u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 spi_set_nss_high()   <\/p>\n<\/li>\n<\/ul>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u043e\u0436\u043a\u0435 \u043d\u0438\u0437\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c, \u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432\u043d\u043e\u0432\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0435\u0439 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c.<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">static void spi_setup(void){         gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO12); \/\/CS         gpio_set(GPIOB, GPIO12);         gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO13 | GPIO15 ); \/\/SCK, MOSI           spi_disable(SPI2);         spi_init_master(SPI2, SPI_CR1_BAUDRATE_FPCLK_DIV_128, SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE, SPI_CR1_CPHA_CLK_TRANSITION_1, SPI_CR1_DFF_16BIT, SPI_CR1_MSBFIRST);         spi_enable_software_slave_management(SPI2);         spi_set_nss_high(SPI2);         spi_enable(SPI2);   }   static void spi_transmit(uint16_t data){         gpio_clear(GPIOB, GPIO12);         spi_xfer(SPI2, data);         gpio_set(GPIOB, GPIO12);       }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>STM32F4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">static void spi_setup(void){         gpio_mode_setup(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO12); \/\/CS         gpio_set(GPIOB, GPIO12);         gpio_mode_setup(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO13 | GPIO14 | GPIO15 ); \/\/SCK, MISO, MOSI         gpio_set_af(GPIOB, GPIO_AF5, GPIO13 | GPIO14 | GPIO15);         gpio_set_output_options(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO13  | GPIO15);           spi_disable(SPI2);         spi_init_master(SPI2, SPI_CR1_BAUDRATE_FPCLK_DIV_128, SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE, SPI_CR1_CPHA_CLK_TRANSITION_1, SPI_CR1_DFF_16BIT, SPI_CR1_MSBFIRST);         spi_enable_software_slave_management(SPI2);         spi_set_nss_high(SPI2);         spi_enable(SPI2); }   static void spi_transmit(uint16_t data){         gpio_clear(GPIOB, GPIO12);         spi_xfer(SPI2, data);         gpio_set(GPIOB, GPIO12); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u0448 \u043c\u043e\u0434\u0443\u043b\u044c SPI \u043e\u0442\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d, \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0430 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438. \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435\u043c \u0441 \u043c\u0438\u043a\u0440\u043e\u0441\u0445\u0435\u043c\u043e\u0439 MAX7219. \u041e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430. \u041c\u044b \u0431\u0435\u0440\u0435\u043c \u0431\u0430\u0439\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0431\u0430\u0439\u0442 \u0434\u0430\u043d\u043d\u044b\u0445, \u0437\u0430\u0442\u0435\u043c \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c \u0438\u0445 \u0432 16-\u0431\u0438\u0442\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043f\u043e SPI:<\/p>\n<pre><code class=\"cpp\">static void max7219_send(uint8_t cmd, uint8_t data){         spi_transmit(((uint16_t)cmd &lt;&lt; 8) | data); }<\/code><\/pre>\n<p>\u0418\u0437\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u0442\u0430\u0448\u0438\u0442 \u043d\u0430 <a href=\"https:\/\/www.analog.com\/media\/en\/technical-documentation\/data-sheets\/max7219-max7221.pdf\">MAX7219<\/a> \u0438 \u043d\u0430\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e:<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include &lt;libopencm3\/stm32\/gpio.h> #include &lt;libopencm3\/stm32\/spi.h> #include \"ex2_spi.h\"   #define MAX7219_MODE_DECODE       0x09 #define MAX7219_MODE_INTENSITY    0x0A #define MAX7219_MODE_SCAN_LIMIT   0x0B #define MAX7219_MODE_POWER        0x0C #define MAX7219_MODE_TEST         0x0F #define MAX7219_MODE_NOOP         0x00   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);         rcc_periph_clock_enable(RCC_GPIOB);         rcc_periph_clock_enable(RCC_SPI2); }   static void spi_setup(void){         gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO12); \/\/CS         gpio_set(GPIOB, GPIO12);         gpio_set_mode(GPIOB, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO13 | GPIO15 ); \/\/SCK, MOSI           spi_disable(SPI2);         spi_init_master(SPI2, SPI_CR1_BAUDRATE_FPCLK_DIV_256, SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE, SPI_CR1_CPHA_CLK_TRANSITION_1, SPI_CR1_DFF_16BIT, SPI_CR1_MSBFIRST);         spi_enable_software_slave_management(SPI2);         spi_set_nss_high(SPI2);         spi_enable(SPI2);   }   static void spi_transmit(uint16_t data){         gpio_clear(GPIOB, GPIO12);         spi_xfer(SPI2, data);         gpio_set(GPIOB, GPIO12);      }   static void max7219_send(uint8_t cmd, uint8_t data){        spi_transmit(((uint16_t)cmd &lt;&lt; 8) | data); }   int main(void) {         clock_setup();         spi_setup();         max7219_send(MAX7219_MODE_DECODE, 0xFF);         max7219_send(MAX7219_MODE_SCAN_LIMIT, 3);         max7219_send(MAX7219_MODE_INTENSITY, 2);         max7219_send(MAX7219_MODE_POWER, 1);         max7219_send(0x1, 4);         max7219_send(0x2, 3);         max7219_send(0x3, 2);         max7219_send(0x4, 1);           while(1){         } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>STM32F4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include &lt;libopencm3\/stm32\/gpio.h> #include &lt;libopencm3\/stm32\/spi.h> #include \"ex2_spi.h\"   #define MAX7219_MODE_DECODE       0x09 #define MAX7219_MODE_INTENSITY    0x0A #define MAX7219_MODE_SCAN_LIMIT   0x0B #define MAX7219_MODE_POWER        0x0C #define MAX7219_MODE_TEST         0x0F #define MAX7219_MODE_NOOP         0x00   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_25mhz_3v3[RCC_CLOCK_3V3_96MHZ]);         rcc_periph_clock_enable(RCC_GPIOB);         rcc_periph_clock_enable(RCC_SPI2); }   static void spi_setup(void){         gpio_mode_setup(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO12); \/\/CS         gpio_set(GPIOB, GPIO12);         gpio_mode_setup(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO13 | GPIO14 | GPIO15 ); \/\/SCK, MISO, MOSI         gpio_set_af(GPIOB, GPIO_AF5, GPIO13 | GPIO14 | GPIO15);         gpio_set_output_options(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO13  | GPIO15);           spi_disable(SPI2);         spi_init_master(SPI2, SPI_CR1_BAUDRATE_FPCLK_DIV_128, SPI_CR1_CPOL_CLK_TO_0_WHEN_IDLE, SPI_CR1_CPHA_CLK_TRANSITION_1, SPI_CR1_DFF_16BIT, SPI_CR1_MSBFIRST);         spi_enable_software_slave_management(SPI2);         spi_set_nss_high(SPI2);         spi_enable(SPI2); }   static void spi_transmit(uint16_t data){         gpio_clear(GPIOB, GPIO12);         spi_xfer(SPI2, data);         gpio_set(GPIOB, GPIO12); }   static void max7219_send(uint8_t cmd, uint8_t data){         spi_transmit(((uint16_t)cmd &lt;&lt; 8) | data); }   int main(void) {         clock_setup();         spi_setup();         max7219_send(MAX7219_MODE_DECODE, 0xFF);         max7219_send(MAX7219_MODE_SCAN_LIMIT, 3);         max7219_send(MAX7219_MODE_INTENSITY, 2);         max7219_send(MAX7219_MODE_POWER, 1);         max7219_send(0x1, 4);         max7219_send(0x2, 3);         max7219_send(0x3, 2);         max7219_send(0x4, 1);           while(1){         } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0fb\/90e\/808\/0fb90e80872d2129576990ab9b5bd2dc.png\" alt=\"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 MAX7219 \u043a \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 BluePill. \u041e\u0431\u0432\u044f\u0437\u043a\u0430 7219 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u043a \u043d\u0435\u0439 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u043f\u0443\u0449\u0435\u043d\u0430.\" title=\"\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 MAX7219 \u043a \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 BluePill. \u041e\u0431\u0432\u044f\u0437\u043a\u0430 7219 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u043a \u043d\u0435\u0439 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u043f\u0443\u0449\u0435\u043d\u0430.\" width=\"616\" height=\"604\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0fb\/90e\/808\/0fb90e80872d2129576990ab9b5bd2dc.png\"\/><\/p>\n<div><figcaption>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043b\u0438\u043d\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 MAX7219 \u043a \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0443 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 BluePill. \u041e\u0431\u0432\u044f\u0437\u043a\u0430 7219 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u0439 \u043a \u043d\u0435\u0439 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u043f\u0443\u0449\u0435\u043d\u0430.<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c, \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0435\u043c<\/p>\n<pre><code>$ make clean &amp;&amp; make bin $ make ex2_spi.stlink-flash<\/code><\/pre>\n<p>\u041c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u0435 &#171;1234&#187;.<\/p>\n<h2>\u041e\u0442\u043b\u0430\u0434\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043d\u0430 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 GDB<\/h2>\n<p>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u043b\u0435\u0447\u0435\u043c\u0441\u044f \u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 libopencm3 \u0438 \u043f\u043e\u0434\u0443\u043c\u0430\u0435\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043e\u0442\u043b\u0430\u0434\u043a\u0443 \u0438 \u043f\u043e\u0438\u0441\u043a \u043e\u0448\u0438\u0431\u043e\u043a \u0432 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0445. \u041e\u0442\u0432\u0435\u0442 \u043d\u0430 \u044d\u0442\u043e \u2013 GNU Debugger. \u0412\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8f1\/c26\/b27\/8f1c26b2785bf9f062f26114c266f0fd.png\" width=\"312\" height=\"483\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8f1\/c26\/b27\/8f1c26b2785bf9f062f26114c266f0fd.png\"\/><\/figure>\n<p>\u041d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e GDB, \u0447\u0442\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0443 \u0432\u0430\u0441 \u043d\u0430 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435, \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c\u0443 GDB \u0441\u0435\u0440\u0432\u0435\u0440\u0443. \u0410 \u0443\u0436\u0435 GDB \u0441\u0435\u0440\u0432\u0435\u0440 \u0431\u0443\u0434\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b \u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a GDB \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 TCP\/IP, \u0442\u0430\u043a \u0438 \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e.<\/p>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/companies\/auriga\/articles\/728270\/\">\u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0443 \u0447\u0435\u0440\u0435\u0437 SWD \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 stlink-utils \u0438 Black Magic Probe. \u041d\u043e \u044d\u0442\u0438 \u0432\u0435\u0449\u0438 \u043d\u0435\u0441\u0443\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 GDB. \u0423\u0442\u0438\u043b\u0438\u0442\u0430 <strong>st-util <\/strong>\u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 TCP \u0441\u0435\u0440\u0432\u0435\u0440, \u0430 Black Magic Probe \u2013 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439, \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044f \u0441 \u043d\u0438\u043c \u0447\u0435\u0440\u0435\u0437 \u0441\u0438\u043c\u0432\u043e\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \/dev\/ttyACM0.   <\/p>\n<p>\u041f\u043e\u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c! \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c Blue Pill \u043a ST-Link V2 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430\u0442\u043e\u0440\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c st-util.<\/p>\n<pre><code>$ st-util  st-util 2023-04-17T23:56:08 WARN common.c: NRST is not connected 2023-04-17T23:56:08 INFO common.c: F1xx Medium-density: 20 KiB SRAM, 128 KiB flash in at least 1 KiB pages. 2023-04-17T23:56:08 INFO gdb-server.c: Listening at *:4242...<\/code><\/pre>\n<p>st-util \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b TCP \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 4242. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u043d\u0435\u043c\u0443. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043e\u043a\u043d\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 GDB:<\/p>\n<pre><code>$ arm-none-eabi-gdb -tui<\/code><\/pre>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443:<\/p>\n<pre><code>(gdb) target remote localhost:4242 Remote debugging using localhost:4242 warning: No executable has been specified and target does not support determining executable automatically.  Try using the \"file\" command. 0x080008c0 in ?? () (gdb) <\/code><\/pre>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0448\u043b\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f, \u043e\u0442\u0434\u0430\u0434\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 quit \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u043c\u0443 GDB \u0441\u0435\u0440\u0432\u0435\u0440\u0443.<\/p>\n<p>\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043d\u0430\u0448 Black Magic Probe \u043a USB, \u043a BMP \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u043c \u043d\u0430\u0448\u0443 \u043f\u043b\u0430\u0442\u0443 \u0438 \u0432\u043d\u043e\u0432\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c GDB. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/p>\n<pre><code>(gdb) target extended-remote \/dev\/ttyACM0 Remote debugging using \/dev\/ttyACM0 (gdb) monitor swdp_scan Available Targets: No. Att Driver  1      STM32F1 medium density M3 (gdb) attach 1 Attaching to Remote target warning: No executable has been specified and target does not support determining executable automatically.  Try using the \"file\" command. 0x080008bc in ?? () (gdb) <\/code><\/pre>\n<p>\u0423\u0441\u043f\u0435\u0445! \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043e\u0442\u043b\u0430\u0434\u0438\u0442\u044c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 SPI. \u0421\u043e\u0431\u0435\u0440\u0435\u043c \u0435\u0433\u043e \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b &#171;make hex&#187;, \u044d\u0442\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e HEX \u0444\u0430\u0439\u043b, \u043d\u043e \u0438 ELF, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e. \u041f\u043e \u0438\u0442\u043e\u0433\u0443 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u0444\u0430\u0439\u043b &#171;ex2_spi.elf&#187;. \u0421\u043a\u0430\u0436\u0435\u043c GDB \u0435\u0433\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c:<\/p>\n<pre><code>(gdb) file ex2_spi.elf  A program is being debugged already. Are you sure you want to change the file? (y or n) yReading symbols from ex2_spi.elf... (gdb) <\/code><\/pre>\n<p>\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u043c \u0444\u0430\u0439\u043b \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430:<\/p>\n<pre><code>(gdb) load Loading section .text, size 0x708 lma 0x8000000 Loading section .data, size 0xc lma 0x8000708 Start address 0x080005d4, load size 1812 Transfer rate: 9 KB\/sec, 604 bytes\/write. (gdb) <\/code><\/pre>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e main():<\/p>\n<pre><code>(gdb) break main Breakpoint 1 at 0x8000180: file ex2_spi.c, line 15. Note: automatically using hardware breakpoints for read-only addresses. (gdb) <\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435:<\/p>\n<pre><code>(gdb) continue Continuing.  Breakpoint 1, main () at ex2_spi.c:15 (gdb) <\/code><\/pre>\n<p>\u041c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043d\u0430\u0447\u043d\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u0438\u0437 main(). \u0412 \u043e\u043a\u043d\u0435 \u0441\u0432\u0435\u0440\u0445\u0443 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u0441\u044f \u043a\u043e\u0434.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d15\/9f5\/5ab\/d159f55ab33e58b02076778639e5396b.png\" width=\"890\" height=\"454\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d15\/9f5\/5ab\/d159f55ab33e58b02076778639e5396b.png\"\/><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u0439 cheatsheet \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c GDB:<\/p>\n<ul>\n<li>\n<p>&#171;s&#187; &#8212; &#171;step into&#187;<\/p>\n<\/li>\n<li>\n<p>&#171;c&#187; &#8212; &#171;step over&#187;<\/p>\n<\/li>\n<li>\n<p>&#171;p &lt;variable name>&#187; &#8212; \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/p>\n<\/li>\n<li>\n<p>&#171;b &lt;line number | function name>&#187; &#8212; \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0431\u0440\u0435\u0439\u043a\u043f\u043e\u0439\u043d\u0442 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u044e<\/p>\n<\/li>\n<li>\n<p>&#171;layout split&#187; &#8212; \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u043d\u0430 \u0442\u0435\u043a\u0441\u0442 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0438 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p>&#171;ni&#187; &#8212; &#171;next instruction&#187;, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e<\/p>\n<\/li>\n<li>\n<p>&#171;i r r3&#187; &#8212; \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 R3<\/p>\n<\/li>\n<\/ul>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434 GDB \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 <a href=\"https:\/\/raw.githubusercontent.com\/wiki\/NETMF\/llilum\/gdbTutorial.pdf\">\u044d\u0442\u043e\u043c \u043a\u0440\u0430\u0442\u043a\u043e\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435<\/a>, \u0438\u043b\u0438 <a href=\"https:\/\/sourceware.org\/gdb\/current\/onlinedocs\/gdb\">\u043f\u043e\u043b\u043d\u043e\u0439 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0448\u0430\u0433\u0435 \u043c\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043c \u0434\u0430\u043d\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u0432\u0432\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u0443\u0440\u0441\u0430 \u043f\u043e libopencm3. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0432\u0441\u044f \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u0430 \u0442\u0435\u043c, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 HAL \u043e\u0442 STMicroelectronics. <br \/>\u041a\u043e\u0434 \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0445 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043d\u0430 <a href=\"https:\/\/github.com\/bsdmry\/stm_dev\/tree\/master\">GitHub<\/a>.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/729418\/\"> https:\/\/habr.com\/ru\/articles\/729418\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p><a href=\"https:\/\/habr.com\/ru\/companies\/auriga\/articles\/728270\/\">\u0427\u0430\u0441\u0442\u044c 1. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 libopencm3<\/a><br \/>\u0427\u0430\u0441\u0442\u044c 2. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 GPIO, SPI, \u043e\u0442\u043b\u0430\u0434\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 GDB<br \/>\u0427\u0430\u0441\u0442\u044c 3. \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 USART, \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f\u043c\u0438, I2C \u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u0430\u043c\u0438<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043b\u0438 \u0441\u0440\u0435\u0434\u0443 \u0434\u043b\u044f \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u043e\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u0434 STM32. \u041f\u043e\u0440\u0430 \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u0442\u044c \u043a \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043c.<\/p>\n<p>\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p>STM32F103 Programming reference. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 &#171;Medium-density STM32F103xx pin definitions&#187; \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 28<br \/><a href=\"https:\/\/www.google.ru\/url?sa=i&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;ved=0CAQQw7AJahcKEwjghtmWoK_-AhUAAAAAHQAAAAAQAw&amp;url=https%3A%2F%2Fwww.st.com%2Fresource%2Fen%2Fdatasheet%2Fstm32f103cb.pdf&amp;psig=AOvVaw2B85wm0e0klOfPbL1GXKBW&amp;ust=1681763708986767\">https:\/\/www.st.com\/resource\/en\/datasheet\/stm32f103cb.pdf<\/a><\/p>\n<\/li>\n<li>\n<p>STM32F1 Reference manual. \u041f\u043e\u043b\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 STM32F1x <br \/><a href=\"https:\/\/www.google.ru\/url?sa=i&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;cad=rja&amp;uact=8&amp;ved=0CAQQw7AJahcKEwi4ieSjoa_-AhUAAAAAHQAAAAAQAw&amp;url=https%3A%2F%2Fwww.st.com%2Fresource%2Fen%2Freference_manual%2Fcd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf&amp;psig=AOvVaw0zskB8WWXPzzI32gZSIftr&amp;ust=1681764005854111\">https:\/\/www.st.com\/resource\/en\/reference_manual\/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf<\/a><\/p>\n<\/li>\n<li>\n<p>STM32F411 Programming reference. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 &#171;Alternate function mapping&#187; \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 47<br \/><a href=\"https:\/\/www.google.ru\/url?sa=i&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;cad=rja&amp;uact=8&amp;ved=0CAQQw7AJahcKEwiYv53Noa_-AhUAAAAAHQAAAAAQAw&amp;url=https%3A%2F%2Fwww.st.com%2Fresource%2Fen%2Fdatasheet%2Fstm32f411re.pdf&amp;psig=AOvVaw13K_mI5M159SzJ85scI1Ym&amp;ust=1681764091851047\">https:\/\/www.st.com\/resource\/en\/datasheet\/stm32f411re.pdf<\/a><\/p>\n<\/li>\n<li>\n<p>STM32F4 Reference manual. \u041f\u043e\u043b\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 STM32F4 <br \/><a href=\"https:\/\/www.google.ru\/url?sa=i&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=&amp;cad=rja&amp;uact=8&amp;ved=0CAQQw7AJahcKEwiQ1Pb8oa_-AhUAAAAAHQAAAAAQAg&amp;url=https%3A%2F%2Fwww.st.com%2Fresource%2Fen%2Freference_manual%2Frm0383-stm32f411xce-advanced-armbased-32bit-mcus-stmicroelectronics.pdf&amp;psig=AOvVaw3FiOddN7YOfv_bLKhDQ-UV&amp;ust=1681764192520897\">https:\/\/www.st.com\/resource\/en\/reference_manual\/rm0383-stm32f411xce-advanced-armbased-32bit-mcus-stmicroelectronics.pdf<\/a><\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043d\u0430 libopencm3<br \/><a href=\"http:\/\/libopencm3.org\/docs\/latest\/html\/index.html\">http:\/\/libopencm3.org\/docs\/latest\/html\/index.html<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0435 \u043b\u0438\u0448\u043d\u0438\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u044d\u0442\u0438 2 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0441 \u043f\u043b\u0430\u0442\u0430\u043c\u0438:<\/p>\n<details class=\"spoiler\">\n<summary>STM32F103 Blue Pill<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>STM32F411 BlackPill<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c.<\/p>\n<h2>\u041f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442: \u043c\u043e\u0440\u0433\u0430\u0435\u043c \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u043c (GPIO &amp; DWT)<\/h2>\n<p>\u041a\u0430\u043a \u0438 \u043d\u0430 \u043c\u043d\u043e\u0433\u0438\u0445 \u043a\u0443\u0440\u0441\u0430\u0445 \u043f\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432, \u043c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0440\u043d\u044b\u0445 \u0432\u0435\u0449\u0435\u0439, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e, \u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f GPIO.<\/p>\n<p><strong>\u0426\u0435\u043b\u044c: \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043e\u0440\u0433\u0430\u043d\u0438\u0435 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u043c \u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e\u0439 \u043a \u043d\u043e\u0436\u043a\u0435 PC13.<\/strong><\/p>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043c\u0441\u044f \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u044b (BluePill \u0438\u043b\u0438 BlackPill) \u0438 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code>$ .\/make_project.sh ex1_gpio_blink<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043c\u0441\u044f \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 ex1_gpio_blink \u0438 \u0438\u0437\u0443\u0447\u0438\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d. \u041e\u0442\u043a\u0440\u043e\u0435\u043c \u0444\u0430\u0439\u043b ex1_gpio_blink.c:<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include \"ex1_gpio_blink.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);         rcc_periph_clock_enable(RCC_GPIOA); }   int main(void) {         clock_setup()         while(1); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>STM32F4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include \"ex1_gpio_blink.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_25mhz_3v3[RCC_CLOCK_3V3_96MHZ]);         rcc_periph_clock_enable(RCC_GPIOA); }   int main(void) {         clock_setup();         while(1); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u043d\u0430\u0447\u0430\u043b\u0435 \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b c \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 RCC (Reset and Clock Control), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430.<\/p>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u043e\u0437\u043b\u043e\u0436\u0435\u043d\u0430 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e clock_setup, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u0430 GPIOA. \u0418\u0437\u0443\u0447\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <strong>rcc_clock_setup_pll<\/strong> \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0434\u0430\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 rcc_clock_scale (\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u043b\u044f <a href=\"http:\/\/libopencm3.org\/docs\/latest\/stm32f1\/html\/structrcc__clock__scale.html\">F1<\/a> \u0438 <a href=\"http:\/\/libopencm3.org\/docs\/latest\/stm32f4\/html\/structrcc__clock__scale.html\">F4<\/a>), \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0443\u044e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432, \u0437\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u0434\u0435\u043b\u0435\u043d\u0438\u044f\/\u0443\u043c\u043d\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>libopencm3 \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u0441\u0445\u0435\u043c \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u043a\u043e\u0434\u0435 (\u0434\u043b\u044f F1 <a href=\"http:\/\/libopencm3.org\/docs\/latest\/stm32f1\/html\/rcc_8c_source.html#l00061\">\u0437\u0434\u0435\u0441\u044c<\/a> \u0438 \u0434\u043b\u044f F4 <a href=\"http:\/\/libopencm3.org\/docs\/latest\/stm32f4\/html\/rcc_8c_source.html#l00332\">\u0437\u0434\u0435\u0441\u044c<\/a>).<\/p>\n<p>\u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u0435\u043d\u044f\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0432 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\u043c\u0438. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 STM32F1 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u0432\u0430\u0440\u0446\u0430 8 \u041c\u0433\u0446 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0448\u0438\u043d\u044b AHB 72 \u041c\u0433\u0446, \u0430 \u0434\u043b\u044f STM32F4 \u2013 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u043a\u0432\u0430\u0440\u0446\u0430 25 \u041c\u0433\u0446 \u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u044b \u0448\u0438\u043d\u044b AHB 96 \u041c\u0433\u0446. \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435, \u043a\u0430\u043a\u043e\u0439 \u043a\u0432\u0430\u0440\u0446 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u043d\u0430 \u0432\u0430\u0448\u0435\u0439 \u043f\u043b\u0430\u0442\u0435, \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u0447\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 GPIO, \u0437\u0430\u0442\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0435 \u0432 \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0440\u0442\u0430 GPIOA \u043d\u0430 \u043f\u043e\u0440\u0442 GPIOC.  \u0414\u0430\u043b\u0435\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438\u00a0\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043f\u0438\u043d\u043e\u0432 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u043b\u0443\u0447\u0430\u044f \u0437\u0430\u0434\u0430\u0435\u043c \u043d\u043e\u0436\u043a\u0435 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 PC13 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e: \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430 \u0432\u044b\u0445\u043e\u0434, \u0440\u0435\u0436\u0438\u043c \u00abpush-pull\u00bb.<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include &lt;libopencm3\/stm32\/gpio.h> #include \"ex1_gpio_blink.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);         rcc_periph_clock_enable(RCC_GPIOC); }   int main(void) {         clock_setup();         gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_50_MHZ,  GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);         while(1);   }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>STM32F4 <\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include &lt;libopencm3\/stm32\/gpio.h> #include \"ex1_gpio_blink.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_25mhz_3v3[RCC_CLOCK_3V3_96MHZ]);         rcc_periph_clock_enable(RCC_GPIOC); }   int main(void) {         clock_setup();         gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO13);         while(1); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u043e\u0436\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438. \u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 libopencm3 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043d\u0430\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u043f\u043e\u0440\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><strong>gpio_set()<\/strong> &#8212; \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u0432 \u00ab1\u00bb<\/p>\n<\/li>\n<li>\n<p><strong>gpio_clear()<\/strong> &#8212; \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u0432 \u00ab0\u00bb<\/p>\n<\/li>\n<li>\n<p><strong>gpio_toggle()<\/strong> &#8212; \u0418\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u044b\u0432\u043e\u0434\u0430<\/p>\n<\/li>\n<li>\n<p><strong>gpio_port_write()<\/strong> &#8212; \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0432\u044b\u0432\u043e\u0434\u043e\u0432 \u043f\u043e\u0440\u0442\u0430 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0431\u0438\u0442\u0430\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e 16-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<\/ul>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c gpio_toggle():<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include &lt;libopencm3\/stm32\/gpio.h> #include \"ex1_gpio_blink.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]);         rcc_periph_clock_enable(RCC_GPIOC); }   int main(void) {         clock_setup();         gpio_set_mode(GPIOC, GPIO_MODE_OUTPUT_50_MHZ,  GPIO_CNF_OUTPUT_PUSHPULL, GPIO13);         while(1){                 for (i = 0; i &lt; 1000000; i++) {                         __asm__(\"nop\");                 }                 gpio_toggle(GPIOC, GPIO13);         } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>STM32F4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">#include &lt;libopencm3\/stm32\/rcc.h> #include &lt;libopencm3\/stm32\/gpio.h> #include \"ex1_gpio_blink.h\"   static void clock_setup(void) {         rcc_clock_setup_pll(&amp;rcc_hse_25mhz_3v3[RCC_CLOCK_3V3_96MHZ]);         rcc_periph_clock_enable(RCC_GPIOC); }          int main(void) {         clock_setup();         gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO13);         while(1){                 for (i = 0; i &lt; 1000000; i++) {                         __asm__(\"nop\");                 }                 gpio_toggle(GPIOC, GPIO13);         } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p><strong>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435<\/strong>! \u0415\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0431\u0443\u0442\u043b\u043e\u0430\u0434\u0435\u0440, \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u043f\u0446\u0438\u0438 \u043b\u0438\u043d\u043a\u0435\u0440\u0430. \u041e\u0442\u043a\u0440\u043e\u0439\u0442\u0435 Makefile \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e LDSCRIPT \u043d\u0430:   <\/p>\n<pre><code>$ LDSCRIPT = ..\/bluepill-bootloader.ld<\/code><\/pre>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0430\u0448 \u043f\u0440\u043e\u0435\u043a\u0442. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c make-\u0444\u0430\u0439\u043b\u0443 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 (bin, hex \u0438\u043b\u0438  elf). \u042f \u0441\u043e\u0431\u0435\u0440\u0443 \u0432 bin.<\/p>\n<pre><code>$ make clean &amp;&amp; make bin<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u043e\u0448\u044c\u0435\u043c \u0444\u0430\u0439\u043b. \u042f \u0431\u0443\u0434\u0443 \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 StLinkV2. Make \u0444\u0430\u0439\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0432\u0437\u044f\u043b\u0438 \u0438\u0437 libopencm3-examples, \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043e\u043f\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 st-util \u0438 BMP. \u0415\u0441\u043b\u0438 \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u043c\u0438 (\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0430 \u0447\u0435\u0440\u0435\u0437 USART \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e stm32-flash \u0438\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 DFU), \u0442\u043e \u0432\u0437\u0433\u043b\u044f\u043d\u0438\u0442\u0435 \u043d\u0430 \u0444\u0430\u0439\u043b <a href=\"https:\/\/github.com\/bsdmry\/stm_dev\/blob\/master\/rules.mk\">rules.mk<\/a>. \u041e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0422\u0430\u043c \u0432\u0441\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e.<\/p>\n<p>\u0418\u0442\u0430\u043a, \u043f\u0440\u043e\u0448\u0438\u0432\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 STLinkV2:<\/p>\n<pre><code>$ make ex1_gpio_blink.stlink-flash<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0448\u0438\u0432\u043a\u0438 \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043c\u043e\u0440\u0433\u0430\u044e\u0449\u0438\u0439 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434 \u043d\u0430 \u043e\u0442\u043b\u0430\u0434\u043e\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u043f\u0440\u043e\u0448\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u043d\u0430 BluePill, \u0438 \u043d\u0430 BlackPill, \u0442\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043c\u043e\u0440\u0433\u0430\u043d\u0438\u044f \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u043e\u0432 \u043d\u0430 \u043f\u043b\u0430\u0442\u0430\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f. \u042d\u0442\u043e \u0432\u044b\u0437\u0432\u0430\u043d\u043e \u0442\u0435\u043c, \u0447\u0442\u043e \u043d\u0430\u0448\u0430 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0441\u0432\u0435\u0442\u043e\u0434\u0438\u043e\u0434\u0430 \u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u0438\u043a\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u043c 1 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430 \u043f\u0443\u0441\u0442\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439. \u041e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u043e\u0442\u044b. \u0427\u0442\u043e\u0431\u044b \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u044d\u0442\u043e\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 STM32 \u043a\u0430\u043a DWT (Data Watchpoint Trigger), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u0438 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f DWT \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u00abClock cycle\u00bb. \u041f\u043e\u0441\u043b\u0435 \u0435\u0433\u043e \u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u0438 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u00ab\u0442\u0438\u043a\u0435\u00bb \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0446\u0443. \u0417\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u043e\u0442\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0447\u0435\u0440\u0435\u0437 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u00ab\u0442\u0438\u043a\u043e\u0432\u00bb \u0438\u0441\u0442\u0435\u0447\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a.<\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0443 DWT, \u0441\u043e\u0437\u0434\u0430\u0432 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0412 \u043d\u0435\u0439 \u043c\u044b \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u0447\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 dwt_enable_cycle_counter(). \u0414\u0430\u043b\u0435\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043f\u0430\u0440\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438 \u0443\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u043d\u0435 \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e, \u0442.\u0435. \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0435\u0433\u043e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442.<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1 &amp; STM32F4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">static uint32_t dwt_setup(void) {         dwt_enable_cycle_counter();         __asm volatile (\"nop\");                                               __asm volatile (\"nop\");                     __asm volatile (\"nop\");        if(dwt_read_cycle_counter())      {                        return 0;                              }                 else                                         {                                         return 1;   }                                         }   <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0441\u0430\u043c\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443:<\/p>\n<details class=\"spoiler\">\n<summary>STM32F1 &amp; STM32F4<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">static void dwt_delay_us(uint32_t microseconds)                                                                           {                                                                                                                                               uint32_t initial_ticks = dwt_read_cycle_counter();                                                                                 uint32_t us_count_tics = microseconds * (rcc_ahb_frequency \/ 1000000);                                                                                    while ((dwt_read_cycle_counter() - initial_ticks) &lt; us_count_tics);                                         }                                                                                                                                         static void dwt_delay_ms(uint32_t milliseconds)                                                                                  {                                                                                                                                               uint32_t initial_ticks = dwt_read_cycle_counter();                                                            <\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-421088","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/421088","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=421088"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/421088\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=421088"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=421088"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=421088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}