8051 (c51) マイクロコントローラーのアセンブリから C 言語、ブートからアプリケーションまで [オープンソース シリーズ チュートリアル]

8051 (c51) マイクロコントローラーのアセンブリから C 言語、ブートからアプリケーションまで [オープンソース シリーズ チュートリアル]

著者 オオカミはクジラになるだろうか
作成日 2022-09-29

1. 倉庫の紹介

工事名 効果
01_ハローワールド Keil デバッグ ウィンドウから Hello world を直接出力します。
02_Keil_boot_アノテーション Keil に付属するアセンブリ ブート ソース コードに注釈を付ける
03_組み立て_レジスター 8051 実際のプログラム エントリを表示し、カスタム レジスタ ヘッダー ファイルを追加します
04_マクロ_機能と_irq アセンブラマクロ定義関数と割り込み処理を表示
05_組み立てる_ハロー_ワールド アセンブリを使用して Keil デバッグ ウィンドウから Hello world を出力する
06_uart0_ループバック Keil デバッグ出力ウィンドウのシリアル ポート ループバック
  • これは 8051 教育リポジトリです。特定のハードウェアを使用する代わりに、Keil をシミュレータとして直接使用し、入出力に仮想シリアル ポートを使用し、ハードウェアの問題で立ち往生しないようにコンピュータ上で直接コンパイルして実行します。Keil 公式 Web サイトから Keil ソフトウェアをダウンロードしてから、このウェアハウスをダウンロードします。ウェアハウスでプロジェクトを開いた後、プログラムを実行すると、結果を直接確認できます。8051 のレジスタ、命令セット、Keil 擬似命令、アセンブリ ブート、アセンブリ プログラミング ルーチン、C 言語プログラミング ルーチン、ソフトウェア フレームワーク、および通信フレームワークに焦点を当てます。
  • ウェアハウスには複数の Keil プロジェクトとソース コードがあり、各ウェアハウスは独立しており、直接開いてコンパイルし、実行できます。
  • この倉庫の対象者は次のとおりです。
  1. 私は学校で「C51 マイクロコントローラーの原理 (アセンブリ)」や「C 言語プログラミング」などの同様のコースを勉強したことがありますが、商用プロジェクトの開発で 8051 チップを使用したことはありません。
  2. 8051チップを使用してC言語で商用プロジェクト開発を行ったのですが、チップの電源投入からmain()関数実行までの8051のブートプロセスが分かりません。
  3. 8051 純粋なアセンブリのプログラミングは行われていません。
  4. アセンブリを使用して 8051 ブート プログラムを最初から作成した人はいません。
  5. 本業は32ビットCPUのC言語開発ですが、仕事中に一時的に8051チップのプログラミングに触れたことがある、あるいは8051関連の知識、特にアセンブリロジックを復習したいだけです。

  • なぜ 8051 チップを使用せずに Keil のシミュレータを使用してプログラムを直接実行するのでしょうか?
  1. プログラミングの習慣:
    C 言語を学習する過程、または単に C 言語の純粋な論理関数を検証する過程では、GCC+Makefile、Qt、または VS (Microsoft Visual Studio) を直接使用してコンパイルおよび実行できます。printf はコンパイル環境の正確さを検証できます。
    しかし、8051チップを搭載したハードウェアを使用すると、環境構築の過程でさまざまな問題が発生し、ガイダンスがないとボトルネックに遭遇することが多く、開発ボードの購入にも追加費用がかかります。
    32 ビット CPU の組み込み開発であれば、オープンソースの QEMU シミュレーターも利用できます。
  2. 仕事の習慣:
    元のチップ工場では、チップが開発中で FPGA 上で実行できない場合、組み込みソフトウェア エンジニアの作業は待ってくれません。多くの場合、最初にシミュレーターを使用してソフトウェア プロジェクトを構築し、プログラムの作成とテストを同時に行います。
  3. 時間を節約し、いつでもどこでもプログラムのデバッグを容易にします:
    特定のハードウェア ドライバーが関与していない限り、さまざまな通信ドライバーのロジックとビジネス ロジックは、ソフトウェア シミュレーターを使用してシミュレートできます。コンピューターのみが必要で、自宅などの場所でコードを作成してデバッグできます。
  4. 汎用性:
    あらゆる種類の組み込みチップがあり、すべてのチップに精通している人はいません。チップの最大公約数であるカーネルは、シミュレーターですでに完全に実行できます。32 ビット CPU の場合、QEMU はすでに USB、ネットワーク、シリアル ポート、SPI、I2C、ディスプレイなどのさまざまな周辺機器をシミュレートでき、Keil C51 もシリアル ポートと IO をシミュレートできるため、ソフトウェア ロジックを学習するには十分です。
  5. シンプル:
    Keil プロジェクトを開いて直接実行し、ソフトウェア上でシリアル ポートの出力結果を確認します。

  • Keil + Proteus を使用して 8051 ハードウェアをシミュレートしてみてはいかがでしょうか?
  1. 確かに一部のマイクロコントローラー開発者はソフトウェアとハ​​ードウェアに精通しており、この方法を受け入れることができますが、ほとんどの組み込みソフトウェア開発者はハードウェア関連のソフトウェアを使用した経験がありません。Proteus は学習コストを大幅に増加させるため、将来の作業では使用されません。
  • 多数の 8051 件の教育記事がインターネット上で見つかります。なぜこの倉庫を作成するのでしょうか?
  1. インターネット上で見つかる多数の 8051 チュートリアルは、ほとんどが学校のロジックのセットです。さまざまなレジスタやアセンブリ命令が章で説明されています。これらは完全なプロジェクトを形成しておらず、そのまま使用することはできません。
  2. インターネット上には 8051 件の記事が繰り返し掲載されており、検索するのは時間の無駄です。
  3. 実際、私も 8051 を学習中ですが、どこを書いてどこを記憶を深めるべきかがわかり、久しぶりに同じ問題に遭遇したときに戻って調べるのにも便利です。

2. 環境整備と知識の蓄え

  • 次のステップに進む前に、Keil ソフトウェアをダウンロードしてインストールし、Keil の基本的な使用方法を理解する必要があります。ソース コード内のいくつかの記述メソッドを確認するだけで、実際にプログラムを実行して結果を確認する必要がない場合は、この記事を無視してください。Keil ソフトウェアのインストールの基本的なプロセスは次のとおりです。他のインストール チュートリアルの URL は後でリストされます。
  1. 公式 Web サイトから Keil C51 プログラムをダウンロードします。これは、エディタ、コンパイラ、リンカ、シミュレータが統合された IDE です。
  2. ダウンロードアドレス https://www.keil.com/demo/eval/c51.htm は個人情報の登録と入力が必要です 評価版は 2K の容量のコードのコンパイルのみをサポートしていますが、このウェアハウスにあるプロジェクトの前の部分は 2K の範囲内にあり、直接実行およびデバッグできます。
  3. 既に Keil を使用している人は、Keil クラック版をダウンロードしてクラックすることができます。
  4. インストール プロセス中、インストール パスにスペースや中国語のディレクトリを含めることはできません。
  5. インストールが完了したら、「Keil uVision5」ソフトウェアを開きます。
  • Keil のインストールと導入参考リンク
  1. 1 つは Keil 公式 Web サイトでアカウントを登録し、Keil C51 をダウンロードしてインストールする方法ですが、インストールされるソフトウェアは 2K 内のプログラムのコンパイルのみをサポートします。
    https://www.keil.com/demo/eval/c51.htm

  2. 2つ目は、ひび割れたKeil C51を取り付けることです。
    51 MCU - Keil5 のインストール方法 (ナニー レベルのチュートリアル)
    [組み込み学習] MCU 入門 - 1. Keil のインストール (バージョン 51)


  • Keil の公式 Web サイトによると、98 社の 9500 個のチップ (2022 年 9 月 29 日現在) をサポートしており、そのうちの半分は ARM コアに基づいており、半分は 8051 コアに基づいており、少量は他のコアに基づいています。

  • すべてのデバイスを表示するには、[レガシー デバイス リスト]をクリックします。

  • 参考URL
    メーカーリスト MDK5デバイスリスト: https://www.keil.com/dd2/
    デバイスリスト レガシーデバイスリスト: https://www.keil.com/dd/

  • Keil に加えて、他の 8051 シミュレータには次ものあります






  • ケイル指令
  1. Keil A51 アセンブリ コードは、習得する必要がある多くの一般的に使用される疑似命令をサポートしています。アセンブリを記述するときによく使用されます。これらの疑似命令は、A51 に関連する英語ドキュメントのすべての説明で確認できます。国内 Web サイトですべての疑似命令の完全な翻訳を見つけることはできませんが、オリジナルの英語版は Keil 公式 Web サイトで見つけることができます。注意深く検索しませんでしたが、C51 ユーザーのドキュメントのシリーズのいくつかの章にあるはずですマニュアル

  2. Keil アセンブリ疑似命令の導入については、同階層ディレクトリにあるドキュメント ["Keil A51 アセンブリ疑似命令"](./02_doc/Keil A51 アセンブリ疑似命令.md) を参照してください。


  1. 公式 Web サイトから Keil C51 プログラムをダウンロードします。これは、エディタ、コンパイラ、リンカ、シミュレータが統合された IDE です。
  2. ダウンロードアドレス https://www.keil.com/demo/eval/c51.htm で個人情報の登録・記入が必要です 評価版では容量 2k のコードのみコンパイル可能です。
  3. インストール プロセス中、インストール パスにスペースや中国語のディレクトリを含めることはできません。
  4. 安装完成后打开“Keil uVision5”软件,
    点击“Project”–>“new uVision Project”–>选中你愿意放工程的目录–>
    在选择设备弹窗中,我选择Cadence公司的R8051XC2(8DPTR),选择哪款8051芯片都无所谓,前期只操作基础的8051寄存器,不同公司的基础寄存器是一致的,我这里以这款芯片为例–>
    点击下一步后,弹出“Copy ‘STARTUP.A51’ to Project Folder and Add File to Project?”,点是,这样编译器会自动给你填充一份Boot汇编代码模板,这个Boot代码能让你跳转到main函数。
  5. 左上隅にある 2 つの矢印のボタンをクリックしてプログラムをコンパイルすると、下の「ビルド出力」領域に
    「.\Objects\cadence_first_project」 - エラー 0 件、警告 2 件というプロンプトが表示されます。エラーが 0 の
    場合は、コンパイルが成功したことを意味し、生成される実行可能ファイルはサフィックスなしの Objects\cadence_first_project になります。
  6. 点击右上角红色的‘d’图标,能直接使用软件自带的模拟器仿真运行8051程序,
    如果提示“EVALUATION MODE…2K”,表示未注册的评估版只支持2K代码,我前期的代码没有超过2K,直接点确定下一步–>
    使用Keil默认提供的boot汇编程序,测试时断点会停在“?C_STARTUP”这一行–>
    点击行号前面可以创建和取消断点–>
    点击左上角几个带箭头或者叉叉的图标,可以单步执行、跳转到函数内部执行、持续运行、立即停止运行,快捷键是F10、F11、F5–>
    进入调试模式后,Keil里有各种窗口看串口输出的信息、RAM里的数据值、当前各个变量和寄存器的值、所有寄存器的值,修改当前变量的值,让程序中的变量按自己手动输入的值生效并运行,如果程序跑飞了可以查看异常寄存器和地址寄存器存储的上一个语句的地址。
  • このチップに精通している場合は、Keil に付属のブート プログラムを使用せず、レジスタ マクロ定義全体を自分で記述し、Keil プロジェクト設定で魔法の杖のアイコン –> デバイス –> [Use LX51] および [Use AX51] をチェックし、自分で定義した SFR 特殊関数レジスタを使用します。
  • プログラムをボードにダウンロードする必要がある場合、または 16 進数実行可能ファイルをより容量の小さい bin ファイルに変換する必要がある場合は、出力ページの「HEX ファイルの作成」にチェックを入れてください。

  • Keil を使用する際のヒント:
  1. Keil 付属の GB2312 中国語エンコーディングを使用せず、UTF-8 中国語エンコーディングを使用することで、バージョン管理に Git を使用するときに中国語が正常に表示され、Linux と Windows 間でプロジェクトを切り替えた後に文字化けが発生しにくく、回復できない中国語情報の損失が発生しにくくなり
    ます

  2. Keil は、Tab を固定の 4 つのスペースに設定します (Linux カーネルと Git Tab との互換性を保つため、8 バイトで表示するために、スペースによって表示形式が固定される可能性があります) 構成 –> エディター –> C/C++ ファイル –> タブ サイズ:
    4


2. 8051 リソースの説明

  • 直感的にわかるように、8051 のすべてのレジスタをここに直接リストし、8051 のすべてのアセンブリ命令テーブルは、このレジスタ テーブルの後の記事へのリンクとして提供されます。
  • 8051 MCU データ メモリは 2 つの領域に分割できます: 00H ~ 7FH はチップ上の下位 128 バイト RAM 領域、80H ~ FFH は特殊機能レジスタ領域 (SFR) です。
  • 8051 IP コアは Cadence の r8051xc を使用しており、関連する汎用レジスタは r8051xc の関連ドキュメントを確認する必要があります。
  • 8051 のレジスタの末尾が 0 と 8 のアドレスは、0x80 P0、0x88 TCON のようにビットアドレス可能であり、8051 のビットアドレス可能な各ビットには対応する名前があり、その名前を直接操作することでビットを操作できます。具体的な意味については、プログラムのソース コード内の注意事項を参照するか、必要に応じてインターネットで直接検索してください。
  • アドレス 00H ~ 7FH の下位 128 バイトの内蔵 RAM 領域は、汎用レジスタ領域アドレス (00H ~ 1FH)、ビットアドレッサブル領域 (20H ~ 2FH)、ユーザ RAM 領域 (30H ~ 7FH、ここでスタックも設定可能) の 3 つの領域に分割できます。
  1. 8051汎用レジスタ導入、合計128個:
住所 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07
汎用レジスタ 0グループR0 0グループR1 0グループR2 0グループR3 0グループR4 0グループR5 0グループR6 0グループR7
住所 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F
1グループR0 R1 1セット R2 1セット R3 1セット R4 1セット R5 1セット R6 1セット R7 1セット
住所 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17
R0 2セット R1 2セット R2 2セット R3 2セット R4 2セット R5 2セット R6 2セット R7 2セット
住所 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F
R0 3セット R1 3セット R2 3セット R3 3セット R4 3セット R5 3セット R6 3セット R7 3セット
住所 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27
ビットアドレス 00H~06H 07H~0FH 10時間〜16時間 17H~1FH 20時〜26時 27時〜2時 30時間〜36時間 37H~3FH
住所 0x28 0x29 0x2A 0x2B 0x2C 0x2D 0x2E 0x2F
40時間〜46時間 47H〜4FH 50時間〜56時間 57H~5FH 60H~66H 67H~6FH 70H~76H 77H~7FH
住所 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37
残りは ユーザーRAM 一般的な開発 スタック ……
住所 0x38 0x39 0x3A 0x3B 0x3C 0x3D 0x3E 0x3F
住所 …… …… …… …… …… …… …… ……
住所 0x78 0x79 0x7A 0x7B 0x7C 0x7D 0x7E 0x7F
  1. R8051XC2 特殊機能レジスタ領域 (SFR) の導入、最大 128、8051 の汎用レジスタが太字になります。
住所 0x80 0x81 0x82 0x83 0x84 0x85 0x86 0x87
説明 P0 IOポートラッチ SPスタックポインタ DPLデータアドレス下位8ビット DPH データアドレス上位 8 ビット WDTREL PCON
住所 0x88 0x89 0x8A 0x8B 0x8C 0x8D 0x8E 0x8F
TCONタイマー制御 TMODタイマーモード TL0 タイマ0の下位8ビット TL1 タイマー 1 下位 8 ビット TH0 タイマー0 上位 8 ビット TH1 タイマ 1 上位 8 ビット CKCON
住所 0x90 0x91 0x92 0x93 0x94 0x95 0x96 0x97
P1 IOポートラッチ DPS DPC ページセル D_PAGESEL
住所 0x98 0x99 0x9A 0x9B 0x9C 0x9D 0x9E 0x9F
S0CON串口控制 S0BUF串口锁存 IEN2 S1CON S1BUF S1RELL
地址 0xA0 0xA1 0xA2 0xA3 0xA4 0xA5 0xA6 0xA7
P2 IO口锁存器 DMAS0 DMAS1 DMAS2 DMAT0 DMAT1 DMAT2
地址 0xA8 0xA9 0xAA 0xAB 0xAC 0xAD 0xAE 0xAF
IE0 中断允许 IP0 S0RELL
地址 0xB0 0xB1 0xB2 0xB3 0xB4 0xB5 0xB6 0xB7
P3 IO口锁存器 DMAC0 DMAC1 DMAC2 DMASEL DMAM0 DMAM1
地址 0xB8 0xB9 0xBA 0xBB 0xBC 0xBD 0xBE 0xBF
IP 中断优先级 IEN1 IP1 S0RELH S1RELH IRCON2
地址 0xC0 0xC1 0xC2 0xC3 0xC4 0xC5 0xC6 0xC7
IRCON CCEN CCL1 CCH1 CCL2 CCH2 CCL3 CCH3
地址 0xC8 0xC9 0xCA 0xCB 0xCC 0xCD 0xCE 0xCF
T2CON CRCL CRCH TL2 TH2 RTCSEL
地址 0xD0 0xD1 0xD2 0xD3 0xD4 0xD5 0xD6 0xD7
PSW 程序状态字 IEN4 I2C2DAT I2C2ADR I2C2CON I2C2STA SMB2_SEL SMB2_DST
地址 0xD8 0xD9 0xDA 0xDB 0xDC 0xDD 0xDE 0xDF
ADCCON P5 IO口 I2CDAT I2CADR I2CCON I2CSTA SMB_SEL SMB_DST
地址 0xE0 0xE1 0xE2 0xE3 0xE4 0xE5 0xE6 0xE7
ACC 累加器 SPSTA SPCON SPDAT SPSSN P6 IO口
地址 0xE8 0xE9 0xEA 0xEB 0xEC 0xED 0xEE 0xEF
P4 IO口 MD0 MD1 MD2 MD3 MD4 MD5 ARCON
地址 0xF0 0xF1 0xF2 0xF3 0xF4 0xF5 0xF6 0xF7
B 寄存器
地址 0xF8 0xF9 0xFA 0xFB 0xFC 0xFD 0xFE 0xFF

三、工程与源码介绍

1)Hello world输出

  • 本工程主要演示使用Keil创建一个R8051XC2的默认工程,使用Keil自带的Boot汇编文件,然后新建一个main.c文件,写一个printf函数 + 简单的串口0驱动,并能从软件窗口上看到printf的结果。

  • 创建工程的步骤详见章节“二、环境准备及知识储备”中“Keil创建工程”小节中的内容,你可以省掉这步,直接打开现有的工程。

  • 工程路径:本文档同级目录/01_proj_and_src/01_Hello_world/

  • 你可以直接双击打开 ./01_proj_and_src/01_Hello_world/01_Hello_world.uvproj工程

  • 然后编译:点击软件上面状态栏第三排左侧两个向下小箭头的图标。看到.\Objects\01_Hello_world" - 0 Error(s)表示编译通过。

  • 然后开始运行:点击软件上面状态栏第二排右侧黑色放大镜+红色“d”的小图标;如果你的软件是官网下载的未破解的评估版,会出现一个弹窗,关掉那个弹窗不管它;程序会停在main()函数的第一行,先不要继续运行。

  • 输出的结果会在Keil Debug状态下的UART #1窗口中;这个窗口Keil不会主动为你打开,你需要点击在软件上面第三排图标中的小串口带一个黑色串口的图标旁边的小三角形,选中里面的UART #1,然后软件右下角就会出现UART #1窗口。

  • 继续运行:点击软件左上角一个向下箭头的图标,UART #1窗口中出现了Hello world!的输出。

  • 额外的知识:

    • Keil输出窗口选项中,除了有UART #1、UART #2和UART #3外,还有一个Debug (Printf) Viewer窗口,这个窗口C51是用不了的,这是Keil MDK为ARM等芯片准备的,例如调试STM32时,不需要写串口驱动,而且直接写串口驱动还有点麻烦,而直接对fputc()函数进行重定向之后,能直接在这个窗口看到printf()的输出;这和在PC上直接写C语言程序有点类似,就更方便了。
  • *参考网址 *
    keil C51 重定向printf到串口

2)Keil自带的汇编boot源码解析注释

  • 本工程主要演示使用Keil创建一个R8051XC2的默认工程,使用Keil自带的Boot汇编文件,然后对这个STARTUP.A51进行注释。
  • 工程路径:本文档同级目录/01_proj_and_src/02_Keil_boot_annotation/
  • 你可以直接双击打开 ./01_proj_and_src/02_Keil_boot_annotation.uvproj/02_Keil_boot_annotation.uvproj工程

3)展示8051真正的程序入口, 和添加自定义寄存器头文件

  • 本工程主要演示使用Keil创建一个空工程,不使用Keil自带的boot汇编文件,也不使用Keil自带的寄存器头文件,而是自己添加一切文件,展示8051真正的程序入口,添加自定义寄存器头文件,顺便对8051的每个寄存器进行注释。
  • 工程文件:本文档同级目录/03_Assemble_register/03_Assemble_register.uvproj

4)展示汇编宏定义函数和中断处理

  • 工程文件:本文档同级目录/04_Macro_func_and_irq/04_Macro_func_and_irq.uvproj

5)用汇编从Keil调试窗口中输出Hello world

  • 工程文件:本文档同级目录/05_Assemble_hello_world/05_Assemble_hello_world.uvproj
    双击打开并直接运行,能在Keil UART #1串口中看到hello world输出(这个窗口可能需要你手动在软件中打开)

6)Keil调试输出窗口串口回环

おすすめ

転載: blog.csdn.net/qq582880551/article/details/127594062