硬件平台:jz2440
软件平台:Ubuntu16.04 arm-linux-gcc-3.4.5
源码位置: https://github.com/lian494362816/C/tree/master/2440/003_led_c
1 主要流程
承接上一篇博客 https://blog.csdn.net/lian494362816/article/details/84309342, 原理分析就略过,流程也很简单:
1)设置栈
2)跳到C语言
3)将GPF4配置成输出模式
4)将GPF4输出低电平,即可点亮LED1
2 源码
start.s
.global _start
_start:
ldr sp, =4096 /* for nand */
/*ldr sp, =0x40000000 + 4096 /* for nor */
bl main
loop:
b loop
汇编代码很简单,设置完了栈之后就直接跳到了C源的main函数
led_on.c
int main()
{
unsigned int *pGPF4CON = (unsigned int *)0x56000050;
unsigned int *pGPFDAT = (unsigned int *)0x56000054;
*pGPF4CON = 0x100;
*pGPFDAT = 0x0;
return 0;
}
C代码也很简单,将地址强制转换成了指针,再对指针进行赋值
3 SP(stack pointer)的设置
这里要引出2个问题:
为什么要设置SP
SP的值如何设置
3.1 为什么要设置SP
当程序跳到C语言执行时,第一件事情就是保存现场,而保存现场就需要将数据压入到栈中。因此查看反汇编代码时,跳到main之后,开头就执行了 “stmdb sp!, {fp, ip, lr, pc}”指令,这里就用到了SP 。
led_on.dis
3.2 SP的值如何设置
SP的设置根据nand flash, nor flash这2种不同启动方式可以配置成2个值,nand flash 是4096, nor flash 是0x40000000 + 4096。
主要原因:
1)nand flash的数据无法直接读取,需要预先发送指令,所以当使用nand启动时,2440会把nand 前4K的数据拷贝到内部的SRAM里面,这样程序是从在内部的SRAM里面读取指令。因为程序是从0地址开始拷贝,SP设置成4906(4K),SP的数值又是往下减的,所以保证SP不会踩到程序。
2)nor flash是跟CPU统一编址, CPU可以直接从nor flash读取数据(写数据需要预先发送命令)。当使用nor flash启动时,程序是直接从nor flash读取指令,根据2440的手册,此时SRAM的起始地址为0x40000000, 所以把SP的值设置为0x40000000 + 4096。
如果写了一个简单的流水灯程序会发现一个问题,程序烧到nand flash上运行的速度比nor flash要快,原因就是一个是在内部的SRAM读取指令, 另一个是在外部的nor flash读取指令。
上一篇:s3c2440学习之路-003 汇编给C传参数 点亮不同led灯
下一篇:s3c2440学习之路-012-1 Undefined未定义中断
设计资源 培训 开发板 精华推荐
- 基于VIPer22A-E的3 W非隔离离线LED驱动器演示板
- 用于服务器的 12V DC 到 DC 单路输出电源
- 用于开/关控制应用的 AM2G-2409DZ ±9V 2 瓦 DC-DC 转换器的典型应用
- UMFT240XA-01,用于 FT240XQ 全速 USB 2.0 接口的 USB 转 4 位 SPI/FT1248 开发模块
- 使用 RP40-11015DFR DC/DC 转换器并根据 EN55022 Class B 进行 EMC 滤波的典型应用(110Vin 双输出)
- ADL5545-EVALZ,基于 ADL5545 30 MHz 至 6 GHz RF/IF 增益模块的评估板
- LT6654BHS6-2.048、16 位 ADC 电压基准的典型应用
- DC500A-E,使用 LTC3406BES5-1.5 的演示板,2.7V 至 5.5Vin,1.5Vout @ 600mA max 同步降压稳压器
- LTC3632IDD 高效 15V、4mA 稳压器的典型应用电路
- AM3G-4815SZ 15V 3 瓦 DC/DC 转换器的典型应用