セグメントのデザインは12時間表示の時計用+2桁の7セグ+曜日+絵文字2+battryMetorサンフルプログラムTWRLL64_Quick_Startもサーモスタットとなっている。
絵文字は炎と雪?ということで空調コントローラ用で他に使い道はない、
しかしこれはヘッダーがおかしいかリンクが出来ない。
TWRLL64_AccelerometerはOKだった。
そこでAccelerometerのプロジェクトファイルを使い時計を動かしてみる事とした。
CodeWarriorV6.3を起動し下記ファイルのプロジェクトをinportして不足のソースは Quick_Startからコビーしてくる。
プロジェクトと変更ソースは下記。TWR-S08LL64 Clock
ガイガーカウンタ4,5のカラムにフィルター後のリアルタイムの数値
GeigarCounterの設計
仕様
ClockにCounterを追加しガイガーカウンターの表示と記録を取る
RTOSではレジスターなどCPUの知識も必要だ。さらに
Cortex-Mのレジスター
IARのユーザーニュースにのっていた
CMSISの日本語訳APSのHomePage
東京理科大学木村研究室で日本語訳をしている
デバックインターフェイス接続Cortex-M系は各社SWDと言う規格で統一されている。
Fu-RTOS-ARM でのファイル区分system.h 作ろうとしているターゲットに固有の情報を含む、main.cとともにシステムの振る舞いを決める。
stm32vldiscoveryF.c "stm32vldiscovery"ボード名、FはFu-RTOSの意味 ボード特有のコードを書く
これを使って何か喋らせてみよう。
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のサイン波機能は使っていないので、波形データを変えればどんな波形でも出せる。
プロジェクトと変更ソースは下記。
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のケーブルを利用しテストベンチを作った。
基板は手元にあったピッチ変換基板を利用。
回路図 JMP2を外すと書き込み禁止
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をドングル風に刺せるように作って見た。
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
省電力モードとクロック
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の動作を見てみると。
これがもっとも簡単なサンプルだ
ハードウェア抽象化レイヤ(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 |
ホスト側
デバッガをとめるとストールする、その度にデバイスマネージャでVCOMを無効⇒有効とやらなくてはいけない
リンク
クロックギャ
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
1 MHz 0.6mAなら 600mahのリチューム電池では
1日で放電してしまうとすると
600/24=25ma
1maとして25日もつ
HEWは4になったが機能は10年かわらず、H8STynyの設定は無い、ヘッダーファイルさえ無いのだ。
そこで造りましたH8S−20103/20115のヘッダーファイル
自由に使ってください、無保証です
H8s2011x.h
iodefine.h