java打印对象内存地址 分布式事务 事务消息 分布式事务 几种解决方案 分布式事务-Seata 分布式事务-Seata 分布式事务-LCN-TCC 分布式事务-LCN 分布式事务-消息队列-定时任务-本地事件表 Zuul网关实战02 Zuul网关实战01 灰度发布落地实战2 灰度发布落地实战1 Gsnova on Heroku build Systemd Debian system initialization manage multi id_rsa ubuntu 64bits cannot run 32bits app REHL power auditing Debug Assembly for ARMv8 on QEMU ARM体系结构--寄存器 Run Debian iso on QEMU ARMv8 QEMU ARM64 guide cross compiler install buildroot install QEMU install python入门--数据结构 python入门--内置数据类型 python入门--类 异常 python入门--条件表达式 方法 python入门--数字 字符串 数组 RTC驱动分析 块设备驱动 TCP UDP socket 触摸屏驱动 USB驱动 LED按键中断 LCD 驱动 驱动信号 根文件系统 实验 内核实验 字符设备驱动程序 绪论 uboot 实验 LCD 实验 系统时钟和UART 中断控制器 Nand Flash控制器 MMU 实验 储存管理器实验 GPIO实验 点亮LED 编译加载驱动 制作烧写内核 dnw替代方法 MINI2440 TQ2440安装配套Linux 使用NFS 制作烧写跟文件系统 grub引导Windows 烧写裸版程序-linux Ubuntu 网络没有 eth0 Linux自动挂载 烧写裸板程序 电路基础 Mac词典 Vim插件 Assembly 综合研究 Assembly 指令总结 Assembly 直接定址表 Assembly 使用BIOS进行键盘输入和磁盘读写 Assembly 外中断 Assembly 端口 Assembly int指令 Assembly 内中断 Assembly 标志寄存器 Assembly 转移指令的原理 Assembly Call和ret指令 Assembly 数据处理两个基本问题 Assembly 灵活定位内存地址 Assembly 包含多个段的程序 Assembly [bx] loop Assembly 第一个程序 Assembly 寄存器 (内存访问) Assembly 寄存器 AWS VPN with EC2 hidden file in picture(linux) Assembly 基础 idea shortcuts 常用快捷键 idea plugin folder install ruby and jekyll

GPIO实验 点亮LED

2015年01月11日

###GPIO实验

目标:点亮LED

1.看原理图:GPF4=0 亮 GPF4=1 灭

2.怎么让GPF4输出 0/1

看芯片手册操作寄存器

a. 配置功能:输出/输入/其他 配置GPFCON[9:8]=0b01 (0b表示二进制)

b. 设置输出高/低电 GPFDAT[4]=0

汇编实现:

@******************************************************************************
@ File:led_on.S
@ 功能:LED点灯程序,点亮LED1
@******************************************************************************       
            
.text
.global _start
_start:     
            LDR     R0,=0x56000050      @ R0设为GPFCON寄存器。此寄存器
                                        @ 用于选择端口B各引脚的功能:
                                        @ 是输出、是输入、还是其他
            MOV     R1,#0x00000100      @ 设置[9:8]=01 [0-7]=0000000 二进制为100000000B = 0x100  
            STR     R1,[R0]             @ 设置GPF4为输出口, 位[8:7]=0b01
            LDR     R0,=0x56000054      @ R0设为GPBDAT寄存器。此寄存器
                                        @ 用于读/写端口B各引脚的数据
            MOV     R1,#0x00000000      @ 此值改为0x00000010,
                                        @ 可让LED1熄灭
            STR     R1,[R0]             @ GPF4输出0,LED1点亮
MAIN_LOOP:
            B       MAIN_LOOP


Makefile:

led_on.bin : led_on.S
	arm-linux-gcc -g -c -o led_on.o led_on.S
	arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf
	arm-linux-objcopy -O binary -S led_on_elf led_on.bin
clean:
	rm -f   led_on.bin led_on_elf *.o

###arm汇编指令:

.data     @数据段声明 

.text     @代码段声明

.global _start     @指定函数入口 
LDR     R0,=0x56000050      @装载寄存器,0x56000050为GPFCON寄存器
STR R1,[R0]     @将R1寄存器的值写入R0地址的寄存器中

MAIN_LOOP:
            B       MAIN_LOOP     @B是跳转指令,这里是死循环


C实现:

#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)

int main()
{
    GPFCON = 0x00000100;    // 设置GPF4为输出口, 位[8:7]=0b01
    GPFDAT = 0x00000000;    // GPF4输出0,LED1点亮

    return 0;
}

Makefile:

led_on_c.bin : crt0.S  led_on_c.c
	arm-linux-gcc -g -c -o crt0.o crt0.S
	arm-linux-gcc -g -c -o led_on_c.o led_on_c.c
	arm-linux-ld -Ttext 0x0000000 -g  crt0.o led_on_c.o -o led_on_c_elf
	arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin
	arm-linux-objdump -D -m arm  led_on_c_elf > led_on_c.dis
clean:
	rm -f led_on_c.dis led_on_c.bin led_on_c_elf *.o

C程序: volatile 告诉编译器不要优化

例子:

int a = 5;
int *p;
p = &a;
*p = 6; //与a = 6;一样

(*(volatile unsigned long *)0x56000050) 最外层(*…..)代表取值,相当于*p


按位操作:

  1. 清零 位与 例:清除bit 3为0 a = a & ~(1 << 3)

  2. 置1 位或 例:置bit 3为1 a = a | (1 << 3)


Makefile中:

arm-linux-ld -Ttext 0x0000000 led_on.o -o led_on_elf

-Ttext 0x0000000指定代码段从0地址开始

Makefile命令能被执行的条件

1.目标不存在

2.依赖已更新


####2440启动方式

#####NAND启动:

1.Nand 前4K内容,会拷贝到SDRAM

2.CPU从0地址执行

#####NOR启动:(可以像内存一样读,不能像内存一样写)

1.0地址指向NOR

2.CPU从0地址读取执行


####source insight 快捷键 alt + . 返回之前的文件

网卡开关 ifconfig eth0 down ifconfig eth0 up


####C编译步骤:

1.预处理

2.编译 .c -> .s

3.汇编 .s -> .o

4.链接 多个.o合并成一个可执行文件


###Troubleshooting: make编译成功,但无法看到效果

检查Makefile中arm-linux-ld -Ttext 0x0000000 crt0.o leds.o -o leds_elf

先连接crt0.o (crt0.S编译后文件) 用于引导main函数

再连接leds.o (leds.c编译后文件)