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
© Copyright 2026 ExpyDoc