arm中斷控制led

2021-07-04 15:04:02 字數 3273 閱讀 8395

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...