前の概要では、GPIO1_IO03に対して次の設定を行う必要があります。1 . GPIO1
のクロックを有効にします。GPIO1 のクロック
は、CCM_CCGR1レジスタのビット27および26によって制御されます。これらの2ビットを1に設定すると、GPIO1のクロックが有効になります。 。
2.
GPIO1_IO03 の多重化機能を構成します。IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03レジスターは、GPIO1_IO03の多重化レジスターです。アドレスは0x20e0068です。このレジスターをGPIO機能として設定します。
3. GPIO1_IO03のプルアップとプルダウンを
構成します。IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03レジスタはGPIO1_IO03の構成レジスタであり、このレジスタを介してGPIO1_IO03をGPIOのプルアップおよびプルダウンとして構成します。
4. GPIO1_IO03出力を設定する
2番目のステップでは、GPIO1_IO03をGPIOに多重化してから、出力としてGPIOを構成し、高レベルと低レベルの出力を構成する必要があります。「IMX6ULLリファレンスマニュアル」の1357ページで、GPIO1_IO03に対応するGPIOレジスタグループを確認できます。図1に示すように:
レジスタGPIO1_GDIRのビット3を1に設定すると、GPIO1_IO03を出力として設定できます。次に、GPIO1_DRレジスタのビット3を0に設定すると、GPIO1_IO03を制御してローレベルを出力でき、LEDが点灯します。GPIO1_DRのビット3が1に設定されているため、GPIO1_IO03を制御して高レベルを出力でき、LEDはオフになります。
この実験のソースコードは、開発ボードのCD-ROMの「i.MX6ULターミネーターCD-ROMデータ\ 04_bare-metalルーチンソースコード\ 1_leds \ 1_leds」にあります。このフォルダーをUBuntuにコピーして、クロスコンパイラーでコンパイルできます。
LED実験を段階的に実装してみましょう。まずUbuntuシステムにログインし、ユーザーのルートディレクトリの下の作業フォルダーにledフォルダーを作成します。次に、図2に示すように、ledディレクトリーの下に新しいアセンブリファイル「led.s」を作成します。
次に、「vi led.s」コマンドを使用してled.sファイルを開き、led.sファイルに次のコードを入力します。
1 .global _start /* 全局标号 */
2 /*
3 * _start函数,程序从此函数开始执行此函数完成时钟使能、
4 * GPIO初始化、最终控制GPIO输出低电平来点亮LED灯。
5 */
6 _start:
7 /* 1、使能所有时钟 */
8 ldr r0, =0X020C4068 /* CCGR0 */
9 ldr r1, =0XFFFFFFFF
10 str r1, [r0]
11 ldr r0, =0X020C406C /* CCGR1 */
12 str r1, [r0]
13 ldr r0, =0X020C4070 /* CCGR2 */
14 str r1, [r0]
15 ldr r0, =0X020C4074 /* CCGR3 */
16 str r1, [r0]
17 ldr r0, =0X020C4078 /* CCGR4 */
18 str r1, [r0]
19 ldr r0, =0X020C407C /* CCGR5 */
20 str r1, [r0]
21 ldr r0, =0X020C4080 /* CCGR6 */
22 str r1, [r0]
23 /* 设置GPIO1_IO03为GPIO模式 */
24 ldr r0, =0X020E0068 /* 把寄存器SW_MUX_GPIO1_IO03_BASE加载到r0中 */
25 ldr r1, =0X5 /* 设置寄存器SW_MUX_GPIO1_IO03_BASE的MUX_MODE为5 */
26 str r1,[r0]
27 /* 配置GPIO1_IO03的IO属性
28 *bit 16:0 HYS关闭
29 *bit [15:14]: 00 默认下拉
30 *bit [13]: 0 kepper功能
31 *bit [12]: 1 pull/keeper使能
32 *bit [11]: 0 关闭开路输出
33 *bit [7:6]: 10 速度100Mhz
34 *bit [5:3]: 110 R0/6驱动能力
35 *bit [0]: 0 低转换率
36 */
37 ldr r0, =0X020E02F4 /*寄存器SW_PAD_GPIO1_IO03_BASE */
38 ldr r1, =0X10B0
39 str r1,[r0]
40 /* 设置GPIO1_IO03为输出 */
41 ldr r0, =0X0209C004 /*寄存器GPIO1_GDIR */
42 ldr r1, =0X0000008
43 str r1,[r0]
44 /* 点亮LED0
45 * 设置GPIO1_IO03输出低电平
46 */
47 ldr r0, =0X0209C000 /*寄存器GPIO1_DR */
48 ldr r1, =0
49 str r1,[r0]
50 /*
51 * 描述: loop死循环
52 */
53 loop:
54 b loop
2行目では、グローバルラベル_startを定義し、プログラムは_startラベルから順に実行されます。
行8はldrを使用して0x020c4068をレジスターr0に書き込みます。これはCCM_CCGR0のレジスターアドレスです。
ライン9はldrを使用して0xffffffffをレジスタr1に書き込み、すべてのペリフェラルのクロックをオンにします。
行10はstrコマンドを使用して、r1の値をr0に保存されたアドレスに書き込みます。これは、0xffffffffをアドレス0x20c4068に書き込むのと同じです。つまり、CCM_CCGR0レジスタを0xffffffffに設定し、CCM_CCGR0レジスタによって制御されるすべての周辺クロックを有効にします。
11行目から22行目まで、CCM_CCGR1-CCM_CCGR6レジスタに0xffffffffを書き込んで、すべてのペリフェラルクロックを有効にします。
24〜26行目は、GPIO1_IO03のIOをGPIOモードに設定するためのものです。GPIO1_IO03の多重化レジスタは0x20e0068です。このレジスターのMUX_MODEを5(GPIOモード)に
設定します。37〜39行目は、GPIO1_IO03構成レジスターのIOMUX_SW_PAD_CTL_PAD_GPIO1_IO03を設定します
。 40行目から43行目は、GPIOを出力機能として設定するためのものです。
47〜49行目はGPIO出力0(ローレベル)の設定で、53〜54
行目は無限ループで、bジャンプ命令を使用して連続的にジャンプしてループ実行します。