> 技术文档 > 嵌入式硬件——ARM

嵌入式硬件——ARM


一、ARM体系结构

1、最小系统:电源、时钟(晶振)、复位、内存、Flash、输入输出

ROM:只读存储,访问速率慢,掉电数据不丢失

RAM:随机存储,访问速率快,掉电数据丢失

flash:结合RAM和ROM的优点的存储

SRAM:静态随机存储

DRAM:动态随机存储 

SSRAM:同步静态随机存储       

SDRAM:同步动态随机存取存储器

DDRn:双倍速率同步动态随机存取存储器

PROM:可编程ROM

EPROM:可擦除PROM

EEPROM:电可擦除PROM

2、CPU:中央处理单元

CU:处理单元//

ALU:运算单元,实现基本的运算单元

R0-R12:通用寄存器,存储数据

PC:程序计数器,指向正在执行的下下条指令,上电默认做自加运算

LR:链接寄存器,保存函数的返回地址

SP:栈指针寄存器,指向栈顶

CPSR:当前程序状态寄存器,运算的结果为0、正、负等,运算中产生的进位、借位等;中断使能,工作状态、工作模式。
SPSR:保存程序状态寄存器,存放CPSR的备份
Cache: CPU和内存之间的缓存,访问速率远高于内存
MMU: 内存管理单元,做虚拟地址到物理地址的转换

3、处理器

有几个CPU就有几核

多核异构:同一个处理集成不同架构的CPU

SOC:片上系统(下图)

AHB:高速总线

APB:外设总线(低速)

RISC:精简指令集(使用20%的指令实现80%的功能)

CISC:复杂指令集(使用100%的指令实现100%的功能)

cortex-A:低功耗、消费类电子

cortex-R:实时性、军工、汽车

cortex-M:高性能、偏控制

DSP:数字信号处理器

FPGA:现场可编程门阵列

4、三大总线(外设)

地址总线:传输地址(单向)

数据总线:传输数据(双向)

控制总线:读写、忙

5、三级存储系统

6、处理器工作模式

特权模式权限比非特权模式高

FIQ>IRQ

7、程序状态寄存器CPRS SPRS

N:结果是否-,Z:结果是零0

8、异常处理

三级流水线:预处理、解码、执行

ARM汇编语言

二、汇编

1、ARM指令集

数据处理指令

Load/Store指令

跳转指令

程序状态寄存器处理指令:完成CPSR的管理

协处理器指令:完成CPU扩展功能的实现

异常产生指令

2、指令格式

3、数据处理指令

6、进位

7、条件if

练习:求和(if+loop)循环

8、函数(难点)

立即数:一个数(或按位取反)循环右移2^n位后中所有的1能放进低8位中,#代表立即数

ldr sp,=0x40001000:将一个地址加载到寄存器中

函数调用的规则:

前四个参数用r0-r3传递,剩余的参数用栈传递(保护现场,恢复现场)

返回值在r0中

 preserve8area reset, code, readonlycode32entrystartldr sp, =0x40001000mov r0,#1mov r1,#2import c_addbl c_addnopb startexport asm_addasm_addstmfd sp!, {r4-r12,lr}add r0,r0,r1ldmfd sp!, {r4-r12,pc}end
int asm_add(int x, int y);int c_add(int a, int b){int sum = asm_add(a, b);return sum;}

5、PSR传送指令

swi #5软中断指令

swi后面的数范围是0-0xffffff

 preserve8area reset, code, readonlycode32entryb startnopb deal_swinopnopnopnopnopdeal_swistmfd sp!, {r4-r12,lr}add r0,r0,r1ldmfd sp!, {r4-r12,pc}startldr sp, =0x40001000mrs r0,cpsr ;//程序状态寄存器(CPSR)的值读取到通用寄存器 r0bic r0,r0,#0x1f ;//清除 r0 的低5位(二进制 0b00011111),即 CPSR的模式位orr r0,r0,#0x10 ;//将 r0 的低5位设置为 0x10(二进制 0b10000),即切换到 用户模式msr cpsr_c,r0 ;//将修改后的 r0 值写回 CPSR的控制域(cpsr_c),完成模式切换ldr sp, =0x40000c00swi #5 ;//触发SWI中断(跳转到deal_swi)mov r0,#1mov r1,#2import c_addbl c_add ;//跳转到c_add函数处,并保存返回地址到lr寄存器nopb start ;//无条件跳转到start处export asm_addasm_addstmfd sp!, {r4-r12,lr}add r0,r0,r1ldmfd sp!, {r4-r12,pc}end
三、端口控制描述

1、端口控制描述

端口配置寄存器(GPACON-GPJCON):配置引脚的功能

端口数据寄存器(GPADAT-GPJDAT):读写数据

2、点亮led灯

#ifndef __LED_H#define __LED_H#define GPBCON (*(volatile unsigned long *)0x56000010UL)#define GPBDAT (*(volatile unsigned long *)0x56000014UL)void led1_init(void);void led1_on(void);void led1_off(void);#endif
#include \"led.h\"void led1_init(void){// 配置GPB5引脚功能为输出GPBCON &= ~(0x3 << 10);GPBCON |= (0x1 << 10);// 控制GPB5输出高电平向GPBDAT第5位写1GPBDAT |= (1 << 5);}void led1_on(void){// 控制GPB5输出低电平 向GPBDAT第5位写0GPBDAT &= ~(1 << 5);}void led1_off(void){// 控制GPB5输出高电平向GPBDAT第5位写1GPBDAT |= (1 << 5);}

小tips:

volatile:易失性修饰符 读写值时都操作内存地址

配置1bit,一步完成

配置连续多个bit,两步完成,先清0,再置1

四、时钟管理

S3C2440A 包含两个锁相环(PLL:锁相环,倍频(提高频率))

一个提供给 FCLK、HCLK 和 PCLK,另一个专用于USB 模块(48MHz)
根据OM2 OM3选择时钟源(通过本次原理图,两个引脚接地,选择00模式)

代码

#ifndef __CLK_H#define __CLK_H//#define MPLLCON (*(volatile unsigned long *)0x4C000004UL)//#define CLKCON (*(volatile unsigned long *)0x4C00000CUL)//#define CLKDIVN (*(volatile unsigned long *)0x4C000014UL)//#define CAMDIVN (*(volatile unsigned long *)0x4C000018UL)void clk_init(void);void clk_enable(unsigned char num);void clk_disable(unsigned char num);#endif
#include #include \"clk.h\"void clk_init(void){// 配置分频//CAMDIVN &= ~(1 << 9); //该位默认值为0CLKDIVN = (0x2 << 1) | (1 << 0);// 配置PLLMPLLCON = (127 << 12) | (2 << 4) | (1 << 0);}void clk_enable(unsigned char num)//枚举{CLKCON |= (1 << num);}void clk_disable(unsigned char num)//枚举{CLKCON &= ~(1 << num);}
五、中断

注意:

不支持中断嵌套

1、user模式(非特权)不能直接转换中断模式(特权),SVC模式可以直接切换中断模式

(特权优先级高于非特权)

2、函数的返回值,初始化栈

3、中断返回不一样

六、ADC

小tips:

两个电阻两头电压是:0v和3v,那么中间是1.5v

V_mid = V_total × (R2 / (R1 + R2))

模拟:连续的,数字:离散的

AD转换的过程:

把模拟信号转换成数字信号

(2440的量程是:0~3.3v,精度是10位,转换速率:500KSPS)

例题:假设电压是0~3.3v,数字0~0x3ff,测出0x200

  • 0x200 = 2 × 16² + 0 × 16¹ + 0 × 16⁰ = 512

  • 0x3ff = 3 × 16² + 15 × 16¹ + 15 × 16⁰ = 768 + 240 + 15 = 1023

  • 那电压就是3.3v*(512/1023)=1.65

代码:

两种模式:

读启动转换:读取结果后字段启动下次转换

手动启动:手动启动转换

#include //1读启动void adc_init(void){// ADC时钟50M / (49 + 1) // 通道默认为0 // 使能读启动ADCCON = (1 << 14) | (49 << 6) | (1 << 1);}void adc_set_channel(unsigned char channel){ADCCON &= ~(0x7 << 3);ADCCON |= ((channel & 0x7) << 3);}unsigned short adc_read(){unsigned char t = 5;unsigned short data = ADCDAT0;while((!(ADCCON & (1 << 15))) && t--){delay_ms(1);}data = ADCDAT0 & 0x3ff;return data;}//手动启动void adc_init(void){// ADC时钟50M / (49 + 1) // 通道默认为0 ADCCON = (1 << 14) | (49 << 6);}void adc_set_channel(unsigned char channel){ADCCON &= ~(0x7 << 3);ADCCON |= ((channel & 0x7) << 3);}void adc_start(void){ADCCON |= (1 << 0);}unsigned short adc_read(){unsigned char t = 5;unsigned short data = 0; // ADCDAT0;while((!(ADCCON & (1 << 15))) && t--){delay_ms(1);}data = ADCDAT0 & 0x3ff;return data;}int main(){ adc_init(); while() { adc_set_channel(0); adc_start(); adc_value = adc_read(); }}
七、串口通信

注意置位时::

置的是1位:直接或(&)或者与(|),

置的是多位:先与(|)再或(&),

置的是寄存器的所有位:直接等(=)

通信概念:

1、按传输介质分类:

        有线通信,无线通信

2、按数据传输方向分类:

        单工(数据只能单向传输)

        半双工(数据可以双向传输,但不能同时进行

        全双工(数据可以同时双向传输

3、按数据位传输方式分类

        并行(两根及以上的数据线)

        串行(一根数据线)

4、 按时钟同步方式分类

        同步:通信双方使用同一个时钟,异步:通信双方使用不同的时钟

TTL:正逻辑

RS232:负逻辑

RS485:差分信号

八、IIC(同步半双工)

注意点:同一个时钟源就是同步

SDA:数据线        SCL:时钟线

1、起始信号:SCL为高,SDA由高到低

2、传输数据时:当SCL为低电平时,SDA可以任意改变(该期间接收方不采集SDA电平),当SCL为高电平时,SDA保持不变(该期间接收方采集SDA电平)

3、应答位(ACK):数据位后(第9个)的时钟周期由接收方拉低SDA

4、终止信号:SCL位高,SDA由低到高

典型的时钟频率:100k,400k,3.4M(高速)

每帧固定8bit

通信时:SDA(数据线)由主机控制,SCL(时钟线)由发送方(写入)控制,应答信号由接收方(读取)控制

九、定时时钟

单独工作的定时器:有一定的逻辑处理

独立的电源(备用电池)

独立的时钟(32.768KHz)

十、SPI

串行外设接口 同步全双工

十一、LCD

1、lcd

2、存储器控制器

十二、DMA

DMA(直接存储器存取):实现外设之间的数据直接搬移(不通过CPU),节省CPU,CPU可以执行其他任务