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 ...
随机推荐
- 验证进入AppStore的评分界面
NSString * appstoreUrlString = @"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/view ...
- UNION 查询中的排序
MSSQL 不允许在UNION查询中使用 ORDER BY 因此,当我们需要这种功能的时候,就需要绕一些弯路. 比如有一张学生表student 和教师表 teacher , 我们要查询所有的教师学生的 ...
- Qt中单例模式的实现(4种方法)
最简单的写法: 12345 static MyClass* MyClass::Instance(){ static MyClass inst; return &inst;} 过去很长一段时间一 ...
- angularJS中controller的通信
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- CSS3新添加的属性
1.圆角设置 border-radius:15px 50px 30px 5px; /*四个值: 第一个值为左上角,第二个值为右上角,第三个值为右下角,第四个值为左下 角. 三个值: 第一个值为左上角, ...
- [LeetCode]题解(python):062 Unique path
题目来源 https://leetcode.com/problems/unique-paths/ A robot is located at the top-left corner of a m x ...
- LightOj 1090 - Trailing Zeroes (II)---求末尾0的个数
题目链接:http://lightoj.com/volume_showproblem.php?problem=1090 题意:给你四个数 n, r, p, q 求C(n, r) * p^q的结果中末尾 ...
- 浅谈 man 命令的日常使用
Linux系统提供了相对比较丰富的帮助手册(man),man是manual的缩写,在日常linux系统管理中经常用到,今天就简单聊聊man.man 本身也提供自己的帮助手册,通过man就可以查看. ( ...
- OC面向对象—多态
OC面向对象—多态 一.基本概念 多态是基于继承的基础之上的,多态可以使得父类的指针指向子类的对象.如果函数或参数中使用的是父类类型,可以传入父类.子类对象,但是父类类型的变量不能直接调用子类特有的方 ...
- 第九篇 SQL Server安全透明数据加密
本篇文章是SQL Server安全系列的第九篇,详细内容请参考原文. Relational databases are used in an amazing variety of applicatio ...