SSブログ

フリスクJTAGの完成例とNXPのARM(Interface5月号付属基板)で使う時の注意点 [ARM&Cortex-M3]

frisk_01.JPG
frisk_02.JPG
frisk_03.png
フリスクJTAGを買っていただいた「かじまや@つくば」さんから完成写真を送ってもらいました。

ねっ、いい感じでしょ!。
ケースの加工も綺麗だし、半田付けも上手。まるで製品みたいじゃないですか。

それとこのInterface5月号付属のARM基板で使用する時は「CPUモード設定をOpenにする」とアドバイスも頂いています。
判らない事があったら原点、この場合はInterface5月号に戻ってみると良い事が起きるかもしれません。

皆さんの完成写真もお待ちしております(笑)。

ARMプロセッサ入門―ARMアーキテクチャの詳細&ARM7/XScaleの応用 (TECH I)

ARMプロセッサ入門―ARMアーキテクチャの詳細&ARM7/XScaleの応用 (TECH I)

  • 作者:
  • 出版社/メーカー: CQ出版
  • 発売日: 2004/05
  • メディア: -






STM32F ARIESの開発 [ARM&Cortex-M3]

Img_1553.jpgファイルシステムを搭載する事で、ずいぶん色々な事が出来ますね。
例えるならMS-DOS時代のパソコン並、、、まだそこまでは行っていないけれど。

外付けでマウスやキーボードインタフェースやネットワークなんかも追加していきたいです。


ELMさんありがとう。
http://elm-chan.org/index_j.html

Martin ThomasさんのSTM32F用FatFsの修正点 [ARM&Cortex-M3]

※10月14日の版でこの件は修正が行われた様です。

え!、勿論面識無いです(笑)。
fatfs_005.png例のSTM32F用のFatFsを提供してくれているMartin Thomasさんの2009年9月10日版のプロジェクトファイルですが、細かい話ですがLibraries\fat_sdのsd_spi_stm32.cに若干の修正が必要な様です。


175行目のこれを、
static void socket_wp_cp_init(void)
{
	/* Turn on GPIO for socket-switches */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_WP_CP, ENABLE);
	/* Configure I/O for Power FET */
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_WP | GPIO_Pin_CP;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIO_WP_CP, &GPIO_InitStructure);
}

この様に、
static void socket_wp_cp_init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Turn on GPIO for socket-switches */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_WP_CP, ENABLE);
  /* Configure I/O for Power FET */
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_WP | GPIO_Pin_CP;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_WP_CP;
  GPIO_Init(GPIO_WP_CP, &GPIO_InitStructure);
}


また185行目を
static inline socket_state_t socket_wp_cp_state(void)
{
	return (socket_state_t)(GPIO_ReadInputDate(GPIO_WP_CP) 
	                        & ( GPIO_Pin_WP | GPIO_Pin_CP));
}


この様にします。
static inline socket_state_t socket_wp_cp_state(void)
{
  return (socket_state_t)(GPIO_ReadInputData(GPIO_WP_CP) 
                         & ( GPIO_Pin_WP | GPIO_Pin_CP));
}

共にWrite Protect、Card Detectを有効にしてビルドを行うと、コンパイラ、またはリンカーに怒られて間違いが発覚します。
最初の奴はGPIO_InitTypeDef構造体が用意されていなくてエラーですね。
2番目の奴はもろにタイプミスでしょう。

2008年6月号のDWMの付録基板をお持ちの方なら実際にFatFsをお試しいただけると思います。
一部PINの割付等がMartin Thomasさんの場合と異なるので、コンフィギュレーションの一部を自分の基板向けに修正する必要があります。
私はDWMの付録基板を持っていないのでAIRESの例で行けば、
 #define CARD_SUPPLY_SWITCHABLE   0
 #define SOCKET_WP_CP_CONNECTED   1 /* */
 #define GPIO_WP_CP               GPIOB
 #define RCC_APB2Periph_GPIO_WP_CP  RCC_APB2Periph_GPIOB
 #define GPIO_Pin_WP              GPIO_Pin_11
 #define GPIO_Pin_CP              GPIO_Pin_10
 #define GPIO_Mode_WP_CP          GPIO_Mode_IPU /* pull up resistors */
 #define SPI_SD                   SPI2
 #define GPIO_CS                  GPIOB
 #define RCC_APB2Periph_GPIO_CS   RCC_APB2Periph_GPIOB
 #define GPIO_Pin_CS              GPIO_Pin_12
 #define DMA_Channel_SPI_SD_RX    DMA1_Channel4
 #define DMA_Channel_SPI_SD_TX    DMA1_Channel5
 #define DMA_FLAG_SPI_SD_TC_RX    DMA1_FLAG_TC4
 #define DMA_FLAG_SPI_SD_TC_TX    DMA1_FLAG_TC5
 #define GPIO_SPI_SD              GPIOB
 #define GPIO_Pin_SPI_SD_SCK      GPIO_Pin_13
 #define GPIO_Pin_SPI_SD_MISO     GPIO_Pin_14
 #define GPIO_Pin_SPI_SD_MOSI     GPIO_Pin_15
 #define RCC_APBPeriphClockCmd_SPI_SD  RCC_APB1PeriphClockCmd
 #define RCC_APBPeriph_SPI_SD     RCC_APB1Periph_SPI2
 /* for SPI2 and full-speed APB1: 36MHz/2 */
 /* !! PRESCALE 4 used here - 2 does not work, maybe because 
       of the poor wireing on the HELI_V1 prototype hardware */
 #define SPI_BaudRatePrescaler_SPI_SD  SPI_BaudRatePrescaler_2  /*可能だが若干不安定*/
// #define SPI_BaudRatePrescaler_SPI_SD  SPI_BaudRatePrescaler_4  /*実用可能*/
// #define SPI_BaudRatePrescaler_SPI_SD  SPI_BaudRatePrescaler_256

//#error "unsupported board"

を#else句の中に記述してしまいました。

以上!。

FatFsをARIES(STM32F103)で試してみる [ARM&Cortex-M3]

勿論FatFsと言えばELMさんのそれですが、更にそれをSTM32Fにインプリメントされた物をARIESにて動かしてみました。※転送にはDMAを使用しています。
もう完全に人の成果を再確認しているだけで申し訳無い。
ELMさん
http://elm-chan.org/index_j.html
それをインプリメントしたところ
http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/arm_memcards/index.html#stm32_memcard

手持ちのSDカードを幾つか試したのですが、色々動作に違いが出ますね。
それぞれ10Mbyteずつ7回書き込み、70Mbyteの読み出しを行って、それに掛かった時間の計測です。
ユーザーインタフェースは既に作り込まれています。
fatfs_001.png このカードはとても古く、メーカーも判らないし、容量も128Mbyteしか無い物です。組み込みでデータ収集とかする場合、多分手持ちの今となっては半端なSDカードの再利用とかするかと思いますが、それです。 このSDカードはSPIクロックを9MHzにしないと動きませんでした。 書き込みは比較的安定していて700Kbyte/sの後半から800Kbyte/sの半ば辺りです。読み込みは926Kbyte/sでまずまず。
fatfs_002.png 今度のは100円で買って来たバッファローの128Mbyteのカードです。 同じく9MHzSPIクロックですが、先程より若干書き込み、読み込み速度の低下が見られます。 値段成りなんでしょうか。
fatfs_003.png ただこのカードはSPIクロック=18MHzでも動きます。その時の様子ですが、相変わらず書き込みは奮いませんね。ただ読み込みは随分速くなりました。
fatfs_004.png 最後は手持ちのSDカードで最も大きいサイズのKingston製4GbyteSDHCです。 こちらもクロックは18MHzとなっています。 最初の書き込みは調子良いのですが、その後が駄目ですね。半減しています。 読み込みも全然ですね、トホホ。



なんと言うか、FatFs凄過ぎ!。




fatfs_005.pngあれ?、何故か知らないけれどメーカー不明の128Mbyteが18MHzで動くようになって、書き込み、読み込みが最速になってしまった。わからなぃ、、、。

※やはりデバッカーが有るとはかどりますな。

Transcend SDHCカード Class6 8GB TS8GSDHC6

Transcend SDHCカード Class6 8GB TS8GSDHC6

  • 出版社/メーカー: トランセンド・ジャパン
  • メディア: エレクトロニクス



Transcend SDHCカード Class6 16GB TS16GSDHC6

Transcend SDHCカード Class6 16GB TS16GSDHC6

  • 出版社/メーカー: トランセンド・ジャパン
  • メディア: エレクトロニクス



OpenOCD フリスクJTAGの発送とその後 [ARM&Cortex-M3]

Dsc00220.jpg
Dsc00221.jpg
第1便は先程発送完了しました。

部品セットは6セット、基板単体で2枚の注文があり、手持ちの部品は残り2セット分となりました。
まあだらだらと配布を継続してもあれなので、今週の金曜日の23時59分59秒まで待って、その時点で私の方からの配布は終了とします。

注文された方、メール便で送っていますので、ちょと時間が掛かりますが、今しばらくお待ちください。
なお実装で向きの判らない部品はほとんどありませんが、唯一LEDだけはこれが判らない。

写真を掲載して置きますので実装の参考としてください。
一番上が青色LEDです。秋月ではすでに販売終了していて残念な限りです。
二番目が赤色LEDです。
緑のLEDはDIGI-KEYで型番から調べていただければデータシートを入手できます。


数学ガール

数学ガール

  • 作者: 結城 浩
  • 出版社/メーカー: ソフトバンククリエイティブ
  • 発売日: 2007/06/27
  • メディア: 単行本



数学ガール 下 (MFコミックス フラッパーシリーズ)

数学ガール 下 (MFコミックス フラッパーシリーズ)

  • 作者: 原作/結城浩・作画/日坂水柯
  • 出版社/メーカー: メディアファクトリー
  • 発売日: 2009/07/23
  • メディア: コミック



数学ガール 上 (MFコミックス フラッパーシリーズ)

数学ガール 上 (MFコミックス フラッパーシリーズ)

  • 作者: 結城 浩
  • 出版社/メーカー: メディアファクトリー
  • 発売日: 2008/11/22
  • メディア: コミック



ARIESとOpen OCD フリスク JTAG の写真を送ってもらった [ARM&Cortex-M3]

CIMG0477.jpgTACさんの方でもARIESとOpenOCD フリスクJTAGを組み立てとの事で写真を送っていただきました。

今回何人かの方から注文いただきました。
購入された皆さん、是非フリスクのケースに入れてください。見栄えが違います。

フリスクのケースの加工には、ダイソーで買ったミニルーターとダイアモンドカッターを使いました。
結構いい感じで加工できます。

グラフィックは楽しい! [ARM&Cortex-M3]

Dsc00218.jpg機会があれば是非!。

画面サイズもそこそこ有るし、全部自分でプログラムを組まなければならないし、DRAWだったり、ペイントだったり、フォントの扱いだったりとか。
本当に面白いです。プログラミングの結果が目で見えるし。

写真はシリアル経由のコマンドラインから矩形や三角、円等の描画コマンドを送って操作しているところです。
モードを切り替えると文字データをトランスペアレントにLCDに送ります。

面白いのだけれど、やってもやってもきりが無い。
描画アルゴリズムを比較してみたり、色々凝った機能を追加してみたりとか。スクロールどうしよう!とか文字はやはりエスケープシーケンスをサポートするか!とか頭の痛い問題も。

もう少しちゃんとgccのライブラリが動けば、演算結果のプロットとかやらして面白いのでしょうけれどね。




OpenOCD フリスクJTAGデバッカーの部品セット配付 まずは2セット準備中 [ARM&Cortex-M3]

Dsc00215.jpg取り合えず注文のあった2セット分をパッケージしてみました。部品はセロハンテープで台紙にペトペト付けています。これなら十分メール便の80円で送れます。

まだケーブルが届いていませんので、届き次第お送りします。※ケーブル長は10cmにしました。
部品代は2920円、ケーブルは8本注文し、諸費用を加算して頭割りで1本336円です。それに送料の80円を加算します。

振込みは銀行振込です。注文後、部品セットを先に送ります。その中に振込先を同梱しておきますのでよろしくお願いします。

※このページのリストから必要な物だけリストを出してもらえれば、その分だけ発送しますが、ケーブルは頭割りとなっていますので、除外できません。
http://hamayan.blog.so-net.ne.jp/2009-09-08-2

大体1セットのパッケージングは40分くらい掛かりますね。

ARMの数値演算ライブラリ 解決編か? [ARM&Cortex-M3]

Dsc00214.jpg例の数値演算ライブラリを呼ぶと暴走してしまう問題ですが、ちょっとだけ解決を見たようです。

まずCodeSourceryから提供されているツールチェインのデフォルトライブラリの位置は、インストールディレクトリ以下のlib\gcc\arm-none-eabi\4.3.3以下にあるライブラリをランタイムルーティンとして使用している様です。
また標準ライブラリ等はインストールディレクトリ以下のarm-none-eabi\libに有るものを使用しています。

ところでこれらディレクトリには、更にその下にCPUコアのバージョン毎のライブラリが用意されており、実際に使用するのは自分で使用するコアに対応したこっちのライブラリを使うようです。

つまりCortex M3で使用する時はthumb2以下の内容物を先程のライブラリが納められているディレクトリにコピーして使う事になります。
※リンカーオプションでコア別のディレクトリを直接指定できるかもしれません。

ここで注意しなければならないのは、ライブラリに気を取られて何とか.aのみコピーしただけでは駄目で、lib\gcc\arm-none-eabi\4.3.3の場合はcrti.oとcrtbegin.oもコピーの対象です。
この2つをコピーしなかったお蔭で随分と悩む結果になってしまったのです。これはxoさんに指摘された事ですね。
※しかしなんで今までちゃんと起動して動いていたんだ?。

※このオブジェクトファイルが呼ばれている事は、mapファイルをよく眺めていないと全く気付けませんでした。何だろうな?、makefileの中にもこのオブジェクトの記述が一切無いのですが、gccって自動的にcrtをリンクする機能が有るのかな?。

ちなみにコンパイルオプションはコンパイラマニュアルの記述に則って以下の様にしました。
COMPILE_OPTS = -mthumb -march=armv7 -mfix-cortex-m3-ldrd -Wall -g -O0


写真は三角関数を使って座標を決め、中心から放射状に線を引いてみたところです。
#include  <math.h>

  int angle,cos_x,sin_y;

  BG_Set( 0, X_MAX_PIXEL, 0, Y_MAX_PIXEL, WHITE );
  for( angle = 0; angle < 360; angle++ )
  {
    cos_x = 100.0 * cos( angle * M_TWOPI / 360);
    sin_y = 100.0 * sin( angle * M_TWOPI / 360);
    DrawTiltLine( 240, 136, cos_x + 240, sin_y + 136, BLACK );
  }

浮動小数点をint型に直す際の切り捨て誤差の影響なのか、なんだかフラクタル画像の様になってしまいました。

今回の対応で浮動小数点は使えるようにはなったのですが、標準入出力がまだ上手く行っていません。
低水準入出力関数は用意できているのですが、ファイル(FILE)の管理領域の初期化を行わないと標準入出力は使えない筈なんだけれど、ぐぐってもなかなか答えを見つける事ができませんです。

ルネサスのHEWの場合はマニュアルに親切丁寧な解説が付いていて容易に標準入出力を構築できたんですけれど、gccは私にとっては敷居が高いなぁ、やれやれ。







STM32F103のUSARTを送受信割込みで使ってみる [ARM&Cortex-M3]

つまり低水準入出力関数の更に下の階層ですな。
※一部のtx、rxのリマップに修正を加えています。

使い方
void hoge( void )
{
  char SndBuf[ 128 ],RcvBuf[ 128 ];
  SCI_BUFFER snd,rcv;

  snd.buf = SndBuf;
  snd.wptr = snd.rptr = 0;
  snd.size = sizeof(SndBuf);
  rcv.buf = RcvBuf;
  rcv.wptr = rcv.rptr = 0;
  rcv.size = sizeof(RcvBuf);
  (void)SCI_Init( SCI_1, &rcv, &snd, BAUD_115200 );

  while( 1 )
  {
    while( RcvSizeOfBuf( SCI_1 ) == 0 ) ;
    SCI_Putc( SCI_1, SCI_Getc( SCI_1 ) );
  }
}


ヘッダーファイル
/*************************************************************************/
/* STM32F103VBT6のUSARTを使う                                            */
/* USART1はPA9,PA10、USART2はPD5,PD6、USART3はPD8,PD9に接続されている。  */
/*                                 designed by hamayan since 2008/11/06  */
/*************************************************************************/

/*************************************************************************/
/* ボーレート定義                                                        */
/*************************************************************************/
#define  BAUD_230400  (0x00000271UL / 2)
#define  BAUD_115200  (0x00000271UL)
#define  BAUD_57600   (0x000004E2UL)
#define  BAUD_38400   (0x00000753UL)
#define  BAUD_19200   (0x00000EA6UL)
#define  BAUD_9600    (0x00001D4CUL)

/*************************************************************************/
/* 端子定義                                                              */
/*************************************************************************/

/*************************************************************************/
/* IOレジスタ定義                                                        */
/*************************************************************************/

/*************************************************************************/
/* レジスタ bit定義                                                      */
/*************************************************************************/
/*SR*/
#define  PE_Bit     0x00000001
#define  FE_Bit     0x00000002
#define  NE_Bit     0x00000004
#define  ORE_Bit    0x00000008
#define  IDLE_Bit   0x00000010
#define  RXNE_Bit   0x00000020
#define  TC_Bit     0x00000040
#define  TXE_Bit    0x00000080
#define  LBD_Bit    0x00000100
#define  CTS_Bit    0x00000200

/*CR1*/
#define  SBK_Bit    0x00000001
#define  RWU_Bit    0x00000002
#define  RE_Bit     0x00000004
#define  TE_Bit     0x00000008
#define  IDLEIE_Bit 0x00000010
#define  RXNEIE_Bit 0x00000020
#define  TCIE_Bit   0x00000040
#define  TXEIE_Bit  0x00000080
#define  PEIE_Bit   0x00000100
#define  PS_Bit     0x00000200
#define  PCE_Bit    0x00000400
#define  WAKE_Bit   0x00000800
#define  M_Bit      0x00001000
#define  UE_Bit     0x00002000

/*CR2*/
#define  LBDL_Bit   0x00000020
#define  LBDIE_Bit  0x00000040
#define  LBCL_Bit   0x00000100
#define  CPHA_Bit   0x00000200
#define  CPOL_Bit   0x00000400
#define  CLKEN_Bit  0x00000800
#define  STOP0_Bit  0x00001000
#define  STOP1_Bit  0x00002000
#define  LINEN_Bit  0x00004000

/*CR3*/
#define  EIE_Bit    0x00000001
#define  IREN_Bit   0x00000002
#define  IRLP_Bit   0x00000004
#define  HDSEL_Bit  0x00000008
#define  NACK_Bit   0x00000010
#define  SCEN_Bit   0x00000020
#define  DMAR_Bit   0x00000040
#define  DMAT_Bit   0x00000080
#define  RTSE_Bit   0x00000100
#define  CTSE_Bit   0x00000200
#define  CTSIE_Bit  0x00000400

/*************************************************************************/
/* その他の定義                                                          */
/*************************************************************************/
typedef enum
{
  SCI_1 = 0, SCI_2, SCI_3, SCI_4, SCI_5,
} SciNum_t;

typedef struct
{
  unsigned long sr;
  unsigned long dr;
  unsigned long brr;
  unsigned long cr1;
  unsigned long cr2;
  unsigned long cr3;
  unsigned long gtpr;
} SCI_REG;

typedef struct
{
  void *buf; 
  unsigned short wptr,rptr; 
  unsigned short size;
} SCI_BUFFER;

/*************************************************************************/
/* 大域変数宣言                                                          */
/*************************************************************************/

/*************************************************************************/
/* プロトタイプ宣言                                                      */
/*************************************************************************/
int SCI_Init( int ch, SCI_BUFFER *rcv, SCI_BUFFER *snd, unsigned long brr );
int SCI_Putc( int ch, char c );
int SCI_Puts( int ch, char *str );
int SCI_Getc( int ch );
unsigned short RcvSizeOfBuf( int ch );
unsigned short SndSizeOfBuf( int ch );
void SCI_ISR( int ch );
unsigned long SCI_Status( int ch );
char SCI_DirectRead( int ch );

/*************************************************************************/
/* end of file                                                           */
/*                                 designed by hamayan since 2008/11/06  */
/*************************************************************************/


Cソース
/*************************************************************************/
/* STM32F103VBT6のUSARTを何とかする                                      */
/*                                 designed by hamayan since 2008/11/06  */
/*************************************************************************/
#include  "stm32f10x_lib.h"
//#include  "delivertive.h"
#include  "usart.h"
#define   PA_CRH     (GPIOA->CRH)
#define   PC_CRH     (GPIOC->CRH)
#define   PD_CRL     (GPIOD->CRL)
#define   PD_CRH     (GPIOD->CRH)
#define   AFIO_MAPR  (AFIO->MAPR)

/*************************************************************************/
/* 端子定義                                                              */
/*************************************************************************/

/*************************************************************************/
/* その他の定義                                                          */
/*************************************************************************/

/*************************************************************************/
/* 大域変数宣言                                                          */
/*************************************************************************/
static SCI_BUFFER *sci_snd[ 5 ];
static SCI_BUFFER *sci_rcv[ 5 ];

/*************************************************************************/
/* プロトタイプ宣言                                                      */
/*************************************************************************/
static SCI_REG *Select_SCI( int ch );

/*************************************************************************/
/* SCI(USART)初期化                                                      */
/*************************************************************************/
static SCI_REG *Select_SCI( int ch )
{
  switch ( ch )
  {
    case SCI_1 : return (SCI_REG *)USART1;
    case SCI_2 : return (SCI_REG *)USART2;
    case SCI_3 : return (SCI_REG *)USART3;
    case SCI_4 : return (SCI_REG *)USART4;
    case SCI_5 : return (SCI_REG *)USART5;
    default : break;
  }

  return (SCI_REG *)0;
}

/*************************************************************************/
/* SCI(USART)初期化                                                      */
/*************************************************************************/
int SCI_Init( int ch, SCI_BUFFER *rcv, SCI_BUFFER *snd, unsigned long brr )
{
  NVIC_InitTypeDef NVIC_InitStructure;
  SCI_REG *sci = Select_SCI( ch );

  if( sci == (SCI_REG *)0 ) return (-1);

  sci_rcv[ ch ] = rcv;
  sci_snd[ ch ] = snd;

  switch ( ch )
  {
    case SCI_1 :
      AFIO_MAPR &= 0xfffffffb;
      PA_CRH &= 0xfffff00f;  /*pa9=tx,pa10=rx*/
      PA_CRH |= 0x000004b0;
      /*USART1へクロックの供給開始*/
      RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1, ENABLE );
      RCC_APB2PeriphResetCmd( RCC_APB2Periph_USART1, DISABLE );
      /*USART1の割り込み設定*/
      NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
      break;

    case SCI_2 :
      AFIO_MAPR |= 0x00000008;  /*pd5,6で使用するにはリマップが必要*/
      PD_CRL &= 0xf00fffff;  /*pd5=tx,pd6=rx*/
      PD_CRL |= 0x04b00000;
      /*USART2へクロックの供給開始*/
      RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART2, ENABLE );
      RCC_APB1PeriphResetCmd( RCC_APB1Periph_USART2, DISABLE );
      /*USART2の割り込み設定*/
      NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;
      brr /= 2;
      break;

    case SCI_3 :
      AFIO_MAPR &= 0xffffffcf;  /*pd8,9で使用するにはリマップが必要*/
      AFIO_MAPR |= 0x00000030;  /*pd8,9で使用するにはリマップが必要*/
      PD_CRH &= 0xffffff00;  /*pd8=tx,pd9=rx*/
      PD_CRH |= 0x0000004b;
      /*USART3へクロックの供給開始*/
      RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART3, ENABLE );
      RCC_APB1PeriphResetCmd( RCC_APB1Periph_USART3, DISABLE );
      /*USART3の割り込み設定*/
      NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQChannel;
      brr /= 2;
      break;

    case SCI_4 :
      PC_CRH &= 0xffff00ff;  /*pc10=tx,pc11=rx*/
      PC_CRH |= 0x00004b00;
      /*USART4へクロックの供給開始*/
      RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART4, ENABLE );
      RCC_APB1PeriphResetCmd( RCC_APB1Periph_USART4, DISABLE );
      /*USART4の割り込み設定*/
      NVIC_InitStructure.NVIC_IRQChannel = USART4_IRQChannel;
      brr /= 2;
      break;

    case SCI_5 :
      PC_CRH &= 0xfff0ffff;  /*pc12=tx*/
      PC_CRH |= 0x000b0000;
      PD_CRL &= 0xfffff0ff;  /*pd2=rx*/
      PD_CRL |= 0x00000400;
      /*USART5へクロックの供給開始*/
      RCC_APB1PeriphClockCmd( RCC_APB1Periph_USART5, ENABLE );
      RCC_APB1PeriphResetCmd( RCC_APB1Periph_USART5, DISABLE );
      /*USART5の割り込み設定*/
      NVIC_InitStructure.NVIC_IRQChannel = USART5_IRQChannel;
      brr /= 2;
      break;
  }

  sci->cr1 = 0;  /*USART停止*/
  sci->brr = brr;  /*???bps*/
  sci->cr2 = 0;  /**/
  sci->cr3 = EIE_Bit;  /*エラー発生時の割り込み許可*/
  sci->cr1 = UE_Bit | TE_Bit | RE_Bit | RXNEIE_Bit;  /*8bit,1stop bit,parity none,tx enable, rx enable,rxie enable*/

  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x40;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init( &NVIC_InitStructure );

  return 0;
}

/*************************************************************************/
/* SCI一文字送信                                                         */
/*************************************************************************/
int SCI_Putc( int ch, char c )
{
  SCI_REG *sci = Select_SCI( ch );

  if( sci == (SCI_REG *)0 ) return (-1);

  while( !(sci->sr & TXE_Bit) ) ;
  sci->dr = c;

  return 0;
}

/*************************************************************************/
/* SCI文字列送信                                                         */
/*************************************************************************/
int SCI_Puts( int ch, char *str )
{
#if 1
  char *ptr;
  unsigned short next;
  int count;
  SCI_BUFFER *snd;
  SCI_REG *sci;

  if( ch != SCI_1 && ch != SCI_2 && ch != SCI_3 && ch != SCI_4 && ch != SCI_5 ) return (-1);  /**/
  if( SndSizeOfBuf( ch ) == 0 ) return (-1);  /*書き込む余裕が無かった場合*/

  sci = Select_SCI( ch );
  snd = sci_snd[ ch ];  /*バッファの選択*/

  count = 0;
  ptr = (char *)snd->buf;
  while( *str )
  {
    next = snd->wptr + 1;  /*ポインタを進めてみる*/
    if( next >= snd->size ) next = 0;  /*書き込みポインタの丸め*/
    if( next == snd->rptr ) break;  /*代入出来ない時*/
    ptr[ snd->wptr ] = *str++;  /*バッファに代入*/
    sci->cr1 |= TXEIE_Bit;  /*送信割込み許可*/
    count++;  /*書き込んだカウント値を更新*/
    snd->wptr = next;  /*書き込みポインタを進める*/
  }

  return count;
#else
  while( *str ) (void)SCI_Putc( ch, *str++ );
  return 0;
#endif
}

/*************************************************************************/
/* SCI受信バッファの受信サイズ                                           */
/*************************************************************************/
unsigned short RcvSizeOfBuf( int ch )
{
  SCI_BUFFER *rcv;
  unsigned short w,r;

  rcv = sci_rcv[ ch ];  /*バッファの選択*/
  w = rcv->wptr;
  r = rcv->rptr;

  if( w == r ) return 0;
  else if( w < r ) return w + rcv->size - r;
  else return w - r;
}

/*************************************************************************/
/* SCI送信バッファの空きサイズ                                           */
/*************************************************************************/
unsigned short SndSizeOfBuf( int ch )
{
  SCI_BUFFER *snd;
  unsigned short w,r;

  snd = sci_snd[ ch ];  /*バッファの選択*/
  w = snd->wptr;
  r = snd->rptr;

  if( w == r ) return snd->size - 1;
  else if( r < w ) return r + snd->size - w - 1;
  else return r - w - 1;
}

/*************************************************************************/
/* SCI受信バッファから1文字取得                                          */
/*************************************************************************/
int SCI_Getc( int ch )
{
  int c;
  char *buf;
  SCI_BUFFER *rcv;

  rcv = sci_rcv[ ch ];  /*バッファの選択*/
  if( RcvSizeOfBuf( ch ) == 0 ) return (-1);
  buf = (char *)rcv->buf;
  c = buf[ rcv->rptr ];
  if( ++rcv->rptr >= rcv->size ) rcv->rptr = 0;

  return c & 0x00ff;
}

/*************************************************************************/
/* SCIステータスの読み出し                                               */
/*************************************************************************/
unsigned long SCI_Status( int ch )
{
  SCI_REG *sci = Select_SCI( ch );
  return sci->sr;
}

/*************************************************************************/
/* SCIステータスの読み出し                                               */
/*************************************************************************/
char SCI_DirectRead( int ch )
{
  SCI_REG *sci = Select_SCI( ch );
  return sci->dr;
}

/*************************************************************************/
/* SCI色々割り込み                                                       */
/* どうも要因別の割り込みは無いみたいだな                                */
/*************************************************************************/
void SCI_ISR( int ch )
{
  unsigned short next;
  volatile unsigned long status;
  char data,*ptr;
  SCI_REG *sci = Select_SCI( ch );
  SCI_BUFFER *rcv;
  SCI_BUFFER *snd;

  status = sci->sr;
  /*各種エラーのチェック*/
  if( status & (FE_Bit | PE_Bit | NE_Bit | ORE_Bit) )
  {
    data = sci->dr;  /*エラーステータスを解除する為にはデータレジスタの読み込みが必要*/
    return;
  }

  /*受信割り込みの判定*/
  if( status & RXNE_Bit )
  {
    data = sci->dr;  /**/
    rcv = sci_rcv[ ch ];  /*バッファの選択*/
    ptr = (char *)rcv->buf;
    next = rcv->wptr + 1;
    if( next >= rcv->size ) next = 0;
    if( next == rcv->rptr ) return;  /*上書きは禁止されるので、入らない分は破棄*/
    *(ptr + rcv->wptr) = data;
    rcv->wptr = next;
  }

  /*送信割り込みの判定*/
  if( status & TXE_Bit )
  {
    snd = sci_snd[ ch ];  /*バッファの選択*/
    if( snd->rptr == snd->wptr )  /*送信すべきデータが無い時*/
    {
      sci->cr1 &= ~TXEIE_Bit;  /*送信割込み禁止*/
      return;
    }
    ptr = (char *)snd->buf;
    sci->dr = *(ptr + snd->rptr);
    if( ++snd->rptr >= snd->size ) snd->rptr = 0;
  }
}

/*************************************************************************/
/* end of file                                                           */
/*                                 designed by hamayan since 2008/11/06  */
/*************************************************************************/


stm32f10x_it.cの割込み処理のところ
/*******************************************************************************
* Function Name  : USART1_IRQHandler
* Description    : This function handles USART1 global interrupt request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void USART1_IRQHandler(void)
{
  SCI_ISR( SCI_1 );
}








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