フリスクJTAGの完成例とNXPのARM(Interface5月号付属基板)で使う時の注意点 [ARM&Cortex-M3]
ねっ、いい感じでしょ!。
ケースの加工も綺麗だし、半田付けも上手。まるで製品みたいじゃないですか。
それとこのInterface5月号付属のARM基板で使用する時は「CPUモード設定をOpenにする」とアドバイスも頂いています。
判らない事があったら原点、この場合はInterface5月号に戻ってみると良い事が起きるかもしれません。
皆さんの完成写真もお待ちしております(笑)。
ARMプロセッサ入門―ARMアーキテクチャの詳細&ARM7/XScaleの応用 (TECH I)
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2004/05
- メディア: -
ARM組み込みソフトウェア入門―記述例で学ぶ組み込み機器設計のためのシステム開発 (Design Wave Advanceシリーズ)
- 作者: Andrew N. Sloss
- 出版社/メーカー: CQ出版
- 発売日: 2007/08
- メディア: 単行本
STM32F ARIESの開発 [ARM&Cortex-M3]
ファイルシステムを搭載する事で、ずいぶん色々な事が出来ますね。
例えるならMS-DOS時代のパソコン並、、、まだそこまでは行っていないけれど。
外付けでマウスやキーボードインタフェースやネットワークなんかも追加していきたいです。
ELMさんありがとう。
http://elm-chan.org/index_j.html
例えるならMS-DOS時代のパソコン並、、、まだそこまでは行っていないけれど。
外付けでマウスやキーボードインタフェースやネットワークなんかも追加していきたいです。
ELMさんありがとう。
http://elm-chan.org/index_j.html
Martin ThomasさんのSTM32F用FatFsの修正点 [ARM&Cortex-M3]
※10月14日の版でこの件は修正が行われた様です。
え!、勿論面識無いです(笑)。
例のSTM32F用のFatFsを提供してくれているMartin Thomasさんの2009年9月10日版のプロジェクトファイルですが、細かい話ですがLibraries\fat_sdのsd_spi_stm32.cに若干の修正が必要な様です。
175行目のこれを、
この様に、
また185行目を
この様にします。
共にWrite Protect、Card Detectを有効にしてビルドを行うと、コンパイラ、またはリンカーに怒られて間違いが発覚します。
最初の奴はGPIO_InitTypeDef構造体が用意されていなくてエラーですね。
2番目の奴はもろにタイプミスでしょう。
2008年6月号のDWMの付録基板をお持ちの方なら実際にFatFsをお試しいただけると思います。
一部PINの割付等がMartin Thomasさんの場合と異なるので、コンフィギュレーションの一部を自分の基板向けに修正する必要があります。
私はDWMの付録基板を持っていないのでAIRESの例で行けば、
を#else句の中に記述してしまいました。
以上!。
え!、勿論面識無いです(笑)。
例の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凄過ぎ!。
あれ?、何故か知らないけれどメーカー不明の128Mbyteが18MHzで動くようになって、書き込み、読み込みが最速になってしまった。わからなぃ、、、。
※やはりデバッカーが有るとはかどりますな。
もう完全に人の成果を再確認しているだけで申し訳無い。
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凄過ぎ!。
あれ?、何故か知らないけれどメーカー不明の128Mbyteが18MHzで動くようになって、書き込み、読み込みが最速になってしまった。わからなぃ、、、。
※やはりデバッカーが有るとはかどりますな。
Transcend SDHCカード Class6 8GB TS8GSDHC6
- 出版社/メーカー: トランセンド・ジャパン
- メディア: エレクトロニクス
Transcend SDHCカード Class6 16GB TS16GSDHC6
- 出版社/メーカー: トランセンド・ジャパン
- メディア: エレクトロニクス
OpenOCD フリスクJTAGの発送とその後 [ARM&Cortex-M3]
部品セットは6セット、基板単体で2枚の注文があり、手持ちの部品は残り2セット分となりました。
まあだらだらと配布を継続してもあれなので、今週の金曜日の23時59分59秒まで待って、その時点で私の方からの配布は終了とします。
注文された方、メール便で送っていますので、ちょと時間が掛かりますが、今しばらくお待ちください。
なお実装で向きの判らない部品はほとんどありませんが、唯一LEDだけはこれが判らない。
写真を掲載して置きますので実装の参考としてください。
一番上が青色LEDです。秋月ではすでに販売終了していて残念な限りです。
二番目が赤色LEDです。
緑のLEDはDIGI-KEYで型番から調べていただければデータシートを入手できます。
ARIESとOpen OCD フリスク JTAG の写真を送ってもらった [ARM&Cortex-M3]
TACさんの方でもARIESとOpenOCD フリスクJTAGを組み立てとの事で写真を送っていただきました。
今回何人かの方から注文いただきました。
購入された皆さん、是非フリスクのケースに入れてください。見栄えが違います。
フリスクのケースの加工には、ダイソーで買ったミニルーターとダイアモンドカッターを使いました。
結構いい感じで加工できます。
今回何人かの方から注文いただきました。
購入された皆さん、是非フリスクのケースに入れてください。見栄えが違います。
フリスクのケースの加工には、ダイソーで買ったミニルーターとダイアモンドカッターを使いました。
結構いい感じで加工できます。
グラフィックは楽しい! [ARM&Cortex-M3]
機会があれば是非!。
画面サイズもそこそこ有るし、全部自分でプログラムを組まなければならないし、DRAWだったり、ペイントだったり、フォントの扱いだったりとか。
本当に面白いです。プログラミングの結果が目で見えるし。
写真はシリアル経由のコマンドラインから矩形や三角、円等の描画コマンドを送って操作しているところです。
モードを切り替えると文字データをトランスペアレントにLCDに送ります。
面白いのだけれど、やってもやってもきりが無い。
描画アルゴリズムを比較してみたり、色々凝った機能を追加してみたりとか。スクロールどうしよう!とか文字はやはりエスケープシーケンスをサポートするか!とか頭の痛い問題も。
もう少しちゃんとgccのライブラリが動けば、演算結果のプロットとかやらして面白いのでしょうけれどね。
画面サイズもそこそこ有るし、全部自分でプログラムを組まなければならないし、DRAWだったり、ペイントだったり、フォントの扱いだったりとか。
本当に面白いです。プログラミングの結果が目で見えるし。
写真はシリアル経由のコマンドラインから矩形や三角、円等の描画コマンドを送って操作しているところです。
モードを切り替えると文字データをトランスペアレントにLCDに送ります。
面白いのだけれど、やってもやってもきりが無い。
描画アルゴリズムを比較してみたり、色々凝った機能を追加してみたりとか。スクロールどうしよう!とか文字はやはりエスケープシーケンスをサポートするか!とか頭の痛い問題も。
もう少しちゃんとgccのライブラリが動けば、演算結果のプロットとかやらして面白いのでしょうけれどね。
ARM組み込みソフトウェア入門―記述例で学ぶ組み込み機器設計のためのシステム開発 (Design Wave Advanceシリーズ)
- 作者: Andrew N. Sloss
- 出版社/メーカー: CQ出版
- 発売日: 2007/08
- メディア: 単行本
OpenOCD フリスクJTAGデバッカーの部品セット配付 まずは2セット準備中 [ARM&Cortex-M3]
取り合えず注文のあった2セット分をパッケージしてみました。部品はセロハンテープで台紙にペトペト付けています。これなら十分メール便の80円で送れます。
まだケーブルが届いていませんので、届き次第お送りします。※ケーブル長は10cmにしました。
部品代は2920円、ケーブルは8本注文し、諸費用を加算して頭割りで1本336円です。それに送料の80円を加算します。
振込みは銀行振込です。注文後、部品セットを先に送ります。その中に振込先を同梱しておきますのでよろしくお願いします。
※このページのリストから必要な物だけリストを出してもらえれば、その分だけ発送しますが、ケーブルは頭割りとなっていますので、除外できません。
http://hamayan.blog.so-net.ne.jp/2009-09-08-2
大体1セットのパッケージングは40分くらい掛かりますね。
まだケーブルが届いていませんので、届き次第お送りします。※ケーブル長は10cmにしました。
部品代は2920円、ケーブルは8本注文し、諸費用を加算して頭割りで1本336円です。それに送料の80円を加算します。
振込みは銀行振込です。注文後、部品セットを先に送ります。その中に振込先を同梱しておきますのでよろしくお願いします。
※このページのリストから必要な物だけリストを出してもらえれば、その分だけ発送しますが、ケーブルは頭割りとなっていますので、除外できません。
http://hamayan.blog.so-net.ne.jp/2009-09-08-2
大体1セットのパッケージングは40分くらい掛かりますね。
ARMの数値演算ライブラリ 解決編か? [ARM&Cortex-M3]
例の数値演算ライブラリを呼ぶと暴走してしまう問題ですが、ちょっとだけ解決を見たようです。
まず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をリンクする機能が有るのかな?。
ちなみにコンパイルオプションはコンパイラマニュアルの記述に則って以下の様にしました。
写真は三角関数を使って座標を決め、中心から放射状に線を引いてみたところです。
浮動小数点をint型に直す際の切り捨て誤差の影響なのか、なんだかフラクタル画像の様になってしまいました。
今回の対応で浮動小数点は使えるようにはなったのですが、標準入出力がまだ上手く行っていません。
低水準入出力関数は用意できているのですが、ファイル(FILE)の管理領域の初期化を行わないと標準入出力は使えない筈なんだけれど、ぐぐってもなかなか答えを見つける事ができませんです。
ルネサスのHEWの場合はマニュアルに親切丁寧な解説が付いていて容易に標準入出力を構築できたんですけれど、gccは私にとっては敷居が高いなぁ、やれやれ。
まず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は私にとっては敷居が高いなぁ、やれやれ。
ARM Cortex‐M3システム開発ガイド―最新アーキテクチャの理解からソフトウェア開発までを詳解 (Design Wave Advance)
- 作者: Joseph Yiu
- 出版社/メーカー: CQ出版
- 発売日: 2009/05
- メディア: 単行本
STM32F103のUSARTを送受信割込みで使ってみる [ARM&Cortex-M3]
つまり低水準入出力関数の更に下の階層ですな。
※一部のtx、rxのリマップに修正を加えています。
使い方
ヘッダーファイル
Cソース
stm32f10x_it.cの割込み処理のところ
※一部の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 ); }
ARM Cortex‐M3システム開発ガイド―最新アーキテクチャの理解からソフトウェア開発までを詳解 (Design Wave Advance)
- 作者: Joseph Yiu
- 出版社/メーカー: CQ出版
- 発売日: 2009/05
- メディア: 単行本
ARM組み込みソフトウェア入門―記述例で学ぶ組み込み機器設計のためのシステム開発 (Design Wave Advanceシリーズ)
- 作者: Andrew N. Sloss
- 出版社/メーカー: CQ出版
- 発売日: 2007/08
- メディア: 単行本