,使用vic" rel="noopener noreferrer">s3c6410裸機中斷終於搞定了,不需要彙編 ,使用vic
劍橋石
經過幾天的努力
,終於搞定了
s3c6410
裸機中斷
,測試使用的是外部中斷0組的
pn0,
使用定時器0。
之前一直很鬱悶的是網上的一些
s3c6410
使用的中斷都是像
51微控制器那樣的固定中斷向量入口
,這種方式不僅需要彙編支援
,而且效率相當的低下,既然
s3c6410
自帶有中斷處理協處理器
vic,
那麼我還是建議使用
vic來管理中斷。
為了向下相容,6410保留了2410的軟體中斷跳轉方式,在三星的文件裡被稱為systembus模式,預設的,而其特有的vic port模式則要手動開啟,啟動**:
mrc p15,0,r0,c1,c0,0
orrr0,r0,#(1<<24)
mcr p15,0,r0,c1,c0,0
將其加到啟動檔案的main函式入口點之前(start.s)即可開始vicport模式,在這個模式下,中斷的使用簡單了不少,比如說我要用某個按鍵來實現外部中斷,則相應的過程如下:
1. 初始化中斷向量控制器:
填充 rvicxintenclear ,清空vicxintselect和vicxaddr,這步嘛沒什麼可說的,就是乙個簡單的重置工作。
2. 配置按鍵對應的gpio腳為中斷模式:
gpxxcon 每乙個腳的配置占此暫存器的2位,其中中斷配置為10b,將對應的兩位位設為10b即可使用中斷功能。
3. 開啟中斷:
將vicxintenable對應位置"1"即可開啟對應的中斷,比如要開啟11號中斷,就將此暫存器第11位置"1",注意此暫存器是32位的,x=0的時候開啟0-31號中斷,x=1時開啟剩下的中斷。
4. 設定外部中斷型別:
操作einxcony,中斷分組對應的暫存器可以在三星的手冊里查到,每兩個中斷占用暫存器的三位,換句話說,暫存器每三位控制兩個中斷的觸發方式,其中中斷號小的偶數的兩倍對應起始位,中斷號大的奇數的兩倍對應結束位,例如eint11、10,對應暫存器的[22:20]三位,這三位怎麼配手冊上有詳細描述,不廢話。
5. 裝載中斷伺服程式:/
void led_init(void)
void delay(u32 n)}
void __irqirq_exception(void)
void key_init(void)
void __irqisr_timer0(void)
voidtimer0_init(void)
//主函式
void main(void)}}
//把下面的彙編加入到啟動檔案中,主要用來開啟cpu中斷和初始化vic
;vic port模式,開啟後就可以不用彙編使用中斷,使用vic控制中斷
mrc p15,0,r0,c1,c0,0
orr r0,r0,#(1<<24)
mcr p15,0,r0,c1,c0,0
;允許中斷,開啟cpu總中斷
mrs r0, cpsr
;將cpsr儲存至r0暫存器中
bic r0, r0, #0x80
;r0 = r0 & ~0x80,清除中斷位
msr cpsr_c, r0
;將r0寫回cpsr狀態寄存
以上就是相關的**
,因為大家的暫存器巨集定義不同
,因此名字可能不同
,因為我寫了注釋的
,大家可以對著文件
,設定相應的暫存器就可以了,
如果需要可以找我,郵箱
**:裸機外部中斷+定時器中斷
S3C6410按鍵驅動 中斷方式
本文 cpp view plain copy include include include include include include include include include include include include include 新版核心 include include st...
S3C6410 中斷例子程式
eint0con0 external interrupt 0 group0 configuration register 0 設定 外部中斷的觸發方式 高電平等 eint0pend external interrupt 0 group0 pending register 遮蔽前的中斷 誰中斷,相應位...
S3c6410在RVDS2 2下裸機浮點問題
近在使用s3c6410裸機的時候用到浮點型時候程式一直無結果輸出,網上查了很久,說需要設定vfpv2 vfpenable equ 0x40000000 vfp使能設定 啟用通過協處理器訪問vfp控制暫存器 mrc p15,0,r0,c1,c0,2 orr r0,r0,0x00f00000 mcr p...