<?xml version="1.0" encoding="utf-8"?>

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:cc="http://web.resource.org/cc/"
  xmlns="http://purl.org/rss/1.0/">

<channel rdf:about="http://todotani.cocolog-nifty.com/blog/">
<title>PS3とLinux、電子工作も</title>
<link>http://todotani.cocolog-nifty.com/blog/</link>
<description>PS3 Linuxを使用したCellプログラミングの実験や電子工作（Arduino、ARM系）について書いています








   SyntaxHighlighter.config.clipboardSwf = &#39;http://todotani.cocolog-nifty.com/Scripts2/clipboard.swf&#39;;
   SyntaxHighlighter.all();

</description>
<dc:language>ja-JP</dc:language>
<dc:creator></dc:creator>
<dc:date>2009-11-08T22:42:26+09:00</dc:date>
<admin:generatorAgent rdf:resource="http://www.typepad.com/" />


<items>
<rdf:Seq><rdf:li rdf:resource="http://todotani.cocolog-nifty.com/blog/2009/11/stm32-primer2-u.html" />
<rdf:li rdf:resource="http://todotani.cocolog-nifty.com/blog/2009/11/post-d418.html" />
<rdf:li rdf:resource="http://todotani.cocolog-nifty.com/blog/2009/11/stm32-primer2sy.html" />
<rdf:li rdf:resource="http://todotani.cocolog-nifty.com/blog/2009/10/windows7-eb46.html" />
<rdf:li rdf:resource="http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-e.html" />
<rdf:li rdf:resource="http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-6.html" />
<rdf:li rdf:resource="http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-f.html" />
<rdf:li rdf:resource="http://todotani.cocolog-nifty.com/blog/2009/10/mbed-e710.html" />
<rdf:li rdf:resource="http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-c.html" />
<rdf:li rdf:resource="http://todotani.cocolog-nifty.com/blog/2009/09/ride7-e061.html" />
</rdf:Seq>
</items>

</channel>

<item rdf:about="http://todotani.cocolog-nifty.com/blog/2009/11/stm32-primer2-u.html">
<title>STM32 Primer2 U17レギュレーター死亡</title>
<link>http://todotani.cocolog-nifty.com/blog/2009/11/stm32-primer2-u.html</link>
<description>あちこちでこの問題が起きていますが、ついにやってしまいました、私も、、、 Fre...</description>
<content:encoded>&lt;p&gt;あちこちでこの問題が起きていますが、ついにやってしまいました、私も、、、&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.stm32circle.com/projects/project.php?id=103&quot; target=&quot;_blank&quot;&gt;FreeRTOSのPrimer2用デモ版&lt;/a&gt;を入れてLEDチカチカを確認した後、CircleOSに戻してリセットしてもLCDが真っ暗のままで、CircleOS起動時のサウンドも出ないのです。症状としては以下の通りで、Known Issueの&lt;a href=&quot;http://www.stm32circle.com/resources/known.php#reg_fail&quot; target=&quot;_blank&quot;&gt;U9 &amp;amp; U17 Voltage Regulator Failure&lt;/a&gt;そのものです。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;FreeRTOS demoやCirlceOSを使用しないLEDチカチカプログラムは動作するため、U9の出力は生きています。拡張コネクタのPin-1（VCC2V8）にも2.8Vが出ていますし、U9の発熱もありません&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;問題のU17は、出力電圧が0&lt;/font&gt;&lt;font color=&quot;#000000&quot;&gt;Vです（C54の両端で測定）&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;中央ボタンを押し続けるとVCC2V8が0Vに落ちるため、CircleOSのshutdown機能は動いているようです。ただ、一定時間放置した際の自動shutdownは働いてくれず、CircleOSも完全に起動しているかが怪しい感じ&lt;/font&gt; &lt;/li&gt;    &lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;U9のグランド強化対策は実施済みのロットでした&lt;/font&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;U17が死んだのはほぼ間違いがないのですが、CircleOSが立ち上がっているかを確認してみようと（ひょっとしてFlashROMの書き込みが不完全ということはないか）、自殺行為覚悟でU17の出力に手持ちの3.3V電源をつないでみました。すると、LCDが点灯して、例のメニュー画面がしっかりと表示されています。&lt;/p&gt;  &lt;p&gt;出力がショートしている可能性もあるため（何か焦げ臭い臭いもしましたし）、すぐに3.3V電源を切り離すとLCDバックライトがチカチカしながら・かつ薄暗い状態で点灯しています。U17の出力が復活（！）したのですが、内部的にはダメージを受けたようで、U17レギュレーターがかなり発熱しています。&lt;/p&gt;  &lt;p&gt;こうなると、&lt;a href=&quot;http://nemuisan.blog.bai.ne.jp/?eid=163838&quot; target=&quot;_blank&quot;&gt;ねむさいんのブログ&lt;/a&gt;にあるように、U17の置換を行わないとダメそうです。あと、出力側のコンデンサC56, C23も積層セラミックコンデンサに交換ですね、、&lt;/p&gt;  &lt;p&gt;U17はなんとか引っぺがしました。VCC3V1に3.3Vをつないでやると、LCD表示やサウンド再生もOKです。バックライトとサウンドICの電源は3.3Vでもよさそうなので、3.3VのLDOをうまく乗っけられるかに挑戦です。&lt;/p&gt;</content:encoded>


<dc:subject>STM32 Primer2</dc:subject>

<dc:creator>todotani</dc:creator>
<dc:date>2009-11-08T22:42:26+09:00</dc:date>
</item>
<item rdf:about="http://todotani.cocolog-nifty.com/blog/2009/11/post-d418.html">
<title>ココログブログの見栄え向上</title>
<link>http://todotani.cocolog-nifty.com/blog/2009/11/post-d418.html</link>
<description>当ブログのフォントやソースコード表示など見栄えの改善を行いました。備忘録も兼ねて...</description>
<content:encoded>&lt;p&gt;当ブログのフォントやソースコード表示など見栄えの改善を行いました。備忘録も兼ねて、今回行ったことを記載します。ココログに特化した部分が多いですがご容赦下さい。&lt;/p&gt;  &lt;p&gt;ブログの共通設定を変えることになりますので、&lt;span style=&quot;color: #ff0000&quot;&gt;お試しをされる方は自己責任でお願いします&lt;/span&gt;。事前にブログ内容のバックアップを取るなどした方がよいかと思います。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Windows Live Writerの導入&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;以前にも書きましたが、Windows 7への移行にあわせて、Live Writerを使い始めました。これまでは、ブラウザーからココログにログインして、ブラウザー上の画面を使って編集を行っていましたが（以後オンライン編集と記載）、作業性が結構向上します。またLive Writerは、以下のようにココログとの連携に加えて、オンライン編集ではできなかった書式指定が可能です：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;オフラインで作成した記事の投稿（サーバーへのアップロード）、PingサーバーへのPing通知 &lt;/li&gt;    &lt;li&gt;作成済み記事を読み込んで編集。Live Writerで作成していない記事も選択可能（取り出せるのは過去の500件まで） &lt;/li&gt;    &lt;li&gt;実際のブログテンプレートを使ったプレビューが投稿前に可能 &lt;/li&gt;    &lt;li&gt;ハイパーリンクで、「新しいウインドウで開く」オプションが指定可能（オンライン編集では実はできないのです） &lt;/li&gt;    &lt;li&gt;画像の挿入オプションが多彩。こちらも「新しいウインドウで開く」オプションが指定可能。まだ使っていませんが、 画像のトリミング、明るさ調整といった 画像編集も可能 &lt;/li&gt;    &lt;li&gt;表の挿入。オンライン編集でもHTMLタグをゴリゴリ書き込めば可能ですが、エクセルのような感じで編集ができるため楽ちんです &lt;/li&gt;    &lt;li&gt;プラグインを使って、プログラムコードを整形して挿入（キーワードのハイライト化など） → 後ほど詳細を記載します &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;以下は、気になる点です。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;スペルチェックがダメ      &lt;br /&gt;自動スペルチェックを有効にすると、日本語部分がすべてエラーになってしまいます（正しいスペルの英単語だけが赤くならない、、）。FireFoxのスペルチェック機能の方がよっぽど賢いです &lt;/li&gt;    &lt;li&gt;箇条書き指定を行うと、勝手に色指定のHTMLタグ（&amp;lt;font color=&amp;quot;#000000&amp;quot;&amp;gt;）が挿入されることがある &lt;/li&gt;    &lt;li&gt;スタイルシートを埋め込んだり、フォント指定を行うと、オンラインで再編集した際に書式が崩れる。こちらはLive Writerの問題というより、ココログとの相性問題と言うべきですが、、、 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;マイクロソフト製品なので、Windows Liveのブログにのみ対応かと思ったのですがさにあらずで、メジャーなブログエンジンには対応しているようです（ココログはTypePadです）。おかげでLive Writerは結構重宝しています。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;メイリオフォントの指定&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;ココログのテンプレートはデフォルトでMS Pゴシックを使っていますが、Vistaから使えるようになったメイリオフォントやMACに比べると見栄えがよくない（読みづらい）です。そのため、メイリオフォントを使えるようにしました。&lt;/p&gt;  &lt;p&gt;当初はLive Writerのフォント指定機能を使おうとしたのですが、各段落にフォント指定のHTMLタグが埋め込まれてソースが汚くなること、オンラインで編集を行うと書式が大きく乱れてしまう（書式指定の取り消しかつ、各行に改行が追加されるなど）ことから、スタイルシートをいじることにしました。CSSの構造はまったく分かっておらず、先人の成果を拝借しております。&lt;/p&gt;  &lt;p&gt;私はココログの出来合いテンプレート（リッチテンプレート）を使っているため、CSSの編集はできません。そのため、「&lt;a href=&quot;http://kitahei.cocolog-nifty.com/youyou/2007/08/post_e45e.html&quot; target=&quot;_blank&quot;&gt;きたへいの悠々自適&lt;/a&gt;」さんの記事を参考にし、ブログサブタイトルにカスタムCSSファイルへのリンクを書くことでフォント指定ができるようになりました。手順を以下に示します。&lt;/p&gt;  &lt;p&gt;1) トップページのソースから、読み込んでいるスタイルシート(style.cssファイル他）を探して、個別にダウンロード&lt;/p&gt;  &lt;p&gt;2)フォント指定部分を取り出しメイリオを追加し、適当な名前をつけてローカルに保存（mystyles.cssなど）    &lt;br /&gt;自分の場合は、以下の内容です。&lt;/p&gt;  &lt;pre class=&quot;brush: cpp; auto-links: false; &quot;&gt;body {
    font-family: &#39;メイリオ&#39;, &#39;Meiryo&#39;,&#39;MS PGothic&#39;, &#39;Hiragino Kaku Gothic Pro W3&#39;, Osaka, sans-serif;
    }

textarea {
    font-family: &#39;メイリオ&#39;, &#39;Meiryo&#39;,&#39;MS PGothic&#39;, &#39;Hiragino Kaku Gothic Pro W3&#39;, Osaka, sans-serif;
    width: 100%;
    }&lt;/pre&gt;

&lt;p&gt;3)上記のファイルをblogスペースにアップロードする。私は以下のようにしました&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;管理ページトップ &amp;gt; コントロールパネル &amp;gt; ファイルマネージャー&amp;#160; に移動 &lt;/li&gt;

  &lt;li&gt;ホーム配下にStylesフォルダを作成し、作成したcssファイル(mystyles.css)をアップロード &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4)ブログサブタイトルにアップロードしたcssファイルへのリンクを追加する&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;管理ページトップ &amp;gt; ブログ一覧 &amp;gt; [対象ブログ] &amp;gt; 設定 &amp;gt; ブログの基本情報&amp;#160; に移動 &lt;/li&gt;

  &lt;li&gt;ブログのサブタイトル（キャッチフレーズ）ボックスに以下のコードを追加 &lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;brush: xml; auto-links: false; &quot;&gt;&amp;lt;link type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;http://todotani.cocolog-nifty.com/Styles/mystyles.css&amp;quot;/&amp;gt;&lt;/pre&gt;

&lt;p&gt;5)変更を保存&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ソースコードの挿入&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://alexgorbatchev.com/wiki/SyntaxHighlighter&quot; target=&quot;_blank&quot;&gt;SyntaxHighlighter&lt;/a&gt;というJavaScriptベースのツールを使いました。Live WriterでSyntaxHighlighterを使うためのプラグインとして、&lt;a href=&quot;http://wlwsyntaxhighlighter.codeplex.com/&quot; target=&quot;_blank&quot;&gt;SyntaxHighlighter for Windows Live Writer&lt;/a&gt;があります。こちらは、プレビューでの確認や投稿後の再編集におけるブログとの連携に優れており、当初はこのプラグインを使い始めたのですが一点問題がありました。&lt;/p&gt;

&lt;p&gt;SyntaxHighlighterはVersion 2.xに移行しているのですが、プラグインはVersion 1.5対応となっており、SyntaxHighlighter Version 2.xが使えません。1.5では、IEを使った際に、折り返しや横スクロールの表示がうまくできませんでした（FireFoxなら問題はなかったのですが）。2.xなら改善されていそうなので、なんとか2.xを使えないかと思い他のプラグインを探したところ、&lt;a href=&quot;http://www.codeplex.com/precode&quot; target=&quot;_blank&quot;&gt;PreCode Snippet&lt;/a&gt;を発見しました。こちらは2.x専用だったりしますがPreCodeを使用することにしました。&lt;/p&gt;

&lt;p&gt;SyntaxHighlighterを使うためには、ブログサーバーにJavaScriptやスタイルシート(cssファイル）を登録しスクリプトを動かすための設定が必要になります。先ずはその手順を示します。&lt;/p&gt;

&lt;p&gt;1)SyntaxHighlighterをダウンロード&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://alexgorbatchev.com/wiki/SyntaxHighlighter:Download&quot; target=&quot;_blank&quot;&gt;ダウンロードページ&lt;/a&gt;からファイルを落とします（執筆時点の最新版は2.1.364） &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2)ブログサーバーにスクリプトファイルフォルダーの作成&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ホーム配下にScripts2フォルダを作ります（名前は任意です） &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;3)ブログサーバーにJavaScriptファイルをアップロード&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ダウンロードしたzipファイルのscriptsフォルダーから以下のファイルをアップロード &lt;/li&gt;

  &lt;li&gt;shCore.js（必須） &lt;/li&gt;

  &lt;li&gt;clipboard.swf（行番号を除いたソースをクリップボードにコピーするために必要） &lt;/li&gt;

  &lt;li&gt;shBrushCpp.js（C/C++ソースの整形を行うために必要） &lt;/li&gt;

  &lt;li&gt;shBrushXml.js（HTML/XMLの整形） &lt;/li&gt;

  &lt;li&gt;shBrushPlain.js（Plain Textの整形） &lt;/li&gt;

  &lt;li&gt;その他、Java/Rubyなど、必要に応じて整形用のshBrushXXX.jsファイルをアップ &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;4)スタイルシートのアップロード&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ダウンロードしたzipファイルのstylesフォルダーから以下のファイルをサーバーにアップ &lt;/li&gt;

  &lt;li&gt;shCore.css &lt;/li&gt;

  &lt;li&gt;shThemeDefault.css &lt;/li&gt;

  &lt;li&gt;xxx.pngファイル（全部） &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;5)ブラウザーでJavaScriptを起動するためのコードの埋め込み&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;メイリオフォントの指定に加えて、ブログサブタイトルに以下のコードを追加 &lt;/li&gt;
&lt;/ul&gt;

&lt;pre class=&quot;brush: xml; auto-links: false; &quot;&gt;&amp;lt;link type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;http://todotani.cocolog-nifty.com/Styles/mystyles.css&amp;quot;/&amp;gt;
&amp;lt;link type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;http://todotani.cocolog-nifty.com/Styles/shCore.css&amp;quot; /&amp;gt;
&amp;lt;link type=&amp;quot;text/css&amp;quot; rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;http://todotani.cocolog-nifty.com/Styles/shThemeDefault.css&amp;quot; /&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://todotani.cocolog-nifty.com/Scripts2/shCore.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://todotani.cocolog-nifty.com/Scripts2/shBrushCpp.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://todotani.cocolog-nifty.com/Scripts2/shBrushXml.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;http://todotani.cocolog-nifty.com/Scripts2/shBrushPlain.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
   SyntaxHighlighter.config.clipboardSwf = &#39;http://todotani.cocolog-nifty.com/Scripts2/clipboard.swf&#39;;
   SyntaxHighlighter.all();
&amp;lt;/script&amp;gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;変更を保存 &lt;/li&gt;

  &lt;li&gt;Live Writerの ブログ &amp;gt; ブログ設定の編集メニューから アカウント設定の更新を実行 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;6)PreCodeプラグインをインストール&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.codeplex.com/precode&quot; target=&quot;_blank&quot;&gt;ダウンロードページ&lt;/a&gt;からプラグインをダウンロードしてインストールします。 &lt;/li&gt;

  &lt;li&gt;Live Writerの ツール &amp;gt; オプション &amp;gt; プラグイン メニューを開き、プラグインを有効化 &lt;/li&gt;

  &lt;li&gt;Live Writerのソース画面を開く（&lt;span style=&quot;color: #ff0000&quot;&gt;&lt;strong&gt;編集画面ではありません&lt;/strong&gt;&lt;/span&gt;） &lt;/li&gt;

  &lt;li&gt;挿入ツールバーからPreCodeプラグインを起動 &lt;/li&gt;

  &lt;li&gt;テキストボックスに整形したいコードを貼り付け &lt;/li&gt;

  &lt;li&gt;プラグイン画面右側にあるコード種別やオプションを選択 &lt;/li&gt;

  &lt;li&gt;OKボタンを押すと、ソースウインドウにコードが挿入されます &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PreCodeプラグインを起動している画面イメージは以下です。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://todotani.cocolog-nifty.com/blog/WindowsLiveWriter/PreCode.png&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;PreCode&quot; border=&quot;0&quot; alt=&quot;PreCode&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/WindowsLiveWriter/PreCode_thumb.png&quot; width=&quot;240&quot; height=&quot;200&quot; complete=&quot;true&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;埋め込まれるコードの例は以下です。&lt;strike&gt;C++のコードとHTMLタグが混在しているため、Plaine Text形式を指定してあります（cpp形式だと、&amp;lt;p&amp;gt;などのHTMLタグが誤って表示されてしまいます）。 
    &lt;br /&gt;&lt;/strike&gt;&lt;font color=&quot;#ff0000&quot;&gt;2009/11/4追記：&lt;/font&gt; cpp (C/C++)形式を指定しても正常に動作するようになりました。なぜだろう？&lt;/p&gt;

&lt;pre class=&quot;brush: cpp; auto-links: false; &quot;&gt;&amp;lt;pre class=&amp;quot;brush: cpp; auto-links: false;&amp;quot;&amp;gt;
#include &amp;quot;stdafx.h&amp;quot;
#include &amp;lt;iostream&amp;gt;

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout &amp;lt;&amp;lt; &amp;quot;Hello C++\n&amp;quot;;

    return 0;
}
&amp;lt;/pre&amp;gt;&lt;/pre&gt;

&lt;p&gt;要はソースコードの開始～終了部分を、&amp;lt;PRE&amp;gt;～&amp;lt;/PRE&amp;gt;タグでくくるという単純なものです。開始タグの中に追加属性を書き込むことによって、書式の拡張が可能です。 &lt;/p&gt;

&lt;p&gt;7)注意点 
  &lt;br /&gt;SyntaxHighlighterはソースを&amp;lt;PRE&amp;gt;タグ（Preformatted Textタグ）で囲むことによって、ソースに記述されたスペース・改行などを、そのまま等幅フォントで表示します。編集画面にPreCodeプラグインが生成したコードを貼り付けると、スペースが”&amp;amp;nbsp;”に置き換わってしまいます。これでもブラウザ上の表示は正しく行われるのですが、コードをクリップボードにコピーすると、スペースの代わりに”&amp;amp;nbsp;”が入ってしまいます。これではコードの再利用ができません。プラグインの出力をソース画面に貼り付けるとスペースコードが変換されることなく入力ができます。&lt;/p&gt;

&lt;p&gt;SyntaxHighlighterを使うと、スペースコードがらみで一点制約が生じてしまいます。ブラウザからオンライン編集を行うと、スペースコードが”&amp;amp;nbsp;”に置き換わってしまいます。ブログファイルを開く時点で自動的に変換されてしまうようです。この問題を回避するためには、SyntaxHighlighterを使ったブログページに関しては、オンライン編集をあきらめて、常にLive Writerにページを読み込んでから編集・アップロードを行う必要があります。&lt;/p&gt;

&lt;p&gt;どこからでも編集できる利便性がなくなったのは残念ですが、出先からブログを編集することはないのでよしとしました。普段使うノートPCにLive Writerをインストールしておけば多くの場合は出先からも編集ができますし。&lt;/p&gt;

&lt;p&gt;&lt;font color=&quot;#ff0000&quot;&gt;2009/11/4追記：&lt;/font&gt; 残課題 

  &lt;br /&gt;一行の文字数が多いソースコードの表示は現状折り返し表示になっています。以下のように折り返し解除の指定を行うと、&lt;a href=&quot;http://alexgorbatchev.com/wiki/SyntaxHighlighter:Demo:wrap-lines&quot; target=&quot;_blank&quot;&gt;demoのように横スクロールバーが表示される&lt;/a&gt;はずなのですがうまく動いてくれません（スクロールバーが表示されず、右端が切れてしまう）。&lt;/p&gt;

&lt;p&gt;&amp;lt;pre class=&amp;quot;brush: cpp; wrap-lines: false; &amp;quot;&amp;gt;&lt;/p&gt;

&lt;p&gt;FireFoxだとちゃんと横スクロールバーが表示されますが、IE8だとNGです。IE8でもdemoのように正しく表示されるサイトもあるため、単なる相性問題でもなさそう（ココログのスタイルシートもからんでいるか）。&lt;/p&gt;</content:encoded>


<dc:subject>パソコン・インターネット</dc:subject>

<dc:creator>todotani</dc:creator>
<dc:date>2009-11-03T23:13:48+09:00</dc:date>
</item>
<item rdf:about="http://todotani.cocolog-nifty.com/blog/2009/11/stm32-primer2sy.html">
<title>STM32 Primer2のSysTickタイマー周期設定</title>
<link>http://todotani.cocolog-nifty.com/blog/2009/11/stm32-primer2sy.html</link>
<description>SysTickタイマーはSTM32 MCUが持つ機能で、OSがタスク切り替えを行...</description>
<content:encoded>&lt;p&gt;SysTickタイマーはSTM32 MCUが持つ機能で、OSがタスク切り替えを行う契機として使用します。PrimerのCircleOSでは、SysTickタイマー周期毎にタスクを切り替えるのではなく、SysTickHandlerに登録された以下の関数郡を毎回実行します。&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;BUTTON_Handler： ボタンの状態取得 &lt;/li&gt;    &lt;li&gt;POWER_Handler： バッテリー状態の取得と表示 &lt;/li&gt;    &lt;li&gt;RTC_DisplayTime： 時刻の取得と表示 &lt;/li&gt;    &lt;li&gt;MENU_Handler： メニュー表示の更新とアプリケーションの起動。      &lt;br /&gt;加えて、&lt;strong&gt;SysTick周期100回毎にユーザーアプリケーションの本体部分（Application_Handler）を実行する&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;その他の周期処理 &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;CircleOSにてSysTickタイマーをどのように設定しているかを調べてみました。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;CircleOSにおけるSysTickタイマー周期&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;以前の記事「&lt;a href=&quot;http://todotani.cocolog-nifty.com/blog/2009/09/stm32-primer2.html&quot; target=&quot;_blank&quot;&gt;STM32 Primer2&lt;/a&gt;」の末尾に示す通り、タイマー周期はMCUのクロック設定に連動して変化します。例えば24MHz動作の場合、SysTick周期 = 1ms、Application_Handler呼び出し周期 = 100msとなります。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;SysTick制御レジスターの動作&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;SysTick制御レジスタのフィールド定義と動作を以下に示します。「Cortex-M3 テクニカルリファレンスマニュアル(Rev.G)」をベースに、STM32固有の部分（太字・斜体）を追記してみました。&lt;/p&gt;  &lt;p&gt;1)SysTick制御レジスタ&lt;/p&gt;  &lt;table border=&quot;1&quot; cellspacing=&quot;1&quot; cellpadding=&quot;1&quot; width=&quot;539&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;69&quot;&gt;Bit&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;162&quot;&gt;フィールド名称&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;302&quot;&gt;機能&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;69&quot;&gt;2&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;162&quot;&gt;CLKCOURCE          &lt;br /&gt;（SysTickタイマーのクロックソース）&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;302&quot;&gt;0： 外部参照クロックを使用          &lt;br /&gt;&lt;strong&gt;&lt;em&gt;STM32ではAHBクロック(=HCLK)の1/8を供給する(STM32 Ref Manual 4.2章より）&lt;/em&gt;&lt;/strong&gt;           &lt;br /&gt;1： コアクロックを使用           &lt;br /&gt;&lt;em&gt;&lt;strong&gt;STM32ではAHBクロック(HCLK)を使用する&lt;/strong&gt;&lt;/em&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;69&quot;&gt;1&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;162&quot;&gt;TICKINT&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;302&quot;&gt;1： 0 までカウントダウンすると、SysTick ハンドラを保留する → 割り込みを生成すると理解          &lt;br /&gt;0： 0 までカウントダウンしても、SysTick ハンドラを保留しない → 割り込み生成しない&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;69&quot;&gt;0&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;162&quot;&gt;ENABLE&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;302&quot;&gt;1： カウンタはマルチショット方式で動作          &lt;br /&gt;0： カウンター無効&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;2)SysTick リロード値レジスタ&lt;/p&gt;  &lt;table border=&quot;1&quot; cellspacing=&quot;1&quot; cellpadding=&quot;2&quot; width=&quot;540&quot;&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;69&quot;&gt;Bit&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;フィールド名称&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;307&quot;&gt;機能&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign=&quot;top&quot; width=&quot;69&quot;&gt;0-23&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;158&quot;&gt;RELOAD&lt;/td&gt;        &lt;td valign=&quot;top&quot; width=&quot;307&quot;&gt;カウンタが0になったときに、SysTick現在値レジスタにロードする値 → タイマー周期を指定する&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;SysTick制御レジスターの設定&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;CircleOSの初期化時に、SysTick_Configuration()関数にて設定を行っています。コードは以下の通りです（CircleOS V3.80のscheduler.cより抜粋）。5行目のSysTick_CLKSourceConfig（）はSTM32F10x標準ライブラリ（以下STライブラリ）の関数です。パラメーター名よりCLKCOURCE = 0を設定することが分かります。&lt;/p&gt;  &lt;p&gt;14行目のSysTick_Config(SystemFrequency / 500)では、SysTickリロード値レジスタを、SystemFrequency(12MHz) / 500 = 24000に設定しています。&lt;/p&gt;  &lt;pre class=&quot;brush: cpp; auto-links: false; wrap-lines: false;　&quot;&gt;void SysTick_Configuration( void )
    {
    /* Configure SysTick to generate an interrupt @1.5MHz (with HCLK = 36MHz) */
    /* Select AHB clock(HCLK) as SysTick clock source */
    SysTick_CLKSourceConfig( SysTick_CLKSource_HCLK_Div8 );
    //SysTick_SetReload( 3000 );

    /* Enable SysTick Counter */
    //SysTick_CounterCmd( SysTick_CTRL_ENABLE );

    /* Enable SysTick interrupt */
    //SysTick_ITConfig( ENABLE );
    
    if (SysTick_Config(SystemFrequency / 500)) /* SystemFrequency is
                defined in system_stm32f10x.h and equal to HCLK frequency */
        {
        /* Capture error */
        while (1);
        } 
    }&lt;/pre&gt;

&lt;p&gt;SysTick_Config()は、CMSISファイルcore_cm3.hで定義されたインライン関数でコードは以下です。 &lt;/p&gt;

&lt;pre class=&quot;brush: cpp; auto-links: false; wrap-lines: false;　&quot;&gt;static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
  if (ticks &amp;gt; SYSTICK_MAXCOUNT)  return (1);   /* Reload value impossible */

  SysTick-&amp;gt;LOAD  =  (ticks &amp;amp; SYSTICK_MAXCOUNT) - 1;   /* set reload register */
  NVIC_SetPriority (SysTick_IRQn, (1&amp;lt;&amp;lt;__NVIC_PRIO_BITS) - 1);  /* set Priority for System Interrupts */
  SysTick-&amp;gt;VAL   =  (0x00);                    /* Load the SysTick Counter Value */
  SysTick-&amp;gt;CTRL = (1 &amp;lt;&amp;lt; SYSTICK_CLKSOURCE) | 
                  (1&amp;lt;&amp;lt;SYSTICK_ENABLE) | 
                  (1&amp;lt;&amp;lt;SYSTICK_TICKINT);        /* Enable SysTick IRQ and SysTick Timer */
  return (0);                                  /* Function successful */
}&lt;/pre&gt;

&lt;p&gt;SysTick_Config()の中で、リロード値レジスタの設定（5行目）に加えて、CLKSOURCEを１に再設定しています（8行目）。また割り込みの有効化をここで行っています（9～10行目）。すなわち、最終的なSysTickタイマーの設定条件は以下となります。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;SysTickカウンターをカウントダウンするクロックはMCUのコアクッロク(18～72MHz)&amp;#160; (CLKCOURCE = 1) &lt;/li&gt;

  &lt;li&gt;SysTickタイマー割り込み有効 &lt;/li&gt;

  &lt;li&gt;カウンターのリロード値は24000 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;上記設定により、冒頭に示したとおり、クロック周波数24MHz時のSysTickタイマー周期は1msとなります。 
  &lt;br /&gt;&amp;#160;&amp;#160; SysTickタイマー周期 = 24000000Hz / 24000 = 1000Hz&lt;/p&gt;

&lt;p&gt;SysTick割り込み発生回数をカウントするプログラムを作って動かしてみると、確かにクロック24MHzでは、１秒間に1000回割り込みが発生することが分かります。&lt;/p&gt;

&lt;p&gt;PS: &lt;a href=&quot;http://wlwsyntaxhighlighter.codeplex.com/&quot; target=&quot;_blank&quot;&gt;SyntaxHighlighter for Windows Live Writer&lt;/a&gt;を使ってソースコードのフォーマットを行ってみました。使い方が分からず結構苦戦。このページが昨晩から何回も消えたり・見えたりしていた筈です。&lt;/p&gt;</content:encoded>


<dc:subject>STM32 Primer2</dc:subject>

<dc:creator>todotani</dc:creator>
<dc:date>2009-11-02T22:05:52+09:00</dc:date>
</item>
<item rdf:about="http://todotani.cocolog-nifty.com/blog/2009/10/windows7-eb46.html">
<title>開発環境をWindows7に移行</title>
<link>http://todotani.cocolog-nifty.com/blog/2009/10/windows7-eb46.html</link>
<description>Windosw 7が発売されました。私もしっかりと(?)、先行予約で購入してしま...</description>
<content:encoded>&lt;p&gt;Windosw 7が発売されました。私もしっかりと(?)、先行予約で購入してしまい、週末はせっせとVistaから環境を移行中です。７の由来は諸説ありますが、Windows 7番目のメジャーリリースといわれています。自分が買った歴代Windowsを並べてみると、Windows 3.0→ ９５→ ９８ → Ｍｅ → ＸＰ → Vista → Windows 7となり、自分的にも７代目のWindowsです。&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;９５～Ｍｅはマイナーリリースですので、５世代お付き合いしたことになりますが、われながらマイクロソフトさんのいいカモだと思います。新しいのが出ると、ついつい、、&lt;/p&gt;  &lt;p&gt;Windows 7の使い勝手やインプレッションは他の記事に譲るとして、Arduino, STM32 Primer2開発環境の移行を行いましたので結果を以下に示します。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Arduio IDE&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Arduino 0017を使っていますが、問題なく動作。まあ、IDEはJavaアプリですから動いて当たり前です。FT2232のドライバーは最新の2.04.16をFTDIからダウンロードして使用しました。Windows 7対応の記載はありませんが、インストール、動作とも問題はありませんでした。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;STM32 Primer2 (Ride7)&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Vista時代に使っていた、CD_STM32-Primer_BN28.zipをインストール。こちらはRLinkドライバのインストールに問題がありました。インストーラーの処理では、RLinkインストールの際にOSバージョンチェックでエラーとなり、RLinkドライバーのインストールがスキップされます。&lt;/p&gt;  &lt;p&gt;[インストールDir]\Ride\Driver\RLinkDrvにドライバーファイルが展開されていますので、インストーラーから抜けた後に、RLinkUSBInstall.exeをXP互換モードで実行することでドライバーがインストールできました。デバッグ、書き込みなど一通り動かしてみましたが、今のところ問題はありません。XP/Vistaから変わった点として、Windows 7のスタートメニューにRide7で最近使ったプロジェクトが表示されるため、１アクションで直近のプロジェクを開くことができます。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;a href=&quot;http://todotani.cocolog-nifty.com/blog/WindowsLiveWriter/Win7_StartMenu_2.png&quot; target=&quot;_blank&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;Win7_StartMenu&quot; border=&quot;0&quot; alt=&quot;Win7_StartMenu&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/WindowsLiveWriter/Win7_StartMenu_thumb_2.png&quot; width=&quot;236&quot; height=&quot;240&quot; complete=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;ちょっと便利ですが、この開き方ででは、プロジェクト内で最後に使っていたソースコードを自動的に開いてくれない点が残念です。（Windowsの問題ではなく、Ride7の動作仕様だと思います）&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;その他&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;今回購入したのはProfessionalエディションの32bit（DSP）版です。64bit版はまだ時期尚早かと思い見送ったのですが、やっぱり64bit版にチャレンジしたほうが面白かったと後悔中です。パッケージ版なら32bit/64bitの両メディアが入っているので、64bitでだめなら32bitに代えるということもできたのですね、、。パッケージ版にこのようなメリトッがあることを認識していなかったです。最近は電子工作関連の情報収集に時間を取られて、このあたりの事前チェックが不足していました（言い訳ですが）。&lt;/p&gt;  &lt;p&gt;Windows 7はVistaに比べてレスポンスが改善されたと巷で言われていますが、確かにVistaで感じたモッサリ感がなくなり改善が実感できます。&lt;/p&gt;  &lt;p&gt;あと、Windows 7の新機能ではありませんが、Windows Live Writerなるブログ編集ソフトがあることを初めて知りました。Windows 7にはメールクライアントが添付されておらず、Windows Liveからのダウンロードになるのですが、その際に発見。この記事はLive Writerを使って入力しています。これまでは、ブラウザーの編集画面経由で記事の入力を行っており、編集機能が限られていたのですが、なかなか便利です。&lt;a href=&quot;http://www.forest.impress.co.jp/article/2007/11/22/wlwplugins.html&quot; target=&quot;_blank&quot;&gt;ソースコードを整形して貼り付けプラグイン&lt;/a&gt;もあり今度使ってみようと思います。フォントの指定ができるようになったため、デフォルトのMSゴシックでなく、メイリオを指定してみました。&lt;/p&gt;  &lt;p&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;2009/11/3追記：      &lt;br /&gt;&lt;/span&gt;Writerでフォント形式を指定すると、投稿後ブラウザーから編集を行うとフォーマットが崩れてしまう問題があったため、メイリオフォントの指定はスタイルシートの編集に変更しました。     &lt;br /&gt;ソース整形の「Insert Code for Windows Live Writer」はスタイルシートを記事の中に埋め込む形式のせいか、フォント指定と同様に、投稿後のブラウザー編集に問題がありました。&lt;/p&gt;  &lt;p&gt;上記の機能はココログとは相性が悪いようです。&lt;/p&gt;</content:encoded>


<dc:subject>パソコン・インターネット</dc:subject>

<dc:creator>todotani</dc:creator>
<dc:date>2009-10-25T10:56:00+09:00</dc:date>
</item>
<item rdf:about="http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-e.html">
<title>STM32 Primer2のバッテリー交換</title>
<link>http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-e.html</link>
<description>前回バッテリーが不調と書きましたが、原因はどうも以下のようです。 Primer2...</description>
<content:encoded>&lt;p&gt;&lt;a href=&quot;http://todotani.cocolog-nifty.com/&quot; target=&quot;_blank&quot;&gt;前回バッテリーが不調&lt;/a&gt;と書きましたが、原因はどうも以下のようです。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://www.stm32circle.com/resources/known.php#battery&quot; target=&quot;_blank&quot;&gt;Primer2のKnown Issue&lt;/a&gt;（既知問題）に「USBケーブルの抜き差しを頻繁に行うとバッテリーが死んでしまう」が上がっています。USBケーブルを挿入するとその都度充電シーケンスが開始されるため、これを短時間に繰り返すとバッテリーが死んでしまうというものです。&lt;/p&gt;  &lt;p&gt;実はデバック中に過充電を気にして、充電完了状態になる毎にUSBケーブルを抜き差したため、もろに上記の状態を作ってしまいました。ForumのFAQ（&lt;a href=&quot;http://www.stm32circle.com/forum/viewtopic.php?id=6&quot; target=&quot;_blank&quot;&gt;IMPORTANT: How to preserve the STM32 Primer batteries&lt;/a&gt;）に「&lt;span style=&quot;color: #ff0000&quot;&gt;Primer&lt;/span&gt;の充電回路は単純であり、バッテリーの保護のために長時間USBケーブルを接続したままにしてはいけない」とあったため、デバック中にUSBケーブルの抜き差しを行っていました。&lt;/p&gt;  &lt;p&gt;実は、上記の注意書きは、NiMHバッテリーを使ったPrimer1の話なんですね。単にPrimerとしか書いてないため、Primer2に対する注意書きだと勘違いしていました。よく考えてみると、過充電で発火の危険を伴うLi-Ionバッテリーを使った製品に「簡易充電回路」が認められるわけがなく、Primer2も当然制御ICを使った充電回路を持っています。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;バッテリーの交換&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;ということで、バッテリーを交換しました。バッテリーは&lt;a href=&quot;http://www.switch-science.com/products/detail.php?product_id=135&quot; target=&quot;_blank&quot;&gt;860mAhのリチウムイオンポリマー電池&lt;/a&gt;をスイッチサイエンスさんから購入。製品添付のバッテリーは容量が400mAhと小さめで、もともと交換を考えていたため、まあよいかというところです。&lt;/p&gt;  &lt;p&gt;購入したバッテリーはサイズ的にはぴったりで、元のバッテリーを外して基盤に両面テープで固定しました。&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://todotani.cocolog-nifty.com/blog/WindowsLiveWriter/Primer2_Battery_Change_1.jpg&quot;&gt;&lt;img style=&quot;border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px&quot; title=&quot;Primer2_Battery_Change&quot; border=&quot;0&quot; alt=&quot;Primer2_Battery_Change&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/WindowsLiveWriter/Primer2_Battery_Change_thumb_1.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; complete=&quot;true&quot; /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;まだ、２回程充電した程度ですが、今のところ問題なく動いています。充電電流は60mA程度で充電回路に負担がかかっているという感じはありません。バッテリー稼働時間はLCDをONにしたままでも余裕で6時間はいけそうでいい感じです。当然充電時間も延びましたが。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;2009/10/25追記：&lt;/span&gt;&lt;/strong&gt;     &lt;br /&gt;&lt;span style=&quot;color: #000000&quot;&gt;「&lt;a href=&quot;http://todotani.cocolog-nifty.com/blog/2009/09/stm32-primer2-0.html&quot; target=&quot;_blank&quot;&gt;STM32 Primer2の電源回路とバッテリー駆動時間&lt;/a&gt;」で行った測定方法を使用して、１２時間動作させてもバッテリーは3.77Vでした。まだ数時間は動きそうですので、十分な駆動時間となりました。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Li-Ionバッテリーの放電下限電圧&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;過去のブログ記事で、バッテリーのデーターシート上では放電下限電圧が2.75Vなのになぜ3.5Vでshutdownしてしまうのか、3Vあたりまでバッテリーを使えないのかと書きました。携帯電話のバッテリーが１セル・800mAh程度で今回購入したバッテリーと同程度のスペックですので、携帯電話の動作がどうなっているかを調べてみました。結果は以下のとおりです。&lt;/p&gt;  &lt;p&gt;バッテリーアラームが出て操作を受け付けなくなるまで放電した状態で電池を取り出し、電圧を測ると3.5Vでした。Primer2のshutdown電圧と同じです。かみさんの携帯で試しても同様でした（どちらも同じキャリアですが、端末メーカーは異なります）。ということは、Li-Ion電池は実質的に3.5V/cellあたりまでしか使ってはいけないということでしょうか。理由としては、以下が考えられそうです。&lt;/p&gt;  &lt;p&gt;このWebページ&lt;a href=&quot;http://www.baysun.net/_img4/discharge%20curve.gif&quot; target=&quot;_blank&quot;&gt;にあるLi-Ion電池の放電特性&lt;/a&gt;を見ると、3.5Vあたりまではだらだらと電圧が低下しますが、3.5Vから急激に電圧が低下することがわかります。放電電流が少ないほど3.5V境界での落ち込みが激しくなっています。Primer2も放電電流が少ない使い方になるため、電池を3.0Vあたりまで使うとshutdownタイミングの判断が難しく、下手をすると危険領域の2.75Vまであっという間に放電してしまうリスクがありそうです。加えて、3.5Vまで放電した時点で容量の90%以上を使っており、これ以上放電させても稼働時間延長への寄与は少ないと思われます。&lt;/p&gt;  &lt;p&gt;この点を考えて3.5Vで打ち止め（shotdown）しているのだと理解した次第です。&lt;/p&gt;</content:encoded>


<dc:subject>STM32 Primer2</dc:subject>

<dc:creator>todotani</dc:creator>
<dc:date>2009-10-24T02:48:00+09:00</dc:date>
</item>
<item rdf:about="http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-6.html">
<title>STM32 Primer2のバッテリー不調</title>
<link>http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-6.html</link>
<description>Primer2のバッテリー駆動時間が異常に短くなってしまいました。ひょっとしてバ...</description>
<content:encoded>&lt;p&gt;Primer2のバッテリー駆動時間が異常に短くなってしまいました。ひょっとしてバッテリーがお亡くなりになったかかも。いけない使い方はしていないつもりなのですが、、&lt;/p&gt;

&lt;p&gt;充電回路の動作を確認する意味も込めて、バッテリー充放電時の電圧・電流を計ってみました。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;リチウムイオンバッテリーの充電（予備知識）&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;先ずは&lt;a href=&quot;http://www.baysun.net/lithium/lithium09.html&quot;&gt;リチウムイオンバッテリーの基礎知識をこのサイトでお勉強&lt;/a&gt;です。リチウムイオンバッテリーの充電は、以下のフェーズに分かれます。&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;プリチャージ（バッテリー電圧が低い場合、電流を少し流して電圧が回復するかを確認　→バッテリーの正常性確認）&lt;/li&gt;

&lt;li&gt;定電流充電（定電流で急速充電を行う　→90%程度まで充電）&lt;/li&gt;

&lt;li&gt;定電圧充電（セル電圧が4.2Vに到達すると、定電圧で充電電流が一定の値以下になるまで充電）&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;充電時の電圧変化&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;電圧変化をテスターの写真を並べて示します。実はこのテスター20年以上前の代物なのですが（よく動いている）、測定値はCircleOSのUTIL_GetBat()関数で得られるバッテリー電圧と合っていますので概ね正確だと思います。今度新しいテスターを買わねば。UTIL_GetBat()関数は、バッテリー電圧をSTM32 MCUのADCで測定します。&lt;/p&gt;



&lt;p&gt;1)電圧低下による自動shutdown直後の電圧&lt;/p&gt;

&lt;p&gt;Shudonw直前は3.4V台まで電圧が落ちるが、電源が切れると電圧が少し復活する。&lt;br /&gt;&lt;a onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=640,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot; href=&quot;http://todotani.cocolog-nifty.com/.shared/image.html?/photos/uncategorized/2009/10/20/01_v_aftershutdown.jpg&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;300&quot; border=&quot;0&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/images/2009/10/20/01_v_aftershutdown.jpg&quot; title=&quot;01_v_aftershutdown&quot; alt=&quot;01_v_aftershutdown&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;2) 充電中の電圧&lt;/p&gt;

&lt;p&gt;4.19V（=4.2V）となっています。「&lt;a href=&quot;http://todotani.cocolog-nifty.com/blog/2009/09/stm32-primer2-0.html&quot;&gt;STM32 Primer2の電源回路とバッテリー駆動時間&lt;/a&gt;」で書きましたが、STM32 Primer2はバッテリー電圧3.5Vでshutdownしてしまうためか、定電流充電フェーズがなく、いきなり定電圧充電が始まっています。&lt;br /&gt;&lt;a onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=640,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot; href=&quot;http://todotani.cocolog-nifty.com/.shared/image.html?/photos/uncategorized/2009/10/20/02_v_charging.jpg&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;300&quot; border=&quot;0&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/images/2009/10/20/02_v_charging.jpg&quot; title=&quot;02_v_charging&quot; alt=&quot;02_v_charging&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;3) 充電が完了すると、電圧が4.1Vになります&lt;/p&gt;

&lt;p&gt;&lt;a onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=640,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot; href=&quot;http://todotani.cocolog-nifty.com/.shared/image.html?/photos/uncategorized/2009/10/20/03_v_chargecomp.jpg&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;300&quot; border=&quot;0&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/images/2009/10/20/03_v_chargecomp.jpg&quot; title=&quot;03_v_chargecomp&quot; alt=&quot;03_v_chargecomp&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;4) バッテリー駆動状態にする&lt;/p&gt;

&lt;p&gt;いきなり電圧が3.7V以下になります。電池の内部抵抗の関係？すぐに本体の電源をOFFすると4V台の電圧が見えますが、電源ONのままにするとあっという間に3.5Vに低下していきます。電圧落ちが早すぎるような。&lt;br /&gt;&lt;a href=&quot;http://todotani.cocolog-nifty.com/.shared/image.html?/photos/uncategorized/2009/10/20/04_v_poweron_aftercharge_2.jpg&quot; onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=640,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;300&quot; border=&quot;0&quot; alt=&quot;04_v_poweron_aftercharge_2&quot; title=&quot;04_v_poweron_aftercharge_2&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/images/2009/10/20/04_v_poweron_aftercharge_2.jpg&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;電流の測定&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1) 72MHz動作時の電流&lt;/p&gt;

&lt;p&gt;36MHz動作では、40.3mAでした。36MHzで、バックライト輝度を最低まで落とすと34.4mAとなりました。&lt;a href=&quot;http://todotani.cocolog-nifty.com/blog/2009/05/arduino-f889.html&quot;&gt;ATMega 328 16MhzのArduinoで25mA程度&lt;/a&gt;ですので、LCDがあることを加味するとまぁまぁの低消費電力性能か。&lt;br /&gt;&lt;a href=&quot;http://todotani.cocolog-nifty.com/.shared/image.html?/photos/uncategorized/2009/10/20/a_72mhz_blmid.jpg&quot; onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=640,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;300&quot; border=&quot;0&quot; alt=&quot;A_72mhz_blmid&quot; title=&quot;A_72mhz_blmid&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/images/2009/10/20/a_72mhz_blmid.jpg&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;2)充電電流&lt;/p&gt;

&lt;p&gt;4.2Vの定電圧充電時の電流（放電時に対して電流の流れが逆になるため、マイナス表示になっています）。だんだん、電流が減っていきます。&lt;br /&gt;&lt;a href=&quot;http://todotani.cocolog-nifty.com/.shared/image.html?/photos/uncategorized/2009/10/20/a_chargestart.jpg&quot; onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=640,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;300&quot; border=&quot;0&quot; alt=&quot;A_chargestart&quot; title=&quot;A_chargestart&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/images/2009/10/20/a_chargestart.jpg&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;3)充電完了時の電流&lt;/p&gt;

&lt;p&gt;僅かに放電しています。 &lt;br /&gt;&lt;a href=&quot;http://todotani.cocolog-nifty.com/.shared/image.html?/photos/uncategorized/2009/10/20/a_chargeend.jpg&quot; onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=640,height=480,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot;&gt;&lt;img width=&quot;400&quot; height=&quot;300&quot; border=&quot;0&quot; alt=&quot;A_chargeend&quot; title=&quot;A_chargeend&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/images/2009/10/20/a_chargeend.jpg&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;まとめ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;バッテリーが不調のため、正しい充放電特性になっていない可能性がありますが、以下のことが言えます&lt;/p&gt;

&lt;p&gt;1) STM32 Primer2では放電終止電圧が3.5Vと高めのため、充電はいきなり定電圧充電から始まる。ひょっとしてバッテリーを深く放電させると、定電流充電が走り、&lt;del&gt;ボルテージレギュレーター&lt;/del&gt;充電回路への負荷増になるため定電流充電が動かないようにしている？充電回路の抵抗値（Rprog）で充電電流を制御でき、STM32 Primer2では68KΩになっているため、充電制御IC（ST社L6924D）のデーターシートの式を使って計算すると171mAになります。本体を動かしながら充電すると200mA以上の電流供給が必要になりますが、&lt;del&gt;この電流が取れない？&lt;/del&gt;こちらはUSBバスパワーからの直送のため容量的には足りる筈です。&lt;/p&gt;

&lt;p&gt;2) 定電圧状態の充電電流は徐々に減少して、10mAあたりで充電が終了しました。充電終了電流も充電回路の抵抗で制御ができ、STM32 Primer2では13mAとなります。従って、充電終了の制御もちゃんと行われています&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;この先どうするか&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;バッテリーの電圧があっという間に下がってしまうのは、現象としてメモリー効果が起きているみたいですが、リチウムイオン電池ですからそれはないはずです。やっぱり電池が死んだのでしょうか。&lt;/p&gt;

&lt;p&gt;この際なので、容量の大きいバッテリーに交換を行います。スイッチサイエンスさんに&lt;a href=&quot;http://www.switch-science.com/products/detail.php?product_id=135&quot;&gt;860mAhのリチウムイオンポリマーバッテリー&lt;/a&gt;を注文しました。STM32 Primer2のForumを見ると、バッテリー容量を上げても充電回路は対応できる（充電時間が延びるだけ）とのスレッドがあったので、バッテリー交換で問題が解消するかを確認予定です。&lt;/p&gt;</content:encoded>


<dc:subject>STM32 Primer2</dc:subject>

<dc:creator>todotani</dc:creator>
<dc:date>2009-10-20T01:16:15+09:00</dc:date>
</item>
<item rdf:about="http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-f.html">
<title>STM32 Primer2でシリアルポートを使用する（割り込み編）</title>
<link>http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-f.html</link>
<description>前回に引き続き、STM32 Primer2でシリアルポート（USART2）を使っ...</description>
<content:encoded>&lt;p&gt;&lt;a href=&quot;http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-c.html&quot;&gt;前回&lt;/a&gt;に引き続き、STM32 Primer2でシリアルポート（USART2）を使った実験を行いました。前回はポーリング形式のデーター送受信でしたが、今回は割り込みを使ってみました。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;検証環境&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;CircleOS&amp;nbsp; 3.80&lt;/li&gt;

&lt;li&gt;STM32F10x Standard Peripherals Library V3.1.0 (以下STライブラリ）&lt;/li&gt;

&lt;li&gt;Ride7 V7.24.09&lt;/li&gt;

&lt;li&gt;シリアルポートとしてUSART2を使用&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;動作概要&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;&lt;li&gt;データー受信時（RXNE = 1）に割り込みをかけ、受信データーを受信バッファ（RxBuffer）に格納&lt;/li&gt;

&lt;li&gt;getchar()関数の呼び出しで受信バッファから1文字分のデーターを取得。受信データーがない場合は、0を返す（標準のgetcharと異なる部分）&lt;/li&gt;

&lt;li&gt;putchar()関数の呼び出しで送信データーを送信バッファ（TxBuffer）に格納&lt;/li&gt;

&lt;li&gt;送信バッファのデーターを、Transmit Data Register Empty（TXE）割り込発生契機にUSART2_DRに書き込むことによってデーターを送信する。送信バッファが空になると割り込みを停止する&lt;/li&gt;&lt;/ol&gt;

&lt;p&gt;一文字毎に割り込みを発生させるのもレジスタの退避などでオーバーヘッドがありそうですが、前回書いた通り、STM32 Primer2のCircleOSではユーザーアプリに処理が回ってくる間隔が長いため(33ms以上）、データーの取りこぼしを防止するためには受信側の割り込み処理は必須です。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STM32における割り込みの優先度&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Cortex-M3 テクニカルリファレンスマニュアルとSTライブラリの間で、割り込み優先度レベルの表記に差分がありました。内容を以下に示します。&lt;/p&gt;

&lt;p&gt;STM32は16レベルの割り込み優先度をサポートします（4bit幅の優先度レベルフィールド）。優先度レベルフィールドは、横取り優先度（preemption priority）とサブ優先度（sub-priority）に分割されます。また、横取り優先度とサブ優先度の分割はPriority Groupの指定によってプログラマブルになっています。&lt;/p&gt;

&lt;p&gt;Cortex-M3 テクニカルリファレンスマニュアルでは、Priority Group 0は横取り優先度に優先度レベルフィールドの上位7 bitを割り当てる定義になっているため、STM32では16レベル全てが異なる横取り優先度になります。&lt;/p&gt;

&lt;p&gt;一方で、STライブラリではmisc.hにて以下のようにNVIC_PriorityGroup_x定数を定義しています。 NVIC_PriorityGroup_0に対してサブ優先度フィールドを4 bit割り当てているため、横取り優先度がありません。&lt;br /&gt; &lt;/p&gt;



&lt;p&gt;&lt;/p&gt;

&lt;p&gt;&lt;meta http-equiv=&quot;CONTENT-TYPE&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;&lt;title&gt;&lt;/title&gt;&lt;meta name=&quot;GENERATOR&quot; content=&quot;OpenOffice.org 3.1  (Win32)&quot; /&gt;&lt;style&gt;
		&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;!-- 
		BODY,DIV,TABLE,THEAD,TBODY,TFOOT,TR,TH,TD,P { font-family:&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;ＭＳ Ｐゴシック&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;; font-size:x-small }
		 --&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;
	&lt;/style&gt;
&lt;/p&gt;

&lt;table cols=&quot;4&quot; cellspacing=&quot;0&quot; border=&quot;0&quot; rules=&quot;NONE&quot; frame=&quot;VOID&quot;&gt;
	&lt;colgroup&gt;&lt;col width=&quot;113&quot; /&gt;&lt;col width=&quot;125&quot; /&gt;&lt;col width=&quot;109&quot; /&gt;&lt;col width=&quot;204&quot; /&gt;&lt;/colgroup&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td width=&quot;113&quot; valign=&quot;MIDDLE&quot; height=&quot;24&quot; bgcolor=&quot;#000080&quot; align=&quot;LEFT&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;NVIC_PriorityGroup&lt;/span&gt;&lt;/td&gt;
			&lt;td width=&quot;125&quot; valign=&quot;MIDDLE&quot; bgcolor=&quot;#000080&quot; align=&quot;LEFT&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;PreemptionPri&lt;/span&gt;&lt;/td&gt;
			&lt;td width=&quot;109&quot; valign=&quot;MIDDLE&quot; bgcolor=&quot;#000080&quot; align=&quot;LEFT&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;SubPriority&lt;/span&gt;&lt;/td&gt;
			&lt;td width=&quot;204&quot; valign=&quot;MIDDLE&quot; bgcolor=&quot;#000080&quot; align=&quot;LEFT&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;Description&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td valign=&quot;TOP&quot; height=&quot;38&quot; bgcolor=&quot;#4d4d4d&quot; align=&quot;LEFT&quot; rowspan=&quot;1&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;NVIC_PriorityGroup_0&lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#ffffff&quot; align=&quot;CENTER&quot; rowspan=&quot;1&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;0&lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#ffffff&quot; align=&quot;CENTER&quot; rowspan=&quot;1&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 0-15&amp;nbsp; &lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#cccccc&quot; align=&quot;LEFT&quot; style=&quot;border-top: 1px solid rgb(0, 0, 0); border-left: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0 bits pre-emption priority&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4 bits subpriority&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		
		&lt;tr&gt;
			&lt;td valign=&quot;TOP&quot; height=&quot;38&quot; bgcolor=&quot;#4d4d4d&quot; align=&quot;LEFT&quot; rowspan=&quot;2&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;NVIC_&lt;/span&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;PriorityGroup_1&lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#ffffff&quot; align=&quot;CENTER&quot; rowspan=&quot;2&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0-1&lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#ffffff&quot; align=&quot;CENTER&quot; rowspan=&quot;2&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 0-7 &lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#cccccc&quot; align=&quot;LEFT&quot; style=&quot;border-top: 1px solid rgb(0, 0, 0); border-left: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1 bits pre-emption priority &lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td bgcolor=&quot;#cccccc&quot; align=&quot;LEFT&quot; style=&quot;border-left: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0); border-bottom: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3 bits subpriority&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td valign=&quot;TOP&quot; height=&quot;38&quot; bgcolor=&quot;#4d4d4d&quot; align=&quot;LEFT&quot; rowspan=&quot;2&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;NVIC_PriorityGroup_2 &lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#ffffff&quot; align=&quot;CENTER&quot; rowspan=&quot;2&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0-3&lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#ffffff&quot; align=&quot;CENTER&quot; rowspan=&quot;2&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 0-3&lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#cccccc&quot; align=&quot;LEFT&quot; style=&quot;border-top: 1px solid rgb(0, 0, 0); border-left: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2 bits pre-emption priority&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#cccccc&quot; align=&quot;LEFT&quot; style=&quot;border-left: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0); border-bottom: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2 bits subpriority&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td valign=&quot;TOP&quot; height=&quot;38&quot; bgcolor=&quot;#4d4d4d&quot; align=&quot;LEFT&quot; rowspan=&quot;2&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;NVIC_PriorityGroup_3 &lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#ffffff&quot; align=&quot;CENTER&quot; rowspan=&quot;2&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0-7&lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#ffffff&quot; align=&quot;CENTER&quot; rowspan=&quot;2&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 0-1&lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#cccccc&quot; align=&quot;LEFT&quot; style=&quot;border-top: 1px solid rgb(0, 0, 0); border-left: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3bits pre-emption priority&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#cccccc&quot; align=&quot;LEFT&quot; style=&quot;border-left: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0); border-bottom: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1bits subpriority&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td valign=&quot;TOP&quot; height=&quot;38&quot; bgcolor=&quot;#4d4d4d&quot; align=&quot;LEFT&quot; rowspan=&quot;2&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;NVIC_PriorityGroup_4&lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#ffffff&quot; align=&quot;CENTER&quot; rowspan=&quot;2&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0-15&lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#ffffff&quot; align=&quot;CENTER&quot; rowspan=&quot;2&quot; style=&quot;border: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; 0&lt;/span&gt;&lt;/td&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#cccccc&quot; align=&quot;LEFT&quot; style=&quot;border-top: 1px solid rgb(0, 0, 0); border-left: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4bits pre-emption priority&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		&lt;tr&gt;
			&lt;td valign=&quot;TOP&quot; bgcolor=&quot;#cccccc&quot; align=&quot;LEFT&quot; style=&quot;border-left: 1px solid rgb(0, 0, 0); border-right: 1px solid rgb(0, 0, 0); border-bottom: 1px solid rgb(0, 0, 0);&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;0bits subpriority&lt;/span&gt;&lt;/td&gt;
		&lt;/tr&gt;
		
	&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;実は、STライブラリのmisc.hの中でPriority Group値の読替を行っており、STライブラリのNVIC_PriorityGroup_0は、Cortex-M3 テクニカルリファレンスのPriorityGroup 7に該当し等価です（当たり前ですが）。&lt;br /&gt;　#define NVIC_PriorityGroup_0&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;((uint32_t)0x700)&lt;/p&gt;

&lt;p&gt;また、上位2 bitが横取り優先度となるグループ設定を行った場合、Cortex-M3 テクニカルリファレンスの表記では、横取り優先度レベルは8 bitフィールドの上位2 bitで表されるため、0xC0, 0x80, 0x40, 0x00の値を取ります。一方STライブラリでは3, 2, 1, 0の値を指定します。&lt;/p&gt;

&lt;p&gt;STM32 Primer2の場合、CircleOSにてNVIC_PriorityGroup_2を設定しています。また、Mems用のTIM2割り込みを、横取り優先度=1, サブ優先度=1に設定してしています。今回、USART2の割り込に対して、横取り優先度=2, サブ優先度=0を設定しました。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;プログラムコード&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;前回の「&lt;a href=&quot;http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-c.html&quot;&gt;STM32 Primer2でシリアルポートを使用する&lt;/a&gt;」で使用したSTM32F10X_IO_putchar.cに割り込みハンドラとバッファ制御処理を追加しました。割り込み優先度はSTライブラリを使用して以下のように設定しました。&lt;br /&gt;&amp;nbsp; NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;&lt;br /&gt;&amp;nbsp; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;&lt;br /&gt;&amp;nbsp; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;&lt;/p&gt;

&lt;p&gt;Priority GroupはCircleOS起動時に設定済みのため触っていません。割り込みハンドラはCircleOSが管理しているため、以下のようにCircleOSのUTIL_SetIrqHandlerL関数を呼び出して登録します。&lt;br /&gt;　UTIL_SetIrqHandler(0x00D8, USART2_IRQHandler);&lt;/p&gt;

&lt;p&gt;0x00D8はUSART2_IRQ用割り込みベクターのアドレス（ベクターテーブル先頭からのオフセット値）です。&lt;/p&gt;

&lt;p&gt;割り込みハンドラー（USART2_IRQHandler）では、STライブラリのUSART_GetITStatus()関数を使って割り込み要因を調べ、要因別の処理を行っています。コード全体を以下に示します。&lt;/p&gt;

&lt;p&gt;#include &amp;quot;stm32f10x.h&amp;quot;&lt;br /&gt;#include &amp;quot;circle_api.h&amp;quot;&lt;br /&gt;&lt;br /&gt;/* Private defines -----------------------------------------------------------*/&lt;br /&gt;#define BUFF_SIZE&amp;nbsp; &amp;nbsp;&amp;nbsp; 255&lt;br /&gt;&lt;br /&gt;/* Private variables ---------------------------------------------------------*/&lt;br /&gt;unsigned char __io_init_done = 0;&lt;br /&gt;&lt;br /&gt;u8 TxBuffer[BUFF_SIZE];&lt;br /&gt;u8 RxBuffer[BUFF_SIZE];&lt;br /&gt;&lt;br /&gt;vu8 TxWrCounter = 0x00;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;// Write counter for Tx data buffer&lt;br /&gt;vu8 TxRdCounter = 0x00;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;// Read counter for Tx data buffer&lt;br /&gt;vu8 RxWrCounter = 0x00;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;// Write counter for Rx data buffer&lt;br /&gt;vu8 RxRdCounter = 0x00;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;// Read counter for Rx data buffer&lt;br /&gt;&lt;br /&gt;//unsigned int __io_Main_Osc = 8000000;&lt;br /&gt;&lt;br /&gt;/* Private function prototypes -----------------------------------------------*/&lt;br /&gt;void USART2_IRQHandler(void);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//called by the user app to tell us what is the main osc frequency&lt;br /&gt;void __io_SetMainOscFreq( unsigned int NewFreq )&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; //__io_Main_Osc=NewFreq; //save new freq value&lt;br /&gt;&amp;nbsp; &amp;nbsp; __io_init_done = 0; //force reinit at next putchar&lt;br /&gt;&amp;nbsp; &amp;nbsp; //we need to keep this even if we ignore the NewFreq param&lt;br /&gt;&amp;nbsp; &amp;nbsp; //because if the user calls this, it means that he probably changed his clock settings&lt;br /&gt;&amp;nbsp; &amp;nbsp; //so we must really reinit&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;/*******************************************************************************&lt;br /&gt;* Function Name&amp;nbsp; : InitUSART&lt;br /&gt;* Description&amp;nbsp; &amp;nbsp; : Initialize USART2 and NVIC&lt;br /&gt;*&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;Set Irqvector of USART2 IRQ&lt;br /&gt;* &lt;br /&gt;*******************************************************************************/&lt;br /&gt;void __io_init( void )&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; GPIO_InitTypeDef GPIO_InitStructure;&lt;br /&gt;&amp;nbsp; USART_InitTypeDef USART_InitStructure;&lt;br /&gt;&amp;nbsp; NVIC_InitTypeDef NVIC_InitStructure;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* Enable GPIOx and AFIO clocks */&lt;br /&gt;&amp;nbsp; /* USART2 used for Primer2 */&lt;br /&gt;&amp;nbsp; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* Enable USART2 clocks */&amp;nbsp; &lt;br /&gt;&amp;nbsp; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* Set IRQ Handler to NVIC table */&lt;br /&gt;&amp;nbsp; UTIL_SetIrqHandler(0x00D8, USART2_IRQHandler);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* NVIC_Configuration to enable USART2 IRQ */&lt;br /&gt;&amp;nbsp; NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;&lt;br /&gt;&amp;nbsp; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;&lt;br /&gt;&amp;nbsp; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;&lt;br /&gt;&amp;nbsp; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;&lt;br /&gt;&amp;nbsp; NVIC_Init(&amp;amp;NVIC_InitStructure);&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; /* Configure the GPIO ports */&lt;br /&gt;&amp;nbsp; /* Configure USARTx_Tx as alternate function push-pull */&lt;br /&gt;&amp;nbsp; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;&lt;br /&gt;&amp;nbsp; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;&lt;br /&gt;&amp;nbsp; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;&lt;br /&gt;&amp;nbsp; GPIO_Init(GPIOA, &amp;amp;GPIO_InitStructure);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* Configure USARTx_Rx as input floating */&lt;br /&gt;&amp;nbsp; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;&lt;br /&gt;&amp;nbsp; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;&lt;br /&gt;&amp;nbsp; GPIO_Init(GPIOA, &amp;amp;GPIO_InitStructure);&lt;br /&gt;&lt;br /&gt;/* USARTx configuration ------------------------------------------------------*/&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_BaudRate = 9600;&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_WordLength = USART_WordLength_8b;&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_StopBits = USART_StopBits_1;&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_Parity = USART_Parity_No ;&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;&lt;br /&gt;&amp;nbsp; /*&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_Clock = USART_Clock_Disable;&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_CPOL = USART_CPOL_Low;&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_LastBit = USART_LastBit_Disable;&lt;br /&gt;&amp;nbsp; */&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; /* Configure the USARTx */ &lt;br /&gt;&amp;nbsp; USART_Init(USART2, &amp;amp;USART_InitStructure);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; USART_ClearITPendingBit(USART2, USART_IT_RXNE);&lt;br /&gt;&amp;nbsp; USART_ClearITPendingBit(USART2, USART_IT_TXE);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* Enable USART2 Receive and Transmit interrupts */&lt;br /&gt;&amp;nbsp; USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);&lt;br /&gt;&amp;nbsp; USART_ITConfig(USART2, USART_IT_TXE, ENABLE);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* Enable the USART2 */&lt;br /&gt;&amp;nbsp; USART_Cmd(USART2, ENABLE);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; // IO init done!&lt;br /&gt;&amp;nbsp; __io_init_done = 1;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*******************************************************************************&lt;br /&gt;* Function Name&amp;nbsp; : DeenitUSART&lt;br /&gt;* Description&amp;nbsp; &amp;nbsp; : Restore Irqvector of USART2 irq&lt;br /&gt;*&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;Disable USART2 and USART2 irq&lt;br /&gt;* &lt;br /&gt;*******************************************************************************/&lt;br /&gt;void DeinitUSART(void)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);&lt;br /&gt;&amp;nbsp; USART_ITConfig(USART2, USART_IT_TXE, DISABLE);&lt;br /&gt;&amp;nbsp; USART_Cmd(USART2, DISABLE);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; __io_init_done = 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*******************************************************************************&lt;br /&gt;* Function Name&amp;nbsp; : __io_putchar&lt;br /&gt;* Description&amp;nbsp; &amp;nbsp; : Write data to TxBuffer (Do not write USART DR)&lt;br /&gt;*&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;Actrual data transfer is done by IRQ Handler&lt;br /&gt;* Input&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; : charactor to send&lt;br /&gt;*******************************************************************************/ &lt;br /&gt;void __io_putchar( char c )&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;//init UART if needed&lt;br /&gt;&amp;nbsp; &amp;nbsp;if( !__io_init_done )&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;__io_init();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;// \n is not enough. Need \r too!&lt;br /&gt;&amp;nbsp; &amp;nbsp;if( c == 0x0A )&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;__io_putchar( 0x0D );&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;&amp;nbsp; &amp;nbsp; while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; USART_SendData(USART2, (u8)c);&lt;br /&gt;*/&lt;br /&gt;&amp;nbsp; &amp;nbsp; u16 emptyFlag;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (TxWrCounter == TxRdCounter)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; emptyFlag = 1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; emptyFlag = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; TxBuffer[TxWrCounter] = (u8)c;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (++TxWrCounter == BUFF_SIZE)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; TxWrCounter = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (emptyFlag)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;USART_ITConfig(USART2, USART_IT_TXE, ENABLE); &lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;int&lt;br /&gt;putchar (c)&lt;br /&gt;int c;&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; __io_putchar( (char) c );&lt;br /&gt;&amp;nbsp; &amp;nbsp; return c;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/*******************************************************************************&lt;br /&gt;* Function Name&amp;nbsp; : __io_getchar&lt;br /&gt;* Description&amp;nbsp; &amp;nbsp; : Read data from RxBuffer (Do not read USART DR)&lt;br /&gt;*&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;Actrual data reception is done by IRQ Handler&lt;br /&gt;* Return&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;: RxBuffer not empty-&amp;gt; Received charactor&lt;br /&gt;*&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; : RxBuffer empty&amp;nbsp; &amp;nbsp; -&amp;gt; 0&lt;br /&gt;*******************************************************************************/ &lt;br /&gt;int __io_getchar()&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;//init UART if needed&lt;br /&gt;&amp;nbsp; &amp;nbsp;if( !__io_init_done )&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;__io_init();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;&amp;nbsp; &amp;nbsp;unsigned short value;&lt;br /&gt;&amp;nbsp; &amp;nbsp;unsigned short wStatus;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;value = USART_ReceiveData(USART2);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;return (int)(value);&lt;br /&gt;*/&lt;br /&gt;&amp;nbsp; &amp;nbsp; u8 ch, rxRdNext;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (RxRdCounter == RxWrCounter)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; rxRdNext = RxRdCounter + 1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (rxRdNext == BUFF_SIZE)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; rxRdNext = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; ch = RxBuffer[rxRdNext];&lt;br /&gt;&amp;nbsp; &amp;nbsp; RxRdCounter = rxRdNext;&lt;br /&gt;&amp;nbsp; &amp;nbsp; return (int)ch;&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int getchar()&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;return __io_getchar();&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;/*******************************************************************************&lt;br /&gt;* Function Name&amp;nbsp; : USART2_IRQHandler&lt;br /&gt;* Description&amp;nbsp; &amp;nbsp; : Write received data to RxBuffer&lt;br /&gt;*&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;Send data from TxBuffer&lt;br /&gt;*******************************************************************************/ &lt;br /&gt;void USART2_IRQHandler(void)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; u8 rxWrNext;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp; rxWrNext = RxWrCounter + 1;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(rxWrNext == BUFF_SIZE)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;rxWrNext = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (rxWrNext == RxRdCounter)&amp;nbsp; &amp;nbsp;&amp;nbsp; // Rx buffer full (Write counter overtake Read counter)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;USART_ReceiveData(USART2);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;return;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; RxBuffer[rxWrNext] = USART_ReceiveData(USART2);&lt;br /&gt;&amp;nbsp; &amp;nbsp; RxWrCounter = rxWrNext;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; // Now RxWrCounte point next index (Wr &amp;gt; Rd)&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp; if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)&lt;br /&gt;&amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (TxRdCounter == TxWrCounter)&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;// Tx buffer empty&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;USART_ITConfig(USART2, USART_IT_TXE, DISABLE);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;return;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; USART_SendData(USART2, TxBuffer[TxRdCounter++]);&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(TxRdCounter == BUFF_SIZE)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;TxRdCounter = 0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ビルド方法&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;「&lt;a href=&quot;http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-c.html&quot;&gt;STM32 Primer2でシリアルポートを使用する&lt;/a&gt;」に示した方法を使ってRide7でビルドします。STライブラリのソースに加えて、STM32F10X_IO_putchar.cもプロジェクトフォルダーにおいてコンパイルします。LD Linker設定のUART0 Putcharライブラリ設定はNoにします。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;アプリケーションからの使用方法&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;以下のようにgatchar(), putchar()関数を呼び出すと、裏で割り込みベースの入出力が動きます。&lt;/p&gt;

&lt;p&gt;/*******************************************************************************&lt;br /&gt;* Function Name&amp;nbsp; : Application_Handler&lt;br /&gt;* Description&amp;nbsp; &amp;nbsp; : Management of the Circle_App.&lt;br /&gt;*&lt;br /&gt;* Input&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; : None&lt;br /&gt;* Return&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;: MENU_CONTINUE&lt;br /&gt;*******************************************************************************/&lt;br /&gt;enum MENU_code Application_Handler(void)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; // TODO: Write your application handling here.&lt;br /&gt;&amp;nbsp; &amp;nbsp; int c;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; while ( (c = getchar()) !=0 )&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; putchar(c);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; // This routine will get called repeatedly by CircleOS, until we&lt;br /&gt;&amp;nbsp; &amp;nbsp; // return MENU_LEAVE&lt;br /&gt;&lt;br /&gt;#if 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; // If the button is pressed, the application is exited&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(BUTTON_GetState() == BUTTON_PUSHED)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; BUTTON_WaitForRelease();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; DeinitUSART();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; return MENU_Quit();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; return MENU_CONTINUE;&amp;nbsp; &amp;nbsp;// Returning MENU_LEAVE will quit to CircleOS&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;

&lt;p&gt;アプリケーションを終了する際に、DeinitUSART()を呼んで割り込みの停止とUSART2の停止を行っています。割り込みを有効にしたままアプリケーションを終了した後で、シリアルポートにデーターを送るとCircleOSがメニュー操作を受け付けなくなってしまったため、後始末として入れています。&lt;/p&gt;

&lt;p&gt;リングバッファの管理が手抜きなのですが（書き込みポインターが読み出しポインターに追いついたか否かだかで制御しており、バッファーに溜まっているデーター量は管理していない）、取りこぼし等発生することなく動いています。&lt;/p&gt;</content:encoded>


<dc:subject>STM32 Primer2</dc:subject>

<dc:creator>todotani</dc:creator>
<dc:date>2009-10-11T21:37:25+09:00</dc:date>
</item>
<item rdf:about="http://todotani.cocolog-nifty.com/blog/2009/10/mbed-e710.html">
<title>mbedプロトタイピングツール</title>
<link>http://todotani.cocolog-nifty.com/blog/2009/10/mbed-e710.html</link>
<description>ARMのホームページを覗いたらこんなのを見つけました。ちょっと物欲がうずきます。...</description>
<content:encoded>&lt;p&gt;ARMのホームページを覗いたらこんなのを見つけました。ちょっと物欲がうずきます。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;ARMとNXP、マイクロコントローラ搭載システムのプロトタイピングを高速化する&lt;a href=&quot;http://www.jp.arm.com/pressroom/09/090925.html&quot;&gt;mbed&lt;/a&gt;を発表&lt;/li&gt;

&lt;li&gt;NXP LPC1768（Cortex M3）を使ったプロトタイピング用のモジュールと開発環境が&lt;a href=&quot;http://mbed.org/tour/&quot;&gt;mbed.org&lt;/a&gt;で公開されています&lt;/li&gt;

&lt;li&gt;モジュールは以下のように40pin DIP構成となっており、ブレッドボードで使うのに最適（Arduino Nanoみたいです）。&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://todotani.cocolog-nifty.com/.shared/image.html?/photos/uncategorized/2009/10/07/mbed.jpg&quot; onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=478,height=310,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;194&quot; border=&quot;0&quot; alt=&quot;Mbed&quot; title=&quot;Mbed&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/images/2009/10/07/mbed.jpg&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;開発環境はmbed.orgがクラウド上で提供。各自のPC上にコンパイラ・IDEなどの開発環境を構築する必要がないというのが今風です。曰く「新規ユーザーが60秒でHello Worldを動かせる」とか。&lt;/p&gt;

&lt;p&gt;Digital I/O, PWM, SPIなどのペリフェラルドライバーがC++形式のライブラリとして提供されています。また、2行LCDへの表示・Servoといったよく使う機能もC++オブジェクト形式のライブラリとして提供されています。C++でペリフェラルやI/O制御をラッピングするコンセプトはArduinoと同じですね。C++を組み込み系で使うのは、パフォーマンスやメモリー使用効率の点では最適とは言えないのかもしれませんが、複雑な低レベルI/O制御を隠蔽してお手軽に使えるという点は、Arduinoでそのメリットを実感しています。&lt;/p&gt;

&lt;p&gt;水色のピンは全てDigital I/Oとしても使用可能で、入出力の数に不足はなさそう。気になる点は、JTAGを使ったデバッグが未サポートと思われる点です（webページをざっと見ると、デバッグにはprintfを使えと書いてあります）。&lt;/p&gt;

&lt;p&gt;今なら、先行予約で$60。う～ん、USBを使ったJTAGデバッグがこのお値段で実現できれば買いですが。&lt;/p&gt;

&lt;p&gt;NXPのようなMCUチップベンダーがこの手のプロトタイピングツールや開発環境に投資（協賛？）するのは、NXP製品へのファンを増やすためでしょうか。STM32 Primer2も同様ですが、この手のプロトタイピングツールで組み込み製品の開発ができるとは思えず、入門者（学生さんなど）がARM系MCUになじんで、開発者の裾野を広げる（将来的に量産の組み込み製品に採用してくれる）ことを期待しているのかなぁと思います。&lt;/p&gt;</content:encoded>


<dc:subject>ARM</dc:subject>

<dc:creator>todotani</dc:creator>
<dc:date>2009-10-07T03:50:54+09:00</dc:date>
</item>
<item rdf:about="http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-c.html">
<title>STM32 Primer2でシリアルポートを使用する</title>
<link>http://todotani.cocolog-nifty.com/blog/2009/10/stm32-primer2-c.html</link>
<description>GPSモジュールなど外部装置との通信を行うために、シリアルポートの動作試験を行い...</description>
<content:encoded>&lt;p&gt;GPSモジュールなど外部装置との通信を行うために、シリアルポートの動作試験を行いました。Ride7のライブラリフォルダーを覗いていると、printfやputs関数でシリアルポートに出力が出来そうに思えます。「楽勝」と思って動かしてみるとなかなかはまってしまいました。以下、シリアルポートと格闘した結果分かったことです。&lt;/p&gt;

&lt;p&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;strong&gt;2009/10/02追記：&lt;/strong&gt;&lt;br /&gt;9/30に公開した手順はRide7のDebug機能を使ってプログラムをSTM32 Primer2に書き込むことはできますが、Circle_Mgrを使った転送を行うとリンカーエラーが発生することが分かったため対策を追記しました。検証不足のまま記事を公開してしまいました。注意せねば。。&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;検証環境&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;執筆時点で最新のRide7 V7.24.09とRkit-ARM V1.22.09を使用&lt;br /&gt;→ Rkit-ARM V1.22.09のST Standard Peripherals Libraryが曲者でした&lt;/li&gt;

&lt;li&gt;試験プログラムはCircleOSアプリとして作成&lt;/li&gt;

&lt;li&gt;シリアルポートは拡張コネクタに信号が出ているUSART2を使用&lt;br /&gt;→ USART1はIrDA用です&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ride7開発環境のライブラリ構成&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;STマイクロ社が、STM32のUSART, GPIO, TIMERなどのペリフェラルにアクセスするためのST Standard Peripherals Library（以下STライブラリ）と呼ばれるドライバーモジュールを提供しています。この提供形態に２種類あり、旧バージョン(V2.0.3)のSTライブラリをコンパイル済み形式で提供していることに加え、最新のSTライブラリ(V3.1.0)をソースのみで提供しています。&lt;/p&gt;

&lt;p&gt;[Ride7インストールディレクトリ]\Ride\lib配下には以下のライブラリが存在します；&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;lib\ARM: &lt;br /&gt;コンパイル済みの旧STライブラリ、コンパイル済みの低レベルI/O関数（STM32x_IO_Putchar_thumb.a)、コンパイル済みsmall_printf(Smallprintf_thumb.a)&lt;/li&gt;

&lt;li&gt;lib\ARM\include: &lt;br /&gt;旧ライブラリのヘッダーファイル&lt;/li&gt;

&lt;li&gt;lib\ARM\STM32F10x_Lib:&lt;br /&gt;旧ライブラリのソースファイル、example、ドキュメント&lt;/li&gt;

&lt;li&gt;lib\ARM\STM32F10x_Lib_V3.0.1:&lt;br /&gt;新ライブラリのソース、ヘッダ、example、ドキュメント（フォルダ名はV3.0.1ですが、格納ファイルのバージョンはV3.1.0です）&lt;/li&gt;

&lt;li&gt;lib\ARM\io_putchar:&lt;br /&gt;USARTへの入出力を行うための、低レベル（MCUタイプ依存）I/O関数のソース。printf, puts, putchar, getcharからこの関数を呼び出すことでUSART経由の送受信を行っている&lt;/li&gt;

&lt;li&gt;lib\ARM\small_printf&lt;br /&gt;GNU C標準ライブラリのprintf関数はサイズが大きいため、機能を制限したコンパクト版のソース。Small no-float printfが浮動小数点の書式付き表示を割愛した最もコンパクトなライブラリです。&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;ライブラリのリンク条件の設定方法&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1)STライブラリ&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ride7プロジェクトのデフォルト設定では、コンパイル済みの旧ライブラリがリンクされる点が注意点です。Project→Propeties →LD Linker →Libraries → Use OLD Precomplied Library が、デフォルトでYesになっています。キャプチャー画面を以下に示します。&lt;/p&gt;

&lt;p&gt;&lt;a onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=621,height=501,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot; href=&quot;http://todotani.cocolog-nifty.com/.shared/image.html?/photos/uncategorized/2009/09/30/ride7_ld_menu.jpg&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;242&quot; border=&quot;0&quot; title=&quot;Ride7_ld_menu&quot; alt=&quot;Ride7_ld_menu&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/images/2009/09/30/ride7_ld_menu.jpg&quot; complete=&quot;true&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;後で手順を説明しますが、STM32のペリフェラルにアクセスする場合は、STライブラリV3のソースをプロジェクトフォルダーにコピーしてライブラリを個々にコンパイル・リンクすることが推奨されています。(Use OLD Precomplied LibraryをNoに設定する）。&lt;/p&gt;

&lt;p&gt;STライブラリは、使用するMCUの種別（I/Oピン数、メモリ容量）、クロック周波数など、STM32 Primer2のハード構成に対応するために、一部のヘッダファイルをカスタマイズする必要があります。コンパイル済みの旧ライブラリは、STM32 Primer2に対応した変更を加えずにビルドしているためUSART関連は正常に動作しません。そのため、STライブラリV3のソースを修正して再コンパイルする手順を採用しました。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2)io_putchar&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;こちらはSTライブラリのリンク条件（コンパイル済みか否か）に関わらず、デフォルトはコンパイル済みのライブラリをリンクします。LD Linker設定メニューでUSART0 PutcharをYesに設定することでio_putcharをリンクし、USART経由の入出力を有効にします。&lt;/p&gt;

&lt;p&gt;&amp;lt;stdio.h&amp;gt;をincludeするとputchar, getcharがUSARTにアクセスしないため注意が必要です。（恐らくstdin, stdoutを使用する関数をリンクしてしまう）&lt;/p&gt;

&lt;p&gt;Circle_Mgrを使ってプログラムを書き込む場合、ソースをプロジェクトフォルダーにコピーしてコンパイルする必要があります。コンパイル済みのライブラリは使用できません。詳細手順は後に示します。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3)small_printf&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LD Linkerのprintf capabilitiesメニューから指定が可能です。io_putchar同様に、Circle_Mgrを使ってプログラムを書き込む場合、ソースをプロジェクトフォルダーにコピーしてコンパイルする必要があります。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;USART2を使用するためにカスタマイズが必要なライブラリファイル&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1)lib\ARM\io_putchar\STM32F10X_IO_putchar.c&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;デフォルトでは、USART1を使用する形でハードコーディングしてあります。このままでは、ライブラリをリンクしても正常に出力してくれません。&lt;/p&gt;

&lt;p&gt;そのため、USART2を使用するようにソースを修正してライブラリの再ビルドを行う必要があります。Ride7に「STM32x_IO_Putchar.rprj」を読み込んでソースを変更後ビルドを行うと、STM32x_thumbフォルダ配下にSTM32x_IO_Putchar_thumb.aファイルが生成されます。このファイルをlib\ARMにコピーします。&lt;/p&gt;

&lt;p&gt;ソースファイルの変更点は以下です。stm32circle.comのForumでも修正イメージが複数掲載されています。&lt;/p&gt;

&lt;p&gt;void __io_init( void )&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; GPIO_InitTypeDef GPIO_InitStructure;&lt;br /&gt;&amp;nbsp; USART_InitTypeDef USART_InitStructure;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* Enable GPIOx and AFIO clocks */&lt;br /&gt;&amp;nbsp; /* USART2 used for Primer2 */&lt;br /&gt;&amp;nbsp; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);&amp;nbsp; // GPIOAのクロック共有をON&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* Enable USART2 clocks */&amp;nbsp; &lt;br /&gt;&amp;nbsp; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);　// &lt;span style=&quot;color: #0000ff;&quot;&gt;USART2はAPB1配下（GPIOAはAPB2配下のため分けて設定要）&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* Configure the GPIO ports */&lt;br /&gt;&amp;nbsp; /* Configure USARTx_Tx as alternate function push-pull */&lt;br /&gt;&amp;nbsp; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;&amp;nbsp; &amp;nbsp; // Txピン番号を指定&lt;br /&gt;&amp;nbsp; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;&lt;br /&gt;&amp;nbsp; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;&lt;br /&gt;&amp;nbsp; GPIO_Init(GPIOA, &amp;amp;GPIO_InitStructure);&amp;nbsp; &amp;nbsp;// 出力モードの設定&lt;br /&gt;&lt;br /&gt;&amp;nbsp; /* Configure USARTx_Rx as input floating */&lt;br /&gt;&amp;nbsp; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;&amp;nbsp; &amp;nbsp;// Rxピン番号を指定&lt;br /&gt;&amp;nbsp; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;&lt;br /&gt;&amp;nbsp; GPIO_Init(GPIOA, &amp;amp;GPIO_InitStructure); 　// 入力モードの設定&lt;/p&gt;

&lt;p&gt;&amp;nbsp; USART_InitStructure.USART_BaudRate = 9600;&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_WordLength = USART_WordLength_8b;&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_StopBits = USART_StopBits_1;&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_Parity = USART_Parity_No ;&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;&lt;br /&gt;&amp;nbsp; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; /* Configure the USARTx */ &lt;br /&gt;&amp;nbsp; USART_Init(USART2, &amp;amp;USART_InitStructure);　// BaudRate等のパラメーターを設定&lt;br /&gt;&amp;nbsp; /* Enable the USART2 */&lt;br /&gt;&amp;nbsp; USART_Cmd(USART2, ENABLE);&lt;br /&gt;&amp;nbsp; // IO init done!&lt;br /&gt;&amp;nbsp; __io_init_done = 1;&lt;br /&gt;&amp;nbsp; }&lt;/p&gt;

&lt;p&gt;__io_putchar(), __io_getchar()関数内でもUSAR1を指定しているため、USART2に修正を行います。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) lib\ARM\STM32F10x_Lib_V3.0.1\Libraries\CMSIS\Core\CM3\stm32f10x.h&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;□MCUタイプをMD(Medium density)からHD(High density)に変更。&lt;/p&gt;

&lt;p&gt;#if !defined (STM32F10X_LD) &amp;amp;&amp;amp; !defined (STM32F10X_MD) &amp;amp;&amp;amp; !defined (STM32F10X_HD) &amp;amp;&amp;amp; !defined (STM32F10X_CL)&lt;br /&gt;&amp;nbsp; /* #define STM32F10X_LD */&amp;nbsp; &amp;nbsp;/*!&amp;lt; STM32F10X_LD: STM32 Low density devices */&lt;br /&gt;&amp;nbsp; /* #define STM32F10X_MD */&amp;nbsp; &amp;nbsp;/*!&amp;lt; STM32F10X_MD: STM32 Medium density devices */&lt;br /&gt;&amp;nbsp; &lt;span style=&quot;color: #0000ff;&quot;&gt;#define STM32F10X_HD&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;/*!&amp;lt; STM32F10X_HD: STM32 High density devices */&lt;/span&gt;&lt;br /&gt;&amp;nbsp; //#define STM32F10X_CL&amp;nbsp; &amp;nbsp;/*!&amp;lt; STM32F10X_CL: STM32 Connectivity line devices */&lt;br /&gt;#endif&lt;/p&gt;

&lt;p&gt;□USE_STDPERIPH_DRIVERを有効にする（コメント解除）&lt;/p&gt;

&lt;p&gt;#if !defined&amp;nbsp; USE_STDPERIPH_DRIVER&lt;br /&gt;/**&lt;br /&gt;* @brief Comment the line below if you will not use the peripherals drivers.&lt;br /&gt;&amp;nbsp; &amp;nbsp;In this case, these drivers will not be included and the application code will &lt;br /&gt;&amp;nbsp; &amp;nbsp;be based on direct access to peripherals registers &lt;br /&gt;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&amp;nbsp; &lt;span style=&quot;color: #0000ff;&quot;&gt;#define USE_STDPERIPH_DRIVER&lt;/span&gt;&lt;br /&gt;#endif&lt;/p&gt;

&lt;p&gt;□HSE（高速外部クロック）の周波数を12MHzに変更（デフォルトは8Mhz）&lt;/p&gt;

&lt;p&gt;#if !defined&amp;nbsp; HSE_Value&lt;br /&gt;#ifdef STM32F10X_CL&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; #define HSE_Value&amp;nbsp; &amp;nbsp; ((uint32_t)25000000) /*!&amp;lt; Value of the External oscillator in Hz */&lt;br /&gt;#else &lt;br /&gt;&amp;nbsp; &lt;span style=&quot;color: #0000ff;&quot;&gt;#define HSE_Value&amp;nbsp; &amp;nbsp; ((uint32_t)12000000) &lt;/span&gt;/*!&amp;lt; Value of the External oscillator in Hz */&lt;br /&gt;#endif /* STM32F10X_CL */&lt;br /&gt;#endif /* HSE_Value */&lt;/p&gt;

&lt;p&gt;このクロック周波数を変更しないと、BaudRateの設定（分周比の設定）が正しく行われないため、送受信で文字化けが発生します。この問題を見つけるまで時間を要しました。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) lib\ARM\STM32F10x_Lib_V3.0.1\Libraries\CMSIS\Core\CM3\system_stm32f10x.c&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;以下のシステムクロック種別を修正。&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#define SYSCLK_FREQ_HSE&amp;nbsp; &amp;nbsp; HSE_Value&lt;/span&gt;&lt;br /&gt;/* #define SYSCLK_FREQ_24MHz&amp;nbsp; 24000000 */&lt;br /&gt;/* #define SYSCLK_FREQ_36MHz&amp;nbsp; 36000000 */&lt;br /&gt;/* #define SYSCLK_FREQ_48MHz&amp;nbsp; 48000000 */&lt;br /&gt;/* #define SYSCLK_FREQ_56MHz&amp;nbsp; 56000000 */&lt;br /&gt;//#define SYSCLK_FREQ_72MHz&amp;nbsp; 72000000&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4) lib\ARM\STM32F10x_Lib_V3.0.1\Project\Template\stm32f10x_conf.h&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;今回使用するペリフェラルドライバ関連のヘッダファイルをコメント解除。&lt;br /&gt;/* Uncomment the line below to enable peripheral header file inclusion */&lt;br /&gt;/* #include &amp;quot;stm32f10x_adc.h&amp;quot; */&lt;br /&gt;/* #include &amp;quot;stm32f10x_bkp.h&amp;quot; */&lt;br /&gt;/* #include &amp;quot;stm32f10x_can.h&amp;quot; */&lt;br /&gt;/* #include &amp;quot;stm32f10x_crc.h&amp;quot; */&lt;br /&gt;/* #include &amp;quot;stm32f10x_dac.h&amp;quot; */&lt;br /&gt;/* #include &amp;quot;stm32f10x_dbgmcu.h&amp;quot; */&lt;br /&gt;/* #include &amp;quot;stm32f10x_dma.h&amp;quot; */&lt;br /&gt;#include &amp;quot;stm32f10x_exti.h&amp;quot;&lt;br /&gt;/* #include &amp;quot;stm32f10x_flash.h&amp;quot; */&lt;br /&gt;/* #include &amp;quot;stm32f10x_fsmc.h&amp;quot; */&lt;br /&gt;#include &amp;quot;stm32f10x_gpio.h&amp;quot;&lt;br /&gt;/* #include &amp;quot;stm32f10x_i2c.h&amp;quot; */&lt;br /&gt;/* #include &amp;quot;stm32f10x_iwdg.h&amp;quot; */&lt;br /&gt;/* #include &amp;quot;stm32f10x_pwr.h&amp;quot; */&lt;br /&gt;#include &amp;quot;stm32f10x_rcc.h&amp;quot;&lt;br /&gt;/* #include &amp;quot;stm32f10x_rtc.h&amp;quot; */&lt;br /&gt;/* #include &amp;quot;stm32f10x_sdio.h&amp;quot; */&lt;br /&gt;/* #include &amp;quot;stm32f10x_spi.h&amp;quot; */&lt;br /&gt;/* #include &amp;quot;stm32f10x_tim.h&amp;quot; */&lt;br /&gt;#include &amp;quot;stm32f10x_usart.h&amp;quot;&lt;br /&gt;/* #include &amp;quot;stm32f10x_wwdg.h&amp;quot; */&lt;br /&gt;#include &amp;quot;misc.h&amp;quot;&amp;nbsp; /* High level functions for NVIC and SysTick (add-on to CMSIS functions) */&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;プロジェクトのビルド（Debugを使って書き込みを行う場合）&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;以下のSTライブラリファイルをプロジェクトフォルダーにコピーします。&lt;/p&gt;

&lt;p&gt;　core_cm3.c&lt;br /&gt;　core_cm3.h&lt;br /&gt;　misc.c&lt;br /&gt;　misc.h&lt;br /&gt;　stm32f10x.h&lt;br /&gt;　stm32f10x_conf.h&lt;br /&gt;　stm32f10x_exti.c　→今回はなくてもビルドができました&lt;br /&gt;　stm32f10x_exti.h　→今回はなくてもビルドができました&lt;br /&gt;　stm32f10x_gpio.c&lt;br /&gt;　stm32f10x_gpio.h&lt;br /&gt;　stm32f10x_rcc.c&lt;br /&gt;　stm32f10x_rcc.h&lt;br /&gt;　stm32f10x_usart.c&lt;br /&gt;　stm32f10x_usart.h&lt;br /&gt;　system_stm32f10x.c&lt;br /&gt;　system_stm32f10x.h&lt;/p&gt;

&lt;p&gt;.cファイルをAdd itemを使ってプロジェクトに追加。&lt;/p&gt;

&lt;p&gt;&lt;a onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=328,height=431,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot; href=&quot;http://todotani.cocolog-nifty.com/.shared/image.html?/photos/uncategorized/2009/09/30/projcet.jpg&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;394&quot; border=&quot;0&quot; title=&quot;Projcet&quot; alt=&quot;Projcet&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/images/2009/09/30/projcet.jpg&quot; complete=&quot;true&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Project →Propertiesからライブラリの設定を行ってビルドします。&lt;br /&gt;この際、Use OLD Precomplied LibraryをNoに設定。io_putcharとsmall_printfはコンパイル済みライブラリがリンクされます。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;プロジェクトのビルド（Circle_Mgrを使って書き込みを行う場合）&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Debugの手順で「objdebugもしくはobjrelease」フォルダーに生成される.oファイルをCircle_Mgrを使って書き込みを行おうとすると、以下のリンカーエラーが発生します。&lt;/p&gt;

&lt;p&gt;[objrelease] &amp;gt;Circle_Mgr Aecho.o&lt;br /&gt;Circle_Mgr: software for managing CircleOS applications.&lt;br /&gt;Copyright Raisonance 2007-2009.&lt;/p&gt;

&lt;p&gt;Connecting to RLink... OK&lt;br /&gt;Connecting to target... OK&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; Silicon Revision Id: 0x10016414.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; Option bytes: RDP=0xA5, USER=0xFF, WRP=0xFFFFFFFF&lt;br /&gt; OK&lt;br /&gt;Reading FAT table...&lt;br /&gt;&amp;lt;No application&amp;gt;&lt;br /&gt;... OK&lt;/p&gt;

&lt;p&gt;Linking file echo.o...&lt;br /&gt;Link Failed (file: &#39;echo.o&#39;)echo.o: In function `Application_Handler&#39;:&lt;br /&gt;C:\Users\kenshi\Documents\Ride\Echo/Echo.c:61: undefined reference to `__io_getchar&#39;&lt;br /&gt;C:\Users\kenshi\Documents\Ride\Echo/Echo.c:65: undefined reference to `__io_putchar&#39;&lt;br /&gt;c:/tools/stm32/ride/arm-gcc/bin/../lib/gcc/arm-none-eabi/4.3.2/../../../../arm-none-eabi/lib/thumb&lt;br /&gt;\libc.a(lib_a-sbrkr.o): In function `_sbrk_r&#39;:&lt;br /&gt;sbrkr.c:(.text+0x12): undefined reference to `_sbrk&#39;&lt;br /&gt;c:/tools/stm32/ride/arm-gcc/bin/../lib/gcc/arm-none-eabi/4.3.2/../../../../arm-none-eabi/lib/thumb&lt;br /&gt;\libc.a(lib_a-writer.o): In function `_write_r&#39;:&lt;br /&gt;writer.c:(.text+0x16): undefined reference to `_write&#39;&lt;br /&gt;c:/tools/stm32/ride/arm-gcc/bin/../lib/gcc/arm-none-eabi/4.3.2/../../../../arm-none-eabi/lib/thumb&lt;br /&gt;\libc.a(lib_a-closer.o): In function `_close_r&#39;:&lt;br /&gt;closer.c:(.text+0x12): undefined reference to `_close&#39;&lt;br /&gt;　　～　中略　～&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;!!! Error 103: Fatal error detected. Terminating program.&lt;/p&gt;

&lt;p&gt;Circle_Mgrは、ソースが複数のファイルに分割された場合、.oファイルを指定した書き込みはできないことが分かりました。&lt;a href=&quot;http://www.stm32circle.com/forum/viewtopic.php?id=5&quot;&gt;ForumのFAQ&lt;/a&gt;に複数ファイルを使用する場合はアプリケーションではなくライブラリとしてビルドするべしとあります。&lt;a href=&quot;http://www.stm32circle.com/forum/viewtopic.php?id=744&quot;&gt;io_putcharやsmall_printfといったコンパイル済みのライブラリを使う場合も&lt;/a&gt;、ソースをプロジェクトフォルダーに引っ張ってくる必要があります。&lt;/p&gt;

&lt;p&gt;FAQにあるように、プロジェクトに、Add New Applicaton →New library to be builtで新規ライブラリの追加を行います。ライブラリプロジェクトは、親プロジェクト（キャプチャーの例では、Project &#39;Echo&#39;）の直下に作ります。アプリケーションプロジェクト（キャプチャーでは Echo）の子プロジェクトにするとビルドがエラーになるため注意が必要です。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://todotani.cocolog-nifty.com/.shared/image.html?/photos/uncategorized/2009/10/02/multifileproject.jpg&quot; onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=962,height=638,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;198&quot; border=&quot;0&quot; alt=&quot;Multifileproject&quot; title=&quot;Multifileproject&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/images/2009/10/02/multifileproject.jpg&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;追加したライブラリプロジェクトにソースファイルを追加します。io_putcharやsmall_printfを使う場合は、ソースを追加する順番が重要です。呼び出し元が最後になるように並べないと、Circle_Mgrを使った書き込み時にリンカーのエラーが発生します。また、syscalls.cを最初にもってくる必要があります。そのため、配置の順番としては以下になります。&lt;/p&gt;

&lt;p&gt; 1) syscalls.c&lt;br /&gt; 2) STライブラリのソース&lt;br /&gt; 3) STM32F10X_IO_putchar.c&lt;br /&gt; 4) _SP_puts.c（printfを使う場合は、該当のソース）&lt;br /&gt; 5) echo.c（アプリケーションの処理を記述したソース）&lt;/p&gt;

&lt;p&gt;ライブラリプロジェクトを追加する際に、以下のファイルが再度生成されて上書きされてしまうため注意が必要です。&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Application.c： 事前にどこかにバックアップを作っておくか、アプリ本体をecho.cのような別名のファイルに記述します&lt;/li&gt;

&lt;li&gt;stm32f10x_conf.h： STライブラリV2のファイルに上書きされるため、V3のファイルに戻す必要があります。&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;ライブラリプロジェクトをビルドすると生成される.libファイルをCircle_Mgrを使って以下のように書き込みます。&lt;/p&gt;

&lt;p&gt;[Echo] &amp;gt;Circle_Mgr A&lt;span style=&quot;color: #0000ff;&quot;&gt;Echo_lib.lib&lt;/span&gt;&lt;br /&gt;Circle_Mgr: software for managing CircleOS applications.&lt;br /&gt;Copyright Raisonance 2007-2009.&lt;/p&gt;

&lt;p&gt;Connecting to RLink... OK&lt;br /&gt;Connecting to target... OK&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; Silicon Revision Id: 0x10016414.&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; Option bytes: RDP=0xA5, USER=0xFF, WRP=0xFFFFFFFF&lt;br /&gt; OK&lt;br /&gt;Reading FAT table...&lt;br /&gt;&amp;lt;No application&amp;gt;&lt;br /&gt;... OK&lt;/p&gt;

&lt;p&gt;Linking file Echo_lib.lib...&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;Link of Echo_lib.lib succeeded...&lt;/span&gt;&lt;br /&gt;Hex file generated...&lt;br /&gt;Blank-checking the FLASH area...OK&lt;br /&gt;Programming file .\_tmp_.ld.hex to flash... OK&lt;/p&gt;

&lt;p&gt;Registering application in FAT... OK&lt;/p&gt;

&lt;p&gt;Closing com with RLink... OK&lt;/p&gt;

&lt;p&gt;非常に面倒な手順です。mallocのような標準ライブラリを使う場合もlibcからはリンクできず、ソースを引っ張ってこないといけないと思われます。この点は早く改善してほしいものです。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;試験プログラム&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;ターミナルソフトから読み込んだ文字をエコーバックする単純なプログラムコードを作って動作を確認しました。&lt;/p&gt;

&lt;p&gt;enum MENU_code Application_Handler(void)&lt;br /&gt;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; // TODO: Write your application handling here.&lt;br /&gt;&amp;nbsp; &amp;nbsp; int c;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp; c = getchar();&lt;br /&gt;&amp;nbsp; &amp;nbsp; if ( c == 3 )&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; // c == CTRL-C&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; return MENU_Quit();&lt;br /&gt;&amp;nbsp; &amp;nbsp; else&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; putchar(c);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; // This routine will get called repeatedly by CircleOS, until we&lt;br /&gt;&amp;nbsp; &amp;nbsp; // return MENU_LEAVE&lt;br /&gt;&lt;br /&gt;#if 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; // If the button is pressed, the application is exited&lt;br /&gt;&amp;nbsp; &amp;nbsp; if(BUTTON_GetState() == BUTTON_PUSHED)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; BUTTON_WaitForRelease();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; return MENU_Quit();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; }&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; return MENU_CONTINUE;&amp;nbsp; &amp;nbsp;// Returning MENU_LEAVE will quit to CircleOS&lt;br /&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;

&lt;p&gt;今回修正・作成を行ったファイルは以下です。&lt;br /&gt;　&lt;a href=&quot;http://todotani.cocolog-nifty.com/blog/files/USART2_Test.zip&quot;&gt;「USART2_Test.zip」をダウンロード&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;写真に示す通り、STM32 Primer2の拡張コネクターからケーブルを引き出して、USBシリアル変換モジュール経由でPCに接続しました。拡張コネクタの右下ピンが2番(GND)になります。&lt;/p&gt;

&lt;p&gt;&lt;a onclick=&quot;window.open(this.href, &#39;_blank&#39;, &#39;width=1024,height=768,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0&#39;); return false&quot; href=&quot;http://todotani.cocolog-nifty.com/.shared/image.html?/photos/uncategorized/2009/09/30/primer2serial.jpg&quot;&gt;&lt;img width=&quot;300&quot; height=&quot;225&quot; border=&quot;0&quot; title=&quot;Primer2serial&quot; alt=&quot;Primer2serial&quot; src=&quot;http://todotani.cocolog-nifty.com/blog/images/2009/09/30/primer2serial.jpg&quot; complete=&quot;true&quot; /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;今後の課題 - 割り込み処理&lt;/strong&gt;

&lt;/p&gt;

&lt;p&gt;試験プログラムでは文字の読み取りに__io_getchar()関数を使っています。__io_getchar()はポーリング方式で、USART2のステータスレジスタ（USART SR）をチェックすることで受信あり・なしの判定と受信バイトの読み出しを行います。Application_Handlerの呼び出し周期が最短でも33msと長いため、ターミナルソフトにコピペで文字を流し込むと取りこぼしが発生します。&lt;/p&gt;

&lt;p&gt;そのため、CircleOS配下で確実に受信を行うためには、受信を割り込み処理にしかつ一定量の受信バッファを持つ必要があります。次は受信の割り込み処理対応を行う予定です。割り込み処理は触ったことがないため、またはまりそうです。&lt;/p&gt;

&lt;p&gt;STライブラリの構成を理解する上で、&lt;a href=&quot;http://www.kimura-lab.net/wiki/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8&quot;&gt;東京理科大学木村研究室&lt;/a&gt;さんのWikiを参考にさせていただきました。今回はSTライブラリのヘッダファイルをインクルードする順番が分からず、二重定義のエラーが出たりして右往左往していたところ、上記のWikiで多くの疑問が解消しました。せっかちなタイプでドキュメントを読む前にとにかくモノを動かしたくなるのですが、やはりドキュメントちゃんと読んで構成を把握した上で動かしてみるのが結果的に近道ですね。&lt;/p&gt;</content:encoded>


<dc:subject>STM32 Primer2</dc:subject>

<dc:creator>todotani</dc:creator>
<dc:date>2009-10-02T01:04:50+09:00</dc:date>
</item>
<item rdf:about="http://todotani.cocolog-nifty.com/blog/2009/09/ride7-e061.html">
<title>Ride7開発環境のデバック制限解除ライセンス</title>
<link>http://todotani.cocolog-nifty.com/blog/2009/09/ride7-e061.html</link>
<description>STM32 Primer2購入直後にアップした記事にて、32KBのデバック制限を...</description>
<content:encoded>&lt;p&gt;&lt;a href=&quot;http://todotani.cocolog-nifty.com/blog/2009/09/stm32-primer2.html&quot;&gt;STM32 Primer2購入直後にアップした記事&lt;/a&gt;にて、32KBのデバック制限を解除するためには&lt;a href=&quot;http://www.mcu-raisonance.com/~stm32-primer2-professional__microcontrollers__product~product__T017:4d0fwt74d47e.html&quot;&gt;STM32 Primer2 Professional&lt;/a&gt;（129ユーロ）の購入が必要ではと書いたのですが、誤りでした。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.mcu-raisonance.com/~stm32-primer2-upgrade-for-unlimited-debugging__microcontrollers__product~product__T017:4dsue64c7ij1.html&quot;&gt;STM32 Primer2 Upgrade for Unlimited Debugging&lt;/a&gt;というソフトライセンスのみの製品があり、こちらは68ユーロです。Raisonance（発売元）のwebページは製品一覧がなく見づらいです。ただ、今見ると、自分が参照したSTM32 Primer2 Professionalのページからリンクが張ってありますねぇ。。。&lt;/p&gt;

&lt;p&gt;68ユーロ（クレジットカード決済の為替レートだと9500円程度でしょうか）も決して安くはないですが、32KBの上限を超えるアプリを作る際は追加ライセンスを買ってしまうかも。CircleOS領域が24KBのため、ユーザーアプリは実質8KBが上限、かつデバッグビルドはリリースビルドに比べてHexファイルのサイズが２倍近くになるため、8KBにはすぐ到達しそうです。&lt;/p&gt;

&lt;p&gt;追加ライセンスに引かれるもう一つの理由ですが、デバッグ機能をちょっと触ってみたところ、これがなかなかよい感じなのです。&lt;a href=&quot;http://todotani.cocolog-nifty.com/blog/2008/01/cell_d799.html&quot;&gt;Cell SDKを使用したリモートデバック&lt;/a&gt;（PS3にデバック対象プログラムをロードしてPC上のEclipse IDEからデバックを実行）では、デバックプログラムのロード中にエラーで停止するような事象に結構遭遇しますが、Ride7では今のところこのような問題もありません。&lt;/p&gt;

&lt;p&gt;IDEとしての機能を比べると、Eclipse + CDT + Cell SDKの方が上だと思いますが（定義済み変数の入力補完など）、デバックの安定性という点ではRide7の方がよいです。あくまで、Cell SDKを使用したデバッグとの比較ですので、Eclipse上でPCのネイティブコードをデバックする場合は問題ないです。&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;</content:encoded>


<dc:subject>STM32 Primer2</dc:subject>

<dc:creator>todotani</dc:creator>
<dc:date>2009-09-24T20:08:50+09:00</dc:date>
</item>


</rdf:RDF>
