02-JZ2440裸机学习之GPIO实验

发布者:GoldenDream最新更新时间:2022-03-25 来源: eefocus关键字:02-JZ2440  裸机学习  GPIO实验 手机看文章 扫描二维码
随时随地手机看文章

一:汇编点亮一个LED


1看原理图


2设置寄存器,配置引脚

3代码现


@******************************************************************************

@ File:led_on.S

@ 功能:LED点灯程序,点亮LED1

@******************************************************************************       

            

.text

.global _start

_start:     

            LDR     R0,=0x56000050      @ R0设为GPFCON寄存器。此寄存器

                                        @ 用于选择端口B各引脚的功能:

                                        @ 是输出、是输入、还是其他

            MOV     R1,#0x00000100        

            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

4 编写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

-o 输出


-c汇编不链接


-Ttext 0x0000000:代码段地址0.


在使用GCC编译程序时,编译过程分为四个阶段:


1. 预处理(Pre-Processing)    头文件,define等处理


2. 编译(Compiling)         .C->.S


3. 汇编(Assembling)        .S->.O


4. 链接(Linking)          多个.O=>1个


5将代码上传至服务器


make编译生成 .bin文件


6下载至开发板


cd H:ARM学习codegpio

oflash 选择相关选项 下载代码到开发板,上电观察现象。第一个灯亮


二:C点亮LED

1.启动文件


库(启动文件,之前是系统做好的)+自己的程序(led.c)


现在都自己来写


启动文件 crt0.S:要做什么呢?软件初始化+硬件初始化




(设置栈 就是栈指针SP指向某个内存,如果是SDRAM就要执行初始化操作)


main函数并不特别,被别处掉用,执行完要返回。被谁调用呢?被启动文件调用。


启动文件软件初始化:


设置栈(片内ram或者片外SDRAM则需要初始化)

设置返回地址

调用main()

清理

启动文件硬件初始化:


关看门狗

设置时钟

初始化SDRAM

启动文件crt0.S:



@******************************************************************************

@ File:crt0.S

@ 功能:通过它转入C程序

@******************************************************************************       

 

.text

.global _start

_start:

            ldr     r0, =0x53000000     @ WATCHDOG寄存器地址

            mov     r1, #0x0                     

            str     r1, [r0]            @ 写入0,禁止WATCHDOG,否则CPU会不断重启(硬件初始化完毕)

            

            ldr     sp, =1024*4         @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K

                                        @ nand flash中的代码在复位后会移到内部ram中,此ram只有4K

            bl      main                @ 调用C程序中的main函数(BL指令会记录返回地址YF)

halt_loop:

            b       halt_loop


2、C函数编写

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

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

 

int main()

{

    GPFCON = 0x00000100;    // 设置GPF4为输出口, 位[9:8]=0b01

    GPFDAT = 0x00000000;    // GPF4输出0,LED1点亮

 

    return 0;

}

-Ttext 0x0000000:代码段位于0地址。

写法解释:


56000050是寄存器的地址。


(volatile unsigned long *)0x56000050是指针变量


(*(volatile unsigned long *)0x56000050)则表示这个地址的值,也就是寄存器的值。


清零与置1


清零:与运算  a=a&(~(1<<3))


置1:  或运算  a=a |(1<3)



总结:

裸机程序,主要包括两部分


(1)启动文件(汇编指令):负责初始化,为C准备环境


(2)C程序:实现硬件功能

关键字:02-JZ2440  裸机学习  GPIO实验 引用地址:02-JZ2440裸机学习之GPIO实验

上一篇:02-JZ2440裸机学习之存储管理器
下一篇:tiny4412学习(四)之移植linux-设备树(2)设备树之LED点灯

推荐阅读最新更新时间:2024-11-13 10:12

TQ2440 学习笔记—— 14、GPIO 接口【实验:用C语言实现】
1、使用C语言代码点亮一个LED C 语言程序执行的第一条指令,并不在main函数中。生成一个C程序的可执行文件时,编译器通常会在我们的代码中加上几个被称为启动文件的代码——crtl.o、crti.o、crtend.o、crtn.o等,它们都是标准库文件。这些代码设置C程序的堆栈等,然后调用main函数。它们依赖于操作系统,在裸板上这些代码无法执行,所以需要自己写一个。 a、crt0.s 它在第 13行设置好栈指针后,就可以通过第15行调用C函数main 了。C 函数在执行前必须设置栈。 【注意】韦东山老师那本教材上面是有点错误的,比如WATCHDOG寄存器的地址就写成了0x56000010。 b、代码:
[单片机]
TQ2440 <font color='red'>学习</font>笔记—— 14、<font color='red'>GPIO</font> 接口【<font color='red'>实验</font>:用C语言实现】
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved