近日在學習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定位到該端口的具體引腳位。