board/keyled_intr.c
#include "stdio.h"
#include "s5pv210.h"
void eint16_isr()
else if(rext_int_2_pend==0x2)
else if(rext_int_2_pend==0x4)
else
}void led_init()
void key_init()
void ext_init()
void vic0_init()
void keyled_intr()
cpu/board.c
#include "stdio.h"
#include "api.h"
int start_armboot()
/cpu/start.s
.text
.extern uart_init
.extern printf
.extern start_armboot
.global _start
_start:
mov r5,lr
bl uart_init
ldr r0,=fmt
bl printf
bl exc_vectable
bl cpsr_init
bl start_armboot
return_uboot:
mov lr,r5
bx lr
cpsr_init:@標誌位初始化
mrs r0,cpsr
bic r0,r0,#0xc0
msr cpsr,r0
bx lr
exc_vectable:
ldr r0,=handler_irq
ldr r1,=0xd0037418
@iram裡的位址
str r0,[r1]
bx lr
handler_irq:@中斷處理程式
sub lr,lr,#4
stmfd sp!,
ldr lr,=return_irq
ldr r0,=0xf2000000
@vic0位址
ldr r1,[r0]
cmp r1,#0
beq return_irq
ldr r0,=0xf2000f00
@vic0address位址
ldr pc,[r0]
return_irq:
ldmfd sp!,^
fmt:
.asciz ">>>>> welcome to arm <<<<<<
.end
makefile
cc = arm-linux-gcc
ld = arm-linux-ld
objcopy = arm-linux-objcopy
includedir := $(shell pwd)/include/
cppflags := -nostdinc -nostdlib -i$(includedir)
cflags := -fno-builtin -wall -o2
export cc ld objcopy cppflags cflags
objs := cpu/start.o cpu/board.o board/keyled_intr.o lib/uart.o lib/libc.a
all:start.bin clean
start.bin:$(objs)
$(ld) -ttext=0x40000000 $(objs) -o start.elf
$(objcopy) -o binary -s start.elf $@
%.o:%.s
$(cc) -c $(cppflags) $(cflags) $< -o $@
%.o:%.c
$(cc) -c $(cppflags) $(cflags) $< -o $@
clean:
rm -rf ./start.elf
make clean -c cpu
make clean -c board
這裡用到框架
通常要修改這幾個檔案
說明:gpd0con是模式設定
gpd0dat是資料暫存器
gpd0pud是推挽選擇
推挽了之後帶負載能力會強一點
其實推挽輸出就是輸出電阻小一點
第一階段:外部中斷初始化
1. io控制器初始化
gph2con[3:0]=1111
2. 外部中斷控制器初始化
ext_int_2_con[2:0]=010
ext_int_2_mask[0] = 1
ext_int_pend[0] = 1 // clear 0
ext_int_con2[3:0] = 1111 = 0xf
3. 向量中斷控制器初始化
4. 狀態暫存器的中斷使能
第二階段:中斷響應過程
1)保護現場
a.模式切換
cpsr -> spsr_irq 硬體做
cpsr_svc
b. pc跳轉
pc -> lr 硬體做
pc c. 儲存通用暫存器r0-r12 使用者做
r0-r12 -> sp
2)真正的中斷處理
3)恢復現場
a. r0-r12
b. lr -> pc
c. spsr_irq -> cpsr
按鍵有不同模式,輸入模式,就不需要中斷,中斷模式就需要中斷。
使用中斷的話一定是要設定異常表的。
不是中斷處理器呼叫中斷處理函式。是cpu自己呼叫中斷處理函式。這個pc指標所指向的中斷私服程式就是中斷控制器在接受到硬體中斷後強制設定的。這個和硬體有關的。
arm的異常向量表位置是可調整的,這個在協處理器cp15中設定
另外,如果是在作業系統下跑的程式,只需向系統註冊中斷處理函式就可以了。異常向量表是不會讓使用者程式動的
參考:
ARM裸機led控制
define gpj0con 0xe0200240 define gpj0dat 0xe0200244 global start 將 start設定為外部屬性 start ldr r0,0x11111111 偽指令編譯器判斷是否為合法立即數 一般都是偽指令 ldr r1,gpj0con str r0...
ARM裸機開發(一)LED控制
以下裸機程式基於gt2440,編譯器為arm linux gcc 4.4.3。程式的功能為 開機上電首先跳轉到復位異常處理,在復位異常處理裡關閉看門狗,然後執行led控制程式,程式執行結果為板上4個led全亮。led.s檔案 1 暫存器實體地址巨集定義 2 define wtcon 0x530000...
中斷 按鍵控制LED燈
xjp的資源 初始化函式 init.c 進行一些初始化 include s3c24xx.h led1,led2,led4對應gpf4 gpf5 gpf6 define gpf4 out 1 define gpf5 out 1 define gpf6 out 1 define gpf4 msk 3 d...