历史上的今天
今天是:2025年04月15日(星期二)
2018年04月15日 | LED裸程序
2018-04-15 来源:eefocus
实验的目的:
点亮一盏LED灯
实验的源程序:
@******************************************************************************
@ 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函数
halt_loop:
b halt_loop
@******************************************************************************
@ File:led_on_c.bin
@******************************************************************************
#define GPBCON (*(volatile unsigned long *)0x56000010) //(volatile unsigned long *)0x56000010这条语句的作用是将0x56000010值强制转化成一个指针,
#define GPBDAT (*(volatile unsigned long *)0x56000014) //然后再在这条语句的基础上加上一个*,是取这个指针所指向的值。
int main()
{
GPBCON = 0x00000400; // 设置GPB5为输出口, 位[11:10]=0b01
GPBDAT = 0x00000000; // GPB5输出0,LED1点亮
return 0;
}
@******************************************************************************
@ File: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
实验的问题总结:
<1>关于crt0.S文件的解释
I.若不关闭看门狗,CPU会一直重启
II.设置堆栈,是因为在C语言中的局部变量会用得到,这可通过反汇编查看得到;思考:在纯汇编中,没有设置堆栈的原因,个人理解的 是,汇编指令操作的对象是寄存器,所以不需要涉及到分配内存的问题。
III.在 bl main 这个指令,为何不用 .IMPORT main这个伪指令声明main函数,难道汇编程序可以自动通过标号找到main函数?
答案:准确地来说,是需要的!
=================================================================================
IMPORT
语法格式:
IMPORT 标号{[WEAK]}
IMPORT伪指令用于通知编译器要使用的标号在其他的源文件中定义,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。
标号在程序中区分大小写,[WEAK]选项表示当所有的源文件都没有定义这样一个标号时,编译器也不给出错误信息,在多数情况下将该标号置为0,若该标号为B或BL指令引用,则将B或BL指令置为NOP操作。
使用示例:
AREA Init,CODE,READONLY
IMPORT Main ;通知编译器当前文件要引用标号Main,但Main在其他源文件中定义
……
END
=================================================================================
<2>关于Makefile文件的解释
I. -Ttext 0x0000000这条是指定 led_on_c.bin这个程序在内存中运行时的地址
II.运行地址指的是程序运行时,其所开始执行的的地方称为运行地址;加载地址是指编译整个Makefile之后,得到的 led_on_c.bin这个
可执行程序所存放的地方的地址称为加载地址。若加载地址和运行地址不在同一处,那么运行时,需要将其从加载地址处搬移到运行地址处,
这会略微影响CPU的效能。
史海拾趣
|
请问以下C代码是什么意思?请问如下代码的含义:据说hook function 是钩子函数,但我并没有在网上搜索到类似的函说说明。不管能否解答都欢迎大家来讨论 typedef void (* PFN_HOOK )(void); &n ...… 查看全部问答> |
|
一个LED的N种玩法(三)----General Timer 一个LED的N种玩法 (三)---General Timer Author: chenzhufly Email: chenzhufly@126.com 2010-4-29 写完两篇终于等到timer上场了,前面已经有网友提议可以用timer来玩LED,那好吧,在这里我来感受一下timer是怎么操作LED的。Come on… ...… 查看全部问答> |
|
基于飞思卡尔ARM9内核的i.mx27嵌入式开发板在视频传输领域的应用 1.i.MX27产品特性和应用范围: i.MX27是高清视频首选,提供了更高的灵活性和更强大的多媒体处理能力,成为IP视频和语音(V2IP)无绳和移动电话、智能远程控制、POS终端和其他大量无线应用的理想选择。同时,i.MX27开发板的主频从i.MX21的 266MHZ提高 ...… 查看全部问答> |
|
在仿真时出错,下面是出错的问题,请高手指教 代码segment\'ram0\'BYTES.Roo ds.b 1.Ro1 ds.b 1.Ro2 ds.b 1.Ro3 ds.b 1.Ro4 ds.b 1.Ro5 ds.b 1.Ro6 ds.b 1.Ro7 ds.b 1.Ro8 ds.b 1MOV TIM1_SMCR,#00HBRES TIM1_ETR,#6MOV TIM1_PSCRH,#00HMOV TIM1_P ...… 查看全部问答> |
|
TFT LCD面板背光应用之TPS65142环路补偿设计考虑因素 作者:Tony Huang,德州仪器 (TI) 电源管理/现场应用摘要 TPS65142器件为笔记本电脑TFT LCD面板的偏置功率和WLED背光提供一种紧凑型解决方案。这种器件拥有一个升压转换器、一个正充电泵稳压器以及一个负充电泵稳压器,用于驱动源极驱动器和栅 ...… 查看全部问答> |
|
作为一个新的技术,不同的人对他有不同的看法。有人说这种开发效率相当快,但是很难应用到汽车上,我希望下有经验的人讲一下,也希望喜欢这个技术的同行们互相交流看法… 查看全部问答> |
|
【TI DLP创意征集】将DLP技术应用到水质监测或者浓度检测 环保一直是大家所关心的,DLP有类似光谱分析的能力,我觉得可以将其应用到水质监测上,通过DLP对有害物质的检测,将测到的数据通过网络实时的传给环保部门,只有有害物质超标,就会有相应的监管部门进行监督。还有就是家庭用水,有时可能会有未知的 ...… 查看全部问答> |
|
replyreload += \',\' + 1980650; 本帖最后由 chenzhufly 于 2016-2-18 23:29 编辑 本着开源的精神,放出飞猪四轴V1.0 硬件设计资料,同时还要像前辈们致敬,这个版本问题还是很多的,我还在苦逼的调试中,大家可以一起学习一下,如果模仿自制 ...… 查看全部问答> |




