www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

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

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

1 懂寄存器

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

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

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

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

2 懂中斷處理過(guò)程

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

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

start.S講解

.text

.global _start @@@@ _start 是一個(gè)全局標(biāo)號(hà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)于定義一個(gè)4字節(jié)的變量_irq,值為irq_handler

@@@@ 等價(jià)于 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, 處于A(yíng)RM狀態(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ù),不會(huì)回來(lái)了

.align 4

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

/**** irq_handler ****/

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

sub lr,lr,#4

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

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

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

stacktop: .word stack+4*512

.data

stack: .space 4*512

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

void do_irq(void ) //C語(yǔ)言的中斷服務(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個(gè), 分為三部分

SGI 16個(gè) Software Generated Interrupt (SGI)

PPI 8個(gè) Private Peripheral Interrupt (PPI)

SPI 128 Shared Peripheral Interrupt (SPI)

每個(gè)中斷都被編了一個(gè)ID

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

SPI Port No SPI中斷源編號(hào)

ID 總的中斷源編號(hào)

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

中斷源 SPI Port No ID

EINT[9] 25 57

GIC 設(shè)置流程:

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

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

ICDISER(n) ICDISER1, ICDISER2, ICDISER3, ICDISER4

SPI中斷共128個(gè),分成了4組

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

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

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

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

INT9 ---- 25號(hào) INT10 ---- 26號(hào)

ICDISER1 (GIC的通道號(hào)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è)置 某個(gè)CPU是否允許響應(yīng)中斷(默認(rèn)情況,4個(gè)CPU都不響應(yīng)中斷)

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

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

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

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

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

ICDDCR

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

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

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

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

ICDIPTR.ICDIPTR14 = 0x00000100; //表示總中斷號(hào)為 57的中斷由CPU0來(lái)處理

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

ICDIPTR.ICDIPTR14 = 0x00000200; //表示總中斷號(hào)為 57的中斷由CPU1來(lái)處理

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

ICDIPTR.ICDIPTR14 = 0x00000400; //表示總中斷號(hào)為 57的中斷由CPU2來(lái)處理

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

ICDIPTR.ICDIPTR14 = 0x00000800; //表示總中斷號(hào)為 57的中斷由CPU3來(lái)處理

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

ICDIPTR.ICDIPTR14 = 0x00001000; //表示總中斷號(hào)為 57的中斷由CPU4來(lái)處理

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

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

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

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

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

0000 0001 表示由 CPU0來(lái)處理

0000 0010 表示由 CPU1來(lái)處理

0000 0100 表示由 CPU2來(lái)處理

0000 1000 表示由 CPU3來(lái)處理

0001 0000 表示由 CPU4來(lái)處理

0010 0000 表示由 CPU5來(lái)處理

0100 0000 表示由 CPU6來(lái)處理

1000 0000 表示由 CPU7來(lái)處理

一個(gè)32位寄存器可以分四組

ICDIPTR.ICDIPTR14 = 0x01010101; //編號(hào)56,57,58,59四個(gè)中斷,由CPU0來(lái)處理

14 是 總的中斷編號(hào) / 4

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

ICDIPR14 = 0x00000A00;

下面是看門(mén)狗定時(shí)器中斷示例

#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); //獲取中斷編號(hào)

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; //清e(cuò)xynos4412中斷標(biāo)志位

// End of interrupt

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

}

void wdt_init()

{

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

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

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ā)布,目的在于傳遞更多信息,并不代表本站贊同其觀(guān)點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉