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)
上一篇 2022年6月13日 下午3:46
下一篇 2022年6月13日 下午3:46


相关推荐

  • 数据分析系统DIY3/3:本地64位WIN7+matlab 2012b訪问VMware CentOS7+MariaDB

    数据分析系统DIY3/3:本地64位WIN7+matlab 2012b訪问VMware CentOS7+MariaDB

    2022年1月30日
    47
  • Win知识 – 程序是怎样跑起来的(合集)

    Win知识 – 程序是怎样跑起来的(合集)操作系统的硬件控制功能,通常是通过一些小的函数集合体的形式来提供的。这些函数及调用函数的行为统称为系统调用(systemcall),也就是应用对操作系统(system)的功能进行调用(call)的意思。在前面的程序中用到了time()及printf()等函数,这些函数内部也都使用了系统调用。这里之所以用“内部”这个词,是因为在Windows操作系统中,提供返回当前日期和时刻,以及在显示器中显示字…

    2022年6月28日
    33
  • ATA考试注意事项「建议收藏」

    ATA考试注意事项「建议收藏」一、考试前将所有计算机除掉还原卡及还原软件。二、officeXp安装要用完全安装。三、服务器端尽量不要刷新所有客户端否则引起考试管理系统死机。四、拍照功能无法使用,可重新启动考试管理系统。五、服务器端无法扫描到客户端,除了服务器与客户端必须在同一网段内,可看一下客户端是否启动llistening    …

    2022年7月13日
    27
  • 在pytorch中实现十折交叉验证

    在pytorch中实现十折交叉验证本想在网上找个代码 看到大部分写的代码有点乱 有些直接自己把交叉验证代码撸了出来 也不知道对不对 我不敢用 然后我还是自己结合 sklearn 库的交叉验证接口来应用到 torch 中进行交叉验证 关于各种交叉验证方式介绍可看这里 Sklearn 中不同的数据抽样验证方式 下面以 10 折交叉验证为例 结合 sklearn 库 给出一个在 pytorch 中进行 10 折交叉验证的模板 deftrain passdefeval passimportco

    2026年3月17日
    1
  • SM8S33、TVS瞬态抑制二极管在汽车上的问题与应用

    SM8S33、TVS瞬态抑制二极管在汽车上的问题与应用随着经济的发展,现代汽车工业也在的高速发展,汽车的电子化、数字化、自动化、通讯化、自动驾驶等相关模块的成为汽车行主流方向;于此同时系统之间的EMC电磁兼容就显得尤为重要,我们专门为电气化的设计提供了高效的保护方案与应用!汽车电源系统的应用:1.首先了解一下基本情况:虽然高浪涌电压是汽车电路保护系统的应对对象,但是也要注意钳位的电压高度。电源系统,12V与24V的电池在指定的环境下最大输出电压的值。常见的稳压器和DC-DC转换器IC的最大输入电压的值。EMC电磁问题的解决,汽车电子系统是干扰源复杂

    2026年2月21日
    6
  • 长尾分布解决方法

    长尾分布解决方法在 20 世纪 30 年代 美国哈佛大学语言学家齐普夫发现 将一文本中的词按照它们在文本中的出现 或使用 次数由高至低排列 以 r 表示序号 又称等级 g r 表示序号为 r 的词在文本中的出现次数 则 r 的某一幂次 r 和 g r 的乘积渐近为一常数 即 g r r c 人们将关系式 g r cr gt 0 c gt 0 称为齐普夫定律 因而 长尾分布就是齐普夫定律 说人话就是数据不均衡 举个栗子 若你现在要做一个十分类 但是每一类下面的图像数量不一 比如第一个类别样本为 100 第二个类别样本只有 10

    2026年3月18日
    2

发表回复

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

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