S3C2440C语言点灯

S3C2440C语言点灯第一代程序员使用机器码第二代程序员使用汇编第三代程序员使用C语言C语言相较于汇编和机器码是一个更高级的语言,我们使用的技术也应该与时俱进之前控制寄存器是配置GPFCON和GPFDAT寄存器,通过地址访问,所以可以用C语言来进行对地址的访问。GPFCON——0x5600,0050GPFDAT——0x5600,0054目录S3C2440芯片手册导读用指针表示S3C2440芯片手册导读对于GPFCON,只用到了16位对于GPFDAT,只用到了8位我们仍然可以以32位,就是4字节的

大家好,又见面了,我是你们的朋友全栈君。

第一代程序员使用机器码
第二代程序员使用汇编
第三代程序员使用C语言
C语言相较于汇编和机器码是一个更高级的语言,我们使用的技术也应该与时俱进
之前控制寄存器是配置GPFCON和GPFDAT寄存器,通过地址访问,所以可以用C语言来进行对地址的访问。

  • GPFCON——0x5600,0050
  • GPFDAT——0x5600,0054

S3C2440芯片手册导读

在这里插入图片描述

  • 对于GPFCON,只用到了16位
  • 对于GPFDAT,只用到了8位

我们仍然可以以32位,就是4字节的形式来访问这些寄存器

  • 对于GPFCON,我们只关心低16位
  • 对于GPFDAT,我们只关心低8位
    其他不需要用到的位,我们不写入值,或者写入0值

用指针表示

我们用4字节去访问这两个寄存器
可以用int变量去表示

注意:

  • 对int变量,最高位是表示符号位

  • 对寄存器,最高位仍然是控制硬件
    所以,我们用unsigned int来表示

  • unsigned int *pGPFCON = 0x56000050;

  • unsigned int *pGPFDAT = 0x56000054;
    在内存中的存放如下图
    在这里插入图片描述

表示如下:

*pGPFCON = 0x100; //0x400
//配置成输出引脚
*pGPFDAT = 0;
//低电平点灯

会导致
在这里插入图片描述
在这两个地址中把这两个数据写进去

代码的编写

在编写C语言的代码前,我们先考虑两个问题

  • 1、编写的main函数被谁调用
  • 2、main函数中变量保存在内存中,这个内存地址是多少

答:我们还需要编写一个汇编代码,给main函数设置一个内存来调用main函数

main函数如下

int main()
{ 
   
	unsigned int *pGPFCON = (unsigned int *)0x56000050;
	unsigned int *pGPFDAT = (unsigned int *)0x56000054;

	/*配置GPF4为输出引脚*/
	*pGPFCON = 0x100;

	/*配置GPF4输出0*/
	*pGPFDAT = 0;
	return 0;
}

汇编如下

//这些只是汇编的语法而已,没什么好记的
.text
.global _start

_start:

/*设置内存:sp(堆栈指针) 栈*/
	ldr sp, = 4096 
	/*对Nand来说,从0地址到4k空间对应的是片内内存*/
	/*将栈设置在这4k内存的顶部*/

// ldr sp, = 0x40000000 + 4096/*nor启动*/

/*调用main函数*/
	bl main /*跳转过去执行main,并且把返回地址保存起来*/

halt:
	b halt

makefile如下

all:
	arm-linux-gcc -c start.S -o start.o
	arm-linux-gcc -c led.c -o led.o
	arm-linux-ld -Ttext 0 led.o start.o -o led.elf#链接
	arm-linux-objcopy -O binary -S led.elf led.bin
	arm-linux-bojdump -D led.elf > led.dis#反汇编
clean:
	rm *.bin *.o *.elf

注意:makefile中的注释是#,如果用//会导致makefile报错

调错

这里的代码并不能成功点灯
在这里插入图片描述
左边是错误的代码,因为上面的makefile中有错误
在这里插入图片描述
链接顺序应该是先将分配地址的汇编文件放在前面

结果只是点亮一个灯,故此处不再演示

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/130727.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • js浅拷贝和深拷贝的区别_前端面试深拷贝和浅拷贝

    js浅拷贝和深拷贝的区别_前端面试深拷贝和浅拷贝1、JS数据类型基本数据类型:Boolean、String、Number、null、undefined引用数据类型:Object、Array、Function、RegExp、Date等2、深拷贝与浅拷贝深拷贝和浅拷贝都只针对引用数据类型,浅拷贝会对对象逐个成员依次拷贝,但只复制内存地址,而不复制对象本身,新旧对象成员还是共享同一内存;深拷贝会另外创建一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。区别:浅拷贝只复制对象的第一层属性,而深拷贝会对对象的属性进行递归

    2022年10月1日
  • 最小二乘法的详细推导过程-比之前见过的推导都简单!!!

    最小二乘法的详细推导过程-比之前见过的推导都简单!!!最小二乘法发展于天文学和大地测量学领域,科学家和数学家尝试为大航海探索时期的海洋航行挑战提供解决方案。准确描述天体的行为是船舰在大海洋上航行的关键,水手不能再依靠陆上目标导航作航行。来源:我是码农,转载请保留出处和链接!本文链接:http://www.54manong.com/?id=1203(function(){vars=”_”+Ma…

    2022年5月16日
  • QGIS使用之基本介绍和安装教程

    QGIS使用之基本介绍和安装教程今天,小崇想和大家介绍一下QGIS的基本知识。希望我们互相学习,共同进步!何为QGIS?QGIS(QuantumGIS)是一款免费的桌面GIS软件,可运行在Linux、Unix、MacOSX和Windows等平台。QGIS是基于Qt,使用C++开发的一个用户界面友好、跨平台的开源版桌面地理信息系统。它主要提供GIS数据的显示、编辑和分析、制图等功能。QGIS的主要特点有:(1)免费开源。(正版ArcGIS价格不菲)(2)支持PostGIS数据库。(3)支持从WMS,WFS服务器中获取

    2022年6月17日
  • 返回给前端的json,long转string

    返回给前端的json,long转stringpackagecom.zhidianfan.ydusermanager.config;importcom.fasterxml.jackson.databind.ObjectMapper;importcom.fasterxml.jackson.databind.module.SimpleModule;importcom.fasterxml.jackson.databind.ser.s…

    2022年5月14日
  • ORA-12154 问题解决办法

    ORA-12154 问题解决办法问题 ORA-12154: TNS:couldnotresolvetheconnectidentifierspecified,即无法解析指定的连接标识符。这说明缺少了一个环境变量,TNS_ADMIN。    解决方法:右击我的电脑->属性 ->高级 ->环境变量->系统变量->新建,    变量名为:TNS_A

    2022年7月24日
  • 天气预报api免费接口_天气API

    天气预报api免费接口_天气API网上几乎所有的天气接口都需要注册key,然后还各种频率限制,每天调用次数才几百次?太坑爹了吧一个简单的天气预报功能,为什么要搞的这么复杂,收什么费?推荐一个真正免费的天气API接口,返回json,jsonp格式没有调用次数、频率和IP限制,并且提供7日天气/15日天气/40日天气/小时预报/生活指数/空气质量/预警信息调用也很简单,一行代码搞定,可在A…

    2022年8月30日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号