當(dāng)前位置:首頁 > 芯聞號 > 充電吧
[導(dǎo)讀]如果想弄懂看門狗定時器中斷,要掌握下面兩個知識點(diǎn):1 懂寄存器Cortex A9采用的是ARM官方規(guī)定的中斷處理機(jī)制有兩大類寄存器決定了中斷工作狀態(tài)1) exynos 4412 特有的寄存器(在第26

如果想弄懂看門狗定時器中斷,要掌握下面兩個知識點(diǎn):

1 懂寄存器

Cortex A9采用的是ARM官方規(guī)定的中斷處理機(jī)制

有兩大類寄存器決定了中斷工作狀態(tài)

1) exynos 4412 特有的寄存器(在第26章)

2) Cortex A9 規(guī)定的工作寄存器(在第9章和第10章)

2 懂中斷處理過程

1) Arm啟動先執(zhí)行一段啟動代碼(start.S),這段代碼是用匯編寫的

2) 然后,匯編代碼再執(zhí)行到c的main函數(shù)

start.S講解

.text

.global _start @@@@ _start 是一個全局標(biāo)號 (表示在其他函數(shù)可以調(diào)用_start)

_start: @@@@ 通常被指定為0x0000 0000地址

b reset @@@@ 此段代碼放在0x0000 0000地址處 ,命令功能是跳轉(zhuǎn)到reset處去執(zhí)行

ldr pc,_undefined_instruction

ldr pc,_software_interrupt

ldr pc,_prefetch_abort

ldr pc,_data_abort

ldr pc,_not_used

ldr pc,_irq @@@@ 將_irq地址處的指令地址給PC ,相當(dāng)于一條跳轉(zhuǎn)命令,這條指令回放在0x0000 0018處

ldr pc,_fiq

_undefined_instruction: .word _undefined_instruction

_software_interrupt: .word _software_interrupt

_prefetch_abort: .word _prefetch_abort

_data_abort: .word _data_abort

_not_used: .word _not_used

_irq: .word irq_handler @@@@ .word 是一條偽指令,相當(dāng)于定義一個4字節(jié)的變量_irq,值為irq_handler

@@@@ 等價于 int _irq = irq_handler

_fiq: .word _fiq

@@@@ 偽指令:不是一條實(shí)際的匯編指令,變量定義,宏定義,數(shù)組定義

reset:

@@@@ 初始化 協(xié)處理器

ldr r0,=0x40008000

mcr p15,0,r0,c12,c0,0 @ Vector Base Address Register

@@@@ 設(shè)置cpsr的值,為0xd3

mrs r0,cpsr

bic r0,r0,#0x1f

orr r0,r0,#0xd3 @@@@ 0xd3 1101 0011 禁止FIQ, IRQ, 處于ARM狀態(tài) ,模式為管理模式 SVC

msr cpsr,r0 @ Enable svc mode of cpu

init_stack: @@@@初始化堆棧, svc, irq, fiq.... 每種模式的堆棧大小為512字節(jié)

ldr r0,stacktop /*get stack top pointer*/

/********svc mode stack********/

mov sp,r0

sub r0,#128*4 /*512 byte for irq mode of stack*/

/****irq mode stack**/

msr cpsr,#0xd2

mov sp,r0

sub r0,#128*4 /*512 byte for irq mode of stack*/

/***fiq mode stack***/

msr cpsr,#0xd1

mov sp,r0

sub r0,#0

/***abort mode stack***/

msr cpsr,#0xd7

mov sp,r0

sub r0,#0

/***undefine mode stack***/

msr cpsr,#0xdb

mov sp,r0

sub r0,#0

/*** sys mode and usr mode stack ***/

msr cpsr,#0x10

mov sp,r0 /*1024 byte for user mode of stack*/

@@@此處可以添加自己的初始化代碼

b main @@@@ 跳轉(zhuǎn)到main函數(shù),不會回來了

.align 4

/**** swi_interrupt handler ****/

/**** irq_handler ****/

irq_handler: @@@@ 一旦IRQ中斷會跳轉(zhuǎn)到這

sub lr,lr,#4

stmfd sp!,{r0-r12,lr} @@@@ 將r0-r12, lr寄存器入棧,,,,保護(hù)現(xiàn)場

bl do_irq @@@@ 跳轉(zhuǎn)到中斷服務(wù)程序do_irq, 執(zhí)行完再回來

ldmfd sp!,{r0-r12,pc}^ @@@@ 將棧中數(shù)據(jù)出棧,給r0-r12, lr寄存器,,,,恢復(fù)現(xiàn)場

stacktop: .word stack+4*512

.data

stack: .space 4*512

//////////////////////////////////下面是C代碼//////////////////////////////

void do_irq(void ) //C語言的中斷服務(wù)程序代碼,這段程序是程序員需要重點(diǎn)完成的

{

int irq_num;

irq_num = (CPU0.ICCIAR & 0x1FF);

switch (irq_num) {

case 58: //turn on LED2; turn off LED3

GPX2.GPX2DAT = 0x1 << 7;

GPX1.GPX1DAT &= ~0x1;

printf("IRQ interrupt !! turn on LED2; turn off LED3n");

//Clear Pend

EXT_INT41_PEND |= 0x1 << 2;

ICDICPR.ICDICPR1 |= 0x1 << 26;

break;

}

// End of interrupt

CPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x1FF)) | irq_num;

}

int main(void)

{

//.....

}

二:GIC控制器初始化, ARM提供(Generic Interrupt Controller)

////////4412 的中斷控制其部分,采用了ARM公司的GIC中斷控制器架構(gòu)

GIC中斷共152個, 分為三部分

SGI 16個 Software Generated Interrupt (SGI)

PPI 8個 Private Peripheral Interrupt (PPI)

SPI 128 Shared Peripheral Interrupt (SPI)

每個中斷都被編了一個ID

可以根據(jù)GIC Interrupt Table 來查找

SPI Port No SPI中斷源編號

ID 總的中斷源編號

exynos4412 已經(jīng)連接了兩個外部中斷

中斷源 SPI Port No ID

EINT[9] 25 57

GIC 設(shè)置流程:

1 設(shè)置GIC中的某個SPI 中斷允許還是禁止

////////////////

ICDISER(n) ICDISER1, ICDISER2, ICDISER3, ICDISER4

SPI中斷共128個,分成了4組

ICDISER1 ---- > 控制 0-31 (第1組) (控制此中斷編號是否可以產(chǎn)生中斷 1 允許,0 禁止)

ICDISER2 ---- > 控制 32-63 (第2組)

ICDISER3 ---- > 控制 64-95 (第3組)

ICDISER4 ---- > 控制 96-127 (第4組)

INT9 ---- 25號 INT10 ---- 26號

ICDISER1 (GIC的通道號0-31) 如果某一位為1 那么中斷允許

允許INT9 產(chǎn)生中斷

ICDISER.ICDISER1 |= (0x1 << 25); //中斷使能寄存器

允許INT10 產(chǎn)生中斷

ICDISER.ICDISER1 |= (0x1 << 26); //中斷使能寄存器

練習(xí):

允許WDT產(chǎn)生中斷(43)

ICDISER2 |= 0x1 << 11; (43 % 32)

2 設(shè)置 某個CPU是否允許響應(yīng)中斷(默認(rèn)情況,4個CPU都不響應(yīng)中斷)

ICCICR: 對應(yīng)于每個CPU,都有一個ICCICR,他的功能是 控制這個CPU的總的中斷開關(guān),1表示這個CPU響應(yīng)中斷, 0表示不響應(yīng)中斷

CPU0.ICCICR |= 0x1; (把它值1,表明CPU0響應(yīng)中斷)

3 設(shè)置 某個CPU響應(yīng)的中斷的最高優(yōu)先級

CPU0.ICCPMR = 0xFF; //上面允許了中斷,ICCPMR中斷優(yōu)先級低于設(shè)置值的中斷允許進(jìn)入 0xFF最高,如果設(shè)置成0,

4 設(shè)置 中斷產(chǎn)生時是否影響中斷標(biāo)志位, 具體中斷標(biāo)志在哪參照ICDICPR

ICDDCR

ICDDCR = 1; //總的中斷標(biāo)志置位允許位

5 設(shè)置某個中斷是由哪個CPU來響應(yīng)

ICDIPTR 有很多組:4個中斷為1組(中斷ID號最大159, 160 / 4 = 40, ICDIPTR 有40個 )

如果設(shè)置EINT9由CPU0來響應(yīng)(EINT9 是57號,所以在編號14的寄存器中(56, 57, 58, 59))

ICDIPTR.ICDIPTR14 = 0x00000100; //表示總中斷號為 57的中斷由CPU0來處理

如果設(shè)置EINT9由CPU1來響應(yīng)

ICDIPTR.ICDIPTR14 = 0x00000200; //表示總中斷號為 57的中斷由CPU1來處理

如果設(shè)置EINT9由CPU2來響應(yīng)

ICDIPTR.ICDIPTR14 = 0x00000400; //表示總中斷號為 57的中斷由CPU2來處理

如果設(shè)置EINT9由CPU3來響應(yīng)

ICDIPTR.ICDIPTR14 = 0x00000800; //表示總中斷號為 57的中斷由CPU3來處理

如果設(shè)置EINT9由CPU4來響應(yīng)

ICDIPTR.ICDIPTR14 = 0x00001000; //表示總中斷號為 57的中斷由CPU4來處理

//上面的寄存器設(shè)置我的中斷由哪個CPU來處理

ICDIPTR 有很多(設(shè)置某個中斷由哪個CPU來執(zhí)行)

ICDIPTR1 ICDIPTR1 ICDIPTR2 ICDIPTR3 ICDIPTR4 ICDIPTR5........

有 160 / 4 個, 共40個, 每個寄存器控制4個中斷

每個寄存器是32位的,8位為1組, 每組代表某種中斷由哪個CPU來執(zhí)行

0000 0001 表示由 CPU0來處理

0000 0010 表示由 CPU1來處理

0000 0100 表示由 CPU2來處理

0000 1000 表示由 CPU3來處理

0001 0000 表示由 CPU4來處理

0010 0000 表示由 CPU5來處理

0100 0000 表示由 CPU6來處理

1000 0000 表示由 CPU7來處理

一個32位寄存器可以分四組

ICDIPTR.ICDIPTR14 = 0x01010101; //編號56,57,58,59四個中斷,由CPU0來處理

14 是 總的中斷編號 / 4

如果設(shè)置EINT9 (57) 中斷優(yōu)先級10

ICDIPR14 = 0x00000A00;

下面是看門狗定時器中斷示例

#include

* @brief IRQ Interrupt Service Routine program body

* @param[in] None

* @return None

int flag = 0;

void do_irq(void)

{

int irq_num;

irq_num = (CPU0.ICCIAR & 0x1FF); //獲取中斷編號

printf("n ******* WDT interrupt !!********n");

if(flag == 0)

{

//點(diǎn)亮

flag = 1;

}

else

{

//點(diǎn)滅

flag = 0;

}

//換成點(diǎn)亮或點(diǎn)滅LED3 GPX1_0

WDT.WTCLRINT = 1; //清exynos4412中斷標(biāo)志位

// End of interrupt

CPU0.ICCEOIR = (CPU0.ICCEOIR & ~(0x1FF)) | irq_num; //清cpu0中斷標(biāo)志位

}

void wdt_init()

{

WDT.WTCNT = 6000; //initial value ,, 延時大概有兩秒

WDT.WTDAT = 6000; //initial value ,, 延時大概有兩秒

WDT.WTCON = 0xff<<8 | 1<<5 | 3<<3 | 1<<2 ;

}

void mydelay_ms(int time)

{

int i, j;

while(time--)

{

for (i = 0; i < 5; i++)

for (j = 0; j < 514; j++);

}

}

int main(void)

{

/*

* GIC interrupt controller:

* */

// Enables the corresponding interrupt SPI43, WDT

ICDISER.ICDISER2 |= 1<<11; //ICDISER2:spi 32[bit0] ~ 63[bit31], 43 - 32 = [bit11]

CPU0.ICCICR |= 0x1; //Global enable for signaling of interrupts

CPU0.ICCPMR = 0xFF; //The priority mask level.Priority filter. threshold

ICDDCR = 1; //Bit1: GIC monitors the peripheral interrupt signals and

// forwards pending interrupts to the CPU interfaces2

//ICDIPTR18:SPI40~SPI43; SPI43 interrupts are sent to processor 0

ICDIPTR.ICDIPTR18 = (ICDIPTR.ICDIPTR18 & ~(0xFF<<24)) | 1<<24;

wdt_init();

printf("n****************WDT Interrupt test!!***************n");

while(1)

{

mydelay_ms(200);

mydelay_ms(200);

printf("working...n");

}

return 0;

}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉