资源描述
1.嵌入式系统的定义:
嵌入式系统是指以应用为中心,以计算机技术为基础,并且软硬件可裁减,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
2.三个基本要素:嵌入性、专用性与计算机系统。
3.Embedded System
4. 嵌入式系统发展的4 个阶段
1)以单片机为核心的低级嵌入式系统
2)以嵌入式微处理器为基础的初级嵌入式系统
3)以嵌入式操作系统为标志的中级嵌入式系统
4)以Internet 为标志的高级嵌入式系统
5. 基于32位/64位微处理器的嵌入式系统的优势:
① 芯片内外资源丰富,硬件系统简单;
② 可运行各种操作系统,降低了复杂系统应用程序开发的难度;可运行多种操作系统,应用程序开发难度降低,系统人机界面友好;
③ 系统数据处理能力强,控制精度高;
④ 有成熟的开发工具,丰富的开发资源和资料;
⑤ 32位/64位的嵌入式系统的开发人群不断增多,有助于降低企业项目开发成本、保持开发的连续性。
6.嵌入式系统的硬件:
由电源模块、嵌入式处理器、存储器模块、可编程逻辑器件、嵌入式系统周边元器件、各种I\O接口、总线以及外部设备和插件等组成。
7.嵌入式系统的软件:
中间层程序、嵌入式操作系统、应用软件层。
8.嵌入式处理器的种类:
嵌入式微处理器(Embedded Microcomputer Unit,EMPU):例如arm、PowerPC等
嵌入式微控制器(Embedded Microcontroller Unit,EMCU):例如单片机
嵌入式数字信号处理器(Embedded Digital Signal Processor,EDSP):专用于数字信号处理的微处理器
嵌入式片上系统(System On Chip,SOC):将一个完整的产品的各功能集成在一个芯片上或芯片组上
嵌入式可编程片上系统(System On a Programmable Chip,SOPC):基于FPGA的可重构SOC
9.嵌入式操作系统特点:
编码体积小、面向应用、实时性强、可移植性好、可靠性高以及专用性强
10.常用嵌入式操作系统:
Linux、μC/OS-II、Windows CE、VxWorks、苹果iOS、Android。
11.嵌入式系统的总体考虑
1)嵌入式微处理器及操作系统的选择:嵌入式微处理器和操作系统种类繁多,根据需要选择
2)开发工具的选择:开发工具繁多,在同一系统下开发的不同阶段也可以使用不同的开发工具,根据需要来选择
3)对目标系统的观察与控制:由于嵌入式硬件系统千差万别,软件模块和系统资源也多种多样,因此要使系统能正常工作,软件开发者必须要对目标系统具有完全的观察和控制能力。
12.嵌入式系统的设计方法
1)传统的设计方法:
①需求分析;②硬软件的设计、开发、调试、测试;③系统集成;④集成测试;⑤若系统正确,则结束;⑥若出现错误,则需要对硬软件分别验证和修改;⑦返回第③步。
由于将硬软件分别开发,因此各自部分的修改和缺陷很容易导致系统集成时出现错误。
2)软硬件协同设计
①需求分析;②硬软件协同设计;③硬软件实现;④硬件软协同测试和验证。
优点是在协同设计、协同测试、协同验证的基础上,充分考虑了硬软件的关系,并在设计额每个层次上进行测试验证,使得尽早发现和解决问题,避免灾难性错误的出现,这样提高了系统开发效率,也降低了开发成本。
13.嵌入式系统的开发环境组成:
宿主机:开发主机
调试仿真器:通用芯片,不是专用的,软硬件综合起来,模拟多种芯片工作
目标机
14.嵌入式系统的调试工具:
指令集模拟器、驻留监控软件、JTAG仿真器(joint test action group)、在线仿真器
15.嵌入式系统的应用模式:
1)非操作系统层次的应用:用于结构简单或实时性要求非常高的系统中;
2)操作系统非GUI层次的应用:应用程序建立在操作系统基础上,是为了实现程序的多任务及实时性;
3)操作系统GUI层次的应用:方便实现人机交互功能、网络功能、数据库功能以及其他更复杂的应用
16.嵌入式应用软件开发的特点:
1)需要交叉编译工具:①目标机上的资源较为有限,直接在目标机上开发和调试应用软件几乎不可能;②嵌入式系统微处理器的指令系统与PC处理器芯片指令系统不同;
2)通过仿真手段进行调试:目标机调试排错是非常困难的,原因是输入输出方式较少,多数嵌入式系统显示面积小,甚至没有显示屏,从而无法显示调试信息;调试工具需要较大存储空间;
3)目标机是最终的运行环境:开发、调试在PC上完成,运行在目标机上;
4)执行应用程序的指令通常需要写入操作系统:在PC上应用程序的执行是在操作系统的图形用户界面或命令状态下进行的,操作系统与该应用程序无直接联系,但嵌入式系统中,应用层序的启动执行指令需要预先写入操作系统的任务调度程序里,编译在目标程序中;
5)系统资源有限:对目标程序有严格的长度限制;
6)控制特定部件:需要针对特定的部件做更加细致的编写作业,如键盘,目标机上要多个ASCII码输入码被分配到一个键上。
17.嵌入式处理器内核种类
MIPS公司的MIPS处理器内核;ARM公司的ARM处理器内核;IBM、Apple以及Motorola公司联合开发的PowerPC;Motorola公司的68K/COLDFIRE
嵌入式处理器内核是一项设计技术,并不是一个芯片
18.ARM体系结构的技术特征
1)单周期操作:ARM指令系统在一个机器周期内完成简单和基本的操作
2)采用加载/存储指令结构:存储器访问指令的执行时间长,因此只采用了加载和存储两种指令对存储器进行读和写的操作,面向运算部件的操作都经过加载指令和存储指令,从存储器取出后预先存放到寄存器对内,以加快执行速度。
3)固定的32位长度指令:指令格式固定为32位长度,使指令译码结构简单,效率提高。
4)3地址指令格式:采用三地址指令格式、较多寄存器和对称的指令格式便于生成优化代码
5)指令流水线技术:ARM采用多级流水线技术,以提高指令执行的效率。
19.ARM处理器的工作状态:
ARM状态:32位指令状态
Thumb状态:16位Thumb指令的状态
20.ARM处理器的工作模式:
用户模式User、快速中断模式FIQ、外部中断模式IRQ、管理模式SVC、中止模式ABT、未定义指令模式UND、系统模式SYS
Interrupt request,Supervisor,abort
21.ARM状态下的寄存器
R0-R7通用寄存器
R8-R12 FIQ模式不同 形如R8_fiq
R13-R14 每个模式都不同
R13:SP,堆栈指针
R14:LR(link register),程序连接寄存器
R15:PC,当前状态寄存器
CPSR:程序状态寄存器,4位条件码标志(N:符号标志;Z:全0标志;C:进借位标志(加法进位C=1;减法借位C=0);V:溢出标志(有是1,没有是0))、1位Q标志(增强的DSP运算指令溢出或饱和标志)及8位控制标志(I:禁止外部中断控制位;F:禁止快速中断控制位;T:与Thumb指令切换控制位;M4~M0:模式选择位)
22.ARM异常种类及异常中断向量
7种类型的异常分成6级,优先级由高到低依次是:
1)复位(RESET)异常;
2)数据访问中止(DABT)异常;
3)快速中断请求(FIQ)异常;
4)外部中断请求(IRQ)异常;
5)指令预取中止(PABT)异常;prefetch
6)软件中断(SWI,software)异常和未定义的指令(UND)异常最低优先级。software
每半字节一个异常类型地址段
复位异常的优先级最高,因此任何情况下,只要进入复位状态,系统无条件地将PC指向0x00000000处,去执行系统第一条指令。通常此处放一条无条件的转移指令,转移到系统初始化程序处
23.ARM存储字数据的格式
大端格式(高字节优先放)、小端格式
24.ARM微处理器的数据类型
字节(8位)、半字(16位)、字(32位)
字需要4字节对齐(地址的低两位为0)
半字需要2字节对齐(地址的低两位为0)
25.流水线技术:
所谓流水线电路,就是将一个电路系统或电路系统的大的数据处理电路模块分成几个小的数据处理电路模块,并且沿着数据通路引入流水锁存器,这样就可以减小有效关键路径,从而提高系统的时钟速度或采样速度,或者可以在同样的速度下降低功耗。电路中的关键路径,是指数据流图DFG中具有零延时的所有路径中据欧最长运算时间的路径。流水线的两个主要缺点是增加了锁存器数目和系统的迟滞。
一个流水线电路系统的速度(或时钟周期)由任意两个锁存器间,或一个输出和一个锁存器,或一个锁存器和一个输出间,或输入与输出之间路径中最长的路径限定。这个最长的路径或“关键路径”可以通过在电路系统中适当地插入流水线锁存器来减小。
在一个M级流水线系统中,从输入到输出的任一路径上的延时元件数目是(M-1),它要大于在原始时序电路中同一路径上的延时元件数。若要使电路正常工作,相邻的两个寄存器之间路径的时延应小于寄存器的时钟信号CLK的周期 Tclk ,亦即流水线锁存器的时钟周期Tclk应大于所有功能部件中的最长执行时间。同时要使流水线电路正常工作,并且系统处理速度尽可能快,流水线数据通路上的各个功能部件的执行时间因尽可能均衡。
tmax≤Tclk
26.ARM指令格式
每条ARM指令都是32位
<Opcode>{<Cond>}{S} <Rd>,<Rn>,<shift_op2>;
指令的操作码,如MOV
指令执行的条件域(即条件码,EQ,NE等)
指令的执行结果会影响CPSR中相应的状态标志
目的寄存器
必须是寄存器
可以使寄存器、内存存储单元或立即数
后为注释
27.操作数符号
立即数符号:#
二进制数符号:%
二进制数符号:2_
十六进制数符号:0x
更新基址寄存器符号:!
复制SPSR到CPSR符号:^
指示寄存器列表范围符号“-”
28.ARM指令中的移位操作
1)逻辑左移:LSL,补0(shift)
2)逻辑右移:LSR,补0
3)算术左移:ASL,补0(arithmetic)
4)算术右移:ASR,用符号位填充
5)循环右移,ROR,(rotate)
6)带扩展的循环右移:RRX(rotate right with extend),进位标志位填充
29.寻址方式
寄存器寻址:利用寄存器中的数值作为操作数
寄存器间接寻址:将寄存器中的值作为操作数的地址,而操作数本身放在存储器中
基址加变址寻址(也是间接寻址):将寄存器的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址
多寄存器寻址(块拷贝寻址)(也是间接寻址):最多传送16个通用寄存器的值,是LDM/STM的寻址方式
30.ARM条件码
CPSR:程序状态寄存器,4位条件码标志(N:符号标志;Z:全0标志;C:进借位标志(加法进位C=1,没有C=0;减法借位C=0,无借位即C=1);V:溢出标志(有是1,没有是0))、1位Q标志(增强的DSP运算指令溢出或饱和标志)及8位控制标志(I:禁止外部中断控制位;F:禁止快速中断控制位;T:与Thumb指令切换控制位;M4~M0:模式选择位)
EQ(equality):相等,Z=1
NE(not equality):不相等,Z=0
CS(carry set):无符号数大于或等于,C=1
CC:无符号数小于,C=0
MI(minus):负数,N=1
PL(plus):正数或零,N=0
VS(overflow set):溢出,V=1
VC:未溢出,V=0
HI(higher):无符号数大于,C=1、Z=0
LS(less or same):无符号数小于或等于,C=0、Z=1
GE(greater or equal):带符号数大于或等于,N=V
LT(less then):带符号数小于,N=!V
GT(greater then):带符号数大于,Z=0,N=V
LE(less or equal):带符号数小于或等于,Z=1或N!=V
AL(always):忽略
31.ARM指令集
MOV R1,R0,LSL#3;将寄存器R0的值左移3位后传送到R1
MOV PC,R14;将寄存器R14的值传送到PC,常用于子程序返回
CMP:比较两个操作数,同时更新CPSR中条件标志位的值,该指令进行一次减法运算,但不存储结果,只更改条件标志位
TST:按位与运算,并更新CPSR中条件标志位的值,操作数1是测试数据,2是掩码
TST R1,#%1;测试R1中是否设置了最低位
(可加S)ADD R0,R2,R3,LSL#1;R0=R2+(R3<<1)
(可加S)ADC
(可加S)AND R0,R0,#3;该指令保持R0的0、1位,其余位清零
(可加S)ORR
(可加S)EOR
(可加S)BIC R0,R0,#%1011;清除R0中的位0、1和3,其余的位保持不变
(可加S,multiply)MULS R0,R1,R2;R0=R1*R2,同时设置CPSR中的相关条件标志位
(可加S,multiplication and addition)MLA R0,R1,R2,R3;R0=R1*R2+R3
转移指令:BEQ Label;当CPSR寄存器中的标志位Z置位时,程序跳转到标号Label处执行
带状态切换的转移指令:BX:如果Rn中的最低位为1,则指令将CPSR的T标志置1,切将目标地址的代码解释为Thumb
带返回的转移指令:BL:会在寄存器R14中保存PC的当前值
BL Label;程序无条件跳转到标号Label处执行的,同时,将当前PC值保存到R14中
LDR(load data from rom):从存储器中将一个32位的字数据传送到目的寄存器中。出栈
LDR R0,[R1];将存储器地址为R1的字数据读入寄存器R0
LDR R0,[R1,R2];将存储器地址为R1+R2的字数据读入寄存器R0(没有更新地址)
LDR R0,[R1,#8];将存储器地址为R1+8的字数据读入寄存器R0(没有更新地址)
LDR R0,[R1,R2]!;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1
LDR R0,[R1],R2;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2写入R1
LDR R0,[R1,R2,LSL#2]!;将存储器地址为R1+R2×4的字数据读入R0,并将新地址R1+R2×4写入R1
LDR R0,[R1],R2,LSL#2;将存储器地址为R1的字数据读入寄存器R0,并将新地址R1+R2×4写入R1
LDRB:8位的字节数据
STR(store into rom):从源寄存器中将一个32位的字数据传送到存储器中。进栈。
STR R0,[R1],#8;将R0的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1
STR R0,[R1,#8];将R0中的字数据写入以R1+8为地址的存储器中
批量数据加载指令:LDM(memory):将由基址寄存器所指示的一片连续存储器中的数据传送到寄存器列表所指示的多个寄存器中
堆栈是先进后出方式
(地址基址不能为R13)
IA(increase after)--传送后地址加1;
IB(increase before)--传送前地址加1;
DA(decrease after)--传送后地址减1;
DB(decrease before)--传送前地址减1;
(地址基址为R13,SP)
FD(full descend)--满递减堆栈
ED(empty descend)--空递减堆栈
FA(full ascend)--满递增堆栈
EA(empty descend)--空递增堆栈
满栈(full stack)----栈指针指向栈顶元素(即最后一个入栈的数据元素)
空栈(empty stack)----栈指针指向与栈顶元素相邻的一个可用数据单元,也就是说栈指针指向第一个没有使用的地址或者空位置
递增堆栈:堆栈由低地址向高地址生成
递减堆栈:堆栈由高地址向低地址生成
LDMFD R13!,{R0,R4-R12,PC};将由R13指示的堆栈内容恢复到寄存器R0、R4~R12及程序计数器(PC)中
STMFD R13!,{R0,R4-R12,LR};将寄存器R0、R4~R12以及LR的值存入由R13指示的堆栈中
LDMIA 从...数据区装载...个字数据到...
STRIA 将...中的...个字数据存入...数据区
入栈保护:出栈和入栈工作方式要对应
{}内的就是指寄存器,且为寄存器寻址
32.ATPCS:ARM-Thumb Procedure Call Standard(ARM-Thumb过程调用规范)
内容:各寄存器的使用规则及其相应的名字、数据栈的使用规则、参数传递的规则
33.ARM处理器芯片的选择原则
1)ARM内核:任何一款基于ARM技术的微处理器都是以某个ARM内核为基础设计的,即ARM内核的基本功能决定了嵌入式系统最终实现目标的性能。因此,ARM处理器芯片的选择的首要任务是考虑选择基于什么架构的ARM内核
2)系统时钟频率:系统时钟频率决定了ARM芯片的处理速度,时钟频率越高,处理速度越快。
3)芯片内部存储器的容量:大多数ARM微处理器芯片的内部存储器的容量都不太大,需要用户在设计系统时外扩存储器,但也有部分芯片具有相对较大的片内存储空间
4)片内外围电路:设计者应分析系统的需求,尽可能采用片内外围电路完成所需的功能,这样既可简化系统的设计,也可提高系统的可靠性。
5)其他因素,除以上需要考虑的内部因素外,在某些特殊需要的场合,应选择符合这些特殊要求的ARM微处理器芯片,如工作环境、工作电压要求、功耗要求、体积要求及成本要求等
34.WDT组件的构成
MUX:multiplexer
WDT组件用于监视程序的运行状态
WTCON用于控制预分频系数、确定是否允许WDT、是否允许输出复位信号等
WTDAT用于存放计数值
WDT用于存放看门狗定时器在正常操作下的当前计数值
先根据设定的WTCON中的[WTCON15~WTCON8]的值选择对主频时钟MCLK的分频值和根据[WTCON4 WTCON3]的值选择计数所需的时钟,再根据设定的WTDAT的值通过WTCNT来进行减法计数,最后根据WTCNT的计数结果及输出控制信号[WTCON2、WTCON0]输出有关结果,当没有加以干预而计数到0时,产生中断输
出并产生复位信号(RESET)来使系统复位。
15~8:prevalue,预分频值:0~255
7,6保留:正常为00
5:WDTEN(enable),WDT组件允许,0=禁止;1=允许
4,3:00=1/16;01=1/32;10=1/64;11=1/128
2:INTEN,中断允许,0禁止;1允许
1:保留,正常为0
0:RESETEN,复位允许,0禁止;1允许
WTDAT,WTCNT都16位
35. 微处理器中控制寄存器的含义及作用
1) 控制寄存器是一个特定的存储单元,而控制寄存器各位的定义由微控制器/微处理器的内部硬件结构决定,所以控制寄存器各位的定义是控制编程的依据。
2))控制寄存器是人机信息交互的桥梁,而人或机器对某个功能组件的控制指令首先必须通过编程给控制寄存器赋值,再通过CPU对控制寄存器的读操作将有关操作控制信号或操作数据传递给该功能组件。当这些操作控制信号或操作数据有效时,该功能组件就会执行特定的操作。
36.不同数据宽度的存储器地址线连接方法
对于8位数据宽度的存储器组织,存储器地址线与系统地址总线直接相连;
对于16位数据宽度的存储器组织,存储器的地址线与系统总线要错一位相连;对于32位存储器组织,存储器的地址线与系统总线要错两位相连。
地址范围为0x00000000~0x001FFFFF
37.NOR Flash:由或非门组成单元的Flash存储器,读取速度快,擦写速度慢,用于程序代码的存放
NAND Flash:由与非门组成存储单元的Flash存储器,擦写速度快,用于数据存放
38.PWM波形程序的设计思想:
1)计算:先选定用于产生PWM波形的计数器的时钟信号频率,再产生PWM波形的频率和占空比的要求,计算出控制PWM波形频率和占空比的计数常数。
2)控制:确定波形信号频率和控制常数之后,PWM波形产生的过程就是一个根据计数的结果控制PWM输出的过程:当计数值小于控制占空比的计数常数时,计数器进行累积加1操作,并输出高电平;当大于或等于占空比的计数常数时,进行累积加1操作,并输出低电平
3)直到计数器累积到控制频率的计数常数位置再通过手动或自动进行控制计数常数的装载,并重复相同的操作
39.常用嵌入式Linux系统
RT-Linux、μCLinux、ARM-Linux、Redhat-Linux、XLinux、红旗嵌入式Linux
40.嵌入式Linux系统内核:
①系统引导工具;②Linux微内核和初始化进程;③硬件驱动程序;④硬件驱动程序;⑤硬件接口程序;⑥应用程序组
41.Linux文件系统层次
1)上层用户空间的应用程序对文件系统的系统调用:用户空间包含一些应用程序和GUN C库,用来为文件系统调用用户接口。系统调用接口的作用就像是交换器,它将系统调用从用户空间发送到内核空间中的适当断点。系统调用实际上是通过调用内核虚拟文件系统提供的统一接口来完成对各种设备的使用
2)虚拟文件系统VFS:把各种具体的文件系统的公共部分抽取出来,形成一个抽象层,是系统内核的一部分
3)挂载到VFS中的各种文件系统:各种具体的操作由具体的文件系统按照各自的方式自己实现,这些文件系统都导出一组通用接口,供VFS使用
42.嵌入式Linux内核的移植
1)移植内核准备工作:在虚拟机安装好操作系统,并建立好交叉编译环境,获取Linux内核、文件系统和各种工具;
2)修改Linux源码参数:①解压内核源码;②对内核进行默认配置修改;③修改平台输入时钟;④修改机器号;
3)配置Linux内核:①有关CPU平台的选项;②配置目标版资源;③配置文件系统
4)编译Linux内核;⑤烧写镜像到开发板
43.Boot Loader的作用:
系统的引导装载程序,在操作系统内核或用户程序之前运行的一段小程序,通过这段小程序可以初始化硬件设备和建立内存空间的映射图,将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境。
44.常用的嵌入式Boot Loader有vivi、U-Boot、RedBoot、ARMBoot、Blob和DIY
45.Boot Loader的操作模式
①启动加载模式;②下载模式
46. 循环累加队列程序(不是C语言不用分号,分号是解释用的)
.GLOBAL _START
.TEXT
_START:
MOV R4,#0
LDR R0,=ARRAY
LOOP:
LDR R1,[R0],#4
ADD R4,R4,R1
CMP R1,#0
BNE LOOP
STOP: B STOP
.LTORG
ARRAY: .LONG 0X11,0X22,0X33,0X44,0X55,0X66,0X77,0X88,0X99,0X0
.END
R0指向存储器的数
R1中间寄存器
R4放结果
.global <symbol> 全局声明标志,在程序中声明一个全局标号,该标号可在其他的文件中引用。(与armasm中的EXPORT相同)
.text 定义指令段
.long expressions: 定义一个长整型, 并为之分配空间.
.ltorg: 表示当前往下的定义在归于当前段,并为之分配空间.定义数据缓冲池(文字池)
当程序中使用LDR之类的指令时,数据缓冲池的使用可能越界。为防止越界发生,可使用LTONG伪操作定义数据缓冲池。通常大的代码段可以使用多个数据缓冲池。ARM汇编编译器一般把数据缓冲池放在代码段的最后面,即下一代码段开始之前,或者END伪操作之前。LTORG伪操作通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误的将数据缓冲池中的数据当作指令来执行。
Literal organizations
.end 汇编结束
47. 累加求和程序参考答案
.GLOBAL _START
.TEXT
.EQU NUM,100
_START:
MOV R0,#0
MOV R1,#1
LOOP:
ADD R0,R0,R1
ADD R1,R1,#1 ;CMP R1,#NUM;
EORS R2,R1,#(NUM+1) ;ADD R1,R1,#1;
BNE LOOP
STOP: B STOP
.END
R0结果
R1加数
48. 阶乘程序
.GLOBAL _START
.TEXT
.EQU NUM,10
_START:
MOV R2,#1
MOV R3,#0
JIA:
BL JIECHEN
ADD R3,R3,R1
CMP R2,#NUM
ADD R2,R2,#1
BNE START
B STOP
JIECHEN:
MOV R0,#1
MOV R1,#1
LOOP:
MUL R1,R0,R1
CMP R0,R2
ADD R0,R0,#1
BNE LOOP
MOV PC,R14
STOP:
B STOP
.END
R0:乘数 R1:N! R2:次数 R3:结果
49. 将数据从源数据区SRC(source)复制到目标数据区DST(destination), 数据的个数NUM假定为20,复制时以4个字为单位进行,对于最后不足4个字的数据,以字为单位进行复制
.GLOBAL_START
.TEXT
.EQU NUM,20
_START:
LDR R0,=SRC
LDR R1,=DST
MOV R2,#NUM
MOV SP,#0x400
BLKCOPY:;block
MOVS R3,R2,LSR#2 ;除,逻辑右移
BEQ COPYWORDS
STMFD SP!,{R4-R7}
QUADRCOPY:;oct-:8,quadr-:4
LDMIA R0!,{R4-R7}
STRIA R1!,{R4-R7}
SUBS R3,R3,#1
BNE QUADRCOPY
LDMFD SP!,{R4-R7}
COPYWORDS:;字复制数量
ANDS R2,R2,#3
BEQ STOP
WORDCOPY:
LDR R3,[R0],#4
STR R3,[R1],#4
SUBS R2,R2,#1
BNE WORDCOPY
STOP:B STOP
.LTORG
SRC:.LONG 1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2 ;source
DST:.LONG 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;destination
.END
R0指向源数据区
R1指向目的数据区
R2字数据个数
R3 4个字的倍数/中间数据寄存器
R4-R7 中间寄存器
50.PWM
TCNTBn:定时器计数缓冲器,Timer counter buff
TCMPBn:定时器比较缓冲寄存器
TCFG0:configuration定时器配置寄存器0,十六进制前6位每一位代表一个时钟的预分频值
23~16:T5、T4
15~8:T3、T2
7~0:T1、T0
定时器输入时钟频率=MCLK/(预分频值+1)除法器
预分频值为0~255,除法器值为2、4、8、16
TCFG1:定时器配置寄存器1,每四位为一个定时器的除法器输入,最高四位是选通通道,0000为都导通
0=1/2, 1=1/4, 2=1/8, 3=1/16
TCON:定时器控制寄存器
0x0为关闭定时器,0xA为手动装载定时器的计数值,0x9为启动定时器
T0:3~0;T1:11~8;T2:15~12;T3: 19~16;T4:23~21;T5: 26~24
频率可调:(C语言,要加分号)
void pwmwave(void)
{
rTCFG0=0xFF;
rTCFG1=0x1;
for(freq=3000;freq<15000;freq+=1000)
{
div=(MCLK/256/4)/freq;
rTCON=0x0;
rTCNTB0=div;
rTCMPB0=(4*div)/5;
rTCON=0xA;
rTCON=0x9;
for(index=0;index<100000;index++);
rTCON=0x0;
}
}
占空比可调
void_pwmwave(void)
{
rTCFG0=0xFF;
rTCFG1=0x1;
div=MCLK/256/4/100000
for(rate=10;rate<100;rate+=10);
{rTCON=0x0;
rTCNTB0=div
rTCMPB0=div*rate/100;
rTCON=0xA;
rTCON=0x9;
for(index;index<100000;index++);
rTCON=0x0;
}
}
51.存储器控制寄存器的配置编程
LDR R0,=SMRDATA
LDMIA R0,{R1-R13}
LDR R0,=0x01C80000
STRIA R0,{R1-R13}
SMRDATA:;set memory restore data
DCD 0x22221210 ;1,3位16位,其他为32位
DCD 0x00000600 ;100,10个时钟
DCD 0x00000700 ;111,14个时钟
DCD 0x00000700
DCD 0x00000700
DCD 0x00000700
DCD 0x00000700
DCD 0x00010000 ;范围是16~0,十六进制第六个数只有1位
DCD 0x00018000
DCD 0x00860459 ;1000,01,10,0000,0,100,0101,1001
DCD 0x0
DCD 0x20
DCD 0x20
52.设置中断向量表
ENTRY:
B ResetHandler
B HandlerUndef
B HandlerSWI
B HandlerPabort
B HandlerDabort
B .
LDR PC,=HandlerIRQ
B HandlerFIQ
VECTOR_BRANCH:
LDR PC,=HandlerEINT0 ;外部中断
LDR PC,=HandlerEINT1
LDR PC,=HandlerEINT2
LDR PC,=HandlerEINT3
LDR PC,=HandlerEINT4567
LDR PC,=HandlerTICK ;RTC(实时钟)时间滴答中断
B.
B.
LDR PC,=HandlerZDMA0
LDR PC,=HandlerZDMA1
LDR PC,=HandlerBDMA0
LDR PC,=HandlerBDMA1
LDR PC,=HandlerWDT
LDR PC,=HandlerUERR01
B.
B.
LDR PC,=HandlerTIMER0
LDR PC,=HandlerTIMER1
LDR PC,=HandlerTIMER2
LDR PC,=HandlerTIMER3
LDR PC,=HandlerTIMER4
LDR PC,=HandlerTIMER5
B.
B.
LDR PC,=HandlerURXD0
LDR PC,=HandlerURXD1
LDR PC,=HandlerIIC
LDR PC,=HandlerSIO
LDR PC,=HandlerUTXD0
LDR PC,=HandlerUTXD1
B.
B.
LDR PC,=HandlerRTC
B.
B.
B.
B.
B.
B.
B.
LDR PC,=HandlerADC
53.拷贝Flash地址0x10000内核到RAM 0x300000中
LDR R0,=0x10000
LDR R1,=0xC300000
ADD R2,R0,#(1536*1024)
COPY_KERNEL:
LDMIA R0!,{R3-R10}
STMIA R1!,{R3-R10}
CMP R0,R2
BLE COPY_KERNEL
54.跳转到RAM中执行内核
LDR R0,=0xC30000
MOV PC,R0
18 / 18
展开阅读全文