Document made with KompoZer
Fujisekk Store ForSale
RTOS& ファームウエア
ワンチップマイコンの組み込ソフト

ARM関連
Fu-RTOS for ARM
ルネサスH8
TI MSP-430F
マイコンに よるモータ駆 動
ロータリーエンコーダ
 ジョグダイアルもロータリーエンコーダだ
USB関連

E-kermit適当な訳
マイコンでもファイルのやり取りが出来そうだ。
 
リアルタイムOS Fu-rtos
 仕様

フリースケール MCS08
 CodeWalliorの上でシュミレータを使用、タイマー割り込みでコンテキスト切り替え
  @wai_tsk(Msec)よりの復帰
  Aark_tskでの起動
  Bext_tskでの終了
  が確認出来た
 コンソールはうまくつながらない。
ガイガーカウンターで使用しました。

RAMのZeroPageを使う
RAMの0x0ffまでは1Byteでアドレッシング出きるので早くアクセスできる

#pragma DATA_SEG _DATA_ZEROPAGE
unsigned int  SPUDW[TASK_NUM]; /* stack buff size=16bit  */
#pragma DATA_SEG DEFAULT
のようにすれば良い


  TWR-S08LL64 LCDの利用
  デジタルクロックにしてみました。
 セグメントのデザインは12時間表示の時計用+2桁の7セグ+曜日+絵文字2+battryMetor
絵文字は炎と雪?ということで空調コントローラ用で他に使い道はない、
 サンフルプログラムTWRLL64_Quick_Startもサーモスタットとなっている。
 しかしこれはヘッダーがおかしいかリンクが出来ない。
TWRLL64_AccelerometerはOKだった。
そこでAccelerometerのプロジェクトファイルを使い時計を動かしてみる事とした。
CodeWarriorV6.3を起動し下記ファイルのプロジェクトをinportして不足のソースは Quick_Startからコビーしてくる。
プロジェクトと変更ソースは下記。
  TWR-S08LL64 Clock

ガイガーカウンタ
GeigarCounterの設計
仕様
ClockにCounterを追加しガイガーカウンターの表示と記録を取る
SegmentLCD Clock+2Char
4,5のカラムにフィルター後のリアルタイムの数値
選択で時間ごと 10分30分1時間区切りで過去の記録を表示
フィルターは簡易なIIR型
 

PWM
TWR-S08LL64にはブザーがありPTC2/TPM1CH0に繋がっている。
ブザーをソフトで動かすとCPUの負担が多くなるのでPWMでドライブする
TWRLL64_Quick_Startからbuzzer.cをコ ピー
BZ1は2.3KHZらしいので設定はいい、DUTY比は50%Fixで良いのでInitのみ変更する
BUZZER_Interruptはこの場合不用だがその時は割り込み許可の設定はしない、追加の応用を考えてこのままとした。

***************************************************
初期化とともに鳴り出す

void BUZZER_Init(void)
{
  /* TPM1SC: TOF=0,TOIE=0,CPWMS=0,CLKSB=0,CLKSA=0,PS2=0,PS1=0,PS0=0 */
  setReg8(TPM1SC, 0x00);               /* Disable device */
  /* TPM1C0SC: CH0F=0,CH0IE=0,MS0B=1,MS0A=1,ELS0B=1,ELS0A=1,??=0,??=0 */
  setReg8(TPM1C0SC, 0x3C);             /* Set up PWM mode with output signal level low */
  RatioStore = 0xFFFFU;                /* Store initial value of the ratio */
  /* TPM1MOD: BIT15=0,BIT14=0,BIT13=0,BIT12=1,BIT11=1,BIT10=1,BIT9=1,BIT8=1,BIT7=0,BIT6=0,BIT5=1,BIT4=0,BIT3=0,BIT2=0,BIT1=0,BIT0=0 */
  setReg16(TPM1MOD, 0x1F20U);          /* Set modulo register */
  SetRatio();                          /* Calculate and set up new values of the compare according to the selected speed CPU mode */
  /* TPM1SC: TOF=0,TOIE=1,CPWMS=0,CLKSB=0,CLKSA=1,PS2=0,PS1=0,PS0=0 */
  setReg8(TPM1SC, 0x48);               /* Run the counter (set CLKSB:CLKSA) */
 
  TPM1C0V = 0xF20U; <-追加
}
ブザー停止
void BUZZER_OnEnd(void)
{
  /* Write your code here ... */
  // Clear CH0F flag
  TPM1C0SC &=0x7F;

  //Clear the 16-bit timer1 counter
  TPM1CNTH = 0x00;
    setReg8(TPM1SC, 0x00);    <-追加
}


#pragma CODE_SEG __NEAR_SEG NON_BANKED

/*
** ===================================================================
**     Method      :  BUZZER_Interrupt (bean PWM)
**
**     Description :
**         The method services the interrupt of the selected peripheral(s)
**         and eventually invokes the beans event(s).
**         This method is internal. It is used by Processor Expert only.
** ===================================================================
*/
ISR(TPM1_isr)
{
  (void)getReg8(TPM1SC);               /* Dummy read of the TPM1SC register to reset flag */
  /* TPM1SC: TOF=0 */
  clrReg8Bits(TPM1SC, 0x80);           /*  Reset interrupt request flag */
//  BUZZER_OnEnd();                      /* Invoke user event */
}

Fu-RTOS
 ブザーを鳴らすのにFu-RTOSを使いました、
  仕様 一定時間ならす
 この手の処理は簡単であるが、独自のイベントを作るか、ループの中でカウントを監視するなど、スパケ゜ッテープログラムの元凶だ。
RTOSを使用すれば下記のようにすっきりする。
main.c

// Buzzer Task
30秒ONする
void BuzzerQsec() {
  BUZZER_Init();
  tslp_tsk(2);
  BUZZER_OnEnd();
   ext_tsk();
}

 RunClock
       if(TOD_MATCH_EVENT()){
             nowtime=vfnUpdateDayAndTime(&Calendar_RTC);
              arc_tsk ( BuzzerQsec );  <-追加

  Fu-RTOSItoronと違い、タスク登録のような概念はありませんarc_tsk ( 名前)で起動します。

Fu−Rtos V1.1
MCS08低消費電力化
 
消費電力はぼクロックに反比例するようである、MCS08はじめ最近のMCUはクロックギアになっている。
クロックギアとは動作中にクロック速度を変えることを言うがメーカーによっては別の言い方のところもある。
MCS08のクロック回路は複雑で読み解く がたいへんだ、そこで手始めに。
サンブルのソースを変更して1/1〜1/8が設定出来るようにしてみました。
注、リミットチェックはしていないので必要なら追加すること。

void ICS_FEI(char bdiv) {

  if (NVICSTRM != 0xFF)
    ICSTRM = NVICSTRM;                      // load trim value if NV location not blank
  else
    ICSTRM = 0xAD;                  // use a default value if NVICSTRM is blank

  ICSC1 = ICSC1_FEI;
  bdiv=bdiv&0x03;
  cpu_speed=8>>bdiv;
//  cpu_speed=cpu_speed*1000;
  bdiv=(bdiv)<<6;
  ICSC2 = ICSC2_FEI |bdiv;
  ICSSC = ICSSC_FEI;
  while (ICSC1_CLKS != ICSSC_CLKST) {}  // wait for clk state to match clk select
} //end InitICS

:結果はJP2=MCU IDDをテスターで計測
16MHZ 6mA
  2MHZ 1mA
1/8とはならないもののほぼ満足な結果。

 2013/5追記
  TWR-S08LL64ではJP4をGNDにしないとMAX3218がAutoShutdownDisabledらしくこれだけで平均2mA食うことになっています。

CodeWarrior V6.3を新規に入れたら古いパソコンのプロジェクトでTWR-S08LL64のBDMデバッガが見つけることが出来なくなた。
V6.3 Welcome_CW_MCUs.txtには
(5) Support for the new Freescale Open Source BDM connection based on HCS08JM60
  platform. The "HCS08 FSL Open Source BDM" and "CFV1 FSL Open Source BDM"    
  connections can   be selected in New Project Wizard for the new derivatives
  listed above.
新規作成時に選ぶことで使用可能になるらしく、新規プロジェクトを作成して見たらOKだった。

低電力アナログ入力
アナログデータ取り込みには、A/DConvertorを使うのが一般的だ。
しかしdataloggerのようにコイン型電池で長時間使いたいこともある。
小型のワンチップマイコンのばあいA/DConvertoのReferenceはVDDになっている。
低消費電力の電源ICもあるけど、それでもアイドル電流はもったいない。
そんな時はバンドギャップ・リファレンスを使う手も有る、各社のCPUに内蔵されている。
MCS08の場合コンパレータてしか使えないので応用範囲は限られるが、コイン型電池直で安定なリファレンスがとれるので低消費電力+BOMコスト低減になる。
ProsesserExpert
コンパレータを生かして+入力をバンドギャップ・リファレンスに設定する(変化するエッジも選べる)
これ以外の選択肢はないので簡単、あとは回路設計力で適正な入力電圧がはいるようにする。
PINも固定だ。

CodeWarrior 6.5
  掛け算割り算が出来ない時
 
rtshc08.cをソースファイルのグループlibに読み込む。
   MCS08には8X8Bit掛け算はあるがunsign char型どうしでもだめである、これは”C”ではラウンドアップがプログラマの手で出来ないためライブラリを呼び出している。
   rtshc08はランタイムの意味らしい。

  キーボード割り込みが1個しか設定できない
   CPU.Cを書き直すしかないようだ。
  /* KBIPE: KBIPE2=1 */
  KBIPE |= 0x04;<-ここに追加する
 注意 ProsesserExpert起動すると書き戻される。

 デバッガ
  CPUを間違えても教えてくれない、普通はCPUの番号?かを読んでワーニングをだしてくれると思う。
  clockが無いと言うメッセージが出る内部CLOCKの周波数が違うので合わないようだ。
CodeWarrior 10.x
CodeWarrior 6.5はLinux版も有ったらしいがeclipsになってからは無いようだ。
 
6.5はwin7でも動かないので10.5を入れてみた。
 かつてeclips版はP&E multilinkが動かなかったが10.xになってから使えるようになっていた。
 
eclipsは癖がありすぎる、IARのように簡単に使えない。
 mc9s08とColdfireV1にかぎりProsessor Exportが使える。
 スタートアップコードとスケルトンだけ作ってくれるので割り込みのオマジナイを書かなくて済む。
注意 ProsesserExpert起動すると書き戻される。は相変わらずだバックアップは取られ無い。

ARM
リンク
ARM7<>CortexM3

 ARMのHP
RTOSではレジスターなどCPUの知識も必要だ。
Cortex-Mのレジスター

 IARのユーザーニュースにのっていた
さらに
Cortex-M3 テクニカルリファレンス マニュアル
2.2.1. メインスタックおよびプロセススタック
とても分かりにくい説明だ
MSP=メインスタック
PSP=プロセススタック
プログラマーがなにもしないとメインスタックのまま動く
mainに飛ぶ前にプロセススタックを使うようににすると、例外処理に入るとメインスタックを使うようになる。
このようにするにはシステムコールにSWIを使えばよい。

かつてMotrolaの6809でOS9を使っていた時は当たり前だったが、User<>Systemの区分けをはっきりさせるのは良い事だ。

CMSIS
Cortexマイクロコントローラ ソフトウェア インタフェース規格
 RTOSを作るならこれに合わせなければと思うが、ハードウェア抽象化レイヤなので追加のドライバだけでいいようだ。
ARMのサイトに
ダウンロードファイルがあったので
ダウンロードして見ると文書のHTMLの他、
Cortex-M3/-M4 -M0のヘッダーがあった、これを使って書けと言うことの様だ。
CMSISの日本語訳
 
東京理科大学木村研究室で日本語訳をしている
APSのHomePage
Cortex-M3の命令セット

デバッガ
デバックインターフェイス接続
Cortex-M系は各社SWDと言う規格で統一されている。
ST-Linkで全て可能らしい。
図の結線が標準、5本の線で済む。

接続4線
Fu-RTOS for ARM
ARM
Cortex-M0/M3で簡単に使えるリアルタイムOSを考えています。
 今のところカーネルのみで、デバイスドライバは手付かずです。
特定のICベンダーによらずARM全般をカバーできるようにする。
したがって、今のところSTを対象にしているが、ST社のライブラリを使うのは低レベルドライバーのみとする。
ICベンダーは囲い込みのためサンプルソースに便利なライブラリを含んだSDKを出しているが、その中からペリヘラル固有のものだけ利用させてもらう。
かえって手間のような気がするが有る物は利用するという考え方だ。
ARM社はコア部のみを設計して、周辺はICベンダーが自社のCPUの設計資産を利用するケースがほとんどだ。
ここにARMを使う時の難しさがある、
ICベンダーのユーザーズマニュアルには、
ARMが提供するPeripheral
    About the Cortex-M3 peripherals
    Nested Vectored Interrupt Controller NVIC
    System control block
    System timer, SysTick
    Optional Memory Protection Unit
となっているので、ここは共通まずはここから攻めていこう。
 
Memory Protection Unitはほとんど使われていないようだ。
TicTimerはSysTickに決まりだ。
 SysTick_Config(SystemCoreClock / 1000); これで(SysTickが生きる、1msec ごとに割り込みがかかる

Fu-RTOS-ARM でのファイル区分
stm32vldiscoveryF.c "stm32vldiscovery"ボード名、FはFu-RTOSの意味 ボード特有のコードを書く
 system.h 作ろうとしているターゲットに固有の情報を含む、main.cとともにシステムの振る舞いを決める。

NVICの使用サンプル
 ..\Utilities\STM32vldiscovery.cにある

STM32ではサブセットになっている?
RM0008_Rev11_J.pdf 9.1 ネスト化されたベクタ割り込みコントローラ(NVIC)
主な機能
68 のマスク可能な割り込みチャネル(Cortex™-M3 の 16 個の割り込みラインは数に含まれて
いません -> SysTicIntまでの割り込みはARMが提供しているので数に入っていない)。
16 のプログラム可能な優先レベル(4 ビットの割り込み優先順位を使用 -> 256ではない

仕様
割り込み
 
タスクを起動させることができる
mallocによるメモリー管理

 mainタスク以外でも利用可能にする。
 ?管理というほどではないが、動的に割り当てることでフリーソフトの移植に対応できる。

デバイスドライバ仕様
 当面ITronの通常要求のみとする。

第1章 デバイスドライバ共通仕様
1.1 概要
デバイスドライバは、 中心核 ( ITRON ) 上で独立したタスクとして動作し、 デバイスに対して以下の基本操作を要求に応じて行う。
通常要求
    OPEN     デバイスの使用開始
    CLOSE     デバイスの使用終了
    CLOSEALL    デバイスの使用終了、メディアのイジェクト
    READ     データの読み込み
    WRITE     データの書き込み

 デスパッチヤーの設計変更

  RUN <--- REDY
  ↑↑    ↑
  │└---->WAIT <---POST(割り込みより)
  ↓   
  DOMANT

POST(割り込処理タスクNO.)でタスクNOの処理が起動する

ARM Cortex-Mの特徴
 Cortex-M0/M3はリトルエンデイアンBit操作でH8やColdfireと違っている
  Fu-RTOSのコードをほぼそのまつかっているがASMとの関連で違いが出た。

ビット操作
 Cortex-M3はビットバンドという方式で、1命令で変更できる、Cortex-M0は無しFu-RTOSではリード、モディファイ、ライトがアトミック  命令であることを前提にしているのでCortex-M0は無理ということになる。

動作モード
 ハンドラ・モード(特権状態/メインスタック)と,スレッド・モード(特権状態と非特権状態/プロセススタック)をサポートする.
 なにもしないとハンドラ・モードのままなので当面このままとする。
非特権状態では使えないコマンド・レジスタがある。

割り込み
 レジスターA0~A3のPUSH POPがハードで行われる、また関数コールと同じ動作になっている。
 コンパイラはこれに対応しているので割り込みを意識しで書く必要はない。
割り込みレジスターxPSRは次の3つのカテゴリに分けられる。
    APRS=アプリケーションPSR 普通のステータス
    IPRS=割り込みPSR 割り込み番号が入る
    EPRS=実行PSR

_WFI();でとまる
 WFI=割り込み待ちで停止している、そのためデバッガも動かない、その後デバッガが飛ぶ(STリンクの場合JTAGではOKらしい)


使用開発環境
IAR無償版 ARM用IAR Embedded Workbenchバージョン6.50.3
EABIにも対応している
EABIは、"the ABI (Application Binary Interface)for the ARM Architecture"だそうでビッグエンデアンの略ではなくリトルエンデアン。

IAR-ARM-ST版開発デレクトリ
 現段階ではST以外ないが他のメーカも入れるつもりなのでもう一階層深くなる予定

ARMが提供する Cortex-M3 Peripherals
    About the Cortex-M3 peripherals
    Nested Vectored Interrupt Controller
    System control block
    System timer, SysTick
    Optional Memory Protection Unit
これらは
 Libraries\CMSIS
からもってくる
STのソースは
 Libraries\STM32F30x_StdPeriph_Driver
からもってくる
他のメーカーは
 Libraries\etc
となる

STマイクロ
STM32 Value Line discovery
 
Value Lineと言うだけあってARMコアで24MHzは低速の方だろう、DACがあるのが特徴
 これを使って何か喋らせてみよう。
DACは12Bit、2CH用意されているが、
2CHのレジスターは各32Bitを半分ずつ共用しているので2CHでステレオ何かと言う使い方を想定したものらしい、
左右でタイミングに差が出ないようになっている。
出力
電圧 P-P2.4V
インピータダンス Bufferd out 5kΩ / NonBufferd out 1MΩ
最大速度 1MHZ 
のようである
TIMER6と関連つけるとうまくいくように設計されている。

 
DACを使ったトーンジェネレータ
SINE波を出すものを作ってみた、この実験ではベースボートはいらない、
不要になったデスクトップパソコンのケースから取ったLEDのケーブルを利用、その先にイヤホンジャックを付けるだけ。
それをパソコンのLINE−INにさせば準備完了である。
ノート
パソコンでMICに入れて見たが当然サチってしまった。
D/Aのサイン波機能は使っていないので、波形データを変えればどんな波形でも出せる。
D/AOutに部ラグを繋ぐ
 プロジェクトと変更ソースは下記。
STMDiscoveryTone
D/Aはオフセットバイナリーで出力されると言うか、単一電源なので0〜3.3Vまで単純に変化するだけだ。
オフセットバイナリーの計算は

オフセットバイナリー x 0x10000000000^x
0x111111111111 65532*7 0x011111111111 0x111111111111
0x100000000001 1 0x000000000001 0x100000000001
0x100000000000 0 0x000000000000 0x100000000000
0x011111111111 -1 0x111111111111 0x011111111111
0x000000000000 -(65532*7+1) 0x100000000000 0x000000000000

なんと0x10000000000^xでいいのだ
当然だが 0は、1.65Vになる。

シリアル通信の実験
P2コネクターが6Pなのでここを使うと6Pで済む、PINNo.1,2
なので2PのLEDのケーブルでもOK
P2
1.Port B10 I2C2_SCL/ USART3_TX
2.Port B11 I2C2_SDA/ USART3_RX

IARのサンプルは解かりずらい、自分なりに変更して使おう、例えば
USART1だけにすれば
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
/* Check the parameters */
assert_param(IS_USART_ALL_PERIPH(USARTx));
assert_param(IS_USART_DATA(Data));
/* Transmit Data */
USARTx->DR = (Data & (uint16_t)0x01FF);
}

↓ 難解なおまじないは必要ない

void USART_SendData( uint16_t Data)
{
USART1->DR = (Data & (uint16_t)0x01FF);
}


USARTで割り込みを使うには
NVIC (Nested Vector Interrupt Controller)セットをセットアッフする必要がある。
NVICはARMのM3の仕様なようで他社のCPUにも応用出来る。
IARのサンプルでは
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

/* Enable the USARTx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USARTx_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
となっていて、NVIC_Initでこれをやっている

割り込みハンドラーはstm32f30x_it.c
などのところに書かれているので、ここからさらに必要な処理関数を呼ぶ
無駄なようだが最適化を上げれば直接呼ぶようになる。

UART
 ホスト(XP)の問題
連続転送するとデータが抜けてしまう、VBでも"C"でも同じようだ。
ハイパータームなどはOKなのでファイルにして転送が簡単

SPI
SPIをマスターで使う(お手軽設計)
 この場合受信でも割り込みは必要ない、
受信でもダミーのデータを送り出す必要があり、その後には確実にデータが受信バッファにある。
クロックを高速にし、割り込みを使えばGPIOよりCPU負荷が少ないと思う。
相手がFPGAやDSPのような高速シリアルを持ったチップを相手にするにはこれに限る。

STM32のGP-IO
どこのメーカーのCPUも多くの機能を盛り込みたいし、製造プロセスが微細化し密度も高くなって来ている、一方足の数は
そのままコストになるので多くの品種はできない。
その為足を使い分けることで多くの機能を盛り込み品種を少なくする努力をしてきた結果、
GP-IO設定は複雑になりここでつっかかることが多い。
RM0008_Rev11_J.pdf リファレンスマニュアルSTM32F10nxx日本語の
TABLE16と17とその説明を穴の開くほど良く見ること、優先デバイスを生かしてもそれだけではだめなようだ。
此の辺は改善してもらいたいところだ。

音声再生装置
もどき 単なる音声再生ですが
パソコンで作った音声データを再生する。
何種類かをファイルとしてフォルダーに収める
フォルダーをSTM32V-Discoveryに転送
フォルダー内のファイルを選択し再生する
という物です。
 ファイルシステムが必要になりますがFAT−FSはSTM32V-Discoveryではサイズ的に無理
音声はシーケンシャルにしかアクセスしないため簡単なファイルシステムにした。
TARというUNIX系では多用されている(windowsでも開発者は使っている)を使います。
フォルダーに収めるのにTARでアーカイブし、
STM32V-Discovery内ではTARのヘッダーを解析し必要ファイルを読み出すという物です。
ファイルをシリアルEEPROMにおさめることにしていますが、どのEEPROMが良いか?

SPI FLASHとSPI EEPROMの違い
Flashはイレースしてからでないと書き込んでもデータがでたらめ
EEPROMはいつでも書き込める。
サイズ
EEPROM<FLASH
読み込み速度
EEPROM<FLASH
とFLASHの方が有利なことが多い、
SPIなデバイスではピン互換なものもあるのでシステム要求で乗せかえれば良い。
とかし
EEPROMはブロック単位で書き込めるためソフトの自由度が大きい、データレコーダなど随時に書き込みが必要なときはこれ。
音声再生装置でデータが収まりきらない時ホストから必要なデータを送ることも出来る。
ramの少ないマイコンではFLASHのページの編集が出来ないので追記するにはEEPROMしかない。

SPIとI2Cの違い
読み込み速度
SPI>I2C
使用線数
SPI>I2C
ソフトの複雑さ
SPI<I2C
音声をターゲットにすると当然のようにSPIを選ぶことになる。

STの物が容量が最も大きく、速度も十分なのでこれにした。
シリアルEEPROM
 M95M02-DRMN6  2MBit

TARFile
Mingwでの検証とソース

 
TARFileの構造

2012/4現在、M95M02は市場では入手しようとすると、海外のネット販売しか見当たらず、振込み、送料の方が高くなってしまう。
今回はアクシスデバイス・テクノロジー株式会社のご好意でサンプルをいただきましたので、例によって、
デスクトップパソコンのケースから取ったLEDのケーブルを利用しテストベンチを作った。
基板は手元にあったピッチ変換基板を利用。

フレキシブル、ピッチ変換基板にE2ROMとパスコン、CSのジャンパーを載せた。
回路図 JMP2を外すと書き込み禁止
8pin eeprom conection cirkit
SPI-EEPROM
ドライバー
SPI-Flashを使ったサンプルはNet上にいろいろ見つかったが、EEPROMドライバーは無かった。
無い物は作ると言うことで調べてみた。
基本的なコマンドはFlashと同じだ、かつて作ったM25Mの物を修正して使って見る。
しかもBlock R/WしかできないのもFlashと同じだ。
最近の大容量の物は、かつてのnicのハードIDを記録していた小容量のものと違い、8Bitアクセス固定で
SPIハードで全て出来る、ソフトでI/Oをたたく必要が無いので高速に読み込みができる。
 書き込みも高速だが、相変わらず10uSのwaitは必要だ。
このためOSが有る方が合理的なソフト設計が出来る。


参考ソース
SPI-EEPROMドライバー 2013/5/7 バージョン
2MBitでテストしたが1Mでもサイズ以外変わりはないようだ。
M95M0xソース eeprom.c
M95M0xヘッダー M95M0x.h

SPI-FLASHドライバー
 
かつて作ったドライバー、未確認、参考まで
M25M-10ソース flashM25x.c
M25M-10ヘッダー M25P10_A.h

HOST通信プロトコル
ファイルを送るには
@データの透過性 
Aファイルの転送終了を通知できる
がなくてはならない、いちいち作るのは車輪の再発明になりかねない、そこで
Kermitの登場である、NFSを乗せるのは32kの制限で無理。
Kermitは古くから有るがまったく目立たないソフトである。
しかしハイパーターム、Teratermでもサポートされている、多分ほとんどのターミナルソフトでサポートしている。
linuxのminicomのKermitにはバグが有るのだそうで使うなとあちこちの開発ツールには書かれている。

HOST通信リンク
uartを使うことを考えているが、パソコンにシリアルI/Fがないことが多いこの頃なので、

STM32 F3 discoveryを購入、だが32kの制限で無理かもしれない、GCCに移行も考えにいれながらやろう。

E-Kermit
組み込み用途のコンパクトなKermit、一部機能が省かれている。
 ライセンスはRevised 3-Clause BSD License
これを組み込む

E-Kermit HomePageの訳
 適当訳して見た。

LCD
カラーhグラフィック液晶 NOKIA3300-LCD
手元にあるので表示させて見る。
ここを参考にした。

NXP
LPC1114
LPC1114FN28 /102は110円で買えるARMである、8BitCPUより安い
トラ技2012/11オマケ基板。と同じCPU
コアはCortex-M0であるが8Bitよりは格段に強力
RAMは4Kあり、十分である。
デバックインターフェイスは、SWDと言う規格なので
STM32 Value LinediscoveryのST-Linkでデバッグ出来る。
エレキジャックのHPに参考になる記事が出ている。

最近はこんな面白企画が、
LPC1114FN28のDIPが400円になってしまったのが残念
イチゴジャム
あてんどーで200\で売っていた
LPC1114FN28基板、調べたらジャムだったので、おいしくいただくよう料理中
ようやく組み立て完了
ISP SW & Reset Bottunをドングル風に刺せるように作って見た。
ai.Jam.Piのくみたて後の様子

Ti
MSP430F
 
CQトラ技2007-1の付録基板に
Fu-rtosインプリメント
この基板は
超低消費電力マイコンMSP430基板2枚組み[CD-R付き]でまだ販売しているので使って見るのもいい、低電力、計測系の機器に向いている。
MSP-430ソース

malloc/free代替関数
430F543x,430F541x
 16KBのRAMをもつ、FLASHの容量と足の数=I/Oの数で品番がいくつかある
これ位のメモリーがあるとフリーソフトの移植も幅がでる。
MSP-EXP430F5438実験ボードが手元にあるのでFU-Rtosのメモリー管理機能を強化
malloc/free代替関数の拡張をする。
タスク間でmallocコールをロックすることでメモリー破壊を防止するようにする。

MSP430は16BitCPUなのでこれが生きるように、カーネルも16BitR/Wを多用するようにする。

低電力化
TIのHP
省電力モードとクロック


USB
USB Embedded Host 

Embedded Hostは全てのUSB Peripheralを接続するのではなく、接続デバイスを限定できるUSBホストだ。
例えば、USBメモリだけを接続サポートするなどの仕様が可能。
PC以外の製品でもHost機能を持ちたい、接続サポート対象として、一部のPeripheralだけで十分。

USBはホスト主動なため、プロトコルの理解にはデバイスよりもこちらが早道
秋月でUSB SL811の乗ったH8-3069ボード
 まだ売っている。SL811は古いが、FPGAのFreeCoreもある。

USBデバイス (USB-ターゲット)

STM32 F3 discovery の巻き
はOnChip USB-I/Fが含まれているのでこれを使ってみる

STM32F3-Discovery_FW_V1.1.0をダウンロードし展開する
開発環境はIARを使う
 最適化は無しか低にしないと削除または書き換えが起こって動作しないことがあるようだ。

RM0008_Rev11_J.pdfはSTM32F10xxxの日本語解説だがUSBの部分は共通

HIDクラス
....\ARM\STM32F3-Discovery_FW_V1.1.0\Project\Peripheral_Examples\USB_Example

がUSBマウスのデモソフトだ、加速度計を使ってその傾きをマウスの動きにしている。

とりあえずUSB_Example.ewwをダブルクリックでIARを起動
全てを再コンパイルでダウンロードでOK、USBケーブルを繫ぐとマウスとして認識できた。

CDCクラス
 STマイクロのCD00158241.pdf UM0424
 の中にUSB-Silialのサンプルがある、STM32F3-DiscoveryがターゲットではないがSTM32F3コアも対象になっている。

 stsw-stm32121.zipをダウンロードし展開する

....\stsw-stm32121\STM32_USB-FS-Device_Lib_V4.0.0\Projects\Virtual_COM_Portなどデモソフトだ。

 なぜかターゲットにダウンロード時エラーとなる、デフォルトからプロジェクトを作り直し、ソースをそのまま借用したら動作した。
 デバッガST-LNKのリセット設定に問題があった、
リセット=リセットピンで良い。

状態遷移はホスト主導なので明示的になっていない、割り込みで全て処理している
ここいらに必要な処理があるようだ

https://sites.google.com/site/toriaezunomemo/home/stm32-usb-development-toolkit/stm32-usb-fs-device-firmware-library/USB-FS_Device-peripheral-interface
1.2 USB-FS_Device peripheral interface

USB-FSは FullSpeedのこと

VirtualComport USBシリアル

サンプルVirtualComportは動作する
もう一つのサンプルVirtualComport_Loopbackの動作を見てみると。
これがもっとも簡単なサンプルだ

usb_reg(.h, .c)

     ハードウェア抽象化レイヤ(Hardware abstraction layer)
 usb_int.c    転送正常完了割り込みサービスルーチン Correct transfer interrupt service routine
 usb_mem(.h, .c)    データ転送管理(送受パケットメモリエリア) Data transfer management(from/to packet memory area)

main.c
      CDC_Receive_DATA(); ほすとからのパケットを確認
      /*Check to see if we have data yet */
      if (Receive_length  != 0)
      {
        if (packet_sent == 1)
          CDC_Send_DATA ((unsigned char*)Receive_Buffer,Receive_length);ここで
Receive_Bufferの内容をホストに送信 ここを加工すればホストよりのデータを受け取れる。

これだけでもなにか出来そうだ。

_SetCNTRのようにアンダーバーで関数風に書かれている物は
#define _SetCNTR(wRegValue)  (*CNTR   = (uint16_t)wRegValue)
などと定義してレジスターなどを読み書きしている。

USBの割り込み
USBWakeUp
 サスペンドからの USB ウェイクアップ割り込み(EXTI ライン経由)

USB_HP_CAN_TX
 USB 優先割り込みまたは CAN TX 割り込み

USB_LP_CAN_RX0
 USB 非優先割り込みまたは CAN RX0 割り込み

おまけ 

8方向LED
なんらかの状態を表示させるのに使ってみよう
PEに接続されている

方向
PORT No LED No シルク
N
9
3
NE
10
5
E
11
7
SE
12
9
S
13
10
SW
14
8
W
15
6
NW
8
4
Nから始まると時計周りの換算は LED=(x+1)&0x7+8

USB ON Fu-RTOS
USBのデバッグ
  USBデバイスはスタンバイ時500uAの規定があるためSuspend時はCPUを停止していることが多い。
  割り込みが入るとそこから動き出すことになるが、Cortex-M3ではデバッガが
CPU停止に対応していなかった。
  Fu-RTOSを使うことにした、
usb_pwr.c
//???        __WFI();//??? こでNG
/*??? debug*/        wai_flg(0);

stm32_it.c
void USBWakeUp_IRQHandler(void)
#endif
{
  EXTI_ClearITPendingBit(EXTI_Line18);
/*??? debug*/   POST(0);
}
  とやればフラグで待ちから抜け出すことが出来
WFIの代用になる、CPU Powerは食い続けるのでこのままではセルフパワーの物しか出来ないので実用では外すようなifdefを書くようにする。
−>接続されている限り問題ないようだ、パソコンがサスペンドするとNG
 
−>ハードで対応可能、リセットで一旦USBを切断でOK

 ホスト側

 デバッガをとめるとストールする、その度にデバイスマネージャでVCOMを無効⇒有効とやらなくてはいけない

リンク

Virtual COM port demo翻訳

クロックギャ

CPU クロックを変えて消費電流を下げる。
LSE OSC 32.768kHを使うことは出来ない
Table 28. Typical and maximum current consumption from VDD supply at VDD = 3.6V (continued)
CPUCLOCK IDD/ma
72 MHz     44.0
 8 MHz      4.9
 1 MHz      0.6
STM32 F3 discovery IDDの測定場所 MB1035.pdf
 JP3
1 MHz      0.6mAなら 600mahのリチューム電池では
1日で放電してしまうとすると
600/24=25ma
1ma
として25日もつ



ルネサスH8
H8とH8Sの違い

H8<>H8S 
 
H8とH8SのTiny版は似ていて似てざる、設計時点が10年以上立っているので当然だが。
 クロックに関しては大した進歩はないようだが、内部CR発信器が追加された。
 他社のようにDOCのような物は得意でないようだ。
 ロバスト性が強化され、I/Oも設定無しでは動かない、I/Oピンの代替機能もあるのでかなり面倒になってきた
 HEWは4になったが機能は10年かわらず、H8STynyの設定は無い、ヘッダーファイルさえ無いのだ。
 そこで造りましたH8S−20103/20115のヘッダーファイル
自由に使ってください、無保証です
H8s2011x.h
iodefine.h