フォト
2025年3月
            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          
無料ブログはココログ

« 2017年11月 | トップページ | 2018年1月 »

2017年12月の8件の記事

2017年12月28日 (木)

micro:bitをArduino環境で使う(4)豊四季Tiny BASICを動かしてみる

Tetsuya Suzukiさんが開発・公開している「豊四季タイニーBASIC」をmicro:bitに移植しました。
まだまだ機能不十分ですが、下記のサイトにて公開しました。
先日作成した、内部フラッシュメモリへの保存機能も組み込みました。

豊四季Tiny Basic for micro:bit V0.03
https://github.com/Tamakichi/ttbasic_microbit

ダウンロードの直リンク
https://github.com/Tamakichi/ttbasic_microbit/archive/master.zip

シリアル接続したターミナル上でプログラムを作成することが出来ます。
フルスクリーンエディタ対応で、操作は8ビットマイコン時代のBASIC風です。

02

上記のプログラムを動かした様子

01

機能的には、現時点で
  ・シリアルコンソール上でのPRINT、INPUT等の一般的なコマンドの利用
  ・プログラムの保存・読み込み・保存一覧表示:SAVE n、LOAD n、FILES
 ・LEDマトリックスの描画:PSET、LINE、RECT、CIRCLE
 ・GPIOを使ったデジタル入出力、アナログ入力:OUT、IN()、ANA()

に対応しています。

ファームウェアの書込みは、通常のプログラム書き込みと同様です。
公開サイトからダウンロードした圧縮ファイルを解凍し、
binフォルダ内のhexファイルをmicro:bitのフォルダに書き込みます。

マニュアル等はこれから整備していきます。

グラフィカルなインタフェースも良いのですが、修正の都度コンパイルと書き込みに
ちょっとフラストレーションがたまります。
その点、即実行できるインタープリタ言語のBASICは思ったら直ぐ実行できるので良いです。

2017年12月25日 (月)

micro:bitをArduino環境で使う (3)内部フラッシュへのデータ書き込み

256kバイトもあるフラッシュメモリにプログラムから自由にデータを書き込みたいと思い、ライブラリを作成しまた。

2017/12/27 更新
書込みの*addr++ = *ptr++;の両アドレスが4バイト境界でないとフォルトを起こしてしまうようです。
その防止のためのエラー処理を追加しました。

ライブラリ

//
// フラッシュメモリ書き込みライブラリ
// 2017/12/25 by たま吉さん
// 参考文献
//  nRF51 Series Reference Manual Version 3.0 「6 Non-Volatile Memory Controller (NVMC)」
//

#include <Arduino.h>
#include "nrf.h"

//
// フラッシュメモリ指定ページ消去
// フラッシュメモリアドレスは、0x00000000 ~ 0x0003FFFFの範囲とする
// 1ページのサイズは1024バイトとし、アドレスは
//
// 引数
//   addr 消去対象ページ先頭アドレス
// 戻り値
//   0:正常終了
//   1:異常終了(指定アドレスが正しくない)
//
uint8_t  flashPageErase(uint32_t addr) {
  if ( addr >= 0x00040000 )
    return 1;  // フラッシュメモリ領域外
  if ( addr % 1024 )
    return 1;  // ページ先頭アドレスでない
  
  // 書込みアンロック
  NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Een;
  while (NRF_NVMC->READY == NVMC_READY_READY_Busy);

  // 指定ページの消去
  NRF_NVMC->ERASEPAGE = addr;
  while (NRF_NVMC->READY == NVMC_READY_READY_Busy);

  // 書込みロック
  NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren;
  while (NRF_NVMC->READY == NVMC_READY_READY_Busy);
  return 0;
}

// フラッシュメモリ32ビットワードデータ書き込み
// 引数
//  addr: 書込みアドレス(4バイト境界アドレスであること)
//  ptr : 書込みデータ格納アドレス(4バイト境界アドレスであること)
//  len : 書込みデータ長さ
// 戻り値
//   0:正常終了
//   1:異常終了(指定アドレスが正しくない)
//
uint8_t flashWriteData(uint32_t* addr, uint32_t *ptr, uint16_t len) {

  if ( ((uint32_t)addr) >= 0x00040000 )
    return 1;  // フラッシュメモリ領域外
  if ( ((uint32_t)addr) % 1024 )
    return 1;  // ページ先頭アドレスでない
  if (((uint32_t)ptr)%4)
    return 1;  // 4バイト境界アドレスでない
    
  // 書込み有効設定
  NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Wen;
  while (NRF_NVMC->READY == NVMC_READY_READY_Busy);

  // データ書き込みループ
  for (uint32_t i = 0; i<len; i++) {
    *addr++ = *ptr++;
    //Serial.println(i,DEC); 
    while (NRF_NVMC->READY == NVMC_READY_READY_Busy);
  }

  // 書込み無効設定
  NRF_NVMC->CONFIG = NVMC_CONFIG_WEN_Ren;
  while (NRF_NVMC->READY == NVMC_READY_READY_Busy);
  return 0;
}


利用サンプルスケッチ
//
// micro:bit フラッシュメモリ書込みテスト 2017/12/25 by たま吉さん
//

uint8_t  flashPageErase(uint32_t addr);
void flashWriteData(uint32_t* addr, uint32_t *ptr, uint16_t len);

#define FLASH_PAGESIZE    1024         // ページサイズ
#define FLASH_PAGENUM     256          // 総ページ数
#define FLASH_TOPADR      0x00000000   // フレッシュメモリ先頭アドレス
#define FLASH_SAVESIZE    4096         // 保存データサイズ(ttbasicを想定)
#define FLASH_SAVEPAGENUM 4            // 
#define FLASH_SAVENUM     1
#define FLASH_SAVEPOP  ((FLASH_TOPADR+FLASH_PAGESIZE*256)-FLASH_SAVESIZE*FLASH_SAVENUM)

uint8_t buf[FLASH_SAVESIZE];
void setup() {
  uint8_t c;
  
  Serial.begin(115200);
  Serial.print("Save top adr=");
  Serial.println(FLASH_SAVEPOP,HEX);

  // テスト用ダミーデータ
  for (uint16_t i=0; i < FLASH_SAVESIZE; i++) {
    buf[i] = i%256;
  }

  Serial.print("Write(y/n)? ");
  while(!Serial.available());
  c = Serial.read();
  Serial.write(c);
  Serial.println();
  if (c == 'y') {
  
    // ページの消去
    Serial.println("ERASE PAGE");
    for (uint8_t i=0; i<FLASH_SAVEPAGENUM; i++) {
       flashPageErase(FLASH_SAVEPOP+FLASH_PAGESIZE*i);
    }
  
    // データの書込み
    Serial.println("Write Data");
    //for (uint8_t i=0; i<FLASH_SAVEPAGENUM; i++) {
      flashWriteData((uint32_t*)FLASH_SAVEPOP, (uint32_t*)buf, FLASH_SAVESIZE/4);
    //}
  }
  
  // データの確認
  Serial.println("Read Data");
  for (uint32_t i=0; i <FLASH_SAVESIZE; i++) {
    if (i%16 == 0) {
      Serial.print(FLASH_SAVEPOP+i,HEX);
      Serial.print(":");
    }
 
    c = *((uint8_t*)FLASH_SAVEPOP+i);
    if (c<0x10){
      Serial.print("0");Serial.print(c,HEX);
    } else {
      Serial.print(c,HEX);
    }
    if (i%16 == 15) 
      Serial.println();
    else
      Serial.print(" ");
   }
}

void loop() {
  // put your main code here, to run repeatedly:

}

実行結果

03

フラッシュメモリの書込みは、ページ単位(1024バイト)で行います。
データの書込みはワード単位(4バイト)で行います。

フラッシュメモリの256kバイト領域のアドレス範囲は、
   0x00000000 ~ 0x0003FFFF
です。

テストプログラムでは、ブートローダやプログラムを破壊しないよう、後半部に4kバイトを書き込んでいます。

このライブラリは、豊四季TinyBASICの移植時に利用する予定です。

2017年12月22日 (金)

STM32関連 「STM32HAL&SW4入門 Kindle版」を読んでみると..

STM32開発環境として最近 SW4STM32を使い始めました。
何か参考になる書籍をと思い、電子書籍「STM32HAL&SW4入門 Kindle版」購入しました。
(実際には、Kindle Unlimited: 読み放題対象の書籍なので、そのサービスにて購入)

03

内容的には、参考になる書籍なのですが、確実に間違っている内容もあります。
ケチをつけるつもりは無いのですが(う~ん、でも有料なので文句も言いたいなぁ..)、
間違った手順が広まると困るので、その点について記載します。

以下、インストールに関しての電子書籍「STM32HAL&SW4入門 Kindle版」 からの引用です。

2-2. 統合開発環境 インストール

 今回 は Windows 7 マシン に インストール する 場合 について 説明 し ます。

2-2-1. JavaSE インストール

  SW 4 STM 32 は Eclipse ベース の 開発環境 の ため、 JavaSE の インストール が 必須 です。 既に JavaSE が インストール さ れ て いる 場合 は 次項 へ 進ん で ください。 先 ほど、 ダウンロード し た SW 4 STM 32 の インストール を 開始 する と、 JavaSE が インストール さ れ て い ない 場合 は 自動的 に インストール が 中止 さ れ、 JavaSE の インストール が 促さ れ ます が、 今回 は 先 に JavaSE を インストール し ます。

実際には、JavaSEの事前インストールは不要ですし、インストールは中止されません。
実際に試してみると、途中でjavaのインストール確認画面が表示され、javaがインストール
されます。

02

インストール後は問題なくSW4STM32が起動出来ました。
インストールしたSW4STM32のフォルダを調べてみると、jreがインストールされてる
ことが分かります。

05

利用しているSW4STM32のEclipdeインストール情報を見てみると、
どのjava環境を利用しているかが分かります。

04_3

公式サイトのインストール手順にjavaを事前にインストールする記載は
ないので、素直に公式サイトの手順に従えばインストールでOKですね。

情報が正確かどうかは、改めて「一次ソース(公式サイト)」の確認が大事ですね。


2017年12月16日 (土)

電子書籍「Mastering STM32」で勉強中 。。。。

先日購入した 電子書籍「Mastering STM32」を熟読中。。。

本日は、「5. Introduction to Debugging」の章に到達(まだまだ先は長いです^^)。

「ARMセミホスティング」等、ARMでは当たり前の作法というか、ノウハウのようですが、
全然知りませんでした。OpenOCDのちょっと突っ込んだ解説、非常に良いです。
このあたりを知っているだけで、デバッグに対するアプローチが全然異なると思います。

個人の趣味ベースで、体系的に幅広く網羅して学んでいくのは限界がありますが、
この書籍は、けん引してくれます。
英文なので、読み進めるとストレスが溜まるのがちょっと難点です。

追記
Mastering STM32の解説では、eclipce+プラグインを対象としていますが、
System Workbench for STM32(SW4STM32)で、セミホスティングやってみました。

デバッグ内でfprint()はもちろんのこと、fopen()、fwrite()で実行中の情報をホスト側の
OSのファイルに保存できます。デバッグでかなり威力を発揮できます。
ホスト側のファイルをロードして、EEPROMへの書込みなんかも出来るかもしれません。

Sw4stm32

設定は、下記の情報を参考にさせていただきました。

SW4STM32でsemihostingが使いたい
Semihosting with OpenSTM32 and STM32F446RE Nucleo
Semihosting on ARM with GCC and OpenOCD

2017年12月15日 (金)

電子書籍「Mastering STM32」を購入 ・・・ かなりの良本

STM32関連の書籍を探していたのですが、国内で市販されている書籍があまりなく、
洋書の電子書籍「Mastering STM32」がお薦めとのことで、購入しました。

https://www.carminenoviello.com/mastering-stm32/

01

価格は$32.99と高い気がしますが、PDF版では848ページもあり高くはないでしょう。

まだ最初の導入部分と開発環境の構築部分までした読み進めていませんが、
STM32をマスタするにおいては、かなりの良本だと思います。

国内で出版されている書籍は古いフレームワークを利用したものばかりの中、
HALベースなのも良いです。記事内で利用しているツール類は、最近のバージョンの
ため、ずれが無いのも良いです。

また、電子出版の利点を生かして、頻繁に更新しているようです。
定期的に情報を取り込んで更新しているようなので、これ一冊持っていれば、
長く使えそうです。サポート専用サイト、フォーラムもあるので情報交換等を出来そうです。

導入部分の「1.2.2 …. And Its Drawbacks(そしてその欠点)」で、
『なんで、STM32は今一、分かりにくのだろうか?』と思っていた疑問に対する答えが
分かりました。

他のメーカーのLPC、AVR、Microchipなんかは、取りあえず無料で使える(制約あり)、
専用の統合環境を用意していますが、ST社は用意していません。
そのため、利用はそれぞれ異なった環境を使っています。
幾つかの書籍なんかも、開発環境がまちまちです。
これだけでも、それそれの環境で初心者は混乱します。ネットで調べても、
自分と異なる環境の情報なので、手順なんかも違ってきます。

また、ライブラリ関係の公開ドキュメントが貧弱です。
ソースコードから生成しているので、簡単なインタフェースレベルの説明しかなく、
サンプルソース付きの解説がほとんどないです。

そのほか、CubeMXの生成コードがバグが多い点にも言及しています。

英語なので、読み進めるスピードが亀ですが、ネット上の断片的な情報を探すよりも
しっかりと理解出来そうです。

去年、スイッチサイエンスで安売りしていた「ST Nucleo Board STM32F401RE」を
やっと活用出来ます。

02_2

Dscn7371

2017年12月13日 (水)

micro:bitにケースを取り付けました

micro:bit用のケースを探していると、 ELECFREAKSというところで
良さげなものが販売されているのでポチリました。

ELECFREAKS Micro:case Transparent Acrylic Case Shell Enclosure Computer Box For Microbit

01

んで、到着したので早速取り付けました。

組み立ては、説明書がなく若干手間取りました。

Dscn7354

アクリル板に張り付いている傷防止の紙が手で剥がしにくいため、
濡れたティッシュで湿らせて剥がしやすくしました。

Dscn7356

とりあず完成。

Dscn7357

裏側に単三電池が装着出来ます。
実は、この電池ボックスを取り付ける付属ねじが短くて、取り付けられませんでした。
手持ちのねじで代用しました。

Dscn7360

端子部分は剥き出しのタイプです。

Dscn7359

まあ、値段のわりには良い感じです。

さて、ここでちょっと気になったのがUSB経由の電源と、電池との併用です。
ケースを購入したELECFREAKSのサイトに回路図があり、電源部は次のような感じになっています。

02
(画像は https://www.elecfreaks.com/wiki/index.php?title=Micro:bitより引用)

整流用ダイオードBAT60Aあり、他の電源に逆流しないようになっています。
同時接続しても問題なさそうです。

USBからの電源は、USBインタフェースIC KL26Zの3.3Vレギュレーターから供給されいる
ことも分かりました。

2017年12月 9日 (土)

Arduino IDEのgccのバージョンの再認識

Arduino IDE 1.8.5の環境は、「C++11対応しているの?」とちょっと疑問に思い、試してみました。


サンプルスケッチ

//
// C++11対応の確認
//

void setup() {
  Serial.begin(9600);

  int x       {3};           // 新しい初期化形式
  int d[]     {0,1,2,3,4,5}; // 新しい初期化形式(配列)
  char *ptr   {nullptr};     // 新しい初期化形式、NULLの新しい形式
  uint16_t b  {0b11110001};  // 2進数対応

  Serial.print("x=");
  Serial.println(x,DEC);
  Serial.print("b=");
  Serial.println(b,BIN);
      
  for (auto a:d) {         // 新しい範囲指定形式 
    Serial.println(a,DEC);
  }
}

void loop() {

}

コンパイルは問題なく出来ました。実行結果も期待通りに動作しています。
う~ん、これは積極的に使っていった方がコーディング量も減り、不具合も回避できるかも..

01


裏付けを取るために、Arduinoのgccの環境周りを調べてみました。
まずは、利用しているgccのバージョンですが、
C:\Users\ユーザー\AppData\Local\Arduino15\staging\packagesの下には、
avr-gcc-4.9.2-atmel3.5.4-arduino2-i686-mingw32.zip
があります。

確認のため、インストールされているフォルダ \arduino-1.8.5\hardware\tools\avr\bin
のgcc++のバージョンを調べると4.9.2でした。

02

次にコンパイルオプション
\arduino-1.8.5\hardware\arduino\avr\platform.txt に定義されているコンパイルオプション
を調べると次の設定になっています。

compiler.c.cmd=avr-gcc
compiler.c.flags=-c -g -Os {compiler.warning_flags} -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects


compiler.cpp.cmd=avr-g++

compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threads

gcc4.9.2では機能的にc++11は完全対応であり、
cコンパイラはC11対応、C++コンパイラはC++11対応の指定が設定されています。

これでc++11の記述が堂々と利用出来ます。

(注意)
同じArduino IDE を利用していても、Arduino M0、DueのARMや、別のアーキテクチャのボードは、
利用しているコンパイラが異なります。この設定はAVRマイコン限定です。
他の環境については、別途調べる必要があります。

2017年12月 4日 (月)

ラズパイ版IchigoJamが公式サイトに掲載されています

IchigoJamのラズパイ版がラスパイ公式サイト ダウンロードに掲載されています。

https://www.raspberrypi.org/downloads/

01

早速、手持ちのラズパイ2で試してみました。
オリジナル版とは異なり、USBキーボードがサポートされています。
画面表示もHDMIに対応していますが、AV端子を使ってNTSCビデオ出力を試してみました。

02

config.txtファイルに sdtv_mode=1 を追加るつことでNTSCビデオ出力出来ます。

今回、ちょとハマったのがSDカードの相性問題です。
下記サイトにラズパイでのSDカードの相性についての記載があります。
https://elinux.org/RPi_SD_cards

手持ちのSanDisk製microSDカードではブートできませんでした。
手持ちのエレコム製microSDカードでは問題無く起動出来ました(写真)。

現時点では、オリジナル版の全ての機能はサポートされていません。
処理速度は、オリジナル版の50倍から100倍(利用するラズパイによる)くらい出ているようです。

移植は完成度は高く、素晴らしいのですが、
オリジナル版のインタープリタ実装方式が今一だった部分がそのまま移植されたため、
ラズパイ本来のパフォーマンス出せていないようで、ちょっと残念です。
(STM32F103C8T6の豊四季Tiny BASICよりも処理は遅いです^^)

このあたりは、改善を望みます。

2017/12/15 追記

現在ラズパイ版IchigoJamは、随時改良・更新が行われています。
描画処理がかなり改善されているようです。

« 2017年11月 | トップページ | 2018年1月 »