LED流水灯(二)
记住看汇编的时候是红在上面 黑色在下面

startup.s 程序
; MDK跑马灯实验
;
PRESERVE8 // 字节对齐关键词 ,汇编有8位对齐的要求,要添加
AREA RESET, CODE, READONLY // AREA 伪指令 用于定义一个代码段或数据段,这里就是一个 代码段,段名为 RESET ,定义成 只读 ,参考 http://blog.csdn.net/beyondioi/article/details/7854011
ENTRY // ENTRY伪指令用于指定汇编程序的入口点 ,参考 http://blog.csdn.net/beyondioi/article/details/7854011
start // 作为汇编程序的一个标号,定义了程序的入口,既程序从start:处开始执行。 缺省也是可以的,但是奇怪的是 这里怎么没有 : 冒号啊,不是必须添加的吗???
; 关闭看门狗
ldr r0, = 0x53000000 ; 将看门狗控制寄存器地址放入r0 // 寄存器也是有地址的 参考 s3C2440 手册或者书 99页,watch dog 地址 便是 0x53000000 ,可以看知乎: http://www.zhihu.com/question/30155201?sort=created
mov r1, #0 //
str r1, [r0] ; 设置看门狗控制寄存器的值为0, str 指令 将r1寄存器的值,传送到地址值为r0的(存储器)内存中

bl initmem ; 跳转到initmem代码段,初始化内存 // 黄色箭头指到这里的时候,使用
图标,跳转到 initmem 标号的代码中
IMPORT xmain ; 引入xmain.c中的xmain函数
ldr sp, =0x34000000 ; 调用C程序之前先初始化栈指针
ldr lr, =endxmain ; 设置xmain函数的返回地址 为什么PC+ 0x0070 
ldr pc, =xmain ; 跳转到C程序中的xmain函数的入口处执行
endxmain
ldr r0, =0x56000010 ; LED的GPIO接口配置寄存器
ldr r1, =0x00015400 ; GPIO配置数据
str r1, [r0] ; 设置GPIO
ldr r0, =0x56000014 ; LED控制寄存器地址
ldr r1, =0x000000e0 ; 全部LED亮
str r1,[r0]
loop
b loop ; 死循环
initmem ; 内存初始化
ldr r0, =0x48000000 ; 加载内存相关寄存器首地址r0
ldr r1, =0x48000034 ; 加载内存相关寄存器尾地址到r1 // 相当于 LDR R1 ,[PC,#0x0058] 参考书 ARM体系(P85也),将内存单元 PC+0x0058 中的字读取到 R0 寄存器中,

与
计算机为什么会 这样做呢?? PC=0x3C 加上 0x58 还是 94啊 不是 9C 相差了 8位,有点乱了,不过差不多了
adr r2, memdata ; 将寄存器配置数据地址段首地址加载到r2
PC=0x000040 + 0x00010 = 0x00050 + 8 (也相差8位),读到了, R2=58 ,这么说来 R2 原来就是 0
initmemloop
ldr r3, [r2], #4 ; 循环设置存寄存器 ,将地址为R2的内存单元数据读取到 r3 中,并且 R1=R1+4
str r3, [r0], #4 ; 与上面一样
teq r0, r1
bne initmemloop ; 循环到最后一个寄存器时退出函数,BNE指令,是个条件跳转,即:是“不相等(或不为0)跳转指令”。如果不为0就跳转到后面指定的地址,继续执行

BX lr ; mov pc,lr
memdata
DCD 0x22000000 ;BWSCON // PC 指针 0X000058
DCD 0x00000700 ;BANKCON0
DCD 0x00000700 ;BANKCON1
DCD 0x00000700 ;BANKCON2
DCD 0x00000700 ;BANKCON3
DCD 0x00000700 ;BANKCON4
DCD 0x00000700 ;BANKCON5
DCD 0x00018005 ;BANKCON6
DCD 0x00018005 ;BANKCON7
DCD 0x008e07a3 ;REFRESH
DCD 0x000000b1 ;BANKSIZE
DCD 0x00000030 ;MRSRB6
DCD 0x00000030 ;MRSRB7
END
第二个函数 cmain.c 函数
/*C语言函数*/
/*端口F寄存器预定义*/ #define GPBCON (*(volatile unsigned long *)0x56000010) // GPBCON 控制寄存器的地址
#define GPBDAT (*(volatile unsigned long *)0x56000014)
#define LEDS (1<<5|1<<6|1<<7|1<<8)
#define DELAYVAL (0xffff) extern int delay(int time); /*声明汇编函数*/ int xmain(void)
{
int i = ;
GPBCON = 0x00015400;// 定义了 四个LED 都为输出端口
while(i>)
{
GPBDAT=(GPBDAT&(~LEDS)) | (<<|<<|<<); // LED1 亮了,其余灭
delay(DELAYVAL);//调用汇编语言编写的延时程序 GPBDAT=(GPBDAT&(~LEDS)) | (<<|<<|<<); // LED2 亮了,其余灭
delay(DELAYVAL);//调用汇编语言编写的延时程序 GPBDAT=(GPBDAT&(~LEDS)) | (<<|<<|<<); // LED3 亮了,其余灭
delay(DELAYVAL);//调用汇编语言编写的延时程序 GPBDAT=(GPBDAT&(~LEDS)) | (<<|<<|<<); // LED4 亮了,其余灭
delay(DELAYVAL);//调用汇编语言编写的延时程序
i--;
}
return ;
}
现在我们主要老讨论下面这两行代码:
#define LEDS (1<<5|1<<6|1<<7|1<<8)
GPBDAT=(GPBDAT&(~LEDS)) | (1<<6|1<<7|1<<8); // LED1 亮了,其余灭 这个可以去看 另外一篇 LED 随笔,终于懂了啊
LED流水灯(二)的更多相关文章
- 第一个FPGA工程—LED流水灯
这一章我们来实现第一个FPGA工程-LED流水灯.我们将通过流水灯例程向大家介绍一次完整的FPGA开发流程,从新建工程,代码设计,综合实现,管脚约束,下载FPGA程序.掌握本章内容,大家就算正式的开始 ...
- S3C6410裸奔之旅——RVDS2.2编译、仿真、调试过程 LED流水灯---转的
S3C6410裸奔之旅——RVDS2.2编译.仿真.调试过程 LED流水灯 (2012-10-13 23:56:30) 转载▼ 标签: s3c6410裸奔 ok6410 rvds2.2 rvds2.2 ...
- 使用CCS10新建TMS320F28335工程并闪烁LED(流水灯)程序
学习TMS320F28335使用Code Composer Studio 10.4.0下载和安装本文不再叙述. 1. 新建工程 1.1选择目录新建工作区 1.2打开软件界面如下图所示: 1.3选择新建 ...
- 学习笔记——单片机简介 & 点亮LED & 流水灯 & 电路基础【更新Ing】
视频地址:https://www.bilibili.com/video/av10765766 超详细!!!!!! 单片机内部三大资源 [资源:单片机可提供使用的东西] FLASH 可以重复擦写 断电后 ...
- 关于LED 流水灯的软件调试方法(非开发板调试)
因为: 硬件 norflash 有寿命,所以尽量少用,而且自己也不会把 程序在 KEIL中从SDRAM 中调试,不会设置.所以采取软件虚拟的方法调试. 主要修改一下几部分: 1. ledcircle ...
- TQ210裸机编程(2)——LED流水灯
两个文件start.S和led.c start.S .global _start @声明一个全局的标号 _start: bl main ...
- [DM8168]Linux下控制GPIO实现LED流水灯
首先加载驱动模块,应用程序通过调用API实现GPIO控制功能. 驱动程序: /* * fileName: led_gpio.c * just for LED GPIO test * GP1_14 -& ...
- 利用简单的有限状态机(FSM)来实现一个简单的LED流水灯
有限状态机,(英语:Finite-state machine, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型. 有限状态机是指输出取决于过去 ...
- (一)GPIO 编程实验 LED 流水灯控制
7个寄存器 是R1-R16.(当然,里面有很多是分几个模式的,所以总共有37个)类似于单片机的R0-R7. GPXCON,GPXDAT等等是另外的寄存器,应该叫,特殊功能寄存器,类似于单片机的P0,P ...
随机推荐
- Union Find and search
1.POJ2488 A Knight's Journey search #include<iostream> #include<cstring> #include<alg ...
- Redis学习笔记(9)-管道/分布式
package cn.com; import java.util.Arrays; import java.util.List; import redis.clients.jedis.Jedis; im ...
- Delphi调用约定
Register Calling Convention Ojbect Pascal的默认调用约定为register,寄存器调用约定会将前三个参数依次放入eax,edx,ecx,返回值是eax(根据类型 ...
- 软件工程概论---max单元测试
题目:一个单元测试,查找list[]中的最大值 编写一个程序对Largest函数进行测试,列举所有测试用例. 思路:首先确保数组不为空,和数组长度不为0,否则输入错误.根据老师所给的函数写一个主函数, ...
- Spring中Quartz的最精简的配置
<bean id="parserJob4Pos" class="org.springframework.scheduling.quartz.JobDetailBea ...
- Face The Right Way---hdu3276(开关问题)
题目链接:http://poj.org/problem?id=3276 题意:n牛头排成一排,每头牛两个状态,向前或向后,为了让所有的牛都向前,现在有一个机器 每次 能控制连续K头牛转换自己的状态,求 ...
- BetterZip,支持rar等多种压缩解压方式(Xcode自身不能解压rar)
百度云盘下载链接: http://pan.baidu.com/s/1sk7Faw9密码: muw7 rarosx-5.3.0.tar.gz1.解压之后放到/usr/local/目录下(位置可选,不过要 ...
- http://blog.csdn.net/yangyuhan156/article/details/48899439
http://blog.csdn.net/yangyuhan156/article/details/48899439
- JavaScript:复选框事件的处理
复选框事件的处理 复选框本身也是多个组件的名字相同.所以在定义复选框的同事依然要使用document.all()取得全部的内容. 范例:操作复选框,要求是可以一个个去选择选项,也可以直接全选,全选按钮 ...
- shell脚本编程-使用结构化命令(if/else)(转)
11.1 使用if-then语句 格式如下 if语句会执行if行定义的那个命令,如果该命令的退出状态码是0,则then部分的语句就会执行,其他值,则不会 1 2 3 4 if command th ...