プラットフォーム:JZ2440開発ボード--cpu:S3C2440(ARM920)
S3C2440はSOCとして、一般的にほとんどダウンここでベアメタルレベルにハードウェア関連のソフトウェアの開発を低下させる最も身近な方法でシステムを(など、Linuxなど)を実行するために使用されます。実験第1のプログラミング言語は、光AのLEDランプに比べて、「Hello World」の黒または他の出力ウィンドウに印刷され、裸の金属「のHelloWorld」されています。
STC89C51またはSTM32マイコンの開発経験と、すべて知っているので、裸のボード制御CPUが実際にやっているがあり、読み書きレジスタがこれに基づいて、当社のビジネスロジックを増やし、私たちは私たちが実行したいものに合わせてボードを作ることができ、S3C2440も例外ではありません。
分析
にのみ必要は(典型的には3.3Vに、LEDのセットに依存する)方向の両端に電位差を印加する、LEDランプのオンまたはオフを制御する第1の回路の知識から知ることができ、発光ダイオードのLED一方向性導電これは、照明することができます。したがって、下部基板の図を見てする必要がありますが、次のように:
概略図から分かるように、LED基板が3.3Vに接続された高電位を有し、我々は唯一のnLED_x制御する必要があるので(図原理を、nは一般にアクティブローを表す)がローレベルに接続された端子出力。
またGPF4を見出すことができる/ 5/6は、3つのLEDに接続されている元のタイトル図から制御するランプ。適切なマニュアルS3C2440チップレジスタ情報を見つけるために次の必要性。レジスタ次光GPIOFにLEDを制御するために必要な既知のチップ手動制御を見ます
GPFCONがIO代替機能が選択される、請求項01に対応するビットセットをクリアするマニュアルに従って、出力端子に出力限り、ここで設定しました。
GPFDATAデータは、我々は、出力に設定すると、データが高いか、低い出力を作るために、対応するビットに書き込むことができ、登録します。
GPFUPには設定GPFDATレジスタが全てリセットに初期化されている間、ピンは、ハイ状態のように引かれませんプルアップ設定、プル制御レジスタであり、対応するビットがピンをプルアップすることができる場合であっても0に設定されていますあなたがそれを設定することはできませんので、0、プルボードLEDを開くために、ピンのデフォルトのすべては、単に需要を満たすために、デフォルトでオフになっています。
プログラムの一部
1.コンパイル
なぜならS3C2440 ARMアーキテクチャの、ARMアセンブラ命令セットを使用して、ここで単に書き込みレジスタは次の3つのLEDが点灯し、直接書き込みモードの値は、より安全な方法の一般的に非常に粗く、後続の書き込みレジスタを覆うように設けられており、 。
.text
.global _start
_start:
/* 将GPF4,5,6设置为输出引脚 */
LDR R0,=0x56000050
LDR R1,=0x1500
STR R1,[R0]
/* 设置GPF4,5,6输出低电平 */
LDR R0,=0x56000054
LDR R1,=0x8f
STR R1,[R0]
halt:
b halt
2.C言語
メインのC言語関数のための統一された入り口が、裸ボード、あなたが書かれた私たちの主を呼び出すためのプログラムが必要です、このプログラムは、プログラムを起動すると呼ばれています。C言語の関数呼び出しは、パラメータを渡し、自動変数はスタックメモリを使用する必要があるので、プログラムはまた、スタックを開始する責任があるので、そう正しく動作するC言語プログラムという、設定されています。
Start.S
--------------------------------------------------
.text
.global _start
_start:
MOV R0,#0
LDR R1,[R0] //保存0地址值
STR R0,[R0] //将0值写入,测试是否为NOR_Flash启动
LDR R2,[R0]
CMP R2,R0
LDR SP,=0x40000000+4096
MOVEQ SP,#4096
STREQ R1,[R0]
bl main
halt:
b halt
led.c
---------------------------------------------------------------------------
int main()
{
volatile unsigned int* pGPFCON = (unsigned int*)0x56000050;
volatile unsigned int* pGPFDAT = (unsigned int*)0x56000054;
//能不影响其他位的寄存器写方式
*pGPFCON &= ~((3<<8) | (3<<10) | (3<<12)); //寄存器对应的控制位清0
*pGPFCON |= ((1<<8) | (1<<10) | (1<<12)); //置位对应的控制位
*pGPFDAT &=~((1<<4) | (1<<5) | (1<<6));
return 0;
}
ブートファイル、モードおよびnandflash S3C2440開発ボードを開始norflashによる存在に決定する必要があるかnandflashのnorflash起動モード、起動モード。下に見ることができるマニュアルS3C2440チップメモリマッピングテーブルをチェックし、
場合norflash始動モード、メモリアドレスとしてデフォルトnorflash 0~0アドレス、チップは、内蔵SRAM(ブート内部SRAM)、アドレス0x40000000から+ 4096と比較しました。
場合nandflashスタートモード、チップ内部データSRAM(ブーツ内部SRAM)にnandflashフロント4Kがコピーされ、したがって、アドレス動作が0、デフォルトのメモリ利用可能な制御ブロック0-4096です。
あなたは別のメモリ・アドレスの脇コンテンツの背後にある適切な初期化の必要性を、使用する必要がある場合。norflash読み取り専用のブートファイルの使用0と読み込みと比較して、0の値にアドレス0を書いて、この裁判。書き込みに失敗した場合Norflashは、データは0として読まれるべきではないので、スタックアドレスは0x40000000から+ 4096に設定されています。読み書き可能なので、0はデータを読み込んだ後に書かれているnandflashも0であるので、スタックは4096に設定されています。
このように、アセンブリ言語とCには、それぞれ、非常にラフと非常に簡単な点灯動作を完了するのではなく、機能を実現することができ、3つのLEDライトの効果は、ボード上にあります。次のように粗いMakefileのC言語の動作のmakefile回避入りを簡略化するために使用される、クロスコンパイラを使用してプログラム、およびコンパイラをコンパイルします。
all:
arm-linux-gcc -o Start.o -c Start.S
arm-linux-gcc -o led.o -c led.c
arm-linux-ld -o led.elf Start.o led.o
arm-linux-objcopy -O binary -S led.elf led.bin
arm-linux-objdump -D led.elf > led.dis
clean:
rm *.bin *.elf *.dis *.o
ファイルを分解しDISプログラムは、フォローアップは、ここに最初当分の間、解析のためにファイルを分解することでしょう。