s3c2440学习之路-002 C语言点亮led

发布者:荒火最新更新时间:2021-10-14 来源: eefocus关键字:s3c2440  C语言  点亮led 手机看文章 扫描二维码
随时随地手机看文章

硬件平台: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  C语言  点亮led 引用地址:s3c2440学习之路-002 C语言点亮led

上一篇:s3c2440学习之路-003 汇编给C传参数 点亮不同led灯
下一篇:s3c2440学习之路-012-1 Undefined未定义中断

小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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