« 2009年10月 | トップページ | 2009年12月 »

2009年11月の記事

STM32 Primer2 U17レギュレーター死亡

あちこちでこの問題が起きていますが、ついにやってしまいました、私も、、、

FreeRTOSのPrimer2用デモ版を入れてLEDチカチカを確認した後、CircleOSに戻してリセットしてもLCDが真っ暗のままで、CircleOS起動時のサウンドも出ないのです。症状としては以下の通りで、Known IssueのU9 & U17 Voltage Regulator Failureそのものです。

  • FreeRTOS demoやCirlceOSを使用しないLEDチカチカプログラムは動作するため、U9の出力は生きています。拡張コネクタのPin-1(VCC2V8)にも2.8Vが出ていますし、U9の発熱もありません
  • 問題のU17は、出力電圧が0Vです(C54の両端で測定)
  • 中央ボタンを押し続けるとVCC2V8が0Vに落ちるため、CircleOSのshutdown機能は動いているようです。ただ、一定時間放置した際の自動shutdownは働いてくれず、CircleOSも完全に起動しているかが怪しい感じ
  • U9のグランド強化対策は実施済みのロットでした

U17が死んだのはほぼ間違いがないのですが、CircleOSが立ち上がっているかを確認してみようと(ひょっとしてFlashROMの書き込みが不完全ということはないか)、自殺行為覚悟でU17の出力に手持ちの3.3V電源をつないでみました。すると、LCDが点灯して、例のメニュー画面がしっかりと表示されています。

出力がショートしている可能性もあるため(何か焦げ臭い臭いもしましたし)、すぐに3.3V電源を切り離すとLCDバックライトがチカチカしながら・かつ薄暗い状態で点灯しています。U17の出力が復活(!)したのですが、内部的にはダメージを受けたようで、U17レギュレーターがかなり発熱しています。

こうなると、ねむさいんのブログにあるように、U17の置換を行わないとダメそうです。あと、出力側のコンデンサC56, C23も積層セラミックコンデンサに交換ですね、、

U17はなんとか引っぺがしました。VCC3V1に3.3Vをつないでやると、LCD表示やサウンド再生もOKです。バックライトとサウンドICの電源は3.3Vでもよさそうなので、3.3VのLDOをうまく乗っけられるかに挑戦です。

ココログブログの見栄え向上

当ブログのフォントやソースコード表示など見栄えの改善を行いました。備忘録も兼ねて、今回行ったことを記載します。ココログに特化した部分が多いですがご容赦下さい。

ブログの共通設定を変えることになりますので、お試しをされる方は自己責任でお願いします。事前にブログ内容のバックアップを取るなどした方がよいかと思います。

Windows Live Writerの導入

以前にも書きましたが、Windows 7への移行にあわせて、Live Writerを使い始めました。これまでは、ブラウザーからココログにログインして、ブラウザー上の画面を使って編集を行っていましたが(以後オンライン編集と記載)、作業性が結構向上します。またLive Writerは、以下のようにココログとの連携に加えて、オンライン編集ではできなかった書式指定が可能です:

  • オフラインで作成した記事の投稿(サーバーへのアップロード)、PingサーバーへのPing通知
  • 作成済み記事を読み込んで編集。Live Writerで作成していない記事も選択可能(取り出せるのは過去の500件まで)
  • 実際のブログテンプレートを使ったプレビューが投稿前に可能
  • ハイパーリンクで、「新しいウインドウで開く」オプションが指定可能(オンライン編集では実はできないのです)
  • 画像の挿入オプションが多彩。こちらも「新しいウインドウで開く」オプションが指定可能。まだ使っていませんが、 画像のトリミング、明るさ調整といった 画像編集も可能
  • 表の挿入。オンライン編集でもHTMLタグをゴリゴリ書き込めば可能ですが、エクセルのような感じで編集ができるため楽ちんです
  • プラグインを使って、プログラムコードを整形して挿入(キーワードのハイライト化など) → 後ほど詳細を記載します

以下は、気になる点です。

  • スペルチェックがダメ
    自動スペルチェックを有効にすると、日本語部分がすべてエラーになってしまいます(正しいスペルの英単語だけが赤くならない、、)。FireFoxのスペルチェック機能の方がよっぽど賢いです
  • 箇条書き指定を行うと、勝手に色指定のHTMLタグ(<font color="#000000">)が挿入されることがある
  • スタイルシートを埋め込んだり、フォント指定を行うと、オンラインで再編集した際に書式が崩れる。こちらはLive Writerの問題というより、ココログとの相性問題と言うべきですが、、、

マイクロソフト製品なので、Windows Liveのブログにのみ対応かと思ったのですがさにあらずで、メジャーなブログエンジンには対応しているようです(ココログはTypePadです)。おかげでLive Writerは結構重宝しています。

メイリオフォントの指定

ココログのテンプレートはデフォルトでMS Pゴシックを使っていますが、Vistaから使えるようになったメイリオフォントやMACに比べると見栄えがよくない(読みづらい)です。そのため、メイリオフォントを使えるようにしました。

当初はLive Writerのフォント指定機能を使おうとしたのですが、各段落にフォント指定のHTMLタグが埋め込まれてソースが汚くなること、オンラインで編集を行うと書式が大きく乱れてしまう(書式指定の取り消しかつ、各行に改行が追加されるなど)ことから、スタイルシートをいじることにしました。CSSの構造はまったく分かっておらず、先人の成果を拝借しております。

私はココログの出来合いテンプレート(リッチテンプレート)を使っているため、CSSの編集はできません。そのため、「きたへいの悠々自適」さんの記事を参考にし、ブログサブタイトルにカスタムCSSファイルへのリンクを書くことでフォント指定ができるようになりました。手順を以下に示します。

1) トップページのソースから、読み込んでいるスタイルシート(style.cssファイル他)を探して、個別にダウンロード

2)フォント指定部分を取り出しメイリオを追加し、適当な名前をつけてローカルに保存(mystyles.cssなど)
自分の場合は、以下の内容です。

body {
    font-family: 'メイリオ', 'Meiryo','MS PGothic', 'Hiragino Kaku Gothic Pro W3', Osaka, sans-serif;
    }

textarea {
    font-family: 'メイリオ', 'Meiryo','MS PGothic', 'Hiragino Kaku Gothic Pro W3', Osaka, sans-serif;
    width: 100%;
    }

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

  • 管理ページトップ > コントロールパネル > ファイルマネージャー  に移動
  • ホーム配下にStylesフォルダを作成し、作成したcssファイル(mystyles.css)をアップロード

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

  • 管理ページトップ > ブログ一覧 > [対象ブログ] > 設定 > ブログの基本情報  に移動
  • ブログのサブタイトル(キャッチフレーズ)ボックスに以下のコードを追加
<link type="text/css" rel="stylesheet" href="http://todotani.cocolog-nifty.com/Styles/mystyles.css"/>

5)変更を保存

ソースコードの挿入

SyntaxHighlighterというJavaScriptベースのツールを使いました。Live WriterでSyntaxHighlighterを使うためのプラグインとして、SyntaxHighlighter for Windows Live Writerがあります。こちらは、プレビューでの確認や投稿後の再編集におけるブログとの連携に優れており、当初はこのプラグインを使い始めたのですが一点問題がありました。

SyntaxHighlighterはVersion 2.xに移行しているのですが、プラグインはVersion 1.5対応となっており、SyntaxHighlighter Version 2.xが使えません。1.5では、IEを使った際に、折り返しや横スクロールの表示がうまくできませんでした(FireFoxなら問題はなかったのですが)。2.xなら改善されていそうなので、なんとか2.xを使えないかと思い他のプラグインを探したところ、PreCode Snippetを発見しました。こちらは2.x専用だったりしますがPreCodeを使用することにしました。

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

1)SyntaxHighlighterをダウンロード

2)ブログサーバーにスクリプトファイルフォルダーを作成

  • ホーム配下にScripts2フォルダを作ります(名前は任意です)

3)ブログサーバーにJavaScriptファイルをアップロード

  • ダウンロードしたzipファイルのscriptsフォルダーから以下のファイルをアップロード
  • shCore.js(必須)
  • clipboard.swf(行番号を除いたソースをクリップボードにコピーするために必要)
  • shBrushCpp.js(C/C++ソースの整形を行うために必要)
  • shBrushXml.js(HTML/XMLの整形)
  • shBrushPlain.js(Plain Textの整形)
  • その他、Java/Rubyなど、必要に応じて整形用のshBrushXXX.jsファイルをアップ

4)スタイルシートのアップロード

  • ダウンロードしたzipファイルのstylesフォルダーから以下のファイルをサーバーにアップ
  • shCore.css
  • shThemeDefault.css
  • xxx.pngファイル(全部)

5)ブラウザーでJavaScriptを起動するためのコードの埋め込み

  • メイリオフォントの指定に加えて、ブログサブタイトルに以下のコードを追加
<link type="text/css" rel="stylesheet" href="http://todotani.cocolog-nifty.com/Styles/mystyles.css"/>
<link type="text/css" rel="stylesheet" href="http://todotani.cocolog-nifty.com/Styles/shCore.css" />
<link type="text/css" rel="stylesheet" href="http://todotani.cocolog-nifty.com/Styles/shThemeDefault.css" />
<script type="text/javascript" src="http://todotani.cocolog-nifty.com/Scripts2/shCore.js"></script>
<script type="text/javascript" src="http://todotani.cocolog-nifty.com/Scripts2/shBrushCpp.js"></script>
<script type="text/javascript" src="http://todotani.cocolog-nifty.com/Scripts2/shBrushXml.js"></script>
<script type="text/javascript" src="http://todotani.cocolog-nifty.com/Scripts2/shBrushPlain.js"></script>
<script type="text/javascript">
   SyntaxHighlighter.config.clipboardSwf = 'http://todotani.cocolog-nifty.com/Scripts2/clipboard.swf';
   SyntaxHighlighter.all();
</script>
  • 変更を保存
  • Live Writerの ブログ > ブログ設定の編集メニューから アカウント設定の更新を実行

6)PreCodeプラグインをインストール

  • ダウンロードページからプラグインをダウンロードしてインストールします。
  • Live Writerの ツール > オプション > プラグイン メニューを開き、プラグインを有効化
  • Live Writerのソース画面を開く(編集画面ではありません
  • 挿入ツールバーからPreCodeプラグインを起動
  • テキストボックスに整形したいコードを貼り付け
  • プラグイン画面右側にあるコード種別やオプションを選択
  • Html Encodeを選択します
  • OKボタンを押すと、ソースウインドウにコードが挿入されます

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

PreCode

埋め込まれるコードの例は以下です。C++のコードとHTMLタグが混在しているため、Plaine Text形式を指定してあります(cpp形式だと、<p>などのHTMLタグが誤って表示されてしまいます)。
2009/11/4追記: cpp (C/C++)形式を指定しても正常に動作するようになりました。なぜだろう?

<pre class="brush: cpp; auto-links: false;">
#include "stdafx.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << "Hello C++\n";

    return 0;
}
</pre>

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

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

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

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

2009/11/4追記: 残課題
一行の文字数が多いソースコードの表示は現状折り返し表示になっています。以下のように折り返し解除の指定を行うと、demoのように横スクロールバーが表示されるはずなのですがうまく動いてくれません(スクロールバーが表示されず、右端が切れてしまう)。

<pre class="brush: cpp; wrap-lines: false; ">

FireFoxだとちゃんと横スクロールバーが表示されますが、IE8だとNGです。IE8でもdemoのように正しく表示されるサイトもあるため、単なる相性問題でもなさそう(ココログのスタイルシートもからんでいるか)。

2010/11/3追記:
SyntaxHighlighter 3.0の使用法を投稿しました。

STM32 Primer2のSysTickタイマー周期設定

SysTickタイマーはSTM32 MCUが持つ機能で、OSがタスク切り替えを行う契機として使用します。PrimerのCircleOSでは、SysTickタイマー周期毎にタスクを切り替えるのではなく、SysTickHandlerに登録された以下の関数群を毎回実行します。

  • BUTTON_Handler: ボタンの状態取得
  • POWER_Handler: バッテリー状態の取得と表示
  • RTC_DisplayTime: 時刻の取得と表示
  • MENU_Handler: メニュー表示の更新とアプリケーションの起動。
    加えて、SysTick周期100回毎にユーザーアプリケーションの本体部分(Application_Handler)を実行する
  • その他の周期処理

CircleOSにてSysTickタイマーをどのように設定しているかを調べてみました。

CircleOSにおけるSysTickタイマー周期

以前の記事「STM32 Primer2」の末尾に示す通り、タイマー周期はMCUのクロック設定に連動して変化します。例えば24MHz動作の場合、SysTick周期 = 1ms、Application_Handler呼び出し周期 = 100msとなります。

SysTick制御レジスターの動作

SysTick制御レジスタのフィールド定義と動作を以下に示します。「Cortex-M3 テクニカルリファレンスマニュアル(Rev.G)」をベースに、STM32固有の部分(太字・斜体)を追記してみました。

1)SysTick制御レジスタ

Bit フィールド名称 機能
2 CLKCOURCE
(SysTickタイマーのクロックソース)
0: 外部参照クロックを使用
STM32ではAHBクロック(=HCLK)の1/8を供給する(STM32 Ref Manual 4.2章より)
1: コアクロックを使用
STM32ではAHBクロック(HCLK)を使用する
1 TICKINT 1: 0 までカウントダウンすると、SysTick ハンドラを保留する → 割り込みを生成すると理解
0: 0 までカウントダウンしても、SysTick ハンドラを保留しない → 割り込み生成しない
0 ENABLE 1: カウンタはマルチショット方式で動作
0: カウンター無効

2)SysTick リロード値レジスタ

Bit フィールド名称 機能
0-23 RELOAD カウンタが0になったときに、SysTick現在値レジスタにロードする値 → タイマー周期を指定する

SysTick制御レジスターの設定

CircleOSの初期化時に、SysTick_Configuration()関数にて設定を行っています。コードは以下の通りです(CircleOS V3.80のscheduler.cより抜粋)。5行目のSysTick_CLKSourceConfig()はSTM32F10x標準ライブラリ(以下STライブラリ)の関数です。パラメーター名よりCLKCOURCE = 0を設定することが分かります。

14行目のSysTick_Config(SystemFrequency / 500)では、SysTickリロード値レジスタを、SystemFrequency(12MHz) / 500 = 24000に設定しています。

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);
        } 
    }

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

static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
  if (ticks > SYSTICK_MAXCOUNT)  return (1);   /* Reload value impossible */

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

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

  • SysTickカウンターをカウントダウンするクロックはMCUのコアクッロク(18~72MHz)  (CLKCOURCE = 1)
  • SysTickタイマー割り込み有効
  • カウンターのリロード値は24000

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

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

PS: SyntaxHighlighter for Windows Live Writerを使ってソースコードのフォーマットを行ってみました。使い方が分からず結構苦戦。このページが昨晩から何回も消えたり・見えたりしていた筈です。

« 2009年10月 | トップページ | 2009年12月 »

2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
無料ブログはココログ