天天看點

對于cc2530GPIO中斷的一點了解。

近日在學習cc2530.想要寫個小程式,使用P0.0作為外部中斷源,P0.0設定為輸入口,當P0.0輸入低電平,觸發中斷,進入中斷服務程式。中斷觸發方式為上升沿觸發。

閱讀cc2530的datasheet知道和P0口中斷相關的寄存器(部分具體到相關位)有以下這些:

a) IEN1.P0IE;//中斷使能寄存器,CPU

b) IRCON.P0IF//中斷标志寄存器,CPU

c) P0IFG //端口0中斷狀态标志寄存器

d) P0IEN //端口0中斷使能寄存器

e) PICTL.P0ICON//端口中斷控制寄存器

我的疑問1:設定各個中斷相關寄存器的先後順序如何安排?

答:手冊上有這樣一段文字:

In orderto enableanyofthe interrupts, the following stepsmustbetaken:

1. Clearinterrupt flags.

2. Set individual interrupt-enable bit in the peripheralsSFRregister,if any.

3. Setthe correspondingindividual interrupt-enable bitin the IEN0, IEN1, orIEN2registerto 1.

4. Enableglobalinterrupt bysettingthe EAbitin IEN0to 1.

5. Beginthe interrupt serviceroutine atthe correspondingvectoraddressofthat interrupt. SeeTable2-5

for addresses.

了解後知道意思是要:

1. 清中斷标志位。這裡就是設定IRCON.P0IF和P0IFG.

2. 設定中斷相關的寄存器的中斷使能位為1.這裡是設定P0IEN.(!這裡是器件相關的中斷寄存器優先于CPU的)

3. 設定中斷相關寄存器IEN0,IEN1,IEN2中相應的中斷使能位為1.(這裡是和CPU中斷相關的。)

4. 設定IEN0.EA為1.開總中斷。(這裡是和CPU中斷相關的)

5. 中斷發生時進入中斷服務程式。

按照上述順序即可。

我的疑問2:清中斷标志是先清CPU中斷标志寄存器還是先清源中斷标志寄存器?(這裡就是IRCON.P0IF和P0IFG)

答:手冊上有了這樣一段文字:

Asageneralrule for pulsedoredgeshapedinterrupt sources,one

shouldclearCPUinterrupt flag registerspriorto clearingsourceflag bit,if available,for flags that arenot

automaticallycleared.Forlevel sources,onemustclearthe sourcepriorto clearingthe CPUflag.

了解後知道意思是要:當不能硬體自動清除标志位時。中斷觸發方式為脈沖觸發方式或邊沿觸發方式,則先清CPU中斷标志寄存器。當中斷觸發方式為電平觸發方式,則先清源中斷标志寄存器。

閱讀手冊得知,cc2530的P0口作為普通IO,其中斷觸發方式好像隻有邊沿觸發方式。

IEN1.P0IE定位到某個端口,P0IEN定位到該端口的具體引腳位。

繼續閱讀