<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Elektronika i Programowanie &#187; ARM</title>
	<atom:link href="http://tutro.net/tag/arm/feed/" rel="self" type="application/rss+xml" />
	<link>http://tutro.net</link>
	<description>Blog studenta Automatyki i Robotyki</description>
	<lastBuildDate>Wed, 21 Jul 2010 11:48:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Moduł z mikrokontrolerem STM32F103RBT</title>
		<link>http://tutro.net/elektronika/modul-z-mikrokontrolerem-stm32f103rbt/</link>
		<comments>http://tutro.net/elektronika/modul-z-mikrokontrolerem-stm32f103rbt/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 11:53:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Elektronika]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[Cortex]]></category>
		<category><![CDATA[Cortex-M3]]></category>
		<category><![CDATA[mikrokontrolery]]></category>
		<category><![CDATA[mikroprocesory]]></category>
		<category><![CDATA[ST Microelectronics]]></category>
		<category><![CDATA[STM32]]></category>

		<guid isPermaLink="false">http://tutro.net/?p=41</guid>
		<description><![CDATA[Już parę postów pojawiło się na moim blogu, ale póki co wszystkie są &#8222;teoretyczne&#8221;. Tak więc nadszedł czas, aby wreszcie zrobić coś praktycznego. Pierwszym projektem, jaki chciałem przedstawić jest moduł z mikrokontrolerem STM32F103RBT. Moduł powstał jako dedykowany do płytki prototypowej własnego projektu. PCB zostało tak zaprojektowane, żeby można było go wpiąć w slot umieszczony na [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/03/stm32dip-3d.png"><img class="alignleft size-medium wp-image-47" title="STM32F103RBT DIP-MODULE" src="http://tutro.net/wp-content/uploads/2010/03/stm32dip-3d-300x243.png" alt="" width="240" height="194" /></a>Już parę postów pojawiło się na moim blogu, ale póki co wszystkie są &#8222;teoretyczne&#8221;. Tak więc nadszedł czas, aby wreszcie zrobić coś praktycznego. Pierwszym projektem, jaki chciałem przedstawić jest moduł z mikrokontrolerem STM32F103RBT. Moduł powstał jako dedykowany do płytki prototypowej własnego projektu. PCB zostało tak zaprojektowane, żeby można było go wpiąć w slot umieszczony na tej płytce. Nie mniej jednak, może on działać także niezależnie, jako prosta płytka prototypowa, lub element jakiegoś urządzenia.</p>
<p style="text-align: justify;"><span id="more-41"></span></p>
<p style="text-align: justify;">Płytka jest bardzo prosta i nie zawiera praktycznie żadnych dodatkowych (prócz mikrokontrolera) układów zewnętrznych. Znajdziemy na niej mikrokontroler, złącze JTAG, rezonatory 8MHz i 32kHz, przycisk reset i odpowiednie kondensatory filtrujące. Dodatkowo na płytce umieściłem zestaw zworek które pozwalają w pewnym stopniu konfigurować układ. LSE i HSE odpowiedzialne są za podłączanie i odłączanie rezonatorów do i od procesora, zworki BOOT0 i BOOT1 odpowiadają za wybór trybu bootowania. Nie będę tu opisywał tych trybów, gdyż opis taki można znaleźć w datasheet&#8217;cie. Przewidziałem także dwie zworki, które umożliwiają podłączanie i odłączanie napięcia zasilającego z pin&#8217;ów VCC i VBAT. Pozwala to na testowanie układów z podtrzymaniem bateryjnym.</p>
<p style="text-align: justify;">Dokumentacja do projektu:</p>
<p style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/03/Schematic-Prints.pdf" target="_self">Schemat ideowy</a></p>
<p style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/03/Composite-Drawing.pdf" target="_self">Schemat montażowy</a></p>
<p style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/03/Final-Artwork-Prints.pdf" target="_self">TOP i BOTTOM &#8211; 1200 DPI</a> (do transferu, albo metody fotochemicznej &#8211; UWAGA!!! warstwa TOP &#8211; lustrzane odbicie)</p>
<p style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/03/Bill-of-Materials.pdf" target="_self">Lista komponentów</a></p>
<p style="text-align: justify;">Nie wiem, czy dla kogokolwiek będzie interesujący taki moduł, ale może akurat :)</p>
]]></content:encoded>
			<wfw:commentRss>http://tutro.net/elektronika/modul-z-mikrokontrolerem-stm32f103rbt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Kompilacja OpenOCD i podpięcie do Eclipse CDT</title>
		<link>http://tutro.net/elektronika/kompilacja-openocd-i-podpiecie-do-eclipse-cdt/</link>
		<comments>http://tutro.net/elektronika/kompilacja-openocd-i-podpiecie-do-eclipse-cdt/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 00:39:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Elektronika]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[debugger]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[JTAG]]></category>
		<category><![CDATA[mikrokontrolery]]></category>
		<category><![CDATA[mikroprocesory]]></category>
		<category><![CDATA[OpenOCD]]></category>

		<guid isPermaLink="false">http://tutro.net/?p=18</guid>
		<description><![CDATA[Z biegiem czasu gdy tworzy się coraz większe projekty, na coraz to lepsze i bardziej rozbudowane mikrokontrolery panowanie nad kodem staje się coraz trudniejsze. Często ciężko przewidzieć pewne rzeczy, a to prowadzi z kolei do błędów, które później bardzo ciężko znaleźć. Aby przyspieszyć tworzenie oprogramowania i skrócić tzw. &#8222;time to market&#8221; producenci wyposażają swoje układy [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/03/bug.png"><img class="alignleft size-full wp-image-39" title="bug" src="http://tutro.net/wp-content/uploads/2010/03/bug.png" alt="" width="128" height="128" /></a>Z biegiem czasu gdy tworzy się coraz większe projekty, na coraz to lepsze i bardziej rozbudowane mikrokontrolery panowanie nad kodem staje się coraz trudniejsze. Często ciężko przewidzieć pewne rzeczy, a to prowadzi z kolei do błędów, które później bardzo ciężko znaleźć. Aby przyspieszyć tworzenie oprogramowania i skrócić tzw. &#8222;time to market&#8221; producenci wyposażają swoje układy w interfejsy które pozwalają debugować program podczas wykonywania. Daje to niesamowite możliwości i bardzo ułatwia tworzenie bezbłędnego kodu. Obecnie prawie każdy mikrokontroler, który kosztuje więcej niż 10zł ma na pokładzie jakiś interfejs do debugowania. Najczęściej jest to popularny JTAG, ale coraz częściej pojawiają się też inne, np. Serial Wire Debug, które zaczynają z nim konkurować. Żeby moc debugować program przez JTAG potrzebujemy dwóch rzeczy: po pierwsze interfejsu JTAG podłączanego do komputera (przez LPT bądź USB), a po drugie oprogramowania. W tym artykule zajmę się tylko tą drugą częścią&#8230;</p>
<h1 style="text-align: justify;"><span id="more-18"></span>Dlaczego OpenOCD?!?</h1>
<p style="text-align: justify;">Na rynku istnieje wiele komercyjnych środowisk, niektóre nawet w darmowych wersjach. Jest tylko jeden problem&#8230; Mianowicie istnieją dwie możliwości&#8230; Pierwsza jest taka, że środowisko jest płatne i obsługuje większość JTAG&#8217;ów na rynku, a druga jest taka, że środowisko jest darmowe i obsługuje tylko jeden konkretny JTAG sprzedawany za ciężkie pieniądze przez twórców tego środowiska. Tak więc nie wygląda to zbyt kolorowo. Nie mniej jednak nie jest, aż tak źle. Tak samo, jak w przypadku kompilatorów i IDE (zapraszam do posta gościnnie napisanego przez mojego kolegę: <a title="Integracja Eclipse CDT z CodeSourcery dla ARM Cortex-M3" href="../elektronika/integracja-eclipse-cdt-z-codesourcery-dla-arm-cortex-m3/" target="_self">Integracja Eclipse CDT z CodeSourcery dla ARM Cortex-M3</a>) trzeba będzie się trochę natrudzić i nie wszystko będzie podane na tacy, ale można mieć całkiem sprawny aparat do debugowania całkowicie za darmo. Jak zapewne się już domyślacie mowa tutaj o OpenOCD. No to zaczynamy :)</p>
<h1 style="text-align: justify;">Cygwin</h1>
<p style="text-align: justify;">Podstawowy problem (a może raczej wyzwanie :P) z OpenOCD polega na tym, że trzeba je sobie skompilować :) Jako, że będziemy to robić pod windowsem, będziemy potrzebować cygwina, więc musimy sobie go najpierw ściągnąć (np. z oficjalnej strony: <a title="http://cygwin.com/" href="http://cygwin.com/" target="_blank">http://cygwin.com/</a>, a dokładnie <a title="stąd" href="http://cygwin.com/setup.exe">stąd</a>) i zainstalować. Instalacja jest dość prosta, a po kolei wygląda to tak:</p>
<ul style="text-align: justify;">
<li>uruchamiamy plik setup.exe</li>
<li>wybieramy instalację z internetu</li>
<li>wybieramy ścieżkę instalacji cygwina (najlepiej zostawić domyślną C:\cygwin), tutaj pragnę zwrócić uwagę na to, by przy instalowaniu wszelkiego rodzaju kompilatorów i narzędzi konsolowych raczej unikać ścieżek zawierających spacje, gdyż może to przysporzyć wielu problemów</li>
<li>wybieramy katalog do którego instalator ściągnie sobie pliki</li>
<li>wybieramy połączenie bezpośrednie, czyli &#8222;Direct Connection&#8221;</li>
<li>wybieramy serwer z którego chcemy ściągnąć cygwina</li>
<li>gdy otworzy nam się okno wyboru pakietów które chcemy zainstalować musimy dodatkowo zaznaczyć (warto skorzystać z &#8222;szukaczki&#8221;):
<ul>
<li>autoconf: Wrapper scripts for autoconf commands</li>
<li>automake: Wrapper scripts for automake and aclocals</li>
<li>gcc: C compiler upgrade helper</li>
<li>libtool: A shared library generation tool</li>
<li>make: The GNU version og the &#8216;make&#8217; utility</li>
</ul>
</li>
<li>klikamy &#8222;Dalej&#8221; i następnie &#8222;Install&#8221;</li>
</ul>
<h1 style="text-align: justify;">Licencje i takie tam&#8230;</h1>
<p style="text-align: justify;">Jak mamy już zainstalowanego cygwina to zanim się weźmiemy do konkretnej roboty to jeszcze chciałem napisać parę słów co i jak. W tym artykule chcę opisać kompilowanie OpenOCD ze sterownikami JTAG&#8217;ów opartych o układy firmy FTDI. Generalnie istnieją dwie drogi. Jako, że OpenOCD jest na licencji GPL to każdy rozpowszechniany program, który korzysta z OpenOCD musi mieć całkiem otwarte źródła. Aby spełnić to wymaganie do kompilacji musimy użyć sterowników o otwartym kodzie. Jedyne znane mi sterowniki o otwartym kodzie obsługujące układy FTDI, to LibUSB (wersja win32:<a title="http://libusb-win32.sourceforge.net/" href="http://libusb-win32.sourceforge.net/" target="_blank"> http://libusb-win32.sourceforge.net/</a>) w połączeniu z biblioteką libftdi (<a title="http://www.intra2net.com/en/developer/libftdi/" href="http://www.intra2net.com/en/developer/libftdi/" target="_blank">http://www.intra2net.com/en/developer/libftdi/</a>). Tak skompilowaną wersję można rozpowszechniać, bez żadnych problemów i możecie ją ściągnąć np z blogu Freddiego: <a title="http://www.freddiechopin.info/" href="http://www.freddiechopin.info/" target="_blank">http://www.freddiechopin.info/</a>). Druga opcja to użycie oficjalnych sterowników i biblioteki firmy FTDI, czyli ftd2xx. Jedyny problem z tą biblioteką jest to, że producent udostępnia ją tylko w wersji skompilowanej, nie pokazując źródeł. Co pociąga za sobą fakt, że tak skompilowane OpenOCD nie spełnia warunku, że cały kod produktu musi być otwarty i udostępniony. Tak więc nie można rozpowszechniać tak skompilowanego programu. Nie oznacza to natomiast, że nie można sobie skompilować OpenOCD z taką biblioteką. Dlatego też opiszę dokładnie jak to zrobić, tak by każdy mógł sobie skompilować kod we własnym zakresie. No to na tyle ględzenia i lecimy dalej.</p>
<h1 style="text-align: justify;">Instalujemy sterowniki do JTAG&#8217;a</h1>
<p style="text-align: justify;">
<p style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/02/foldery.png"><img class="size-full wp-image-22    alignright" style="margin-left: 5px; margin-right: 5px;" title="Drzewo katalogów" src="http://tutro.net/wp-content/uploads/2010/02/foldery.png" alt="Drzewo katalogów" width="214" height="151" /></a></p>
<p style="text-align: justify;">
<p style="text-align: justify;">Najpierw musimy ściągnąć i zainstalować sterowniki do urządzenia i dopiero później możemy kompilować bibliotekę. Trochę to dziwne, ale podczas konfiguracji biblioteki skrypty do tego stworzone testują jakoś tą bibliotekę i jeżeli nie ma w tej chwili zainstalowanych sterowników test się nie powiedzie i nie będzie można ukończyć kompilacji. Najdziwniejsze jest to, że przy kompilacji z bibliotekami libftdi nie ma żadnego testu tylko wszystko ładnie idzie :/ Sterowniki ściągamy z  ze strony producenta ukladów (<a title="http://www.ftdichip.com/" href="http://www.ftdichip.com/" target="_blank">http://www.ftdichip.com/</a>, dokładnie <a href="http://www.ftdichip.com/Drivers/D2XX.htm" target="_blank">stąd</a> &#8211; obecnie jest to wersja <a href="http://www.ftdichip.com/Drivers/CDM/CDM20602.zip" target="_blank">2.06.02</a>). Musimy je teraz wypakować, ale żeby łatwiej było nam się później (przy kompilacji) dogadać co do ścieżek to proponuje stworzyć katalog &#8222;C:\tmp&#8221; do niego wypakować zawartość archiwum, a następnie zmienić nazwę wypakowanego katalogu z &#8222;CDM 2.06.00 WHQL Certified&#8221; na &#8222;ftd2xx&#8221;. Skoro już wzięliśmy się za ściąganie to odrazu proponuję pobrać źródła OpenOCD (<a title="http://developer.berlios.de/project/showfiles.php?group_id=4148&amp;release_id=17249" href="http://developer.berlios.de/project/showfiles.php?group_id=4148&amp;release_id=17249">stąd</a>) w tym momencie najnowszą wersją jest: &#8222;<a title="http://prdownload.berlios.de/openocd/openocd-0.4.0-rc2.zip" href="http://prdownload.berlios.de/openocd/openocd-0.4.0.zip">openocd-0.4.0</a>&#8222;, jest to co prawda wersja RC, ale działa całkiem sprawnie, więc nie widzę powodów by korzystać ze starszej (jeżeli jednak ktoś bardzo chce, może pobrać starszą wersję &#8211; cała procedura kompilacji wygląda dokładnie tak samo). No więc ściągamy<a href="http://tutro.net/wp-content/uploads/2010/02/jtagkey1.png"><img class="size-medium wp-image-25    alignleft" style="margin-left: 5px; margin-right: 5px;" title="jtagkey.cfg" src="http://tutro.net/wp-content/uploads/2010/02/jtagkey1-300x161.png" alt="jtagkey.cfg" width="240" height="129" /></a>OpenOCD i rozpakowujemy do naszego folderu &#8222;C:\tmp&#8221;. Dla jasności obok przedstawiam jak powinno wyglądać drzewo katalogów. Potrzebujemy jeszcze jednego małego programiku, do wygenerowania plików inf sterowników. Programik nazywa się <a title="http://www.ftdichip.com/Resources/Utilities/FT_INF%20v1.0.zip" href="http://www.ftdichip.com/Resources/Utilities/FT_INF%20v1.0.zip" target="_blank">FT_INF</a> i możemy go pobrać ze stronki FTDI (<a title="http://www.ftdichip.com/Resources/Utilities.htm" href="http://www.ftdichip.com/Resources/Utilities.htm" target="_blank">http://www.ftdichip.com/Resources/Utilities.htm</a>). Programik pobieramy, rozpakowujemy gdziekolwiek, instalujemy i uruchamiamy. Naszym oczom ukazuje się tajemnicze okno w którym nie wiemy co wpisać :P Ale spokojnie, zaraz będziemy wiedzieli. Jedyne co musimy wiedzieć to jakiego JTAG&#8217;a mamy, jeżeli wiemy to szukamy w katalogu &#8222;C:\tmp\openocd-0.4.0-rc2\tcl\interface&#8221; pliku *.cfg odpowiedniego dla naszego JTAG&#8217;a. W moim przypadku to &#8222;jtagkey.cfg&#8221; (Posiadam JTAG&#8217;a projektu <a title="http://www.freddiechopin.info/" href="http://www.freddiechopin.info/">Freddiego Choppina</a>, opartego o Amontec JTAGkey). Otwieramy ten plik i patrzymy co  jest w nim popisane. U mnie wygląda to tak jak na rysunku. Teraz wystarczy przepisać odpowiednie informacje do okienka programu FT_INF. Jak to wygląda u mnie, możecie zobaczyć na screenie. Układ (pole chip) należy wybrać zgodnie ze screenem, Następnie wpisać odpowiednie dane w sekcji &#8222;Vendor ID / Product ID&#8221; zgodnie z plikiem *.cfg. Później klikamy &#8222;&gt;&gt;&#8221; aby dodać nasze urządzenie do list. Musimy jeszcze wskazać pliki &#8222;ftdibus.sys&#8221; oraz &#8222;ftser2k.sys&#8221; które znajdują się w katalogu ze sterownikami, a dokładnie: &#8222;C:\tmp\ftd2xx\i386&#8243; (lub &#8222;C:\tmp\ftd2xx\amd64&#8243; w zależności od architektury).<a href="http://tutro.net/wp-content/uploads/2010/02/FT_INF.png"><img class="size-medium wp-image-26   alignright" style="margin-left: 5px; margin-right: 5px;" title="Okno programu FT_INF" src="http://tutro.net/wp-content/uploads/2010/02/FT_INF-300x201.png" alt="" width="210" height="141" /></a></p>
<p style="text-align: justify;">Ustawiamy także folder &#8222;Output&#8221; najlepiej na &#8222;C:\tmp\ftd2xx&#8221; i klikamy &#8222;Generate Files&#8221;. Program spyta czy nadpisać pliki *.ini, oczywiście się zgadzamy. Po tych operacjach mamy już gotowe sterowniki do swojego JTAG&#8217;a w katalogu &#8222;C:\tmp\ftd2xx&#8221;. Tak, więc podłączamy JTAG&#8217;a i instalujemy stworzone przed chwilą sterowniki. Jeżeli wszystko pójdzie dobrze możemy kontynuować. Kolejnym krokiem będzie już kompilacja.</p>
<h1 style="text-align: justify;">Czas na kompilację</h1>
<p style="text-align: justify;">Ten etap wbrew pozorom jest chyba najprostszy :) Odpalamy więc konsole cygwina (przy instalacji na pewno wepchał nam jakiś skrót do menu start) i przechodzimy do naszego katalogu, a dokładnie do katalogu z OpenOCD wpisując komendę:</p>
<pre style="text-align: justify;">﻿﻿﻿cd /cygdrive/c/tmp/openocd-0.4.0-rc2</pre>
<p style="text-align: justify;">po czym wywołujemy plik konfigurujący komendą:</p>
<pre style="text-align: justify;">./configure --enable-maintainer-mode --disable-werror --disable-shared
--enable-ft2232_ftd2xx --with-ftd2xx-win32-zipdir=/cygdrive/c/tmp/ftd2xx</pre>
<p style="text-align: justify;">chwile to potrwa, więc musimy być cierpliwi. Jeżeli w czasie konfigurowania dostaniemy komunikat taki jak na screenie,</p>
<p style="text-align: justify;">
<p style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/02/error.png"><img class="size-full wp-image-27 aligncenter" title="Błąd podczas konfiguracji" src="http://tutro.net/wp-content/uploads/2010/02/error.png" alt="" width="644" height="95" /></a></p>
<p style="text-align: justify;">
<p style="text-align: justify;">oznacza to, że nie zainstalowaliśmy dobrze sterowników przed rozpoczęciem procesu konfigurowania (to muszą być dokładnie te same sterowniki &#8211; ta sama wersja biblioteki &#8211; te które instalujemy i te które używamy do kompilacji) Natomiast jeżeli wszystko poszło jak należy odpalamy komendę:</p>
<pre style="text-align: justify;">make</pre>
<p style="text-align: justify;">i znów czekamy :) &#8230; aż się skompiluje. Jeżeli wszystko się uda to w katalogu &#8222;C:\tmp\openocd-0.4.0-rc2\src&#8221; znajdziemy plik &#8222;openocd.exe&#8221;. Teraz wystarczy zebrać wszystko razem i mamy gotowe skompilowane OpenOCD. No więc do dzieła. Tworzymy sobie gdzieś katalog &#8222;OpenOCD0.4.0rc2&#8243;, w nim tworzymy katalog &#8222;bin&#8221; do którego kopiujemy plik &#8222;openocd.exe&#8221;, oraz pliki &#8222;cygwin1.dll&#8221;, oraz „cyggcc_s-1.dll” z katalogu &#8222;bin&#8221; cygwina (najczęściej C:\cygwin\bin), aby uniezależnić się od cygwina. Dodatkowo do katalogu &#8222;OpenOCD0.4.0rc2&#8243; kopiujemy całą zawartość folderu &#8222;C:\tmp\openocd-0.4.0-rc2\tcl&#8221;. To wszystko. Katalog &#8222;OpenOCD0.4.0rc2&#8243; zawiera teraz wszystko co jest potrzebne do działania OpenOCD. Wystarczy go przenieść w dowolne miejsce na dysku.</p>
<h1 style="text-align: justify;">A teraz podpinamy do Eclipse</h1>
<p style="text-align: justify;">Zanim zaczniemy proponuję postawić sobie Eclipse&#8217;a i CodeSourcery zgodnie z opisem we wcześniejszym wpisie (<a title="Integracja Eclipse CDT z CodeSourcery dla ARM Cortex-M3" href="http://tutro.net/elektronika/integracja-eclipse-cdt-z-codesourcery-dla-arm-cortex-m3/" target="_self">Integracja Eclipse CDT z CodeSourcery dla ARM Cortex-M3</a>). Jeżeli mamy już postawione IDE z podpiętym kompilatorem, to możemy zabierać się za kolejny ważny element Toolchain&#8217;u, czyli Debugger.</p>
<p style="text-align: justify;">Pierwszym krokiem jest instalacja odpowiednich wtyczek do Eclipse&#8217;a pozwalających używać debuggera sprzętowego i OpenOCD. Pierwsza z nich to Eclipse C/C++ GDB Hardware Debugging. Aby go zainstalować wybieramy Help-&gt;Install New Software.Możemy go pobrać z oficjalnego update site&#8217;u Eclipse&#8217;a. Aby to zrobić wpisujemy w pole &#8222;Work with&#8221; http://download.eclipse.org/tools/cdt/releases/galileo i zaznaczamy plugin, aby go zainstalować (znajduje się on w kategorii &#8222;CDT Optional Features&#8221;). Następnie postępujemy zgodnie ze wskazówkami, co praktycznie sprowadza się do klikania &#8222;Next&#8221;. Kolejny plugin to Zylin Embedded CDT .Update site tego plugina to:<em> http://opensource.zylin.com/zylincdt</em>. Zaznaczamy plugin i kontynuujemy instalacje. Oczywiście godzimy się na niepodpisane oprogramowanie i restartujemy eclipse zgodnie z sugestią.</p>
<p style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/03/external_tools_1.png"><img class="size-full wp-image-34 alignleft" title="External Tools  Configuration" src="http://tutro.net/wp-content/uploads/2010/03/external_tools_1.png" alt="" width="253" height="161" /></a>Gdy mamy zainstalowane obie wtyczki możemy przystąpić do podpinania OpenOCD. Otwieramy sobie jakiś projekt (proponuję przykładowy z wpisu <a title="Integracja Eclipse CDT z CodeSourcery dla ARM Cortex-M3" href="../elektronika/integracja-eclipse-cdt-z-codesourcery-dla-arm-cortex-m3/" target="_self">Integracja Eclipse CDT z CodeSourcery dla ARM Cortex-M3</a>), lub tworzymy nowy. Następnie klikamy w menu &#8222;Run-&gt;External Tools-&gt;External Tools Configuration&#8230;&#8221;. Wybieramy &#8222;New launch configuration&#8221;, by dodać nowe narzędzie. Następnie musimy wpisać nazwę narzędzia (np. OpenOCD), ścieżkę do pliku openocd.exe, oraz parametry z jakimi zostanie odpalony program. Jako parametry musimy przede wszystkim podać pliki konfiguracyjne, odpowiednie dla mikrokontrolera z którym się łączony, oraz JTAG&#8217;a. Wpisane przeze mnie parametry przedstawiam na screen&#8217;ie. Na pozostałych zakładkach nie musimy nic zmieniać. Gotowe :) Teraz podłączamy JTAG&#8217;a do komputera i do debugowanego układu i odpalamy narzędzie np. poprzez menu &#8222;Run-&gt;Configuration Tools&#8221;. Jeżeli wszystko się powiedzie powinniśmy w konsoli zobaczyć komunikat podobny jak na screen&#8217;ie.<a href="http://tutro.net/wp-content/uploads/2010/03/console_output.png"><img class="size-full wp-image-35 alignright" title="Console output" src="http://tutro.net/wp-content/uploads/2010/03/console_output.png" alt="" width="316" height="126" /></a></p>
<p style="text-align: justify;">Jeżeli OpenOCD już działa możemy się zabrać za stworzenie odpowiedniej konfiguracji do debugowania. Klikamy &#8222;Run-&gt;Debug configurations&#8230;&#8221;. Tworzymy nową konfigurację, podobnie jak poprzednio (ja nadałem jej nazwę gbd(flash)). Następnie ustawiamy odpowiednie parametry. Na zakładce &#8222;Main&#8221; wybieramy projekt, który chcemy debugować klikając &#8222;Browse&#8230;&#8221; obok pola &#8222;Project&#8221;. Przechodzimy do zakładki &#8222;Debugger&#8221;, gdzie musimy podać ścieżkę do gdb pochodzącego z Code Sourcery, oraz zmienić numer portu na 3333. Później ustawiamy odpowiednie opcje na zakładce &#8222;Startup&#8221; zgodnie ze screen&#8217;em.</p>
<p style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/03/debug_main.png"><img class="size-medium wp-image-37 alignleft" title="debug_main" src="http://tutro.net/wp-content/uploads/2010/03/debug_main-300x191.png" alt="" width="168" height="107" /></a><a href="http://tutro.net/wp-content/uploads/2010/03/debug_debugger.png"><img class="size-medium wp-image-36 alignleft" title="debug_debugger" src="http://tutro.net/wp-content/uploads/2010/03/debug_debugger-300x191.png" alt="" width="168" height="107" /></a><a href="http://tutro.net/wp-content/uploads/2010/03/debug_startup.png"><img class="size-medium wp-image-38 alignleft" title="debug_startup" src="http://tutro.net/wp-content/uploads/2010/03/debug_startup-300x191.png" alt="" width="168" height="107" /></a></p>
<p style="text-align: justify;">Następnie tworzymy identyczną konfigurację tylko dopisujemy jeszcze komendę load na zakładce &#8222;Startup&#8221; w polu poniżej opcji &#8222;Halt&#8221;. Ta konfiguracja pozwoli nam załadować program do pamięci mikrokontrolera.</p>
<p style="text-align: justify;">Aby debugować program musimy najpierw włączyć OpenOCD, robimy to jednorazowo. Później wybieramy odpowiednia konfigurację debugowania &#8211; samo debugowanie, lub debugowania z ładowaniem programu do pamięci. Samego debugowania w Eclipse nie będę opisywał, gdyż można znaleźć wiele informacji na ten temat w internecie.</p>
<h4 style="text-align: justify;">Źródła:</h4>
<ul style="text-align: justify;">
<li><a title="http://www.plugcomputer.org/plugwiki/index.php/Main_Page" href="http://www.plugcomputer.org/plugwiki/index.php/Main_Page" target="_blank">http://www.plugcomputer.org/plugwiki/index.php/Main_Page</a></li>
<li><a title="http://forum.sparkfun.com/viewtopic.php?t=11221&amp;postdays=0&amp;postorder=asc&amp;start=0&amp;sid=89cf3e590ac8185041bdbcc7ec2732e4" href="http://forum.sparkfun.com/viewtopic.php?t=11221&amp;postdays=0&amp;postorder=asc&amp;start=0&amp;sid=89cf3e590ac8185041bdbcc7ec2732e4" target="_blank">http://forum.sparkfun.com/viewtopic.php?t=11221&amp;postdays=0&amp;postorder=asc&amp;start=0&amp;sid=89cf3e590ac8185041bdbcc7ec2732e4</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://tutro.net/elektronika/kompilacja-openocd-i-podpiecie-do-eclipse-cdt/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Integracja Eclipse CDT z CodeSourcery dla ARM Cortex-M3</title>
		<link>http://tutro.net/elektronika/integracja-eclipse-cdt-z-codesourcery-dla-arm-cortex-m3/</link>
		<comments>http://tutro.net/elektronika/integracja-eclipse-cdt-z-codesourcery-dla-arm-cortex-m3/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 03:17:58 +0000</pubDate>
		<dc:creator>kwesoly</dc:creator>
				<category><![CDATA[Elektronika]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[code sourcery]]></category>
		<category><![CDATA[Cortex]]></category>
		<category><![CDATA[Cortex-M3]]></category>
		<category><![CDATA[eclipse]]></category>

		<guid isPermaLink="false">http://tutro.net/?p=13</guid>
		<description><![CDATA[Dzisiaj gościnny wpis mojego dobrego kolegi &#8211; Krzyśka. Dzięki wielkie za chęci i poświęcony czas. Jestem przekonany, że artykuł ten zaoszczędzi wielu nieprzespanych nocy wszystkim amatorom  Cortex&#8217;ów. Wprowadzenie Celem dzisiejszego wpisu jest prześledzenie i opisanie kroków potrzebnych do konfiguracji Środowiska Eclipse do współpracy z pakietem CodeSourcery Lite. Efektem tego połączenia jest w pełni darmowe (open-source) [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/02/eclipse1.jpg"><img class="alignleft size-full wp-image-33" title="eclipse" src="http://tutro.net/wp-content/uploads/2010/02/eclipse1.jpg" alt="" width="143" height="83" /></a>Dzisiaj gościnny wpis mojego dobrego kolegi &#8211; <a title="http://kwesoly.net" href="http://kwesoly.net" target="_blank">Krzyśka</a>. Dzięki wielkie za chęci i poświęcony czas. Jestem przekonany, że artykuł ten zaoszczędzi wielu nieprzespanych nocy wszystkim amatorom  Cortex&#8217;ów.</p>
<h3 style="text-align: justify;">Wprowadzenie</h3>
<p style="text-align: justify;">Celem dzisiejszego wpisu jest prześledzenie i opisanie kroków  potrzebnych do konfiguracji Środowiska Eclipse do współpracy z pakietem  CodeSourcery Lite. Efektem tego połączenia jest w pełni darmowe  (open-source) środowisko programistyczne.</p>
<p style="text-align: justify;"><span id="more-13"></span></p>
<h3 style="text-align: justify;">Instalacja Code Sourcery Lite</h3>
<p style="text-align: justify;">Na stronie http://www.codesourcery.com/ znajdujemy wersję Lite  pakietu.  Ponieważ nawigacja w poszukiwaniu pakietu w wersji darmowej  jest jak zwykle &#8222;super łatwa&#8221; podaję bardziej bezpośredni link do  pobierania:  http://www.codesourcery.com/sgpp/lite/arm/portal/subscription?@template=lite</p>
<p style="text-align: justify;">Po pobraniu i uruchomieniu aplikacji (w moim przypadku  arm-2009q3-68-arm-none-eabi.exe) . W przypadku pakietu Lite wybór wersji  (Typical/Custom etc.) jest bez znaczenia. Warto przy wybieraniu ścieżki  unikać spacji &#8211; proponowane Program Files sprawia problemy w najmniej  przewidywalnym momencie. Instalator proponuje nam również dodanie  swojego katalogu binarek do zmiennej PATH &#8211; warto mu na to pozwolić,  gdyż i tak konieczna będzie jego obecność w tej zmiennej. Alternatywa  jest ręczna modyfikacja PATH za pomocą ustawień komputera, lub  stworzenie pliku bat który modyfikuje PATH i uruchamia nasze środowisko.  Biorąc pod uwagę iż pakiet CodeSourcery składa się z plików nie  wprowadzających konfliktów nazw (np. cs-make, arm-none-eabi-gcc)  zostawienie tego zadania instalatorowi to najlepsze wyjście. Program  tworzy niezliczoną ilość ikon, więc najlepiej skierować te zapędy w  stronę menu start :)</p>
<h3 style="text-align: justify;">Instalacja Eclipse</h3>
<p style="text-align: justify;">Kolejny krok to pobranie Eclipse IDE ze zintegrowanymi narzędziami do  programowania w C/C++. Dokładniejszy opis instalacji tego programu  (m.in. instalacja wymaganej Javy, dotyczący użycia MinGW, a nie  CodeSourcery) w środowisku Windows można znaleźć np. w tym wpisie: <a title="Eclipse CDT – środowisko C/C++" rel="bookmark" href="http://kwesoly.net/programowanie/cpp/eclipse-cdt/" target="_blank">Eclipse  CDT – środowisko  C/C++</a> (nie należy się nim w tym przypadku dokładnie kierować,  aczkolwiek pozwala poznać podstawowe informacje na temat konfiguracji  wspomnianego IDE). W tym przypadku interesuje nas tylko środowisko, więc  po prostu pobieramy i rozpakowujemy w wybrane miejsce. Po rozpakowaniu  eclipse znalazł się w C:\eclipse, a skrót do eclipse.exe utworzyłem dla  wygody na Pulpicie. Po uruchomieniu zostaniemy poproszeni o wybór  Workspace &#8211; tradycyjnie przypominam o unikaniu spacji.</p>
<h3 style="text-align: justify;">Wtyczka zarządzająca projektami</h3>
<p style="text-align: justify;">Za pomocą wymienionych wyżej narzędzi można już tworzyć projekty &#8211;  jednak ręczna edycja plików makefile nie jest najwygodniejszym  rozwiązaniem. Dlatego kolejnym etapem jest instalacja wtyczki która  będzie je automatycznie tworzyć i zarządzać projektem.</p>
<p style="text-align: justify;">Z pośród niewielu istniejących rozwiązań wybrałem GNU ARM Eclipse  plugin. Aby go zainstalować wybieramy Help-&gt;Install New Software.  Update site tego plugina to:  http://gnuarmeclipse.sourceforge.net/updates, taki adres wklejamy w  &#8222;Work with&#8221;. Należy zwrócić uwagę na odznaczenie &#8222;Group items by  category&#8221;, ponieważ nasz plugin nie ma przypisanej kategorii. Zaznaczamy  plugin  kontynuujemy instalacje. Oczywiście godzimy się na niepodpisane  oprogramowanie i restartujemy eclipse zgodnie z sugestią.</p>
<h3 style="text-align: justify;">Tworzenie pierwszego projektu</h3>
<p style="text-align: justify;">Projekty dla platformy ARM są typowymi projektami C/C++. Wybieramy  więc File-&gt;New-&gt;C++ Project. Po wpisaniu dowolnej nazwy wybieramy  typ projektu &#8211; ARM Cross Target Application-&gt;Empty Project. W polu  Toolchains wybieramy nasze Sourcery G++ Lite. Kolejnym etapem jest  wybranie dwóch możliwych wersji w których nasz program będzie  kompilowany &#8211; debug, przystosowanej do pracy z JTAG i debugowania na  platformie docelowej, i release, działającej z pełną wydajnością ale  pozbawionej powyższych możliwości.</p>
<p style="text-align: justify;">Kolejnym etapem jest zebra</p>
<p style="text-align: justify;">nie podstawowych elementów potrzebnych do kompilacji i linkowania. W zależności od użytego mikrokontrolera mogą występować różnice w poniższych plikach. Te zostały przygotowane dla uC <em>STM32F103RB.</em></p>
<ul style="text-align: justify;">
<li> skryptu linkera (pliku o rozszerzeniu *.ld, zawierającym informacje  jak &#8222;poskładać&#8221; kolejne pliki *.o z kompilatora w nasz plik wynikowy &#8211;  czyli elf /hex)<br />
plik ten zawiera informacje o rozmieszczeniu danych w pamięci, oraz  przede wszystkim informacje o samej pamięci &#8211; początek, koniec pamięci  RAM, ROM etc.<br />
Obszerną dokumentacje możemy znaleźć w plikach zainstalowanych z  CodeSourcery (./share/doc/arm-arm-none-eabi/pdf/ld.pdf)</li>
<li> pliku startup (czyli pliku który po skompilowaniu będzie  uruchamiany po zresetowaniu procesora. Jego zawartość to Reset_Handler,  zajmujący się inicjalizacją zmiennych, kopiowaniem danych FLASH-&gt;RAM  dla zmiennych zainicjalizowanych, oraz uruchomieniem konstruktorów  obiektów globalnych (tylko C++), funkcji main, a na koniec destruktorów  obiektów globalnych(tylko C++)).<br />
Z uwagi na złożoność asemblera procesorów Cortex-M3 warto skorzystać z  gotowego pliku &#8211; np. zamieszczonego tutaj, stworzonego przez Freddiego  Chopina.</li>
<li>Informacje o położeniu głównego stosu i o wektorach przerwań<br />
Mikrokontroler  Cortex-M3 zaraz po uruchomieniu ładuje do rejestru MSP (Main Stack Pointer) wartość spod adresu  0&#215;00000000.  Kolejna niezbędna informacja to adres funkcji inicjalizującej &#8211; Reset_Handler pochodzącej z naszego startup&#8217;u. Adres ten musi znaleźć się pod adresem 0&#215;00000004. Pozostałe adresy w tym wektorze to procedury obsługi przerwań. W naszym przypadku wykorzystaliśmy plik vectors.c, również stworzony  przez Freddiego. Poprawiono tylko nazwy metod &#8211; teraz są w pełni  zgodne (-; z standardem CMSIS.</li>
</ul>
<p style="text-align: justify;">Przydatne są rownież biblioteki &#8211; przede wszystkim CMSIS zawierający define&#8217;y rejestrów naszego mikrokontrolera, oraz biblioteka peryferiów STM32F10x_StdPeriph_Lib</p>
<p style="text-align: justify;">Wszystkie powyższe pliki można pobrać klikając tutaj &#8211; <a href="http://tutro.net/wp-content/uploads/2010/02/ProjectBasicFiles_Cortex-M3-STM32.zip">Podstawowe pliki  projektu ARM Cortex-M3 STM32</a></p>
<h3 style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/02/empty_stm32_project.png"><img class="size-thumbnail wp-image-16 alignleft" title="Pusty projekt na  STM32" src="http://tutro.net/wp-content/uploads/2010/02/empty_stm32_project-150x150.png" alt="" width="150" height="150" /></a></h3>
<p style="text-align: justify;">W tym momencie zakładam, że w Eclipse wyświetla nam się projekt C++, pliki po pobraniu zostały rozpakowane i przeciągnięte do naszego projektu. W tej chwili okno mojego projektu wygląda tak jak na obrazkach po lewej. Oczywiście samo dodanie plików do projektu to zbyt mało aby móc zacząć pracować nad samym programem. W celu czysto doświadczalnym w tej chwili stwórzmy plik main.cpp (File-&gt;New-&gt;Source File, zwróćmy uwagę aby umieścić ten plik w głównym katalogu projektu). Jedynym plikiem związanym z naszymi bibliotekami jaki będziemy include&#8217;ować jest plik stm32f10x_conf.h, znajdujący się w głównym katalogu projektu. Za jego pośrednictwem uzyskamy dostęp do całej reszty biblioteki pobranej ze <a title="Strona z STM32F10x_StdPeriph_Lib" href="http://www.st.com/mcu/familiesdocs-110.html#Firmware">strony ST</a>. Podsumowując, stworzony plik main cpp wygląda teraz tak:</p>
<pre style="text-align: justify;">/*
 * Podstawowy plik wykorzystujący biblioteki dla STM32
 */
#include
#include 

int main() {

	return 0;
}</pre>
<p style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/02/empty_stm32_project2.png"><img class="size-thumbnail wp-image-17 alignleft" title="Pusty projekt na  STM32 (Pokazana zawartość)" src="http://tutro.net/wp-content/uploads/2010/02/empty_stm32_project2-150x150.png" alt="" width="150" height="150" /></a>Jego kompilacja generuje błędy, związane z includowaniem plików nie podając ich pełnych ścieżek. Na szczęście nazwy plików są na tyle jednoznaczne i unikalne ze można je bez obaw dodać do domyślnie w danym projekcie przeszukiwanych ścieżek (odpowiednik przełącznika -I przy kompilacji). Ponieważ przyszłe projekty chcemy stworzyć poprzez proste skopiowanie bieżącego &#8222;szablonu&#8221;, warto podać ścieżki w takiej formie aby nie nastręczało to trudności. W tym celu często będziemy korzystać z ręcznie wpisanych ścieżek, gdyż te uzyskane poprzez wybranie odpowiednich katalogów zawierają nazwę projektu.</p>
<p style="text-align: justify;">Aby edytować wspomniane ścieżki oraz zmieniać ustawienia kompilatora/linkera należy kliknąć w Project-&gt;Properties, następnie wybrać C/C++ Build  -&gt; Settings. Na wstępie z bieżącej konfiguracji Debug warto  przełączyć się w [ All configurations ], pozwoli to nie dublować opisanej niżej pracy.</p>
<ul style="text-align: justify;">
<li>Ustawienia preprocesora C. W zakładce ARM Sourcery Windows GCC C Compiler-&gt;Preprocessor dodajemy symbole (plus przy opcjach -D): USE_STDPERIPH_DRIVER (jeśli chcemy używać bibliotek stm32) oraz STM32F10X_MD (obowiązkowo, definiujemy rodzaj mikrokontrolera &#8211; Medium Density Line w tym wypadku). Ustawienia które tu podajemy umożliwiaja nie edytowanie bibliotecznego pliku stm32f10x.h.</li>
<li>Ustawienia kompilatora C. W zakładce ARM Sourcery Windows GCC C Compiler-&gt;Directories dodajemy (każdą osobno) następujace ścieżki:<br />
&#8222;${CWD}/../&#8221;, &#8222;${CWD}/../Libraries/CMSIS/Core/CM3&#8243; oraz &#8222;${CWD}/../Libraries/STM32F10x_StdPeriph_Driver/inc&#8221;. Zmienna CWD czyli Current Working Directory to przy kompilacji zawsze katalog Debug/Release projektu, więc taka konstrukcja pozwala zawsze skorzystać z właściwego katalogu.<br />
Z kolei w zakładce ARM Sourcery Windows GCC C Compiler-&gt;Optimization zaznaczamy Function sections (-ffunction-sections) i Data Sections  (-fdata-sections). Moja wersja wtyczki posiada błąd &#8211; zamiast Data Sections powtórzono Function Sections.</li>
<li>Powyższe kroki aplikujemy również dla kompilatora C++ (analogiczne zakładki w kategorii ARM Sourcery Windows GCC C++ Compiler)</li>
<li>Skrypt linkera. Plik ten (stm32f103rb_rom.ld) znajduje się w katalogu Setup. Aby był używany  Po przełączeniu wybieramy ARM Sourcery Windows GCC C++ Linker -&gt; General i w pole &#8222;Script file -T&#8221; wpisujemy wpisujemy &#8222;..\Setup\stm32f103rb_rom.ld&#8221;. Dodatkowo zaznaczamy &#8222;Remove unused sections (-XLinker &#8211;gc-sections)&#8221; (pozwoli to usunąć zbędne sekcje które powstają z każdej kompilowanej a nie używanej funkcji).</li>
</ul>
<p style="text-align: justify;">Po zastosowaniu powyższych ustawień będzie można budować obie wersje projektu. Tworzenie przy kompilacji sekcji dla każdej funkcji, i usuwanie zbędnych przy linkowaniu gwarantuje nam rozsądną wielkość pliku wynikowego, także w trybie Debug &#8211; dzięki temu bez problemu przeprowadzimy testy za pomocą JTAGa na docelowym układzie.</p>
<p style="text-align: justify;">Po zastosowaniu powyższych ustawień budowanie projektu (Ctrl+B) powinno przebiec bez zakłóceń.</p>
<p style="text-align: justify;">Pliki projektu wraz z ustawieniami, do użycia np. na innym komputerze można wyeksportować. Wybieramy File-&gt;Export.  Następnie zaznaczamy General-&gt;Archive File i przechodzimy dalej. Zgodnie z własnym uznaniem wybieramy nazwę i rodzaj tworzonego archiwum, po czym kończymy eksport.</p>
<h3 style="text-align: justify;">Podsumowanie</h3>
<p style="text-align: justify;">Stworzyliśmy szablon projektu, integrując pliki dostarczone przez STMicroelectronic, z plikami z strony <a href="http://www.freddiechopin.info">www.freddiechopin.info</a>. Takie połączenie to solidna podstawa do budowania dowolnej wielkości aplikacji an platformę STM32. Gotowy szablon można pobrać stąd: <a href="http://tutro.net/wp-content/uploads/2010/02/stm32f103RB_template.zip">Szablon projektu dla Cortex-M3 STM32 F103RB</a></p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 1531px; width: 1px; height: 1px; text-align: justify;">&#8222;${CWD}/../</div>
]]></content:encoded>
			<wfw:commentRss>http://tutro.net/elektronika/integracja-eclipse-cdt-z-codesourcery-dla-arm-cortex-m3/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Rodzina STM32</title>
		<link>http://tutro.net/elektronika/rodzina-stm32/</link>
		<comments>http://tutro.net/elektronika/rodzina-stm32/#comments</comments>
		<pubDate>Sat, 20 Feb 2010 08:52:24 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Elektronika]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[Cortex]]></category>
		<category><![CDATA[Cortex-M3]]></category>
		<category><![CDATA[mikrokontrolery]]></category>
		<category><![CDATA[mikroprocesory]]></category>
		<category><![CDATA[ST Microelectronics]]></category>
		<category><![CDATA[STM32]]></category>

		<guid isPermaLink="false">http://tutro.net/?p=10</guid>
		<description><![CDATA[Pierwszą firmą która wprowadziła na rynek mikrokontrolery z rdzeniem Cortex-M3 był Texas Instruments ze swoją rodzina Stellaris. Niedługo później do gry weszło ST Microelectronics wprowadzając nową rodzinę do swojego portfolio &#8211; STM32. Rodzina ta już na samym początku zawierała sporo układów, a z biegiem czasu jeszcze trochę urosła. Niedawno STM wprowadziło nowe układy, które mają [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/02/stm32-cortex-m3.jpg"><img class="size-full wp-image-28 alignleft" title="stm32-cortex-m3" src="http://tutro.net/wp-content/uploads/2010/02/stm32-cortex-m3.jpg" alt="" width="173" height="165" /></a>Pierwszą firmą która wprowadziła na rynek mikrokontrolery z rdzeniem Cortex-M3 był Texas Instruments ze swoją rodzina Stellaris. Niedługo później do gry weszło ST Microelectronics wprowadzając nową rodzinę do swojego portfolio &#8211; STM32. Rodzina ta już na samym początku zawierała sporo układów, a z biegiem czasu jeszcze trochę urosła. Niedawno STM wprowadziło nowe układy, które mają na pokładzie transceivery 2,4GHz i są układami SoC przeznaczonymi do aplikacji Wireless. Opatrzono je wówczas wspólną nazwą STM32W i jednocześnie cała reszta rodziny pierwotnie nazywana STM32 została przemianowana na STM32F. O STM32W niestety nic nie napiszę, gdyż po pierwsze nie miałem jeszcze okazji zaznajomić się z tą częścią rodziny, a po drugie nie czuję się na siłach pisać o technologiach bezprzewodowych. Z kolei opisywanie tych układów z pominięciem części transceivera sprowadzi się do opisywania STM32F, gdyż całą resztą nie wiele się one różnią. Tak więc zaczynamy poznawanie STM32F!</p>
<h1 style="text-align: justify;"><span id="more-10"></span>Ogólnie o STM32F</h1>
<p style="text-align: justify;">Szerokie portfolio sprawia, że naprawdę jest z czego wybierać. Oferowane mikrokontrolery posiadają na pokładzie rdzeń Cortex-M3 taktowany z częstotliwością aż do 72MHz, do 64kB pamięci SRAM, do 512kB pamięci FLASH, oraz są zasilane napięciem 2.0-3.6V (wejścia 5V tolerant), kompatybilne Pin-to-Pin i posiadają wiele peryferiów.  Układy dostępne są w wielu typach obudów takich jak: QFN, LQFP, oraz BGA.</p>
<p style="text-align: justify;">
<p style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/02/portfolio.png"><img class="size-full wp-image-12 aligncenter" title="STM32 - portfolio" src="http://tutro.net/wp-content/uploads/2010/02/portfolio-e1266667381836.png" alt="STM32 - portfolio" width="500" height="546" /></a></p>
<h1 style="text-align: justify;">Na cztery sposoby&#8230;</h1>
<p style="text-align: justify;">Cała oferta podzielona jest na 4 linie w zależności od przeznaczenia układu w którym ma pracować mikrokontroler. Poniżej przedstawiam tabelkę przygotowaną przez ST Microelectronics. Jak nietrudno zauważyć wszystkie układy są bardzo dobrze wyposażone i porażają możliwościami, tym bardziej jeżeli wziąć pod uwagę fakt, że ich cena jest niewiele wyższa niż cena dość popularnych w naszym kraju mikrokontrolerów AVR.</p>
<h4 style="text-align: justify;"><a href="http://tutro.net/wp-content/uploads/2010/02/product-lines.png"><img class="aligncenter size-full wp-image-11" title="STM32F10x: product lines" src="http://tutro.net/wp-content/uploads/2010/02/product-lines.png" alt="Product Lines" width="726" height="355" /></a></h4>
<h3 style="text-align: justify;">Access line &#8211; STM32F101</h3>
<p style="text-align: justify;">Najprostsza i najmniej wyposażona linia produktów. Przeznaczona przede wszystkim do prostych rozwiązań i stosowania w większości urządzeń. Posiada rdzeń taktowany z maksymalną częstotliwością 36MHz i jeden 12-bitowy przetwornik ADC (pomijając oczywiście resztę peryferiów które posiadają wszystkie mikrokontrolery z rodziny STM32F).</p>
<h3 style="text-align: justify;">USB Access line -STM32F102</h3>
<p style="text-align: justify;">Linia podobna do poprzedniej z tym, że dodatkowo wyposażona w peryferia umożliwiające implementację protokołu USB &#8211; Full Speed 12Mbs, oraz możliwość generowania wymaganego sygnału zegarowego 48MHz wykorzystując wewnętrzną pętlę PLL.</p>
<h3 style="text-align: justify;">Performance line &#8211; STM32F103</h3>
<p style="text-align: justify;">Linia o największych możliwościach. Dedykowana przede wszystkim do zastosowań przemysłowych i motoryzacyjnych. Przeznaczona do wymagających aplikacji, takich jak sterowniki silników, regulatory, układy przetwarzające dźwięk i obraz. Mikrokontrolery z tej linii taktowane są z częstotliwości aż do 72MHz, oraz posiadają na pokładzie peryferia takie jak: generatory PWM, sprzętowe sterowniki magistrali I2S, oraz CAN.</p>
<h3 style="text-align: justify;">Connectivity line &#8211; STM32F105/STM32F107</h3>
<p style="text-align: justify;">Linia o możliwościach podobnych do Performance line. Główna różnica to brak generatorów PWM. W zamian za to posiadają USB OTG, a  niektóre z układów (te których nazwa zaczyna się od STM32F107)  posiadają peryferia obsługujące Ethernet MAC z dedykowanym kontrolerem DMA.  Przeznaczone są także do zastosowań w przemyśle, ale również do obsługi paneli sterujących, oraz prostych urządzeń audio.</p>
<h1 style="text-align: justify;">A co w środku?!?</h1>
<p style="text-align: justify;">Mikrokontrolery rodziny STM32 są bardzo dobrze wyposażone w peryferia, dzięki czemu można je stosować w wielu aplikacjach. Uważam, że warto pokrótce opisać przynajmniej część z nich, tym bardziej, że posiadają one duże możliwości . Podczas opisu skupię się przede wszystkim na peryferiach układów z linii Performance.</p>
<h3 style="text-align: justify;">Nested vectored interrupt controller (NVIC)</h3>
<p style="text-align: justify;">Nowy kontroler przerwań obsługuje:</p>
<ul style="text-align: justify;">
<li style="text-align: justify;"> aż do 43 maskowalnych przerwań o 16 poziomach priorytetów</li>
<li style="text-align: justify;">bardzo krótkie i przewidywalne czasy obsługi przerwań</li>
<li style="text-align: justify;">wywłaszczanie przerwań</li>
<li style="text-align: justify;">obsługa przerwań o wyższym priorytecie w trybie late arrival (gdy przerwanie o wyższym priorytecie przyjdzie w momencie rozpoczynania obsługi przerwania o niższym priorytecie, rozpoczynanie obsługi przerwania o mniejszym priorytecie zostaje wstrzymane i obsługiwane jest przerwanie o wyższym priorytecie)</li>
<li style="text-align: justify;">wsparcie dla tail-chaining (ciągłe obsługiwanie zakolejkowanych przerwań, ze skróceniem czasu ich podejmowania &#8211; ilość cykli wymaganych do podjęcia kolejnych przerwań, jest mniejsza niż w przypadku podjęcia jednego przerwania)</li>
<li style="text-align: justify;">automatyczne zachowywanie i odtwarzanie kontekstu, przy wchodzeniu i wychodzeniu z procedury obsługi przerwania</li>
<li style="text-align: justify;">dużo łatwiejsza programowa implementacja wektora funkcji obsługi przerwań</li>
</ul>
<h3 style="text-align: justify;">External interrupt/event constroller (EXTI)</h3>
<p style="text-align: justify;">Kontroler zdarzeń i przerwań zewnętrznych posiadający 19 linii reagujących na zbocze. Każda linia może być niezależnie konfigurowana (wyzwalanie zboczem rosnącym/opadającym/oba), oraz niezależnie maskowana. Do 16 linii kontrolera można podłączyć aż do 80 zewnętrznych portów wejścia/wyjścia (GPIO).</p>
<h3 style="text-align: justify;">Boot modes</h3>
<p style="text-align: justify;">Dostępne sa 3 tryby bootowania:</p>
<ul style="text-align: justify;">
<li>z pamięci FLASH użytkownika</li>
<li>z pamięci systemu (System Memory)</li>
<li>z wewnętrznej pamięci SRAM</li>
</ul>
<p style="text-align: justify;">Program bootloader umieszczony jest w pamięci systemu i umożliwia programowanie pamięci FLASH poprzez interfejs USART1.</p>
<h3 style="text-align: justify;">Power supply supervisor</h3>
<p style="text-align: justify;">Mikrokontrolery STM32F posiadają wbudowany układ power-on reset (POR)/power-down reset (PDR), który odpowiada za poprawne wystartowanie procesora przy napięciach już od 2V. Zapewnia także utrzymywanie mikrokontrolera w trybie Reset gdy napięcie zasilające jest niższe niż wyznaczony próg, dzięki temu nie jest wymagany zewnętrzny układ resetu. Układ posiada także programowalny układ detekcji napięcia (PVD), który nieustannie monitoruje napięcie zasilania i może generować przerwania kiedy napięcie spadnie poniżej ustalonego poziomu. Pozwala to na podjęcie odpowiednich działań, lub wygenerowanie ostrzeżenia.</p>
<h3 style="text-align: justify;">Low-power modes</h3>
<p style="text-align: justify;">Linia Performance obsługuje 3 tryby obniżonego poboru mocy, co pozwala osiągnąć bardzo dobry kompromis między niskim poborem mocy, a krótkim czasem wybudzania.</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">Sleep mode &#8211; w tym trybie procesor jest uśpiony, ale wszystkie peryferia działają i są w stanie wybudzić procesor, gdy tylko nadejdzie przerwanie</li>
<li style="text-align: justify;">Stop mode &#8211; ten tryb charakteryzuje się prawie najmniejszym poborem mocy. Wyłączony jest wówczas zarówno procesor, jak i większość peryferiów, łącznie z tymi generującymi sygnały zegarowe &#8211; PLL, HSI, HSE. Podtrzymywana jest tylko zawartość pamięci SRAM. Wybudzić procesor z tego trybu może przerwanie od RTC, USB (Wake Up), lub przerwanie z linii zewnętrznej.</li>
<li style="text-align: justify;">Standby mode -  najmniejszy z możliwych pobór mocy. Powyłączane są wszystkie te układy, co w trybie Stop, a dodatkowo wyłączana jest pamięć SRAM i zachowywana jest tylko zawartość rejestrów Backup</li>
</ul>
<h3><a href="http://tutro.net/wp-content/uploads/2010/02/power-modes.png"><img class="aligncenter size-full wp-image-14" title="Power modes - current" src="http://tutro.net/wp-content/uploads/2010/02/power-modes.png" alt="" width="386" height="316" /></a>DMA</h3>
<p style="text-align: justify;">Konfigurowalny kontroler DMA umożliwia transfer danych: pamięć-pamięć, peryferia-pamięć, oraz pamięć-peryferia. Może pracować w trybie bufora cyklicznego, bo pozwala uniknąć generowania przerwania w momencie dojścia do końca bufora. Możliwe jest zdefiniowanie aż do 7 kanałów transferu, między wybranymi obszarami pamięci, bądź peryferiami i niezależne ich wyzwalanie. Kontroler DMA może być używany z peryferiami takimi jak: SPI, I2C, USART, Timery, oraz przetwornik ADC.</p>
<h3 style="text-align: justify;">RTC (real-time clock) and backup registers</h3>
<p style="text-align: justify;">Zarówno RTC, jaki i rejestry backup są zasilane poprzez przełącznik, który przełącza napięcie zasilania albo pobierając je z głównego portu zasilania albo z linii zasilania bateryjnego. Rejestry backup to 10 16-bitowych rejestrów które umożliwiają przechowywanie 20 bajtów danych przy braku zasilania.</p>
<p style="text-align: justify;">RTC jest zestawem liczników obsługiwanych programowo i taktowanych z zewnętrznego oscylatora kwarcowego 32.768kHz, albo wewnętrznego oscylatora RC (40kHz). RTC może być wykorzystany do implementacji zegara lub kalendarza, a także do generowania przerwania co określony czas. Dodatkowo do dyspozycji mamy także 20-bitowy preskaler głównego sygnału zegarowego który domyślnie ustawiony jest tak, by przerwanie generowane było co 1 sekundę.</p>
<h3 style="text-align: justify;">Timers &amp; Watchdogs</h3>
<p style="text-align: justify;">Mikrokontrolery linii Performance wyposażone są w jeden zaawansowany timer, trzy timery ogólnego przeznaczenia, dwa timery watchdog, oraz timer SysTick używany w systemach operacyjnych.</p>
<h4 style="text-align: justify;">Advanced-control timer (TIM1)</h4>
<p style="text-align: justify;">Jest to najbardziej zaawansowany 16-bitowy timer w całym układzie. Może on pracować jako trójfazowy generator PWM multiplexowany na 6 kanałów. Posiada komplementarne wyjścia z programowanym czasem martwym (dead-time). Może także działać jako timer ogólnego przeznaczenia, którego funkcje opisuję poniżej.</p>
<h4 style="text-align: justify;">Genereal-purpose timers (TIMx)</h4>
<p style="text-align: justify;">Mikrokontrolery z linii Performance posiadają do 3 timerów ogólnego przeznaczenia. Wszystkie są oparte o 16-bitowy licznik zliczający w dół, lub w górę z funkcją automatycznego przeładowywania. Posiadają także 16-bitowy preskaler i 4 niezależne kanały dla input capture/output compare, PWM i trybu one-pulse. Timery te mogą także pracować razem w trybie zaawansowanym dzięki funkcji Time Link. Mogą również  obierać sygnały wprost z czujników halla i enkoderów.</p>
<h4 style="text-align: justify;">Independent watchdog</h4>
<p style="text-align: justify;">Jest to watchdog oparty o 12-bitowy licznik zliczający w dół z preskalerem 8-bitowym. Taktowany jest on 40kHz wewnętrznym generatorem RC i działa niezależnie od głównego zegara. Pracuje także w trybach obniżonego poboru mocy Stop mode i Standby mode. Może być uzywany jako watchdog do resetowania mikrokontrolera, gdy pojawi się jakiś problem, albo jako swego rodzaju timer używany w aplikacji. Jest on w pełni software&#8217;owo konfigurowalny.</p>
<h4 style="text-align: justify;">Window watchdog</h4>
<p style="text-align: justify;">Realizowany jako 7-bitowy licznik zliczający w dół. Może wywoływać reset gdy nie zostanie odświeżony w zadanym oknie czasowym.</p>
<h3 style="text-align: justify;">I2c Bus</h3>
<p style="text-align: justify;">Układy posiadają do dwóch kontrolerów interfejsu I2C. Mogą one pracować w trybach multimaster, oraz slave. Obsługują transmisje z szybkością standard i fast. Układy slave mogą być adresowane w dwóch trybach &#8211; 7-bitowym, oraz 7/10-bitowym. Dodatkowo kontroler sam dba o generowanie i weryfikację sumy CRC podczas transmisji. Kontrolery I2C mogą być obsługiwane przez DMA.</p>
<h3 style="text-align: justify;">USART</h3>
<p style="text-align: justify;">Jeden z USARTów może pracować z szybkością do 4.5Mbit/s, natomiast pozostałe do 2.25Mbit/s. Sprzętowo obsługiwane są sygnały RTS i CTS. Kontroler USART może być obsługiwany przez DMA.</p>
<h3 style="text-align: justify;">SPI</h3>
<p style="text-align: justify;">Interfejsy SPI mogą pracować zarówno w trybie slave, jak i master z prędkością do 18Mbit/s. Obsługiwane są tryby full- i half-duplex. 3-bitowy preskaler umożliwia wybranie jednej z ośmiu prędkości. Długość ramki danych jest konfigurowalna i może wynosić 8 lub 16 bit. Suma CRC jest generowana i weryfikowana sprzętowo, co ułatwia obsługę kart SD i MMC.</p>
<h3 style="text-align: justify;">USB</h3>
<p style="text-align: justify;">Wbudowany kontroler USB może pracować nawet z prędkości 12Mbit/s. Jako zegar wykorzystywany jest wtedy sygnał z pętli PLL (źródłem sygnału dla pętli musi być zewnętrzny kwarc &#8211; ze względu na stabilność).</p>
<h3 style="text-align: justify;">GPIO</h3>
<p style="text-align: justify;">Porty wejścia/wyjścia mogą byś programowo konfigurowane do pracy w trybach: push-pull lub open drain (wyjście) i push-up lub push-down (wejście). Większość nich ma także dodatkowe funkcje. Podłączone są one do magistrali APB2 co zapewnia prędkość zmian wyjścia do 18MHz.</p>
<h3 style="text-align: justify;">ADC</h3>
<p style="text-align: justify;">Układy wyposażone są w jeden lub dwa (performance line) 12-bitowe przetworniki ADC o czasie konwersji równym 1us. Posiadają one wiele trybów pracy, których wymienianie tutaj nie ma sensu, więc odsyłam do dokumentacji. Ich wejścia mogą być multipleksowane na 18 sygnałów, z czego 16 jest zewnętrznych, a pozostałe dwa, to wewnętrzny reference voltage i wewnętrzny termometr.</p>
<h1 style="text-align: justify;">Podsumowując</h1>
<p style="text-align: justify;">Mam nadzieje, że udało mi się Was przekonać, jaka moc drzemie w mikrokontrolerach STM32F. Ogólnie możliwości mikrokontrolerów z rdzeniami 32-bitowymi są nieporównywalne z możliwościami 8-bitowców. Ceny STM32 zaczynają się już od około 15zł, co jest porównywalne z cenami lepszych ATMeg, dlatego warto się zastanowić, czy czasem nie pora by poznać nową rodzinę mikrokontolerów&#8230;</p>
<h4>Źródła</h4>
<ul>
<li><a title="http://www.st.com/stm32" href="http://www.st.com/stm32">http://www.st.com/stm32</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://tutro.net/elektronika/rodzina-stm32/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cortex: 32-bitowe rdzenie dla wszystkich</title>
		<link>http://tutro.net/elektronika/cortex-32-bitowe-rdzenie-dla-wszystkich/</link>
		<comments>http://tutro.net/elektronika/cortex-32-bitowe-rdzenie-dla-wszystkich/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 14:58:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Elektronika]]></category>
		<category><![CDATA[ARM]]></category>
		<category><![CDATA[Cortex]]></category>
		<category><![CDATA[Cortex-M3]]></category>
		<category><![CDATA[mikrokontrolery]]></category>
		<category><![CDATA[mikroprocesory]]></category>

		<guid isPermaLink="false">http://tutro.net/?p=4</guid>
		<description><![CDATA[Na rynku mikrokontrolerów obserwujemy obecnie duże zmiany. Po długich latach królowania 8-bitowców do walki stają z nimi nowe mikrokontrolery z rdzeniami 16- i 32-bitowymi. Wszystko dzięki nowym opracowaniom architektur rdzeni. Głównym sprawcą tych zmian jest firma ARM Holdings (początkowo Advanced RISC Machines). Wszystko zaczęło się od opracowania w 1993 roku rdzenia ARM7TDMI (architektura ARMv4), który [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Na rynku mik<a href="http://tutro.net/wp-content/uploads/2010/01/cortex.gif"><img class="size-full wp-image-6 alignleft" title="cortex" src="http://tutro.net/wp-content/uploads/2010/01/cortex.gif" alt="" width="200" height="89" /></a>rokontrolerów obserwujemy obecnie duże zmiany. Po długich latach królowania 8-bitowców do walki stają z nimi nowe mikrokontrolery z rdzeniami 16- i 32-bitowymi. Wszystko dzięki nowym opracowaniom architektur rdzeni. Głównym sprawcą tych zmian jest firma ARM Holdings (początkowo Advanced RISC Machines). Wszystko zaczęło się od opracowania w 1993 roku rdzenia ARM7TDMI (architektura ARMv4), który obecnie jest już coraz rzadziej stosowany, gdyż wypiera go z rynku jego następca Cortex-M3 (architektura ARMv7). Niezwykłe jest przede wszystkim to, że dawniej każdy producent mikrokontrolerów miał opracowany własny rdzeń, który stosował w produkowanych przez siebie układach. Obecnie największe firmy produkujące półprzewodniki, takie jak: TI, STMicroelectronics, Freescale, Maxim itd. są klientami firmy ARM Holdings, a ich produkty bazują na rdzeniach ARM7, ARM9, oraz Cortex. Rdzenie z rodziny Cortex, dzięki dobrze przemyślanej architekturze osiągają bardzo dobre wyniki, jednocześnie pobierając niewiele energii. Dodatkowym atutem jest to, że są zbudowane ze stosunkowo niewielkiej liczby bramek, co czyni je bardzo łatwymi w budowie, a zarazem tanimi. Dzięki tym wszystkim zaletom mogą konkurować z mocno ustawionymi na rynku mikrokontrolerami 8-bitowymi.</p>
<h2 style="text-align: justify;"><span id="more-4"></span>Rodzina Cortex</h2>
<p style="text-align: justify;">Rodzina Cortex jest najnowszym opracowaniem firmy ARM. W jej skład wchodzą 3 rodzaje rdzeni (wszystkie oparte na tej samej architekturze &#8211; ARMv7):</p>
<ul>
<li style="text-align: justify;">Cortex-A &#8211; przeznaczone do aplikacji wykorzystujących systemy operacyjne, posiadają MMU (Cortex-A5, Cortex-A8, Cortex-A9)</li>
<li style="text-align: justify;">Cortex-R &#8211; przeznaczone do stosowania w systemach czasu rzeczywistego (Cortex-R4, Cortex-R4F)</li>
<li style="text-align: justify;">Cortex-M &#8211; zoptymalizowane cenowo i przeznaczone do szerokiego stosowania w mikrokontrolerach i typowych aplikacjach (Cortex-M0, Cortex-M1, Cortex-M3)</li>
</ul>
<p style="text-align: justify;">Wszystkie rdzenie obsługują nowy zestaw instrukcji Thumb-2, który umożliwia osiąganie dużych wydajności, przy  niskiej objętości kodu programu. Łączy on w sobie zalety zestawu ARM i Thumb. Kod zajmuję do 31% mniej niż w przypadku zestawu ARM i jest wykonywany do 38% szybciej niż zapisany w Thumb.</p>
<h3><a href="http://tutro.net/wp-content/uploads/2010/01/thumb.png"><img class="aligncenter size-medium wp-image-7" title="thumb" src="http://tutro.net/wp-content/uploads/2010/01/thumb-300x255.png" alt="" width="300" height="255" /></a>Rdzenie Cortex-M</h3>
<p style="text-align: justify;">Linia Cortex-M została stworzona do typowych zastosowań w motoryzacji, medycynie, komunikacji bezprzewodowej (ZigBee, Bluetooth), oraz przemyśle. W jej skład wchodzą obecnie 3 rdzenie:</p>
<ul style="text-align: justify;">
<li>Cortex-M3 &#8211; do stosowania w mikrokontrolerach</li>
<li>Cortex-M1 &#8211; rdzeń miękki zaprojektowany specjalnie do implementacji w FPGA</li>
<li>Cortex-M0 &#8211; rdzeń o bardzo niskim poborze energii &#8211; najmniejszy z zaprojektowanych przez firmę ARM</li>
</ul>
<p style="text-align: justify;">Wszystkie te rdzenie są kompatybilne, co umożliwia łatwe przenoszenie kodu z jednego na drugi. Firma ARM opracowała, we współpracy z producentami półprzewodników, specjalny standard CMSIS (Cortex Microcontroller Software Interface Standard), który ma być warstwą między sprzętem, a programem użytkownika. Umożliwi to łatwe przenoszenie aplikacji na inne rdzenie i skróci czas potrzebny na poznawanie nowych rodzin, oraz czas projektowania nowych urządzeń.</p>
<h2>Główny bohater artykułu &#8211; Cortex-M3</h2>
<div id="attachment_8" class="wp-caption aligncenter" style="width: 310px"><a href="http://tutro.net/wp-content/uploads/2010/01/cortex-m3.jpg"><img class="size-medium wp-image-8" title="cortex-m3" src="http://tutro.net/wp-content/uploads/2010/01/cortex-m3-300x259.jpg" alt="Budowa rdzenia Cortex-M3" width="300" height="259" /></a><p class="wp-caption-text">Budowa rdzenia Cortex-M3</p></div>
<p style="text-align: justify;">Zaskakująco dobry stosunek możliwości do ceny uzyskano w rdzeniach Cortex-M3 dzięki wielu zaawansowanym rozwiązaniom. Najważniejsze z nich to: 3-poziomowe kolejkowanie instrukcji z mechanizmem przewidywania rozgałęzień, skrócony czas wykonywania większości operacji do jednego cyklu, oraz zastosowanie nowego zestawu instrukcji Thumb-2.  Inne, te bardzie istotne, przedstawiam poniżej (tłumaczenie danych ze strony producenta z własnymi komentarzami):</p>
<ul style="text-align: justify;">
<li>hierarchiczna struktura z dobrze dopasowanymi peryferiami
<ul>
<li>CM3Core
<ul>
<li>architektura Harvardzka &#8211; oddzielne magistrale programu i danych</li>
<li>Nested Vectored Interrupt Controller (NVIC) &#8211; poprawiony  kontroler przerwań którego obsługa jest dużo prostsza w stosunku do ARM7</li>
<li>do 240 programowanych przerwań; do 256 poziomów priorytetów</li>
<li>małe opóźnienia obsługi przerwań dzięki zastosowaniu mechanizmów <em>tail chaining </em>i <em>late arrivals</em></li>
<li>wywłaszczanie przerwań o niższym priorytecie</li>
</ul>
</li>
<li>Memory Protection Unit (MPU)</li>
<li>Debug Port ( SW-DP or SWJ-DP )
<ul>
<li>możliwość debugowania przez Serial Wire lub JTAG</li>
</ul>
</li>
</ul>
</li>
<li>mnożenie w jednym cyklu i sprzętowe dzielenie</li>
<li>4GB przestrzeń adresowa</li>
<li>predefiniowane adresy dla pamięci programu, pamięci danych, urządzeń zewnętrznych i peryferiów</li>
<li>możliwość operowania na pojedynczych bitach dzięki technice<em><strong> </strong>bit banding</em></li>
<li>dostęp do pamięci programu w jednym cyklu</li>
<li>zintegrowane tryby obniżonego poboru energii</li>
</ul>
<h3 style="text-align: justify;">Porównanie Cortex-M3 z ARM7TDMI</h3>
<p style="text-align: justify;">Rdzeń Cortex-M3 jest następcą popularnego do tej pory ARM7TDMI. Inżynierzy z ARM Holdings podczas projektowania uwzględnili uwagi użytkowników, przede wszystkim dotyczące dość trudnego w obsłudze kontrolera przerwań. W nowym rdzeniu wprowadzono wiele poprawek, które sprawiają, że Cortex-M3 jest rdzeniem nowej generacji. Nowy zestaw instrukcji, poprawiony kontroler przerwań, krótkie i deterministyczne czasy obsługi przerwań, oraz zintegrowane peryferia pozwalają osiągnąć dużą wydajność, przy małym poborze mocy. Poniżej przedstawiam tabelkę porównawczą przygotowaną przez firmę ARM:</p>
<table style="height: 258px;" width="616">
<tbody>
<tr>
<td class="wep_darkblue"><strong>Features</strong></td>
<td class="wep_darkblue"><strong>ARM7TDMI</strong></td>
<td class="wep_darkblue"><strong>ARM Cortex-M3</strong></td>
</tr>
<tr>
<td class="wep_lightorange">Architecture</td>
<td class="wep_lightorange">ARMv4T (von Neumann</td>
<td class="wep_lightorange">ARMv7-M (Harvard)</td>
</tr>
<tr>
<td class="wep_lightorange">ISA Support</td>
<td class="wep_lightorange">Thumb / ARM</td>
<td class="wep_lightorange">Thumb / Thumb-2</td>
</tr>
<tr>
<td class="wep_lightorange">Pipeline</td>
<td class="wep_lightorange">3-stage</td>
<td class="wep_lightorange">3-stage + branch speculation</td>
</tr>
<tr>
<td class="wep_lightorange">Interrupts</td>
<td class="wep_lightorange">FIQ / IRQ</td>
<td class="wep_lightorange">NMI +1 to 240 physical interrupts</td>
</tr>
<tr>
<td class="wep_lightorange">Interrupt Latency</td>
<td class="wep_lightorange">24 &#8211; 42 cycles</td>
<td class="wep_lightorange">12 cycles</td>
</tr>
<tr>
<td class="wep_lightorange">Inter-Interrupt Latency</td>
<td class="wep_lightorange">24 cycles</td>
<td class="wep_lightorange">6 cycles</td>
</tr>
<tr>
<td class="wep_lightorange">Sleep Modes</td>
<td class="wep_lightorange">None</td>
<td class="wep_lightorange">Integrated</td>
</tr>
<tr>
<td class="wep_lightorange">Memory Protection</td>
<td class="wep_lightorange">None</td>
<td class="wep_lightorange">8 region MPU</td>
</tr>
<tr>
<td class="wep_lightorange">Dhrystone</td>
<td class="wep_lightorange">0.95 DMIPS/MHz (ARM)<br />
0.74 DMIPS/MHz (Thumb)</td>
<td class="wep_lightorange">1.25 DMIPS/MHz</td>
</tr>
<tr>
<td class="wep_lightorange">Power Consumption</td>
<td class="wep_lightorange">0.28mW/MHz</td>
<td class="wep_lightorange">0.19mW/MHz</td>
</tr>
<tr>
<td class="wep_lightorange">Area</td>
<td class="wep_lightorange">0.62mm2 (Core only)</td>
<td class="wep_lightorange">0.86mm2 (core + peripherals)*</td>
</tr>
</tbody>
</table>
<p style="text-align: justify;">
<p style="text-align: justify;">Jeszcze jestem winny małe sprostowanie&#8230; Miało być o rodzinie STM32, a było o Cortex&#8217;ach&#8230; Po prostu doszedłem do wniosku, że trzeba zacząć od początku :P Następny wpis będzie już na pewno o STM32.</p>
<h4>Źródła:</h4>
<ul>
<li><a href="http://www.arm.com/products/CPUs/families/CortexFamily.html">http://www.arm.com/products/CPUs/families/CortexFamily.html</a></li>
<li><a href="http://www.arm.com/products/CPUs/ARM_Cortex-M3.html">http://www.arm.com/products/CPUs/ARM_Cortex-M3.html</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://tutro.net/elektronika/cortex-32-bitowe-rdzenie-dla-wszystkich/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

