信号処理 入門

2 SH-2プログラミング 入門
岐阜大学大学院 工学研究科 応用情報学専攻
1
概要
 基本的なプログラムを作成することで,SH-2プログラミングの流
れを習得する
 ワークスペース,プロジェクトの作成・追加
 レジスタの読み書き
 プログラム内容
 スイッチが押されている間LEDが点灯する
2
基盤の仕様
 32ビットRISCプロセッサ(SH7144F)
 CPUクロック:48MHz(周辺入出力回路のクロックは24MHz)
 内蔵フラッシュ・メモリ:256Kバイト
 内蔵SRAM:8Kバイト
 RS-232-Cドライバ/レシーバ(ADM3202ARU)
 動作電圧:3.0~5.5V
 最高460kbpsの高速通信が可能
 リセットIC(ADM809RAKSZ)
 電源レギュレータIC(ADP3338/3339)
 動作電圧:3.3V
 チップ水晶振動子(TSX-4025)
3
SH-2基盤の外観
40ピン拡張ヘッダ
接続部
パワーONリセットIC
RS-232-C
ドライバ/レシーバ
水晶振動子
LDO電源レギュレータ
シリアル・ポートコネクタ
LEDランプ
32bitRISCプロセッサ
SH7144F
40ピン拡張ヘッダ
接続部
4
新規ワークスペース・プロジェクト作成
 演習用に新しいワークスペースとプロジェクトを作成
 [ファイル]→[新規ワークスペース]
5
設定:名前
 それぞれの名前を設定
 ワークスペース名: lecture
 プロジェクト名: ex1
6
設定:CPU
 CPU名を設定
 CPUシリーズ:SH-2
 CPUタイプ:SH7144F
7
設定:オプション
 エンディアンを[Big]に設定
8
設定:生成ファイル
 生成ファイルの設定
 ハードウェアセットアップ関数生成で[C/C++ source file]に設定
9
設定:完了
 以後,デフォルトのまま[次へ]をクリック
 設定が完了すると下のような画面になる
10
新しいワークスペース
 作成したワークスペース,プロジェクトが表示される
 Main()関数を含むソースファイル「ex1.c」が生成される
11
プロジェクトの追加
 ワークスペースlectureに演習2用の新しいプロジェクトを追加
 左のツリーのlectureを右クリック→[プロジェクトの挿入]
12
プロジェクトの設定
 新規プロジェクトを選択
 プロジェクト名:ex2
13
プロジェクトの追加:完了
 残りの設定は最初と同様
 追加が完了すると左のツリーにex2が増える
14
アクティブ・プロジェクト
 アクティブ・プロジェクト(現在編集中のプロジェクト)は太字で表
示される
 アクティブにしたいプロジェクトを右クリック
→[アクティブプロジェクトに設定]で変更
15
I/Oインターフェース
 組み込みシステムの動作
 外部機器から情報を取得(入力)
 入力された情報を処理
 外部機器の操作(出力)
 入力インターフェース+出力インターフェース
= 入出力(I/O)インターフェース
 マイコンのピン
16
I/Oポート
 I/Oポート・レジスタ
 各ポートに対応したレジスタ
 レジスタに書き込むことで出力状態を変更
 レジスタを読み込むことで入力状態を取得
 1つのピンに複数の機能
 入力,出力, 割り込み, etc…
 「どの機能を使うか」はI/Oポート・モード・レジスタ等のレジスタで設定
 初期化が必要
17
volatile修飾子(1/2)
 レジスタの読み書き
 特定のアドレスの読み書き
*((unsigned int *)0x3fff01) = 0;
 コンパイラの最適化の問題
 コンパイラは,メモリアクセス先が外部入力などで書き換わることを想定し
ていない
 メモリアクセスを除去する場合がある
 レジスタアクセス以外でも,ビジーウェイト等を消去する場合がある
意図通りのプログラムが生成されない!
18
volatile修飾子(2/2)
 volatile修飾子を付ける
 コンパイラの最適化を抑制し,メモリアクセスのパターンを保持する
*((volatile unsigned int *)0x3fff01) = 0;
 今回の環境(HEW)では,指定されたアクセス方法でアクセスする
場合は,自動で付加される
 普通の変数,ポインタなどの場合は必要
19
HEW環境のレジスタ操作方法
 純正環境(HEW)でのSH系プロセッサのレジスタ操作方法
PFC.PEIOL.BIT.B15 = 0;




PFC:操作対象(例:ピンファンクションコントローラ)
PEIOL:レジスタ名(例:ポートE・IOレジスタレジスタ)
BIT:アクセスサイズ(例:ビット,他にWORD, BYTE)
B15:ビット名(例:15番ピン,BYTE以上の場合は必要なし)
 全てのデバイスレジスタで同様にアクセス可能
20
共用体によるアクセス
 共用体による宣言によって複数の型によるアクセスが可能
 WORD(16ビット),BYTE(8ビット),BIT(数ビット)
 例)ポートEの出力値を設定
ビット
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
1
0
1
1
0
0
0
0
1
1
1
0
0
0
1
1
BYTE
BYTE
WORD
 BIT単位の場合
 PE.DRL.BIT.B0 = 1;
 PE.DRL.BIT.B1 = 1;
 PE.DRL.BIT.B2 = 0; のように残り13ビットも設定
 BYTE単位の場合
 PE.DRL.BYTE.L = 0xE3;
 PE.DRL.BYTE.H = 0xB0;
 WORD単位の場合
 PE.DRL.WORD = 0xE3B0;
21
ビットフィールド
 構造体のメンバの領域をビット単位で割り当てる
struct hoge{
unsigned int a1:1; /* a1は1ビット */
unsigned int a2:2; /* a2は2ビット */
unsigned int a3:3; /* a3は3ビット */
};
 型は意味を持たない.
22
構造体の例(PE)
struct st_pe {
union {
unsigned short WORD;
struct {
unsigned char
unsigned char
}
BYTE;
struct {
unsigned char
unsigned char
unsigned char
unsigned char
unsigned char
unsigned char
unsigned char
unsigned char
unsigned char
unsigned char
unsigned char
unsigned char
unsigned char
unsigned char
unsigned char
unsigned char
}
BIT;
}
DRL;
};
H;
L;
B15:1;
B14:1;
B13:1;
B12:1;
B11:1;
B10:1;
B9 :1;
B8 :1;
B7 :1;
B6 :1;
B5 :1;
B4 :1;
B3 :1;
B2 :1;
B1 :1;
B0 :1;
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
struct PE
PEDRL
Word Access
Byte Access
High
Low
*/
*/
*/
*/
*/
*/
*/
Bit Access */
Bit 15
*/
Bit 14
*/
Bit 13
*/
Bit 12
*/
Bit 11
*/
Bit 10
*/
Bit 9
*/
Bit 8
*/
Bit 7
*/
Bit 6
*/
Bit 5
*/
Bit 4
*/
Bit 3
*/
Bit 2
*/
Bit 1
*/
Bit 0
*/
*/
*/
*/
23
I/Oレジスタ定義ファイル(1/2)
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
SCI0
SCI1
SCI2
SCI3
MTU
MTU0
MTU1
MTU2
MTU3
MTU4
POE
INTC
PA
PB
PC
PD
PE
PF
PFC
CMT
CMT0
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
(*(volatile
struct
struct
struct
struct
struct
struct
struct
struct
struct
struct
struct
struct
struct
struct
struct
struct
struct
struct
struct
struct
struct
st_sci
st_sci
st_sci
st_sci
st_mtu
st_mtu0
st_mtu1
st_mtu1
st_mtu3
st_mtu4
st_poe
st_intc
st_pa
st_pb
st_pc
st_pd
st_pe
st_pf
st_pfc
st_cmt
st_cmt0
*)0xFFFF81A0)
*)0xFFFF81B0)
*)0xFFFF81C0)
*)0xFFFF81D0)
*)0xFFFF820A)
*)0xFFFF8260)
*)0xFFFF8280)
*)0xFFFF82A0)
*)0xFFFF8200)
*)0xFFFF8200)
*)0xFFFF83C0)
*)0xFFFF8348)
*)0xFFFF8380)
*)0xFFFF8390)
*)0xFFFF8392)
*)0xFFFF83A0)
*)0xFFFF83B0)
*)0xFFFF83B3)
*)0xFFFF8384)
*)0xFFFF83D0)
*)0xFFFF83D2)
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
SCI0
SCI1
SCI2
SCI3
MTU
MTU0
MTU1
MTU2
MTU3
MTU4
POE
INTC
PA
PB
PC
PD
PE
PF
PFC
CMT
CMT0
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
24
I/Oレジスタ定義ファイル(2/2)
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
CMT1
AD0
AD1
FLASH
UBC
WDT
SBYCR
SYSCR
MST
BSC
DMAC
DMAC0
DMAC1
DMAC2
DMAC3
DTC
IIC
ICDR
ICMR
_SAR
SARX
HUDI
(*(volatile struct
(*(volatile struct
(*(volatile struct
(*(volatile struct
(*(volatile struct
(*(volatile union
(*(volatile union
(*(volatile union
(*(volatile struct
(*(volatile struct
(*(volatile struct
(*(volatile struct
(*(volatile struct
(*(volatile struct
(*(volatile struct
(*(volatile struct
(*(volatile struct
EQU.ICE1.UN_ICDR
EQU.ICE1.UN_ICMR
EQU.ICE0.UN_SAR
EQU.ICE0.UN_SARX
(*(volatile struct
st_cmt0
st_ad0
st_ad1
st_flash
st_ubc
un_wdt
un_sbycr
un_syscr
st_mst
st_bsc
st_dmac
st_dmac0
st_dmac0
st_dmac2
st_dmac3
st_dtc
st_iic
*)0xFFFF83D8)
*)0xFFFF8420)
*)0xFFFF8428)
*)0xFFFF8580)
*)0xFFFF8600)
*)0xFFFF8610)
*)0xFFFF8614)
*)0xFFFF8618)
*)0xFFFF861C)
*)0xFFFF8620)
*)0xFFFF86B0)
*)0xFFFF86C0)
*)0xFFFF86D0)
*)0xFFFF86E0)
*)0xFFFF86F0)
*)0xFFFF8700)
*)0xFFFF87F0)
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
st_hudi *)0xFFFF8A50) /*
CMT1
A/D0
A/D1
FLASH
UBC
WDT
SBYCR
SYSCR
MST
BSC
DMAC
DMAC0
DMAC1
DMAC2
DMAC3
DTC
IIC
ICDR
ICDR
SAR
SARX
H-UDI
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Address*/
Change */
Change */
Change */
Change */
Address*/
25
SH7144FのI/Oポート
 SH7144Fで使用可能なI/Oポート






ポートA
ポートB
ポートC
ポートD
ポートE
ポートF
:
:
:
:
:
:
16ビット入出力
10ビット入出力
16ビット入出力
16ビット入出力
16ビット入出力
8ビット入力
 各ポートは1ビット単位の入出力が可能
 合計84本のI/O端子
 汎用入出力以外にも,アナログ入出力,タイマ入出力,割り込み
などに切り替え可能
 ポート・モード・レジスタで設定
26
I/Oポート関連のレジスタ
 ピンファンクションコントローラ(PFC)
 I/Oレジスタ
 レジスタの入出力方向の設定
 コントロールレジスタ
 マルチプレクス端子(複数機能を持った端子)の機能の選択
 データレジスタ
 入出力ポート
27
例題1-3-1:LED点灯プログラム
 基板に接続されているLEDとスイッチを用い,スイッチが押されて
いる間LEDを点灯させるプログラム
 LEDの点灯
 PE15に1を出力するとVccとPE15が同電位になり電流は流れない.0を出力
するとVccからPE15に向かって電流が流れ,LEDが点灯する.
 スイッチ
 スイッチが短絡するとVccからグランドに電流が流れPB2には0が入力され
る.スイッチが開放するとVcc
からPB2に電流が流れ、PB2
には1が入力される.
28
プログラムの流れ
 Main関数
 ポートの入出力設定
 LED:出力
 スイッチ:入力
 無限ループ
 スイッチの状態取得
 LEDの点灯・消灯
Main()
初期化
ポートレジスタ設
定(17.1.9)
While(1)
スイッチの状態に
応じてLED点灯・消灯
29
LED点灯プログラム

machine.hとiodefine.hをイン
クルード


PFCのI/Oレジスタでポート
の設定



前述の方法での各種レジスタ
へのアクセス等, SH固有の機
能を使用するため
#include <machine.h>
#include "iodefine.h"
void main(void)
{
//初期化
PFC.PEIORL.BIT.B15 = 1; //PE15を出力に設定(LED)
PFC.PBIOR.BIT.B2 = 0; //PB2を入力に設定(スイッチ)
while (1) {
//スイッチが押されていたら(LOW),
//LED点灯(LOW)
//押されていなければ(HIGH),LED消灯(HIGH)
PE.DRL.BIT.B15 = PB.DR.BIT.B2;
}
ポートE15を出力
ポートB2を入力
メイン処理は無限ループ

スイッチの状態をLEDポートに
代入することで, LEDを点灯・
消灯
}
30
ビルド
 サンプルプログラムをビルドする
 [ビルド]→すべてをビルド
31
ビルド結果
[0 Error 0 Warnings]と表示されればビルド完了
32
生成ファイルの書き込みと実行
HEW
・プログラムの記述
・ビルド
・オブジェクトファイルの生成
FDT
・HEWで作成した「*.mot」
をSH-2基盤に書き込む
プログラムの実行
33
FDT(フラッシュ開発ツール)
 プログラムを基板に書き込むためのツール
 サンプルプログラムをビルドしたものを基板に書き込む
 初めて使うときは設定が必要
34
起動
35
デバイスとカーネルの選択
Select Deviceで[SH/7144F]を選択
36
通信ポート
Select portで通信ポートを選択する
[デバイスマネージャ]→[ポート]で確認
37
デバイス設定
入力クロック12Mhz, クロックモード3に設定
38
接続タイプ
Select Connectionで[BOOT Mode]を選択
ボーレートでUse Defaultのチェックをはずし,38400を選択
39
書き込みオプション
Protectionで[Automatic]を選択
Messagingで「Advanced」を選択
40
PCと基板の接続
手順:
1.
2.
3.
PCと基板をシリアルケーブルで接続する
基板のジャンパJ1にショート・プラグをセットする
電源を入れる
ジャンパJ1
ショート・プラグを
セットする
41
ファイルの追加
1.書き込みたいファイ
ルを追加する
書き込むためのファ
イルは[.mot]である
2.[スタート]を押すと,
基板にファイルを書き
込む
42
ファイルの書きこみの完了
[Image successfully
written to device]が
出たら書き込み完了
43
プログラムの実行
手順:
1.
2.
3.
4.
電源を切る
基板のジャンパJ1にセットされているショート・プラグを取り
除く
電源を入れる
プログラムが実行される
ショート・プラグを
取り除く
44
演習課題
1. LED(PE15)を点滅させる
 forやwhileを用いて空のループを回す
2. PE11からPE15のポートに接続されているLEDを点灯させる
3. PE11からPE15を順に点灯させる
45
ビット操作によるポートのON/OFF
BIT
B15
B14
B13
B12
BYTE
B11
B10
B9
B8
B7
B6
B5
B4
H
0
0
0
1
B3
B2
B1
B0
0
0
0
0
L
0
0
0
0
0
0
0
0
PE11~PE14のうちPE12を点灯
 設定方法
 BYTE単位: PE.DRL.BYTE.H = 0x10
 BIT単位: PE.DRL.BIT.B12 = 1
 対象外のビットのON/OFFに注意
46
2進数から16進数への変換
16進数
2進数
16進数
2進数
0
0 0 0 0
8
1 0 0 0
1
0 0 0 1
9
1 0 0 1
2
0 0 1 0
a
1 0 1 0
3
0 0 1 1
b
1 0 1 1
4
0 1 0 0
c
1 1 0 0
5
0 1 0 1
d
1 1 0 1
6
0 1 1 0
e
1 1 1 0
7
0 1 1 1
f
1 1 1 1
 例
 0 0 1 1 1 1 0 1 → 0x3d
 0 1 1 1 1 0 0 1 → 0x79
47