一、ARM體系結構
程序編譯的過程:
預處理(.c-.i):宏替換,頭文件展開,去掉注釋,特殊符號的處理
編譯(.i-.s):C語言轉換成匯編語言
匯編(.s-.o):匯編轉成成二進制文件
鏈接(.o-app):關聯各種符號信息,歸并文件,將不可執行二進制文件轉換成可執行二進制文件
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_add
asm_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_add
asm_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 <s3c2440.h>
#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、中斷返回不一樣