<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3799971</guid>
        <pubDate>Fri, 24 May 2019 10:26:04 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3799971</link>
        <description><![CDATA[WDaft: Коллеги, и в особенности ТС (спасибо за затронутую тему и + за отказ от Eclipse), интересную тему затронули.<br>
Только никак не пойму - почему все так не любят SES?<br>
<a class='tag-url' href='https://daft-soft.blogspot.com/' target='_blank'>моя заметка о начале разработки под STM32</a><br>
Буду рад, если кто-то пояснит мне причины такого презрения или игнора этого продукта.]]></description>
        <author>WDaft</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3710216</guid>
        <pubDate>Thu, 09 Mar 2017 11:51:31 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3710216</link>
        <description><![CDATA[alasso: <strong class='tag-b'>HardRock</strong>, можете скрины перезалить? ссылки битые(]]></description>
        <author>alasso</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3683683</guid>
        <pubDate>Tue, 06 Sep 2016 19:38:31 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3683683</link>
        <description><![CDATA[ysrx: Привет любителям codelite&#33; Я тут настроил себе codelite на ubuntu, работаю с stm32. Все работает прошивает компилирует и так далее. С отладкой какие то странности. dgb запускаеться подключается по порту 3333 openocd работает все супер. Команды дебагера через косоль понимает. Могу поставить брекпоинты регистры посмотреть, но не получается например команда halt, не работает. Через IDE (codelite) если ставлю беркпоинты не работает, но работает пауза и типа run. Они ставятся их видно в списке, но не срабатывают. Может кто подсказать, может настройки какие не правильно...]]></description>
        <author>ysrx</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3655762</guid>
        <pubDate>Sun, 28 Feb 2016 19:48:40 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3655762</link>
        <description><![CDATA[HardRock: Причём тут линаро?]]></description>
        <author>HardRock</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3655732</guid>
        <pubDate>Sun, 28 Feb 2016 17:19:25 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3655732</link>
        <description><![CDATA[Идеал: Небольшое уточнение. Речь идет о <a class='tag-url' href='http://www.linaro.org/' target='_blank'>Linaro</a>.<br>
<a class='tag-url' href='https://ru.wikipedia.org/wiki/Linaro' target='_blank'>https://ru.wikipedia.org/wiki/Linaro</a><br>
В организации Linaro участвуют такие компании, как ARM, Freescale, IBM, Samsung, Texas Instruments, Canonical, Facebook, HP, Red Hat, Nokia Siemens Networks, AMD и многие другие.]]></description>
        <author>Идеал</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3653268</guid>
        <pubDate>Mon, 15 Feb 2016 22:43:13 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3653268</link>
        <description><![CDATA[HardRock: Кстати, для того чтобы пользоваться C++ достаточно качнуть пакет newlib <br>
<br>
<a class='tag-url' href='https://launchpad.net/ubuntu/+source/libstdc%2B%2B-arm-none-eabi' target='_blank'>https://launchpad.net/ubuntu/+source/libstd...B-arm-none-eabi</a><br>
<br>
В 15 версии убунты он из коробки, а на 14 нужно ставить через dpkg. Все прекрасно работает.]]></description>
        <author>HardRock</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3647411</guid>
        <pubDate>Sat, 16 Jan 2016 11:14:52 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3647411</link>
        <description><![CDATA[HardRock: Рад что кому-то статья помогает.<br><br>По поводу бага GCC + CMSIS.<br>В конце статьи выложены готовые проекты, там патч присутсвует.<br>В самой статье этот нюанс действительно не описан. Просто забыл про этот момент. Кстати, решение взял из того же поста на easyelectronics :)]]></description>
        <author>HardRock</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3647398</guid>
        <pubDate>Sat, 16 Jan 2016 10:02:56 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3647398</link>
        <description><![CDATA[Searcher: Здравствуйте,<br>
<br>
немог пройти мимо несказав спасибо автору темы. Зто стало важно после того, как сам лично опробовал методику опысанную автором и прочтения последнего коммента.<br>
<br>
Я и сам начинающий и понимаю возмущение коментатора, но следует убедится в своей правоте.<br>
Мною был скачан ARM компилятор и собран CodeLite из исходников по сведениям с сайта автора выше упомянутой среды.<br>
Далее по туториалу автора темы, собрал библиотеку и тестовую программу. Все было олично кроме неполадки с core_cm3.c. Там ошибочка компиляции. Исправлается зта ошибка по описанию в <a class='tag-url' href='http://we.easyelectronics.ru/PahanMenski/gcc-46-i-cmsis-ispravlyaem-oshibku-kompilyacii.html' target='_blank'>GCC 4.6 и CMSIS: исправляем ошибку компиляции</a><br>
Ну и всякие простые отличия двух файловых систем дву разных пользователей Linux системы. Программа заливалась с помощю st-flash, также собранной мною с исходников. Работа программы проверялась с помощю CuteCom.<br>
<br>
Вот и все. Автору последнего коментария - обращайся расскажу, помогу.]]></description>
        <author>Searcher</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3592842</guid>
        <pubDate>Wed, 15 Apr 2015 19:10:10 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3592842</link>
        <description><![CDATA[kobzar: Похоже автор чегото не дописал или не учел<br>так как добится работоспособной системы по данному опусу нельзя.<br>А жаль - надежда уже была]]></description>
        <author>kobzar</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3509100</guid>
        <pubDate>Tue, 05 Aug 2014 15:16:29 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3509100</link>
        <description><![CDATA[old_lamer: Интересная статья. Буду пробовать. Получится если, Keil уйдёт в корзину.]]></description>
        <author>old_lamer</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3507622</guid>
        <pubDate>Fri, 01 Aug 2014 14:52:53 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3507622</link>
        <description><![CDATA[HardRock: В проекте не должно быть .cpp файлов, только .c]]></description>
        <author>HardRock</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3507567</guid>
        <pubDate>Fri, 01 Aug 2014 12:15:58 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3507567</link>
        <description><![CDATA[Pokemon4ik2008: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Либо качать другой тулчейн, либо пока не пользоваться C++, а только С</div></div><br>
А Вы не поскажите где это настраивается?<br>
Тулчейны не у меня получается собрать, постоянно натыкаюсь на ошибки.]]></description>
        <author>Pokemon4ik2008</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3507293</guid>
        <pubDate>Thu, 31 Jul 2014 17:13:27 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3507293</link>
        <description><![CDATA[HardRock: Лушче скачать готовый. Например sourcery arm toolchain <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2014-07-31T17:13:45+00:00">31.07.14, 17:13</time></span></span><br>
Как вариант, можно попробовать buildroot]]></description>
        <author>HardRock</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3507289</guid>
        <pubDate>Thu, 31 Jul 2014 17:01:20 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3507289</link>
        <description><![CDATA[Pokemon4ik2008: Спасибо за ответ. Хотел ещё задать вопрос.<br>Не встречали ли Вы хороший гайд по сборке тулчейна так как указанный в их документации вызывает много ошибок?]]></description>
        <author>Pokemon4ik2008</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3506982</guid>
        <pubDate>Thu, 31 Jul 2014 06:00:48 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3506982</link>
        <description><![CDATA[HardRock: На Ubuntu 14.04 сломанный пакет arm-none-eabi. Использовать С++ нельзя т.к. он зависит от libstdc++, которой в пакете поставки нет :(<br><br>Либо качать другой тулчейн, либо пока не пользоваться C++, а только С]]></description>
        <author>HardRock</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3506966</guid>
        <pubDate>Thu, 31 Jul 2014 05:19:20 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3506966</link>
        <description><![CDATA[Pokemon4ik2008: Здравствуйте&#33; Попробую скомпилировать проект с примерно получаю <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">/bin/sh -c &#39;make -e -f &nbsp;Makefile&#39;</div><div class="code_line">----------Building project:[ STM32F103C8T6 - STM32F103C8T6 ]----------</div><div class="code_line">make[1]: Entering directory `/home/artem/.codelite/STM/STM32F103C8T6&#39;</div><div class="code_line">arm-none-eabi-as &nbsp;&quot;/home/artem/.codelite/STM/STM32F103C8T6/startup.s&quot; &nbsp;-o ~Build/.intermediate/STM32F103C8T6/startup.s.o -I-I. -I. -I../libSTM32F10X/include</div><div class="code_line">arm-none-eabi-g++ -o ~Build/STM32F103C8T6/STM32F103C8T6.elf @&quot;STM32F103C8T6.txt&quot; -L. -L../libSTM32F10X/~Build/STM32F10X_MD &nbsp;-lSTM32F10X_MD &nbsp;-nostartfiles -mcpu=cortex-m3 -mthumb -TSTM32F103C8T6.ld -Wl,-Map=~Build/STM32F103C8T6/STM32F103C8T6.map -Wl,-gc-sections</div><div class="code_line">/usr/lib/gcc/arm-none-eabi/4.8.2/../../../arm-none-eabi/bin/ld: cannot find -lstdc++</div><div class="code_line">collect2: error: ld returned 1 exit status</div><div class="code_line">make[1]: *** [~Build/STM32F103C8T6/STM32F103C8T6.elf] Error 1</div><div class="code_line">make[1]: Leaving directory `/home/artem/.codelite/STM/STM32F103C8T6&#39;</div><div class="code_line">make: *** [All] Error 2</div><div class="code_line">1 errors, 0 warnings</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Подскажите как решить проблему.<br>
Заранее благодарен&#33;]]></description>
        <author>Pokemon4ik2008</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3493739</guid>
        <pubDate>Tue, 24 Jun 2014 08:43:03 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3493739</link>
        <description><![CDATA[HardRock: Вообще этот файл генерируется автоматически кодлайтом. В нем находится список объектных файлов для сборки статик библиотеки.<br>Попробуй не переименовывать проект в libDebug, а использовать &quot;стандартное имя&quot; - libSTM32F10X.<br>Также возможно как-то странно настроен сам кодлайт.]]></description>
        <author>HardRock</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3492904</guid>
        <pubDate>Sat, 21 Jun 2014 08:58:48 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3492904</link>
        <description><![CDATA[OverKot: Не получается собрать статическую библиотеку libSTM32F10X_MD.а<br>
(даже если беру готовый проект по ссылке &quot;Проект libSTM32F10X&quot; )<br>
<br>
Выдает:<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body">arm-none-eabi-ar rcu Build/Debug/libDebug.a @&quot;libSTM32F10X.txt&quot;<br>
arm-none-eabi-ar: @libSTM32F10X.txt: No such file or directory<br>
make[1]: *** [Build/Debug/libDebug.a] Error 1<br>
</div></div><br>
Объясните, плиз, что я не так делаю.И где брать этот libSTM32F10X.txt и нужен ли он?]]></description>
        <author>OverKot</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3490594</guid>
        <pubDate>Fri, 13 Jun 2014 17:09:06 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3490594</link>
        <description><![CDATA[HardRock: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=387685&view=findpost&p=3477119'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>MeG &#064; <time class="tag-quote__quoted-time" datetime="2014-05-11T16:49:26+00:00">11.05.14, 16:49</time></span><div class='quote '>Порадовала статья&#33;&#33;<br>
 Ждем следующую, как прикрутить STLINK v2</div></div><br>
<br>
Наконец-то добрался и запилил:<br>
<a class='tag-url' href='http://wavecon.ru/ru/tech/setup_stm32_debugger_codelite_and_stlinkv2' target='_blank'>Отладка STM32 в Linux с использованием CodeLite IDE + STLink V2</a>]]></description>
        <author>HardRock</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3477119</guid>
        <pubDate>Sun, 11 May 2014 16:49:26 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3477119</link>
        <description><![CDATA[MeG: Порадовала статья&#33;&#33;<br> Ждем следующую, как прикрутить STLINK v2]]></description>
        <author>MeG</author>
        <category>Микроконтроллеры</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3426724</guid>
        <pubDate>Fri, 07 Mar 2014 11:36:34 +0000</pubDate>
        <title>Программироание STM32 под Linux в CodeLite IDE</title>
        <link>https://forum.sources.ru/index.php?showtopic=387685&amp;view=findpost&amp;p=3426724</link>
        <description><![CDATA[HardRock: Всем привет&#33;<br>
<br>
Начал потихоньку &quot;пересаживаться&quot; на STM32 со всяких AVR&#39;ок. <br>
Конечно, первым делом встал вопроc &quot;в чем писать код?&quot;. Поискав &quot;по интернетам&quot;, нашел кучу разных способов разной степени извращенности.<br>
Скажу сразу, хотелось использовать только свободное ПО. На эту тему нашел только одно вменяемое решение - ARM плагин к Eclipse.<br>
Но&#33; Не люблю эклипс&#33; Пользуюсь CodeLite. <br>
<br>
Итого, пришлось самому вникать во все тонкости. В результате получилась такая статья...<br>
Может кому будет полезно.<br>
<br>
<hr><br>
<br>
Если поискать в интернете, то для программирования STM32 люди используют в основном два подхода (свободные IDE):<ul class="tag-list"><li>Make файл</li><li>ARM плагин для Eclipse</li></ul><br>
Но что делать, если &quot;любимым&quot; редактором является <a class='tag-url' href='http://codelite.org' target='_blank'>CodeLite</a>?<br>
Ответ простой - нужно настроить чтобы всё работало под CodeLite, причем чем проще будет использование - тем лучше и эффективней станет разработка под STM :)<br>
<br>
Отдельно стоит сказать про использование STM Standard Peripheral Library (SPL). <br>
Обычно (на просторах интернета), предлагается создать файл конфигурации, например, stm3210x_conf.h и в нем включать необходимые хэдеры от SPL. При этом исходные коды SPL также предлагается включать в проект и компилировать вместе со своими исходниками.<br>
Данный подход очень распространен среди приверженцев Make файлов.<br>
<br>
Но для чего так делать? Зачем таскать в своём проекте весь SPL и CMSIS, как-то их конфигурировать через .h файлы, если можно собрать SPL и CMSIS в статическую библиотеку и затем просто линковать её к своему проекту?<br>
Это позволит отделить SPL от непосредственно разрабатываемого софта и в целом упростит использование.<br>
<br>
Наш путь будет именно через сборку SPL и CMSIS в статическую библиотеку.<br>
Для самых ленивых, в конце статьи будут ссылки на готовые шаблоны проектов для CodeLite :)<br>
Поехали&#33;<br>
<br>
<br>
<strong class='tag-b'><span class='tag-size' data-value='14' style='font-size:14pt;'>Установка тулчейна для STM32 в Ubuntu Linux</span></strong><br>
Первое что нужно сделать - это установить компилятор. <br>
Мы сознательно не будем заниматься &quot;красноглазием&quot; - скачивать кучу пакетов, настраивать и собирать GCC из исходников.<br>
<br>
Есть правильный путь - установка из PPA.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded</div><div class="code_line">sudo apt-get update</div><div class="code_line">sudo apt-get install gcc-arm-none-eabi</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'><span class='tag-size' data-value='14' style='font-size:14pt;'>Настройка CodeLite</span></strong><br>
Теперь нам необходимо подключить компилятор arm-none-eabi к среде CodeLite.<br>
Делается это очень просто:<ol class="tag-list" type="1"><li>Открываем Settings -&gt; Build Settings</li><li>Напротив надписи &quot;Create New Compiller...&quot; жмем кнопку &quot;New...&quot;</li><li>Вводим имя нового компилятора. Любое. Например ARMNE (ARM None Eabi).</li><li>Жмем кнопку &quot;Ок&quot;</li></ol>Теперь в Tools нового компилятора дописываем к утилитам &quot;arm-none-eabi-&quot;. Не нужно это делать только для команды &quot;Make&quot;.<br>
<br>
<img class='tag-img' src='http://wavecon.ru/upload/ishop/items/64/auto/stm32_codelite_build_settings.jpg' alt='user posted image'><br>
<br>
По завершении жмем &quot;Ок&quot;. <br>
На этом настройка CodeLite закончена.<br>
<br>
Если при создании нового компилятора, он не появился в списке слева, то закройте окно Build Settings и откройте его снова. Созданный компилятор появится. Это баг CodeLite.<br>
<br>
<br>
<strong class='tag-b'><span class='tag-size' data-value='14' style='font-size:14pt;'>Сборка CMSIS и SPL в статическую библиотеку</span></strong><br>
Пора собрать обещанную библиотеку, которая очень сильно упростит нам разработку под STM32.<br>
<br>
В этой статье рассматривается сборка под <strong class='tag-b'>SMT32F10X MD</strong> контроллеры.<br>
Если Вы используете другую серию микроконтроллеров, то Вам потребуется заменить некоторые параметры конфигурации проекта на соотествующие Вашим микроконтроллерам.<br>
<br>
Итак, создаем новый проект Static Library и назовем его <strong class='tag-b'>libSTM32F10X</strong>.<br>
Т.к. линеек котроллеров серии 10Х несколько, то создадим конфигурацию проекта через &quot;Build -&gt; Configuration Manager&quot;<br>
В данном случае это будет STM32F10X_MD.<br>
<br>
И начинаем настраивать проект:<br>
<br>
<img class='tag-img' src='http://wavecon.ru/upload/ishop/items/64/auto/libSTM32F10X%20Project%20Settings_004.jpg' alt='user posted image'><br>
<br>
В целом всё как обычно, только выбираем нужный нам компилятор, который создали в самом начале.<br>
<br>
В настройка комилятора укажем дефайн, индивидуальный для кофигурации STM32F10X_MD.<br>
Этот дефайн необходим для SPL.<br>
<br>
<img class='tag-img' src='http://wavecon.ru/upload/ishop/items/64/auto/libSTM32F10X%20Project%20Settings_005.jpg' alt='user posted image'><br>
<br>
И напоследок укажем глобальные настройки проекта, которые применяются для всех конфигураций.<br>
<br>
<img class='tag-img' src='http://wavecon.ru/upload/ishop/items/64/auto/libSTM32F10X%20Project%20Settings_006.jpg' alt='user posted image'><br>
<br>
С настройкой проекта покончено.<br>
Можно бы уже собрать, но вот собирать пока нечего... исходники то мы не положили :)<br>
<br>
В папке с проектом создаем папки <strong class='tag-b'>src</strong> и <strong class='tag-b'>include</strong>, в которых у нас будут находиться исходники и заголовочные файлы соответственно.<br>
<br>
Теперь идем на сайт ST и качаем оттуда последюю версию стандартной библиотеки.<br>
На момент написания статьи это была версия 3.5.0. <br>
<br>
<a class='tag-url' href='http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1743/PF257890' target='_blank'>Ссылка на скачивание CMSIS + SPL</a><br>
<br>
Распаковываем архив.<br>
<br>
Перекладываем все файлы:<ul class="tag-list"><li><strong class='tag-b'>Libraries/STM32F10x_StdPeriph_Driver/src/*.c</strong> кладем в <strong class='tag-b'>src/stm32f10x</strong></li><li><strong class='tag-b'>Libraries/CMSIS/CM3/CoreSupport/core_cm3.c</strong> копируем <strong class='tag-b'>src/core_cm3.c</strong></li><li><strong class='tag-b'>Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c</strong> кладем в <strong class='tag-b'>src</strong><br>
</li><li><strong class='tag-b'>Libraries/STM32F10x_StdPeriph_Driver/inc/*.h</strong> кладем в <strong class='tag-b'>include/stm32f10x</strong></li><li><strong class='tag-b'>Libraries/CMSIS/CM3/CoreSupport/core_cm3.h</strong> копируем <strong class='tag-b'>include/core_cm3.h</strong></li><li><strong class='tag-b'>Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h</strong> кладем в <strong class='tag-b'>include</strong></li><li><strong class='tag-b'>Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h</strong> кладем в <strong class='tag-b'>include</strong></li></ul><br>
При этом для большего удобства, можно переименовать файлы из <strong class='tag-b'>Libraries/STM32F10x_StdPeriph_Driver/inc/*.h</strong>, отрезав от имени файла префикс <strong class='tag-b'>stm32f10x_</strong>, т.е. чтобы файл stm32f10x_gpio.h назывался просто gpio.h<br>
Конечно, придется поменять инклуды в *.c файлах. Зато в будущем использование будет более красивое:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;stm32f10x/gpio.h&#62;</div></ol></div></div></div></div><br>
<br>
<br>
Впринципе это и есть вся библиотека.<br>
Но мы влючим в неё ещё пару файлов <strong class='tag-b'>syscalls.c</strong> и <strong class='tag-b'>syscalls_hal.s</strong>.<br>
<br>
<strong class='tag-b'>src/syscalls.c</strong> содержит стандартные системные функции:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;stm32f10x.h&#62;</div><div class="code_line">#include &#60;stm32f10x/rcc.h&#62;</div><div class="code_line">#include &#60;stm32f10x/usart.h&#62;</div><div class="code_line">#include &#60;fcntl.h&#62;</div><div class="code_line">#include &#60;errno.h&#62;</div><div class="code_line">#include &#60;stdlib.h&#62;</div><div class="code_line">#include &#60;string.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">//! Uptime counter</div><div class="code_line">static __IO uint32_t __UptimeCounter = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">caddr_t _sbrk_getHeapStartAddress();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">caddr_t _sbrk( int Size ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;// - Current heap end pointer</div><div class="code_line">&nbsp;&nbsp; &nbsp;static caddr_t hHeapEnd;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// - Previous heap end pointer</div><div class="code_line">&nbsp;&nbsp; &nbsp;caddr_t hPrevHeapEnd;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// - Init heap pointer</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ( hHeapEnd == 0 ) hHeapEnd = _sbrk_getHeapStartAddress();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// - Get current stack pointer</div><div class="code_line">&nbsp;&nbsp; &nbsp;caddr_t hStackTop = (caddr_t)__get_MSP();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// - Store current heap pointer </div><div class="code_line">&nbsp;&nbsp; &nbsp;hPrevHeapEnd = hHeapEnd; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// - Check is heap overlaps stack</div><div class="code_line">&nbsp;&nbsp; &nbsp;if( hHeapEnd + Size &#62; hStackTop ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;errno = ENOMEM;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return (caddr_t)-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// - Add heap size</div><div class="code_line">&nbsp;&nbsp; &nbsp;hHeapEnd += Size;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// - Return result</div><div class="code_line">&nbsp;&nbsp; &nbsp;return hPrevHeapEnd;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">int usleep( useconds_t __useconds ){</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;volatile uint32_t nCount;</div><div class="code_line">&nbsp;&nbsp; &nbsp;RCC_ClocksTypeDef RCC_Clocks;</div><div class="code_line">&nbsp;&nbsp; &nbsp;RCC_GetClocksFreq (&amp;RCC_Clocks);</div><div class="code_line">&nbsp;&nbsp; &nbsp;nCount = ( RCC_Clocks.HCLK_Frequency / 10000000 ) * __useconds;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for( ; nCount !=0 ; nCount-- );</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">unsigned int sleep( unsigned int __seconds ){</div><div class="code_line">&nbsp;&nbsp; &nbsp;usleep( __seconds * 1000 * 1000 );</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">} </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">int _close( int __fd ){</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">ssize_t _write( int __fd, const void * __buf, size_t __n ){</div><div class="code_line">&nbsp;&nbsp; &nbsp;uint8_t * Buffer = (uint8_t*)__buf;</div><div class="code_line">&nbsp;&nbsp; &nbsp;switch( __fd ){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// --- USART 1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;case 1:{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for( size_t i = 0; i &#60; __n; i++ ){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// - Wait until TX ready</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// - Send</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;USART_SendData( USART1, Buffer[ i ] );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}; break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// --- USART 2</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;case 2:{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for( size_t i = 0; i &#60; __n; i++ ){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// - Wait until TX ready</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// - Send</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;USART_SendData( USART2, Buffer[ i ] );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}; break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// --- USART 3</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;case 3:{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for( size_t i = 0; i &#60; __n; i++ ){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// - Wait until TX ready</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// - Send</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;USART_SendData( USART3, Buffer[ i ] );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}; break;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">int _open( const char * __file, mode_t mode ){</div><div class="code_line">&nbsp;&nbsp; &nbsp;if( &nbsp; &nbsp; &nbsp; &nbsp; !strcmp( __file, &quot;/dev/usart1&quot; ) ) return 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;else if( &nbsp; &nbsp;!strcmp( __file, &quot;/dev/usart2&quot; ) ) return 2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;else if( &nbsp; &nbsp;!strcmp( __file, &quot;/dev/usart3&quot; ) ) return 3;</div><div class="code_line">&nbsp;&nbsp; &nbsp;else return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">ssize_t _read( int __fd, void * __buf, size_t __nbytes ){</div><div class="code_line">&nbsp;&nbsp; &nbsp;size_t i;</div><div class="code_line">&nbsp;&nbsp; &nbsp;size_t BytesRead = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;switch( __fd ){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;case 1: {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for( &nbsp;i = 0; i &#60; __nbytes; i++ ){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char c = (char)(USART_ReceiveData(USART1) &amp; (uint16_t) 0x01FF);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*((char*)__buf) = c;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;__buf++; BytesRead++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}; break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;case 2: {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for( &nbsp;i = 0; i &#60; __nbytes; i++ ){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char c = (char)(USART_ReceiveData(USART2) &amp; (uint16_t) 0x01FF);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*((char*)__buf) = c;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;__buf++; BytesRead++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}; break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;case 3: {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for( &nbsp;i = 0; i &#60; __nbytes; i++ ){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char c = (char)(USART_ReceiveData(USART3) &amp; (uint16_t) 0x01FF);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;*((char*)__buf) = c;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;__buf++; BytesRead++;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}; break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;default:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;errno = EBADF;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return BytesRead;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">void &nbsp;_exit(int x ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;while(1);</div><div class="code_line">}</div><div class="code_line">pid_t _getpid( ){</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 1;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int _kill( int x ){</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">int _fstat(int file, struct stat *st){</div><div class="code_line">&nbsp;&nbsp; &nbsp;st-&#62;st_mode = S_IFCHR;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int _isatty(int file)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;switch (file)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;case 1:</div><div class="code_line">&nbsp;&nbsp; &nbsp;case 2:</div><div class="code_line">&nbsp;&nbsp; &nbsp;case 3:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;default:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//errno = ENOTTY;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;errno = EBADF;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int _lseek(int file, int ptr, int dir){</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">uint32_t &nbsp; &nbsp;uptime_ms(){</div><div class="code_line">&nbsp;&nbsp; &nbsp;return __UptimeCounter;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">void SysTick_Handler(void){</div><div class="code_line">&nbsp;&nbsp; &nbsp;__UptimeCounter++;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
<br>
Как видно, тут есть функция _sbrk() которая нужна нам для malloc и new, а также некоторые функции ввода-вывода. Например, write(). Если переданный хэндл файла равен 1,2 или 3, то данные будут передаваться в USART1, USART2 или USART3 соответственно.<br>
<br>
Второй файл <strong class='tag-b'>src/syscalls_hal.s</strong> содержит функции для получения некоторых низкоуровневых значений.<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">.syntax unified</div><div class="code_line">.cpu cortex-m3</div><div class="code_line">.fpu softvfp</div><div class="code_line">.thumb</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">.section &nbsp; &nbsp;.text._sbrk_getHeapStartAddress</div><div class="code_line">.weak &nbsp; _sbrk_getHeapStartAddress</div><div class="code_line">.type &nbsp; _sbrk_getHeapStartAddress, %function</div><div class="code_line">&nbsp;</div><div class="code_line">_sbrk_getHeapStartAddress:</div><div class="code_line">&nbsp;&nbsp; &nbsp;ldr r0, = __HeapStart</div><div class="code_line">&nbsp;&nbsp; &nbsp;bx lr</div></ol></div></div></div></div><br>
<br>
Тут только одна функция _sbrk_getHeapStartAddress, которая используется в определенной выше _sbrk() и получает адрес в памяти, с которого начинается куча.<br>
<br>
Впринципе она не обязательна, можно просто использовать константу из линкера, но это более стабильное решение. <strong class='tag-b'>Константа может не работать</strong>, а такая функция работает всегда.<br>
<br>
Это всё. Теперь смело собирает статическую библиотеку libSTM32F10X_MD.a<br>
<br>
И переходим к созданию шаблона проекта для CodeLite.<br>
<br>
<br>
<strong class='tag-b'><span class='tag-size' data-value='14' style='font-size:14pt;'>Создание проекта CodeLite для STM32</span></strong><br>
Как известно, в CodeLite шаблоны создаются одним кликом из существующих проектов. Поэтому нам нужно создать сам проект.<br>
<br>
Итак, создаем новый проект. Поскольку это в будущем будет шаблон для конкретного чипа, то назовем его как модель этого чипа. <br>
В нашем случае это будет STM32F103C8T6.<br>
<br>
Основные параметры стандартные. <br>
<br>
<img class='tag-img' src='http://wavecon.ru/upload/ishop/items/64/auto/STM32F103C8T6%20Project%20Settings_007.jpg' alt='user posted image'><br>
<br>
Глобальные настройки компилятора аналогичны предудущему проекту. Только в этот раз дефайн STM32F10X_MD мы указываем в глобальных дефайнах т.к. STM32F103C8T6 именно MD линейки.<br>
<br>
<img class='tag-img' src='http://wavecon.ru/upload/ishop/items/64/auto/STM32F103C8T6%20Project%20Settings_008.jpg' alt='user posted image'><br>
<br>
А вот настройки линкера уже специальные:<br>
<br>
<img class='tag-img' src='http://wavecon.ru/upload/ishop/items/64/auto/STM32F103C8T6%20Project%20Settings_009.jpg' alt='user posted image'><br>
<br>
Полная строка опций:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">-nostartfiles -mcpu=cortex-m3 -mthumb -TSTM32F103C8T6.ld</div><div class="code_line">-Wl,-Map=~Build/$(ConfigurationName)/$(ProjectName).map -Wl,-gc-sections</div></ol></div></div></div></div><br>
<br>
Также нам нужен Post Build чтобы из эльфа создать бинарную прошивку.<br>
Создавать будем в двух варинтах BIN и HEX.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">arm-none-eabi-size ~Build/$(ConfigurationName)/$(ProjectName).elf</div><div class="code_line">arm-none-eabi-objcopy -Obinary ~Build/$(ConfigurationName)/$(ProjectName).elf ~Build/$(ConfigurationName)/$(ProjectName).bin</div><div class="code_line">arm-none-eabi-objcopy -Oihex ~Build/$(ConfigurationName)/$(ProjectName).elf ~Build/$(ConfigurationName)/$(ProjectName).hex</div></ol></div></div></div></div><br>
<br>
<img class='tag-img' src='http://wavecon.ru/upload/ishop/items/64/auto/STM32F103C8T6%20Project%20Settings_010.jpg' alt='user posted image'><br>
<br>
По настройке все. Однако, прежде чем радостно создавать main.c или main.cpp и писать код прошивки, нам сначала нужно добавить ещё парочку обязательных файлов в проект.<br>
<br>
Первый обязательный файл - это скрипт линкера <strong class='tag-b'>STM32F103C8T6.ld</strong>.<br>
Его содержание следующее:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">/* Linker script to configure memory regions. */</div><div class="code_line">MEMORY {</div><div class="code_line">&nbsp;&nbsp; &nbsp;FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 0x20000 &nbsp;/* 128k */</div><div class="code_line">&nbsp;&nbsp; &nbsp;RAM (rw) &nbsp; : ORIGIN = 0x20000000, LENGTH = 0x5000 &nbsp; /* 20k &nbsp;*/</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">/* Library configurations */</div><div class="code_line">GROUP(libgcc.a libc.a libm.a libSTM32F10X_MD.a)</div><div class="code_line">&nbsp;</div><div class="code_line">/* Linker script to place sections and symbol values. Should be used together</div><div class="code_line">&nbsp;* with other linker script that defines memory regions FLASH and RAM.</div><div class="code_line">&nbsp;* It references following symbols, which must be defined in code:</div><div class="code_line">&nbsp;* &nbsp; Reset_Handler : Entry of reset handler</div><div class="code_line">&nbsp;* </div><div class="code_line">&nbsp;* It defines following symbols, which code can use without definition:</div><div class="code_line">&nbsp;* &nbsp; __exidx_start</div><div class="code_line">&nbsp;* &nbsp; __exidx_end</div><div class="code_line">&nbsp;* &nbsp; __etext</div><div class="code_line">&nbsp;* &nbsp; __data_start__</div><div class="code_line">&nbsp;* &nbsp; __preinit_array_start</div><div class="code_line">&nbsp;* &nbsp; __preinit_array_end</div><div class="code_line">&nbsp;* &nbsp; __init_array_start</div><div class="code_line">&nbsp;* &nbsp; __init_array_end</div><div class="code_line">&nbsp;* &nbsp; __fini_array_start</div><div class="code_line">&nbsp;* &nbsp; __fini_array_end</div><div class="code_line">&nbsp;* &nbsp; __data_end__</div><div class="code_line">&nbsp;* &nbsp; __bss_start__</div><div class="code_line">&nbsp;* &nbsp; __bss_end__</div><div class="code_line">&nbsp;* &nbsp; __end__</div><div class="code_line">&nbsp;* &nbsp; __HeapLimit</div><div class="code_line">&nbsp;* &nbsp; __StackLimit</div><div class="code_line">&nbsp;* &nbsp; __StackTop</div><div class="code_line">&nbsp;* &nbsp; __stack</div><div class="code_line">&nbsp;*/</div><div class="code_line">ENTRY(Reset_Handler)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">SECTIONS {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.text : {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;KEEP(*(.isr_vector))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(.text)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(.text.*)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;KEEP(*(.init))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;KEEP(*(.fini))</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/* .ctors */</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*crtbegin.o(.ctors)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*crtbegin?.o(.ctors)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(SORT(.ctors.*))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(.ctors)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/* .dtors */</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*crtbegin.o(.dtors)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*crtbegin?.o(.dtors)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(SORT(.dtors.*))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(.dtors)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(.rodata*)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;KEEP(*(.eh_frame*))</div><div class="code_line">&nbsp;&nbsp; &nbsp;} &#62; FLASH</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.ARM.extab : {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(.ARM.extab* .gnu.linkonce.armextab.*)</div><div class="code_line">&nbsp;&nbsp; &nbsp;} &#62; FLASH</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;__exidx_start = .;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.ARM.exidx : {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(.ARM.exidx* .gnu.linkonce.armexidx.*)</div><div class="code_line">&nbsp;&nbsp; &nbsp;} &#62; FLASH</div><div class="code_line">&nbsp;&nbsp; &nbsp;__exidx_end = .;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;_sidata = .;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.data : AT ( _sidata ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_sdata = .;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(vtable)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(.data*)</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;. = ALIGN(4);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/* preinit data */</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PROVIDE (__preinit_array_start = .);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(.preinit_array)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PROVIDE (__preinit_array_end = .);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;. = ALIGN(4);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/* init data */</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PROVIDE (__init_array_start = .);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(SORT(.init_array.*))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(.init_array)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PROVIDE (__init_array_end = .);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;. = ALIGN(4);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/* finit data */</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PROVIDE (__fini_array_start = .);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(SORT(.fini_array.*))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(.fini_array)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;PROVIDE (__fini_array_end = .);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;. = ALIGN(4);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/* All data end */</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_edata = .;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} &#62; RAM</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.bss : {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_sbss = .;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(.bss*)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(COMMON)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;_ebss = .;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} &#62; RAM</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.heap : {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;__HeapStart = .;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(.heap*)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;__HeapLimit = .;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} &#62; RAM</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/* .stack_dummy section doesn&#39;t contains any symbols. It is only</div><div class="code_line">&nbsp;&nbsp; &nbsp; * used for linker to calculate size of stack sections, and assign</div><div class="code_line">&nbsp;&nbsp; &nbsp; * values to stack symbols later */</div><div class="code_line">&nbsp;&nbsp; &nbsp;.stack : {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(.stack)</div><div class="code_line">&nbsp;&nbsp; &nbsp;} &#62; RAM</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/* Set stack top to end of RAM, and stack limit move down by</div><div class="code_line">&nbsp;&nbsp; &nbsp; * size of stack_dummy section */</div><div class="code_line">&nbsp;&nbsp; &nbsp;__StackTop &nbsp; &nbsp; &nbsp;= ORIGIN(RAM) + LENGTH(RAM);</div><div class="code_line">&nbsp;&nbsp; &nbsp;__StackLimit &nbsp; &nbsp;= __StackTop - SIZEOF(.stack);</div><div class="code_line">&nbsp;&nbsp; &nbsp;_estack &nbsp; &nbsp; &nbsp; &nbsp; = __StackTop;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;/* Check if data + heap + stack exceeds RAM limit */</div><div class="code_line">&nbsp;&nbsp; &nbsp;ASSERT(__StackLimit &#62;= __HeapLimit, &quot;RAM overflowed with stack&quot;)</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Второй файл - это <strong class='tag-b'>startup.s</strong> который по сути просто скопирован из SPL (Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.s)<br>
<br>
Его содержание:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">/**</div><div class="code_line">&nbsp;&nbsp;******************************************************************************</div><div class="code_line">&nbsp;&nbsp;* @file &nbsp; &nbsp; &nbsp;startup_stm32f10x_md.s</div><div class="code_line">&nbsp;&nbsp;* @author &nbsp; &nbsp;MCD Application Team</div><div class="code_line">&nbsp;&nbsp;* @version &nbsp; V3.5.0</div><div class="code_line">&nbsp;&nbsp;* @date &nbsp; &nbsp; &nbsp;11-March-2011</div><div class="code_line">&nbsp;&nbsp;* @brief &nbsp; &nbsp; STM32F10x Medium Density Devices vector table for RIDE7 toolchain.</div><div class="code_line">&nbsp;&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;This module performs:</div><div class="code_line">&nbsp;&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- Set the initial SP</div><div class="code_line">&nbsp;&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- Set the initial PC == Reset_Handler,</div><div class="code_line">&nbsp;&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- Set the vector table entries with the exceptions ISR address</div><div class="code_line">&nbsp;&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- Configure the clock system </div><div class="code_line">&nbsp;&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- Branches to main in the C library (which eventually</div><div class="code_line">&nbsp;&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;calls main()).</div><div class="code_line">&nbsp;&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;After Reset the Cortex-M3 processor is in Thread mode,</div><div class="code_line">&nbsp;&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;priority is Privileged, and the Stack is set to Main.</div><div class="code_line">&nbsp;&nbsp;******************************************************************************</div><div class="code_line">&nbsp;&nbsp;* @attention</div><div class="code_line">&nbsp;&nbsp;*</div><div class="code_line">&nbsp;&nbsp;* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS</div><div class="code_line">&nbsp;&nbsp;* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE</div><div class="code_line">&nbsp;&nbsp;* TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY</div><div class="code_line">&nbsp;&nbsp;* DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING</div><div class="code_line">&nbsp;&nbsp;* FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE</div><div class="code_line">&nbsp;&nbsp;* CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.</div><div class="code_line">&nbsp;&nbsp;*</div><div class="code_line">&nbsp;&nbsp;* &#60;h2&#62;&#60;center&#62;&copy; COPYRIGHT 2011 STMicroelectronics&#60;/center&#62;&#60;/h2&#62;</div><div class="code_line">&nbsp;&nbsp;******************************************************************************</div><div class="code_line">&nbsp;&nbsp;*/</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;.syntax unified</div><div class="code_line">&nbsp;&nbsp; &nbsp;.cpu cortex-m3</div><div class="code_line">&nbsp;&nbsp; &nbsp;.fpu softvfp</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb</div><div class="code_line">&nbsp;</div><div class="code_line">.global g_pfnVectors</div><div class="code_line">.global Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">/* start address for the initialization values of the .data section. </div><div class="code_line">defined in linker script */</div><div class="code_line">.word &nbsp; _sidata</div><div class="code_line">/* start address for the .data section. defined in linker script */ &nbsp;</div><div class="code_line">.word &nbsp; _sdata</div><div class="code_line">/* end address for the .data section. defined in linker script */</div><div class="code_line">.word &nbsp; _edata</div><div class="code_line">/* start address for the .bss section. defined in linker script */</div><div class="code_line">.word &nbsp; _sbss</div><div class="code_line">/* end address for the .bss section. defined in linker script */</div><div class="code_line">.word &nbsp; _ebss</div><div class="code_line">&nbsp;</div><div class="code_line">.equ &nbsp;BootRAM, 0xF108F85F</div><div class="code_line">/**</div><div class="code_line">&nbsp;* @brief &nbsp;This is the code that gets called when the processor first</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;starts execution following a reset event. Only the absolutely</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;necessary set is performed, after which the application</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;supplied main() routine is called. </div><div class="code_line">&nbsp;* @param &nbsp;None</div><div class="code_line">&nbsp;* @retval : None</div><div class="code_line">*/</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.section &nbsp; &nbsp;.text.Reset_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; Reset_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.type &nbsp; Reset_Handler, %function</div><div class="code_line">Reset_Handler: &nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">/* Copy the data segment initializers from flash to SRAM */ &nbsp;</div><div class="code_line">&nbsp;&nbsp;movs &nbsp;r1, #0</div><div class="code_line">&nbsp;&nbsp;b LoopCopyDataInit</div><div class="code_line">&nbsp;</div><div class="code_line">CopyDataInit:</div><div class="code_line">&nbsp;&nbsp; &nbsp;ldr r3, =_sidata</div><div class="code_line">&nbsp;&nbsp; &nbsp;ldr r3, [r3, r1]</div><div class="code_line">&nbsp;&nbsp; &nbsp;str r3, [r0, r1]</div><div class="code_line">&nbsp;&nbsp; &nbsp;adds &nbsp; &nbsp;r1, r1, #4</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">LoopCopyDataInit:</div><div class="code_line">&nbsp;&nbsp; &nbsp;ldr r0, =_sdata</div><div class="code_line">&nbsp;&nbsp; &nbsp;ldr r3, =_edata</div><div class="code_line">&nbsp;&nbsp; &nbsp;adds &nbsp; &nbsp;r2, r0, r1</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp r2, r3</div><div class="code_line">&nbsp;&nbsp; &nbsp;bcc CopyDataInit</div><div class="code_line">&nbsp;&nbsp; &nbsp;ldr r2, =_sbss</div><div class="code_line">&nbsp;&nbsp; &nbsp;b &nbsp; LoopFillZerobss</div><div class="code_line">/* Zero fill the bss segment. */ &nbsp;</div><div class="code_line">FillZerobss:</div><div class="code_line">&nbsp;&nbsp; &nbsp;movs &nbsp; &nbsp;r3, #0</div><div class="code_line">&nbsp;&nbsp; &nbsp;str r3, [r2], #4</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">LoopFillZerobss:</div><div class="code_line">&nbsp;&nbsp; &nbsp;ldr r3, = _ebss</div><div class="code_line">&nbsp;&nbsp; &nbsp;cmp r2, r3</div><div class="code_line">&nbsp;&nbsp; &nbsp;bcc FillZerobss</div><div class="code_line">/* Call the clock system intitialization function.*/</div><div class="code_line">&nbsp;&nbsp;bl &nbsp;SystemInit &nbsp; &nbsp;</div><div class="code_line">/* Call the application&#39;s entry point.*/</div><div class="code_line">&nbsp;&nbsp; &nbsp;bl &nbsp;main</div><div class="code_line">&nbsp;&nbsp; &nbsp;bx &nbsp;lr &nbsp; &nbsp;</div><div class="code_line">.size &nbsp; Reset_Handler, .-Reset_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">/**</div><div class="code_line">&nbsp;* @brief &nbsp;This is the code that gets called when the processor receives an </div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; unexpected interrupt. This simply enters an infinite loop, preserving</div><div class="code_line">&nbsp;* &nbsp; &nbsp; &nbsp; &nbsp; the system state for examination by a debugger.</div><div class="code_line">&nbsp;* @param &nbsp;None &nbsp; &nbsp; </div><div class="code_line">&nbsp;* @retval None &nbsp; &nbsp; &nbsp; </div><div class="code_line">*/</div><div class="code_line">&nbsp;&nbsp; &nbsp;.section &nbsp; &nbsp;.text.Default_Handler,&quot;ax&quot;,%progbits</div><div class="code_line">Default_Handler:</div><div class="code_line">Infinite_Loop:</div><div class="code_line">&nbsp;&nbsp; &nbsp;b &nbsp; Infinite_Loop</div><div class="code_line">&nbsp;&nbsp; &nbsp;.size &nbsp; Default_Handler, .-Default_Handler</div><div class="code_line">/******************************************************************************</div><div class="code_line">*</div><div class="code_line">* The minimal vector table for a Cortex M3. &nbsp;Note that the proper constructs</div><div class="code_line">* must be placed on this to ensure that it ends up at physical address</div><div class="code_line">* 0x0000.0000.</div><div class="code_line">*</div><div class="code_line">******************************************************************************/ &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.section &nbsp; &nbsp;.isr_vector,&quot;a&quot;,%progbits</div><div class="code_line">&nbsp;&nbsp; &nbsp;.type &nbsp; g_pfnVectors, %object</div><div class="code_line">&nbsp;&nbsp; &nbsp;.size &nbsp; g_pfnVectors, .-g_pfnVectors</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">g_pfnVectors:</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; _estack</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; Reset_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; NMI_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; HardFault_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; MemManage_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; BusFault_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; UsageFault_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; SVC_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; DebugMon_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; PendSV_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; SysTick_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; WWDG_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; PVD_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; TAMPER_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; RTC_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; FLASH_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; RCC_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; EXTI0_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; EXTI1_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; EXTI2_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; EXTI3_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; EXTI4_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; DMA1_Channel1_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; DMA1_Channel2_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; DMA1_Channel3_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; DMA1_Channel4_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; DMA1_Channel5_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; DMA1_Channel6_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; DMA1_Channel7_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; ADC1_2_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; USB_HP_CAN1_TX_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; USB_LP_CAN1_RX0_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; CAN1_RX1_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; CAN1_SCE_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; EXTI9_5_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; TIM1_BRK_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; TIM1_UP_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; TIM1_TRG_COM_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; TIM1_CC_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; TIM2_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; TIM3_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; TIM4_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; I2C1_EV_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; I2C1_ER_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; I2C2_EV_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; I2C2_ER_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; SPI1_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; SPI2_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; USART1_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; USART2_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; USART3_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; EXTI15_10_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; RTCAlarm_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; USBWakeUp_IRQHandler &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;.word &nbsp; BootRAM &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* @0x108. This is for boot in RAM mode for </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;STM32F10x Medium Density devices. */</div><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">/*******************************************************************************</div><div class="code_line">*</div><div class="code_line">* Provide weak aliases for each Exception handler to the Default_Handler. </div><div class="code_line">* As they are weak aliases, any function with the same name will override </div><div class="code_line">* this definition.</div><div class="code_line">*</div><div class="code_line">*******************************************************************************/</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;.weak NMI_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set NMI_Handler,Default_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;.weak HardFault_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set HardFault_Handler,Default_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;.weak MemManage_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set MemManage_Handler,Default_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp;.weak BusFault_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set BusFault_Handler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; UsageFault_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set UsageFault_Handler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; SVC_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set SVC_Handler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; DebugMon_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set DebugMon_Handler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; PendSV_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set PendSV_Handler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; SysTick_Handler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set SysTick_Handler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; WWDG_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set WWDG_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; PVD_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set PVD_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; TAMPER_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set TAMPER_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; RTC_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set RTC_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; FLASH_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set FLASH_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; RCC_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set RCC_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; EXTI0_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set EXTI0_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; EXTI1_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set EXTI1_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; EXTI2_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set EXTI2_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; EXTI3_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set EXTI3_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; EXTI4_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set EXTI4_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; DMA1_Channel1_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set DMA1_Channel1_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; DMA1_Channel2_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set DMA1_Channel2_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; DMA1_Channel3_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set DMA1_Channel3_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; DMA1_Channel4_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set DMA1_Channel4_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; DMA1_Channel5_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set DMA1_Channel5_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; DMA1_Channel6_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set DMA1_Channel6_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; DMA1_Channel7_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set DMA1_Channel7_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; ADC1_2_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set ADC1_2_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; USB_HP_CAN1_TX_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; USB_LP_CAN1_RX0_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; CAN1_RX1_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set CAN1_RX1_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; CAN1_SCE_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set CAN1_SCE_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; EXTI9_5_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set EXTI9_5_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; TIM1_BRK_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set TIM1_BRK_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; TIM1_UP_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set TIM1_UP_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; TIM1_TRG_COM_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; TIM1_CC_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set TIM1_CC_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; TIM2_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set TIM2_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; TIM3_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set TIM3_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; TIM4_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set TIM4_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; I2C1_EV_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set I2C1_EV_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; I2C1_ER_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set I2C1_ER_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; I2C2_EV_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set I2C2_EV_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; I2C2_ER_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set I2C2_ER_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; SPI1_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set SPI1_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; SPI2_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set SPI2_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; USART1_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set USART1_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; USART2_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set USART2_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; USART3_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set USART3_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; EXTI15_10_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set EXTI15_10_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; RTCAlarm_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set RTCAlarm_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;.weak &nbsp; USBWakeUp_IRQHandler</div><div class="code_line">&nbsp;&nbsp; &nbsp;.thumb_set USBWakeUp_IRQHandler,Default_Handler</div><div class="code_line">&nbsp;</div><div class="code_line">/******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/</div></ol></div></div></div></div><br>
<br>
<br>
<strong class='tag-b'><span class='tag-size' data-value='14' style='font-size:14pt;'>Пример программы для STM32 на C под CodeLite</span></strong><br>
<br>
А вот теперь давайте создадим main.c и попробуем отправлять данные через USART1<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;stm32f10x.h&#62;</div><div class="code_line">#include &#60;stm32f10x/gpio.h&#62;</div><div class="code_line">#include &#60;stm32f10x/usart.h&#62;</div><div class="code_line">#include &#60;stm32f10x/rcc.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">#include &#60;stdlib.h&#62;</div><div class="code_line">#include &#60;string.h&#62;</div><div class="code_line">#include &#60;unistd.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">int main(){</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// - Enable clocks</div><div class="code_line">&nbsp;&nbsp; &nbsp;RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, &nbsp; ENABLE );</div><div class="code_line">&nbsp;&nbsp; &nbsp;RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1, &nbsp;ENABLE );</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// - Configure GPIO pins</div><div class="code_line">&nbsp;&nbsp; &nbsp;GPIO_InitTypeDef TX, RX;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TX.GPIO_Speed &nbsp; &nbsp; &nbsp; = GPIO_Speed_50MHz;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TX.GPIO_Mode &nbsp; &nbsp; &nbsp; &nbsp;= GPIO_Mode_AF_PP;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TX.GPIO_Pin &nbsp; &nbsp; &nbsp; &nbsp; = GPIO_Pin_9;</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;RX.GPIO_Speed &nbsp; &nbsp; &nbsp; = GPIO_Speed_50MHz;</div><div class="code_line">&nbsp;&nbsp; &nbsp;RX.GPIO_Mode &nbsp; &nbsp; &nbsp; &nbsp;= GPIO_Mode_IN_FLOATING;</div><div class="code_line">&nbsp;&nbsp; &nbsp;RX.GPIO_Pin &nbsp; &nbsp; &nbsp; &nbsp; = GPIO_Pin_10;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// - Init GPIO pins</div><div class="code_line">&nbsp;&nbsp; &nbsp;GPIO_Init( GPIOA, &amp;RX );</div><div class="code_line">&nbsp;&nbsp; &nbsp;GPIO_Init( GPIOA, &amp;TX );</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// - Configure USART</div><div class="code_line">&nbsp;&nbsp; &nbsp;USART_InitTypeDef usart;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usart.USART_BaudRate &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= 9600;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usart.USART_Mode &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= USART_Mode_Rx | USART_Mode_Tx;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usart.USART_WordLength &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= USART_WordLength_8b;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usart.USART_StopBits &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= USART_StopBits_1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usart.USART_Parity &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= USART_Parity_No;</div><div class="code_line">&nbsp;&nbsp; &nbsp;usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// - Init USART</div><div class="code_line">&nbsp;&nbsp; &nbsp;USART_Init( USART1, &amp;usart );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// - Start USART</div><div class="code_line">&nbsp;&nbsp; &nbsp;USART_Cmd( USART1, ENABLE );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// --- Enter main loop</div><div class="code_line">&nbsp;&nbsp; &nbsp;while(1){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// - Allocate buffer (malloc test)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;char * Buffer = malloc( 64 );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;memset( Buffer, 0, 64 );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// - Copy string into buffer</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;strcpy( Buffer, &quot;Hello world!\n&quot; );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// - Write data into USART1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;write( 1, Buffer, strlen( Buffer ) );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// - Release memory</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;free( Buffer );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// - Sleep one second</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sleep( 1 );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Компилируем и заливаем в микроконтроллер.<br>
Кстати, заливать в контроллер очень удобно и просто при помощи <a class='tag-url' href='https://code.google.com/p/stm32flash/' target='_blank'>stm32flash</a>.<br>
Её к сожалению пока нет в репозитории, поэтому потребуется скачать исходники и собрать. Благо это делается обычным make &amp; make install.<br>
<br>
<strong class='tag-b'><span class='tag-size' data-value='14' style='font-size:14pt;'>Резюме</span></strong><br>
Итого, CodeLite IDE отлично подходит для разработки на С/С++ под STM32 в Linux.<br>
Сборка SPL и CMSIS в статическую библиотеку сильно снижает сложность проектов, делает их более &quot;легкими&quot;, без какого либо вреда размеру кода или производительности прошивки.<br>
<br>
Данный подход также позоляет вести разработку на C++ простым изменением расширения файлов с &quot;*.c&quot; на &quot;*.cpp&quot;. CodeLite автоматически применят GCC или G++ в зависимости от расширения файла.<br>
<br>
Однако, стоит заметить, что C++ проекты имет несколько больший размер скомпилированного кода. Это связано непосредственно с особенностями C++.<br>
<br>
Использовать C++ или C, необходимо решать для каждого проекта отдельно, исходя из задач.<br>
<br>
В следующей статье будет затронута тема отладки кода на микроконтроллере из CodeLite IDE.<br>
<br>
<br>
<strong class='tag-b'><span class='tag-size' data-value='14' style='font-size:14pt;'>Полезные ссылки</span></strong><ul class="tag-list"><li><a class='tag-url' href='http://codelite.org' target='_blank'>Официальный сайт CodeLite IDE</a></li><li><a class='tag-url' href='http://wavecon.ru/upload/ishop/items/64/libSTM32F10X.zip' target='_blank'>Проект libSTM32F10X</a></li><li><a class='tag-url' href='http://wavecon.ru/upload/ishop/items/64/STM32F103C8T6.zip' target='_blank'>Шаблон проекта для STM32F103C8T6</a></li></ul><br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray">Источник: <a class='tag-url' href='http://wavecon.ru/ru/tech/setup_stm32_toolchain_with_codelite' target='_blank'>Программирование STM32 в Linux с использованием CodeLite IDE</a></span>]]></description>
        <author>HardRock</author>
        <category>Микроконтроллеры</category>
      </item>
	
      </channel>
      </rss>
	