SSブログ
ARM&Cortex-M3 ブログトップ
- | 次の10件

ARIES(STM32F103評価ボード)でタッチパネルを試してみる [ARM&Cortex-M3]

aries_001.png
aries_002.png
aries_003.png
パスワールドさん取り扱いの480×272ピクセルのカラーグラフィックLCDにはタッチパネルが装着されていますので、ユーザーインタフェースとしてこれを使ってみます。

回路図の一部を拡大していますが、40pin FPCケーブルの一部にX軸方向、Y軸方向の端子が出ています。
このタッチパネルは抵抗膜方式で4線式です。抵抗値はX軸方向が600Ω以上、Y軸方向が100Ω以上です。

これをマイコンのポートでドライブし、反対側の軸に接続された端子の出力をADCで変換して読み込む訳です。

イメージとしては2枚目の回路図の感じでしょうか。指で押したところでX軸とY軸が短絡されます。

指で押された時の回路イメージが3枚目の回路図です。例えばX軸方向で中心が押されると、大体300Ωずつに分割されてY軸の抵抗膜に短絡しますので、XRにVCC、XLにGND、YDは600Ωよりも十分に大きな抵抗値のプルアップ抵抗を接続し、YUをADCに接続して変換結果を得ます。

実際には抵抗値は公称値に過ぎないので何等かの方法でキャリブレーションが必要になってくると思います。
運用するならキャリブレーション画面を表示して何箇所かポイントしてその位置のADC変換値を得て、まあSTM32Fのデータ用フラッシュ領域にでも書き込むと言うのが大体の流れでしょうね。


/*************************************************************************/
/* ARIES rev.2                                                           */
/*************************************************************************/
void aries_rev2( void )
{
#define  __X_MAX__  3808
#define  __X_MIN__  258
#define  __Y_MAX__  2099
#define  __Y_MIN__  365
  int i,j,k,r;
  int pos_x,pos_y;
  unsigned short x,y;
  DrawForm df;
  static const struct
  {
    int x;
    int y;
  } xy[] = 
  {
    {99, 29},
    {422,88},
    {477,106},
    {69 ,122},
    {160,69},
    {153,125},
    {361,37},
    {123,53},
    {128,147},
    {175,194},
    {154,224},
    {235,127},
    {402,96},
    {432,4},
    {338,7},
    {265,169},
    {206,62},
    {96 ,80},
    {439,203},
    {413,196},
    {244,169},
    {332,41},
    {338,74},
    {440,127},
    {473,93},
    {140,257},
    {274,27},
    {396,234},
    {231,225},
    {186,80},
    {399,238},
    {366,66},
  };

  static const unsigned short plt[] =
  {
    WHITE,       
//    BLACK,       
    GREY,        
    LIGHTGREY,   
    RED,         
    GREEN,       
    BLUE,        
    YELLOW,      
    SAXEBLUE,    
    MAGENTA,     
    DARKRED,     
    DARKYELLOW,  
    DARKGREEN,   
    DARKSAXEBLUE,
    DARKBLUE,    
    DARKMAGENTA, 
  };

  /*背景色=white*/
//  BG_Set( 0, X_MAX_PIXEL, 0, Y_MAX_PIXEL, BLACK );
  /*シャトル*/
  PutPics( 0, shuttle_Width, 0, shuttle_Height, shuttle_BMPTable );

  TouchPanel_Init();

  for( j = 0, pos_x = pos_y = 4095;; )
  {
    for( i = 0; i < sizeof(xy) / sizeof(xy[0]); i++ )
    {
      for( r = 1; r < Y_MAX_PIXEL / 2; r += 4 )
      {
#if 0
        DrawCircle( xy[i].x, xy[i].y, r, plt[ j ] );
        DrawCircle( xy[i].x, xy[i].y, r + 1, plt[ j ] );
        DrawCircle( xy[i].x, xy[i].y, r + 2, plt[ j ] );
        DrawCircle( xy[i].x, xy[i].y, r + 3, plt[ j ] );
#else
        if( pos_x >= 0 && pos_x < X_MAX_PIXEL && pos_y >= 0 && pos_y < Y_MAX_PIXEL )
        {
          DrawCircle( pos_x, pos_y, r, plt[ j ] );
          DrawCircle( pos_x, pos_y, r + 1, plt[ j ] );
          DrawCircle( pos_x, pos_y, r + 2, plt[ j ] );
          DrawCircle( pos_x, pos_y, r + 3, plt[ j ] );
        }
#endif

//        BG_Set( 0, X_MAX_PIXEL, 0, Y_MAX_PIXEL, BLACK );
//        PutPics( 0, shuttle_Width, 0, shuttle_Height, shuttle_BMPTable );
        PutPics( 0, shuttle_Width, 0, shuttle_Height - 60, shuttle_BMPTable );

//      Wait17ms( 4 );
      }

      if( ++j >= sizeof(plt) / sizeof(plt[0]) ) j = 0;

      /*xとyの移動平均を求める*/
      for( k = 0,x = 0; k < sizeof(ave_x_tbl) / sizeof(ave_x_tbl[0]); k++ )
	  {
        if( ave_x_tbl[ k ] >= 3900 )
        {
          x = 4095 * 16;
          break;
        }
        x += ave_x_tbl[ k ];
	  }
      x >>= 4;

      for( k = 0,y = 0; k < sizeof(ave_y_tbl) / sizeof(ave_y_tbl[0]); k++ )
	  {
        if( ave_y_tbl[ k ] >= 3900 )
        {
          y = 4095 * 16;
          break;
        }
        y += ave_y_tbl[ k ];
	  }
      y >>= 4;

      FourNineDisplay( (480 / 2) - 10 - (38 * 4), 272 - 60, x );
      FourNineDisplay( (480 / 2) + 10, 272 - 60, y );
      pos_x = ((__X_MAX__ - x) * 10) / (((__X_MAX__ - __X_MIN__) * 10) / X_MAX_PIXEL);
      pos_y = ((__Y_MAX__ - y) * 10) / (((__Y_MAX__ - __Y_MIN__) * 10) / Y_MAX_PIXEL);

      IWDG_WriteAccessCmd( 0xaaaa );  /*IWDG延長*/
    }
  }
}

/*************************************************************************/
/* タッチパネルのADC初期化                                               */
/*************************************************************************/
void TouchPanel_Init( void )
{
  /*ADC1へクロックの供給開始*/
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1, ENABLE );
  RCC_APB2PeriphResetCmd( RCC_APB2Periph_ADC1, DISABLE );
  RCC->CFGR |= (3 << 14);  /*PCLK2を8分周*/

  if( !(ADC1->CR2 & 0x00000001) ) ADC1->CR2 |= 0x00000001;  /*ADON*/
  ADC1->CR2 |= 0x00000004;          /*較正開始*/
  while( ADC1->CR2 & 0x00000004) ;  /*較正完了待ち*/
  ADC_Calibration_Value = ADC1->DR;  /*較正値の読み出し*/
  ADC1->CR2 |= (7 << 17);           /*ソフトウエア変換を選択*/
  ADC1->SMPR2 = 3 << 0;             /*サンプリングタイミング=28.5サイクル*/
  ADC1->SQR1 = (0 << 20);           /*レギュラー変換グループの項目数=1*/
}

/*************************************************************************/
/* タッチパネルのX側の読み出し                                           */
/* PC0(IN10)がUP、PC1(IN11)がDOWN、PC2(IN12)がRIGHT、PC3(IN13)がLEFT。   */
/*************************************************************************/
unsigned short TouchPanel_X_Read( void )
{
  volatile unsigned short temp;

  LEFT_HI;  /*左端をHI、右端をLOとする*/
  RIGHT_LO;

  GPIO_Terminal_Init( GPIOC, GPIO_Speed_2MHz, GPIO_Mode_Out_PP, GPIO_Pin_3 | GPIO_Pin_2 );  /*RIGHTとLEFTを出力に*/
  GPIO_Terminal_Init( GPIOC, GPIO_Speed_2MHz, GPIO_Mode_AIN, GPIO_Pin_0 );  /*PC0(IN10)をアナログ入力に*/
  GPIO_Terminal_Init( GPIOC, GPIO_Speed_2MHz, GPIO_Mode_IPU, GPIO_Pin_1 );  /*PC1をプルアップ付き入力に*/
  PC_ODR |= 0x0002;

  ADC1->SQR3 = (10 << 0);           /*ADC10の変換位置*/

  ADC1->CR2 |= (1 << 22);           /*ソフトウエア変換開始*/
  ADC1->CR2 |= 0x00000001;          /*ADON*/
  while( !(ADC1->SR & 0x00000002) ) ;  /*変換完了待ち*/
  temp = ADC1->DR - ADC_Calibration_Value;  /*変換完了後の読み出し*/
  /*2回行う*/
  ADC1->CR2 |= (1 << 22);           /*ソフトウエア変換開始*/
  ADC1->CR2 |= 0x00000001;          /*ADON*/
  while( !(ADC1->SR & 0x00000002) ) ;  /*変換完了待ち*/
  temp = ADC1->DR - ADC_Calibration_Value;  /*変換完了後の読み出し*/

  RIGHT_LO;  /*電気食うので電圧の印加を停止*/
  LEFT_LO;

  return temp & 0x0fff;
}

/*************************************************************************/
/* タッチパネルのY側の読み出し                                           */
/* PC0(IN10)がUP、PC1(IN11)がDOWN、PC2(IN12)がRIGHT、PC3(IN13)がLEFT。   */
/*************************************************************************/
unsigned short TouchPanel_Y_Read( void )
{
  volatile unsigned short temp;

  UP_HI;  /*上端をHI、下端をLOとする*/
  DOWN_LO;

  GPIO_Terminal_Init( GPIOC, GPIO_Speed_2MHz, GPIO_Mode_Out_PP, GPIO_Pin_1 | GPIO_Pin_0 );   /*UPとDOWNを出力に*/
  GPIO_Terminal_Init( GPIOC, GPIO_Speed_2MHz, GPIO_Mode_AIN, GPIO_Pin_3 );  /*PC3(IN13)をアナログ入力に*/
  GPIO_Terminal_Init( GPIOC, GPIO_Speed_2MHz, GPIO_Mode_IPU, GPIO_Pin_2 );  /*PC2をプルアップ付き入力に*/
  PC_ODR |= 0x0004;

  ADC1->SQR3 = (13 << 0);           /*ADC13の変換位置*/

  ADC1->CR2 |= (1 << 22);           /*ソフトウエア変換開始*/
  ADC1->CR2 |= 0x00000001;          /*ADON*/
  while( !(ADC1->SR & 0x00000002) ) ;  /*変換完了待ち*/
  temp = ADC1->DR - ADC_Calibration_Value; /*変換完了後の読み出し*/
  /*2回行う*/
  ADC1->CR2 |= (1 << 22);           /*ソフトウエア変換開始*/
  ADC1->CR2 |= 0x00000001;          /*ADON*/
  while( !(ADC1->SR & 0x00000002) ) ;  /*変換完了待ち*/
  temp = ADC1->DR - ADC_Calibration_Value; /*変換完了後の読み出し*/

  UP_LO;  /*電気食うので電圧の印加を停止*/
  DOWN_LO;

  return temp & 0x0fff;
}

/*************************************************************************/
/* TE割込みハンドラから呼ばれる。                                        */
/*************************************************************************/
void ARIES_GLCD_Int_Hdr( void )
{
  unsigned short x,y;
  static int wptr;

  x = TouchPanel_X_Read();
  y = TouchPanel_Y_Read();

  ave_x_tbl[ wptr ] = x;
  ave_y_tbl[ wptr ] = y;

  if( ++wptr >= sizeof(ave_x_tbl) / sizeof(ave_x_tbl[0]) ) wptr = 0;
}


※タッチパネルを動かすのにELMさんのページを参考にさせて頂きました。
http://elm-chan.org/index_j.html







ARMベースのArduino互換ボード [ARM&Cortex-M3]

Make Japan blogより
http://jp.makezine.com/blog/2009/09/maple_prototype.html
mapleproto.jpgARIESとかTAURUSとかのオリジナルボードにはSTM32F103xxxを採用しています。

ARMを始めたのは極々つい最近の事ですが、STM32Fって「嗚呼こんな周辺が欲しいよな!」って周辺機能が入っていて、確かに使ってみたいマイコンの筆頭なんです。ROMもRAMも沢山入っていますしね。

ただし、周辺機能が高機能過ぎてうんうん唸りながら設定しています。マニュアル読むだけですんごく大変なんです。なんて言うかあれですよ、「最新の携帯電話の機能を全て使ってください!」と言われている感じです。

ArduinoのベースとなっているのはAVRですが、やはり機能的限界みたいなのが存在して、そんな時にこのARMをベースとしたArduinoって結構良さそうですよね。
本当、あの周辺機能をArduinoベースで使い易くしたら、誰でも32bit CPUを苦労無くして使えるって事ではないですか。

期待しております。

Arduinoをはじめよう

Arduinoをはじめよう

  • 作者: Massimo Banzi
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2009/03/27
  • メディア: 単行本(ソフトカバー)



ARIES動画 [ARM&Cortex-M3]

久しぶりにARIESを触っております。

背景のシャトルのコックピットの画像の上に同心円の描画を行っています。ただしオーバーレイ表示ができないので同心円の移動は、
1.画面を背景で埋める。
2.円の描画を行う。
と1.と2.を繰り返し行う事であたかもオーバーレイさせているように見せています。

背景の描画がDMAを使ってのメモリ/メモリ間転送ですね。円の描画は100%ソフトウエアによる処理です。
特に背景の転送時には480×272×2byteのデータを一気に転送しています。

この液晶は表面に抵抗膜式のタッチパネルが付いていますので、次はタッチパネルを動かしてみたいですね。




OpenOCDのバージョンを上げてみた(0.1.0→0.3.0) [ARM&Cortex-M3]

openocdv030.pngzusさんのページを参考にARM(Cortex M3)の開発環境を立ち上げ、やはりzusさんのページを参考にOpenOCDのバージョンを上げてみました。


zusさんのページ:http://homepage3.nifty.com/zus/index.html
Cortex M3の開発環境構築のページ:http://homepage3.nifty.com/zus/ARM_M3_Dev_Flame.html
OpenOCDのビルドのページ:http://homepage3.nifty.com/zus/OpenOCD_Build_win32_Flame.html
本当にありがとうございました。

経緯は、OpenOCDは大人の?理由でバイナリ-の配付が出来なくなったらしく、特定のJTAGツール以外のOpenOCDのバイナリ-の入手をweb上から行う事が困難となり路頭に迷っていた(笑)のですが、OpenOCDのバイナリ-の生成手順を一から解説していただいたお蔭で新しいバージョンを利用可能となりました。

上記リンク先の手順の参考にすると、自分でバイナリ-(実行ファイル)を作る事ができます。

ただし、verが0.3.0を使用した場合、今までのJTAGの設定ファイルの一部に修正をする必要がありました。

OpenOCDをコマンドラインからでも、エクリプスからでも良いのですが起動した場合に以下の様なメッセージが表示されます。


Open On-Chip Debugger 0.3.0-in-development (2009-08-11-19:33) svn:2578
$URL: svn://svn.berlios.de/openocd/trunk/src/openocd.c $
For bug reports, read http://svn.berlios.de/svnroot/repos/openocd/trunk/BUGS
OLD SYNTAX: DEPRECATED - use jtag_khz, not jtag_speed
jtag_speed: 1
Warn : Interface already configured, ignoring
OLD SYNTAX: DEPRECATED - use jtag_khz, not jtag_speed
jtag_speed: 1
500 kHz
jtag_nsrst_delay: 100
jtag_ntrst_delay: 100
Info : device: 4
Info : deviceID: 67330064
Info : SerialNumber: FTSA6QCYA
Info : Description: myJTAG A
Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
Info : JTAG Tap/device matched
Info : JTAG tap: stm32.bs tap/device found: 0x06414041 (mfg: 0x020, part: 0x6414, ver: 0x0)
Info : JTAG Tap/device matched


気になるのは
OLD SYNTAX: DEPRECATED - use jtag_khz, not jtag_speed
の一文です。このままデバッカーを起動してみましたが、やはり上手く行かないようです。具体的にはフラッシュにプログラムが書き込めていない様な感じです。

そこで幾つかのJTAG関連の設定ファイルの中を検索し、
jtag_speed 1
となっているところを
jtag_khz 500
と修正してみました。
※設定に関する記述はいい加減です。まったく根拠は無く、たまたま上手く行っただけのレベルです。

この修正によって上記メッセージは出なくなり、接続も無事出来たようです。
実際にデバッカーを動かしてみましたが、バージョン0.1.0よりもきびきび動いて、極めて好感触です。
うーん、良いかも。

ただ気になる事もあります。
これはバージョン0.1.0からなのですが、メモリダンプが上手く行きません。
変数watchとかレジスタの参照とか、勿論ブレークポイントやステップ実行等はちゃんと動くのですが、メモリダンプのみ今だ正常に出来ていません。
どなたか、、、。




Eclipse/ARMプロセッサによる組込み開発 基礎講座

Eclipse/ARMプロセッサによる組込み開発 基礎講座

  • 作者: 大橋 修
  • 出版社/メーカー: 翔泳社
  • 発売日: 2008/09/19
  • メディア: 大型本



TAURUS(ARM Cortex M3)P板製作に出します [ARM&Cortex-M3]

taurus_002.pngP板.COMに「定額給付金パッケージ」で製造を依頼する予定です。

「え!、7月31日までの期間限定ではなかったの?、、、」。
いやいやまだ正式にアナウンスされていませんが、9月末まで延長との事です。

回路図を見た人は知っているかと思いますが、簡単に基板の説明を行うと、
1.CPU:STM32F103ZET(ARM Cortex M3 72MHz ROM 512Kbyte、RAM 64Kbyte)
2.外付けSRAM:CY7C1041DV33-10ZSXI 4Mbit 16bitバス 10ns非同期SRAM
3.インタフェース:USART、UART合計4組み。この内RS232レベル変換されているのが1組
4.インタフェース:SPIを1組(または2組)
5.インタフェース:I2Cを0組(または1組)
6.インタフェース:USBを1組
7.ストレージ:SDカードスロット
8.GPIO:多数
9.アナログ入力:最大12本
10.搭載可能モジュール:加速度センサーモジュール KXM52-1050
11.搭載可能モジュール:ジャイロセンサーモジュール AE-GYRO-SMD
12.バッテリーバックアップ:電気二十層コンデンサーにてバックアップ可能
13.LEDチカチカ用LEDを1個用意
14.8MHzオシレータと32.768KHzオシレータを搭載可能。RTCとバッテリーバックアップにより時計機能を実現可能
15.デバック用にJTAG 20pinソケットを用意
16.電源:3.3V(外部からは5V程度を供給)
17.基板サイズ100mm×100mmでかいかな?
こんなところかな。

乗っかる人、居ますかね。動作確認前なのでもしかしたら問題が有るかもしれないですし、自分で部品を実装する事になりますが、その代わり実費のみで提供します。

えーっと、「定額給付金パッケージ」が12000円+消費税600円で、5枚で割れば一枚辺り2520円(経費別)、納期14日間ですね。
ちなみに同仕様で普通に10枚の見積もりだと税込み25819円、納期5日かぁ。

まあ、動くかどうか判らない物に2520円も出す人はな居ないか。

OpenOCD JTAGボードと接続できず、、、 [ARM&Cortex-M3]

Img_1441.jpg
mprog.png
openocdv020.png
openocdv010.png
いや、JTAGボード自体は動いています。随分前に会社のパソコンにエクリプスだの、GNUツールチェインだの、それにOpenOCDのver0.1.0を入れてちゃんとOpenOCDがJTAGボードと接続でき、デバックもそれなりに(イマイチ怪しいところが有るけれど、、、)できる事は確認済みです。

今回家のパソコンに上記環境を構築し、開発ができるようにと思っていたのですが、、、

OpenOCDはどうやらタッチの差でバージョンはver0.2.0に上がっているようで、すでにダウンロードサイトからはver0.1.0は削除されています。

まあバージョンが上がっていると言う事はリファインされているのでしょうから、こちらをインストールして見ました。これがトラップだとは思わずに。

OpenOCDのver0.2.0をインストールしたところでコマンドラインから接続を試みます。
ですが何故か「fdtiデバイスがOpenできない」、「ファイルcommand.cの469行目がエラー」とメッセージを表示して終了です。訳判りません。

ぐぐると同様のエラーに付いて若干情報がありますが、これはどうも古いバージョンでの話みたいです。
OpenOCDにはソースコードも一緒に入っていますので、command.cの469行目を見る事ができますが、出来たからと言ってコンパイルができる訳ではないので無意味ですね。

この場合、こちらの環境や設定が悪いのか、それともOpenOCDのバグか?と言う事になります。

そこでまずは環境面から。
当初インストールしたパソコンは、メインで使用してるWin2KがインストールされたX24です。FDTIの最新のドライバーが既に入っていますので、JTAGボードを接続したからと言ってあらためてドライバーを取って来る事はしません。普通に認識して、勝手にドライバーが組み込まれて、それで終了です。
で、この環境では全く駄目でした。

次にXPがインストールされたコンパックノートです。キーボードがタイプし難いので普段は持ち出しません。
こちらも当初はFTDIの最新ドライバーが組み込まれていました。その状態でも駄目です。やはり「FDTIデバイスがOpenできない」と言ってきます。
しょうがないので、FTcleanを使ってFDTIのドライバーを一旦削除した上で、ドライバーの再インストール、OpenOCDのテスト、、、これでも駄目です。
「このバージョンまともに動かないんじゃないのかなぁ、、、」

設定面から試してみましょう。
当初はDWMのOPEN OCD JTAGの記事の通りにFTDIのプロファイルを設定しましたので、デスクリプターはmyJTAGとしてありました。
これを、vidやpidは変更せず(と言うかできない)にOlimexのデスクリプター名に変更し、OpenOCDに添付されているOlimex用の設定ファイルを使用して試験です。
んが!、やっぱり駄目です。
「いよいよこのバージョンが怪しいぞ、、、」

じゃあOpenOCDはどうなのよ!
ver0.1.0では動いていたのでver0.1.0をインストール、、、したいところですが、少なくともネット上を検索してもver0.1.0のインストールファイルが見つかりません。なんてこった、トホホ。
過去に使ったインストールファイルなんてとっくの昔に削除しているので、パソコン上にも存在しません。

と、ここまででうんざりして放棄です。「これだからxPENなんとかは、、、実用性がxxんだよなぁ。」

さて、2、3日離れてちょっとだけ気分が盛り返してきたので考え直してみました。

「そもそもインストーラでインストールするとは言え、コマンドラインから単体動作できるんだから、ver0.2.0のexeを捨てて、代わりにver0.1.0を上書きしてしまっても動くんじゃないのかな。」

早速実行です。会社のパソコンにはver0.1.0のexeが有るのでこれを家のパソコンに上書きで入れ直してチャレンジ!。無事JTAGボードやSTM32F103と接続できました。
「なんだかアホみたい、、、ブツクサ、ブツクサ。」

と言う訳でver0.2.0をインストールして同様に悩んでいる方、ver0.1.0のexeを用意してお待ちしておりますので御連絡くださいね。







- | 次の10件 ARM&Cortex-M3 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。