Download as pdf or txt
Download as pdf or txt
You are on page 1of 12

(Advanced Interrupt Controller)‫واﺣﺪ وﻗﻔﻪ‬

‫ – وﯾﺮاﯾﺶ دوم‬4 ‫آﻣﻮزش‬

‫ﻋﻠﯽ اﺑﺮﯾﺸﻤﯽ ﻣﻘﺪم‬


www.armcenter.org
1390/5/26
‫ﺗﻨﻈﯿﻢ‪ :‬ﻋﻠﯽ اﺑﺮﯾﺸﻤﯽ ﻣﻘﺪم‬ ‫‪www.armcenter.ir‬‬

‫)‪(Advanced Interrupt Controller‬واﺣﺪ وﻗﻔﻪ‬


‫واﺣﺪ وﻗﻔﻪ داراي ﻫﺸﺖ ﺳﻄﺢ اوﻟﻮﯾﺖ ﺑﺮاي وﻗﻔﻪﻫﺎ ﻣﯽﺑﺎﺷﺪ ﮐﻪ در ﻣﺠﻤﻮع داراي ‪ 32‬ﻣﻨﺒﻊ وﻗﻔﻪ اﺳﺖ و ﺑﻪ ﺻﻮرﺗﯽ‬
‫ﻃﺮاﺣﯽ ﺷﺪه اﺳﺖ ﮐﻪ از ﺣﺠﻢ ﻧﺮم اﻓﺰار ﺑﮑﺎﻫﺪ‪.‬‬
‫ورودي ﻣﻨﺎﺑﻊ وﻗﻔﻪ ﺑﻪ ﻫﺴﺘﻪ ﭘﺮدازﻧﺪه ﺑﻪ دو دﺳﺘﻪ )‪ FIQ(Fast Interrupt Request‬و ‪IRQ (Standard‬‬
‫)‪ Interrupt Request‬ﺗﻘﺴﯿﻢ ﻣﯽﺷﻮﻧﺪ‪ .‬ﻣﻮرد اول داراي ﺳﺮﻋﺖ و اوﻟﻮﯾﺖ ﺑﯿﺸﺘﺮي ﻧﺴﺒﺖ ﺑﻪ دوﻣﯽ اﺳﺖ‪ .‬ﻫﻤﭽﻨﯿﻦ‬
‫ﻣﯽﺗﻮان ﻣﻨﺎﺑﻊ را ﺑﻪ دو دﺳﺘﻪ داﺧﻠﯽ و ﺧﺎرﺟﯽ ﺗﻘﺴﯿﻢ ﮐﺮد‪ .‬وﻗﻔﻪ ﻣﻨﺎﺑﻊ داﺧﻠﯽ از اﺑﺰار ﺟﺎﻧﺒﯽ داﺧﻞ ﻣﯿﮑﺮو ﻣﯽآﯾﺪ‬
‫ﻣﺎﻧﻨﺪ ‪ PWM، ADC ،I/O‬وﻏﯿﺮه‪ .‬ﻣﻨﺎﺑﻊ ﺧﺎرﺟﯽ ﻣﺘﺸﮑﻞ از وﻗﻔﻪ ﻫﺎي ‪ FIQ‬ﯾﺎ ‪ IRQ‬از ﭘﯿﻦ ﻫﺎ ﻣﯽآﯾﻨﺪ‪ .‬ﻣﻨﺎﺑﻊ‬
‫وﻗﻔﻪ داﺧﻠﯽ ﻣﯽﺗﻮاﻧﻨﺪ ﺑﻪ ﺻﻮرت ﺣﺴﺎس ﺑﻪ ﻟﺒﻪ ﯾﺎ ﺣﺴﺎس ﺑﻪ ﺳﻄﺢ ﺗﻌﺮﯾﻒ ﮔﺮدﻧﺪ و ﻣﻨﺎﺑﻊ ﺧﺎرﺟﯽ ﻣﯽﺗﻮاﻧﻨﺪ ﺑﻪ ﺻﻮرت‬
‫ﺣﺴﺎس ﺑﻪ ﻟﺒﻪ ﺑﺎﻻ روﻧﺪه ﯾﺎ ﭘﺎﯾﯿﻦ روﻧﺪه و ﯾﺎ ﺣﺴﺎس ﺑﻪ ﺳﻄﺢ ﺑﺎﻻ ﯾﺎ ﭘﺎﯾﯿﻦ ﺗﻌﺮﯾﻒ ﮔﺮدﻧﺪ‪ .‬ﻫﻤﭽﻨﯿﻦ وﯾﮋﮔﯽ ‪Fast‬‬
‫‪ Forcing‬اﯾﻦ اﺟﺎزه را ﺑﻪ ﺷﻤﺎ ﻣﯽ دﻫﺪ ﺗﺎ وﻗﻔﻪ ﻫﺎي ‪ IRQ‬را ﺑﻪ ‪ FIQ‬ﺗﺒﺪﯾﻞ ﮐﻨﯿﺪ‪.‬‬
‫ﺑﻠﻮك دﯾﺎﮔﺮام واﺣﺪ وﻗﻔﻪ ﺑﻪ ﺷﮑﻞ زﯾﺮ اﺳﺖ‪.‬‬

‫ﺧﻄﻮط ‪I/O‬‬
‫ﺳﯿﮕﻨﺎل ﻫﺎي وﻗﻔﻪ ﮐﻪ از ﻃﺮﯾﻖ ﭘﯿﻦ ﻫﺎي ‪ FIQ‬و ‪ IRQn‬درﯾﺎﻓﺖ ﻣﯽﺷﻮﻧﺪ ﺑﺎ دﯾﮕﺮ اﺑﺰار ﺟﺎﻧﺒﯽ در واﺣﺪ ﮐﻨﺘﺮﻟﺮ‬
‫‪ PIO‬ﻣﺎﻟﺘﯽ ﭘﻠﮑﺲ ﺷﺪه اﻧﺪ و ﺑﺮاي اﺳﺘﻔﺎده از آﻧﻬﺎ ﺑﺎﯾﺪ رﺟﯿﺴﺘﺮ ﻣﺮﺑﻮﻃﻪ را ﭘﺮوﮔﺮام ﻧﻤﺎﯾﯿﻢ‪.‬‬

‫ﺗﻐﺬﯾﻪ واﺣﺪ ‪ AIC‬ﺑﺎ ﮐﻼك ﭘﺎﻟﺲ‬


‫اﯾﻦ واﺣﺪ ﺑﻪ ﺻﻮرت ﭘﯿﻮﺳﺘﻪ ﺑﺎ ﮐﻼك ﺗﻐﺬﯾﻪ ﻣﯽ ﺷﻮد و ﻧﯿﺎزي ﺑﻪ اﺳﺘﻔﺎده از رﺟﯿﺴﺘﺮ ‪ PMC_PCER‬ﻧﯿﺴﺖ‪.‬‬

‫‪2‬‬
‫ﺗﻨﻈﯿﻢ‪ :‬ﻋﻠﯽ اﺑﺮﯾﺸﻤﯽ ﻣﻘﺪم‬ ‫‪www.armcenter.ir‬‬

‫ﻣﻨﺎﺑﻊ وﻗﻔﻪ‬
‫ﻣﻨﺒﻊ وﻗﻔﻪ ﺻﻔﺮ ﻫﻤﯿﺸﻪ در اﺧﺘﯿﺎر ﭘﯿﻦ ‪ FIQ‬اﺳﺖ و اﮔﺮ ﻣﯿﮑﺮو اﯾﻦ ﭘﯿﻦ را ﻧﺪاﺷﺘﻪ ﺑﺎﺷﺪ اﯾﻦ ﻣﻨﺒﻊ ﻣﻮرد اﺳﺘﻔﺎده ﻗﺮار‬
‫ﻧﻤﯽ ﮔﯿﺮد‪.‬‬
‫ﻣﻨﺒﻊ ﯾﮏ ﻫﻤﯿﺸﻪ در اﺧﺘﯿﺎر ﺳﯿﺴﺘﻢ اﺳﺖ‪ .‬اﯾﻦ ﻣﻨﺒﻊ ﺑﺎ ‪ or‬ﮐﺮدن ﺧﻄﻮط وﻗﻔﻪ اﺑﺰار ﺟﺎﻧﺒﯽ ﻣﺎﻧﻨﺪ ﺗﺎﯾﻤﺮ و ﮐﻨﺘﺮﻟﺮ‬
‫ﺣﺎﻓﻈﻪ و واﺣﺪ ‪ PMC‬و ﻏﯿﺮه ﺣﺎﺻﻞ ﺷﺪه اﺳﺖ‪ .‬ﻫﺮ ﮔﺎه از ﻃﺮف ﯾﮑﯽ از اﯾﻦ ﻣﻨﺎﺑﻊ وﻗﻔﻪاي رخ دﻫﺪ ﺑﺎﯾﺪ ﺑﺎ ﺧﻮاﻧﺪن‬
‫رﺟﺴﯿﺘﺮ)‪ AIC_ISR (Interrupt Status Register‬ﺗﻌﯿﯿﻦ ﮐﻨﯿﻢ ﮐﺪام ﯾﮏ از ﻣﻨﺎﺑﻊ ‪ or‬ﺷﺪه ﺑﺎﻋﺚ اﯾﺠﺎد وﻗﻔﻪ‬
‫ﺷﺪه اﺳﺖ‪ .‬ﻣﻨﺎﺑﻊ ورودي دﯾﮕﺮ از ﺷﻤﺎره ‪ 2‬ﺗﺎ ‪ 31‬ﻣﯽﺗﻮاﻧﺪ ﺑﻪ ﻫﺮﯾﮏ از اﺑﺰار ﺟﺎﻧﺒﯽ و ﯾﺎ وﻗﻔﻪﻫﺎي ﺧﺎرﺟﯽ ﻣﺘﺼﻞ‬
‫ﺷﻮﻧﺪ‪.‬‬
‫ﻧﺎﻣﮕﺬاري ﻣﻨﺎﺑﻊ ﺑﺎ اﺳﺎﻣﯽ ‪ SYS , FIQ‬و ‪ PID2‬ﺗﺎ‪ PID31‬اﻧﺠﺎم ﺷﺪه اﺳﺖ‪.‬‬

‫ﺗﻌﯿﯿﻦ ﺣﺎﻟﺖ و اوﻟﻮﯾﺖ ﻣﻨﺎﺑﻊ وﻗﻔﻪ‬


‫وﯾﮋﮔﯽﻫﺎي ﻫﺮ ﻣﻨﺒﻊ ﺑﻪ ﺻﻮرت ﻣﻨﺤﺼﺮ ﺑﻪ ﻓﺮد ﻣﯽﺗﻮاﻧﺪ ﺗﻮﺳﻂ رﺟﯿﺴﺘﺮﻫﺎي ‪AIC_SRM0..31(Source Mode‬‬
‫‪( Register‬ﺗﻌﯿﯿﻦ ﮔﺮدد‪ .‬ﻓﯿﻠﺪ ‪ SRCTYPE‬در اﯾﻦ رﺟﯿﺴﺘﺮﻫﺎ ﻃﺒﻖ ﺟﺪول زﯾﺮ ﻣﺸﺨﺺ ﮐﻨﻨﺪه ﻧﻮع وﻗﻮع وﻗﻔﻪ‬
‫اﺳﺖ‪.‬‬

‫ﻓﯿﻠﺪ ‪ PRIOR‬در رﺟﯿﺴﺘﺮﻫﺎي ﺑﺎﻻ ﻣﺸﺨﺺ ﮐﻨﻨﺪه اوﻟﻮﯾﺖ وﻗﻔﻪ اﺳﺖ و از ﺻﻔﺮ ﮐﻪ ﭘﺎﯾﯿﻦ ﺗﺮﯾﻦ اوﻟﻮﯾﺖ را دارد ﺗﺎ ‪7‬‬
‫ﮐﻪ ﺑﺎﻻ ﺗﺮﯾﻦ اوﻟﻮﯾﺖ را دارد ﻣﯽﺑﺎﺷﺪ‪ .‬اﯾﻦ ﻓﯿﻠﺪ ﺑﺮاي رﺟﯿﺴﺘﺮ ﻣﺮﺑﻮط ﺑﻪ ‪ FIQ‬اﺳﺘﻔﺎده ﻧﻤﯽﺷﻮد ﭼﻮن ﻫﻤﯿﺸﻪ داراي‬
‫ﺑﺎﻻﺗﺮﯾﻦ اوﻟﻮﯾﺖ اﺳﺖ‪ .‬ﺧﻄﻮط وﻗﻔﻪ ‪ IRQ‬را ﺑﻪ ﺟﺰ آﻧﻬﺎﯾﯽ ﮐﻪ ﺑﻪ ﺻﻮرت ‪ FAST FORCING‬ﺗﻌﺮﯾﻒ ﺷﺪه اﻧﺪ‪ ،‬ﻣﯽ‬
‫ﺗﻮان در ﻫﺸﺖ ﺳﻄﺢ اوﻟﻮﯾﺖ ﻣﺨﺘﻠﻒ ﻃﺒﻘﻪ ﺑﻨﺪي ﮐﺮد‪.‬‬

‫‪3‬‬
‫ﺗﻨﻈﯿﻢ‪ :‬ﻋﻠﯽ اﺑﺮﯾﺸﻤﯽ ﻣﻘﺪم‬ ‫‪www.armcenter.ir‬‬

‫در دﯾﺘﺎﺷﯿﺖ ﻧﺎمﮔﺬاري اﯾﻦ ﻣﺠﻤﻮﻋﻪ رﺟﯿﺴﺘﺮ ﺑﻪ ﺻﻮرت ‪ AIC_SMR0..AIC_SMR31‬اﺳﺖ ﯾﻌﻨﯽ ﺑﺮاي ﻫﺮ‬
‫اﺑﺰار ﺟﺎﻧﺒﯽ ﮐﻪ ﺑﺎ ‪ PID‬ﻫﺎي ‪ 0‬ﺗﺎ ‪ 32‬در ﺟﺪول زﯾﺮ آﻣﺪهاﻧﺪ‪ ،‬ﯾﮏ رﺟﯿﺴﺘﺮ ‪ ، AIC_SMRx‬ﮐﻪ ‪ x‬ﻫﻤﺎن ﺷﻤﺎره‬
‫‪ PID‬اﺳﺖ‪ ،‬وﺟﻮد دارد‪.‬‬

‫ﺟﺪول ‪ PID‬ﻫﺎ ﺑﺮاي ﻣﯿﮑﺮو ‪sam7x‬‬

‫‪4‬‬
‫ﺗﻨﻈﯿﻢ‪ :‬ﻋﻠﯽ اﺑﺮﯾﺸﻤﯽ ﻣﻘﺪم‬ ‫‪www.armcenter.ir‬‬

‫ﺟﺪول ‪ PID‬ﻫﺎ ﺑﺮاي ﻣﯿﮑﺮو ‪sam7s‬‬


‫ﭘﺲ ﺑﻪ اﯾﻦ ﺗﺮﺗﯿﺐ ﺑﺮاي ﻫﺮ ﻣﻨﺒﻊ وﻗﻔﻪ ﮐﻪ ﻫﻤﺎن اﺑﺰار ﺟﺎﻧﺒﯽﻫﺎ ﺑﺎﺷﻨﺪ ﯾﮏ رﺟﯿﺴﺘﺮ ﺑﺮاي ﺗﻌﯿﯿﻦ اوﻟﻮﯾﺖ و ﻧﻮع‬
‫ﺣﺴﺎﺳﯿﺖ وﺟﻮد دارد‪.‬‬
‫ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ ﻧﻮع ﻣﻨﺒﻊ وﻗﻔﻪ)ﺣﺴﺎس ﺑﻪ ﺳﻄﺢ ﯾﺎ ﻟﺒﻪ( ﮐﻪ در رﺟﯿﺴﺘﺮ ‪ AIC_SMR‬در ﻓﯿﻠﺪ ‪ SRCTYPE‬ﺗﻌﯿﯿﻦ‬
‫ﻣﯽﺷﻮد‪ ،‬زﻣﺎﻧﯽ ﮐﻪ وﻗﻔﻪاي رخ ﻣﯽدﻫﺪ‪ ،‬ﺧﻄﻮط وﻗﻔﻪ ‪ IRQ‬را در اﺧﺘﯿﺎر ﻣﯽﮔﯿﺮد‪.‬‬
‫اﮔﺮ ﭼﻨﺪ وﻗﻔﻪ ﺑﺎ اوﻟﻮﯾﺖ ﻣﺸﺎﺑﻪ ﻫﻤﺰﻣﺎن رخ دﻫﻨﺪ آن ﻣﻨﺒﻊ ﮐﻪ داراي ﺷﻤﺎره ‪ PID‬ﮐﻤﺘﺮي اﺳﺖ داراي اوﻟﻮﯾﺖ ﺑﺎﻻﺗﺮي‬
‫اﺳﺖ‪.‬‬
‫ﺧﻄﻮط ‪ IRQ‬در اﺧﺘﯿﺎر وﻗﻔﻪ ﺑﺎ اوﻟﻮﯾﺖ ﺑﺎﻻﺗﺮ ﻗﺮار ﻣﯽﮔﯿﺮد‪ .‬اﮔﺮ وﻗﻔﻪ دﯾﮕﺮي رخ دﻫﺪ در ﺣﺎﻟﯽ ﮐﻪ ﺑﺮﻧﺎﻣﻪ در ﺣﺎل‬
‫اﺟﺮاي روﺗﯿﻦ وﻗﻔﻪ ﻗﺒﻠﯽ اﺳﺖ وﻗﻔﻪ ﺟﺪﯾﺪ‪ ،‬ﺗﺎ رﺳﯿﺪن ﺑﺮﻧﺎﻣﻪ ﺑﻪ اﻧﺘﻬﺎي روﺗﯿﻦ وﻗﻔﻪ ﻗﺪﯾﻢ ﮐﻪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻫﺮ ﻣﻘﺪاري در‬
‫رﺟﯿﺴﺘﺮ ‪ AIC_EOICM‬ﻣﺸﺨﺺ ﻣﯽ ﺷﻮد ﺑﻪ ﺗﺎﺧﯿﺮ ﻣﯽاﻓﺘﺪ‪ .‬ﻧﻮﺷﺘﻦ در اﯾﻦ رﺟﯿﺴﺘﺮ در اﻧﺘﻬﺎي روﺗﯿﻦ اﺟﺒﺎري‬
‫اﺳﺖ‪.‬‬

‫‪5‬‬
‫ﺗﻨﻈﯿﻢ‪ :‬ﻋﻠﯽ اﺑﺮﯾﺸﻤﯽ ﻣﻘﺪم‬ ‫‪www.armcenter.ir‬‬

‫اﮔﺮ وﻗﻔﻪاي رخ دﻫﺪ ﺑﻌﺪ از ﺳﭙﺮي ﺷﺪن ﻣﺮﺣﻠﻪ ﺗﻌﯿﯿﻦ اوﻟﻮﯾﺖ آدرﺳﯽ ﮐﻪ ﺑﺮﻧﺎﻣﻪ ﺑﺎﯾﺪ ﺑﻪ آن ﭘﺮش ﮐﻨﺪ و ﻗﺒﻼً در‬
‫رﺟﯿﺴﺘﺮ )‪ AIC_SVR0..X (Source Vector Registers‬ﻣﺮﺑﻮط ﺑﻪ آن وﻗﻔﻪ ﻧﻮﺷﺘﻪ ﺷﺪه اﺳﺖ‪ ،‬در رﺟﯿﺴﺘﺮ‬
‫‪ AIC_IVR‬ﮐﭙﯽ ﻣﯽﺷﻮد‪ .‬ﺷﻤﺎي اﯾﻦ دو رﺟﯿﺴﺘﺮ در زﯾﺮ آﻣﺪه اﺳﺖ‪.‬‬

‫ﻓﻌﺎل ﯾﺎ ﻏﯿﺮ ﻓﻌﺎل ﮐﺮدن ﻣﻨﺎﺑﻊ وﻗﻔﻪ‬


‫ﻫﺮ ﯾﮏ از ﻣﻨﺎﺑﻊ ﻣﯽﺗﻮاﻧﻨﺪ ﺑﺎ رﺟﯿﺴﺘﺮ ﻫﺎي )‪ AIC_IECR (Interrupt Enable Command Register‬و‬
‫)‪ AIC_IDCR (Interrupt Disable Command Register‬ﺑﻪ ﺗﺮﺗﯿﺐ ﻓﻌﺎل ﯾﺎ ﻏﯿﺮ ﻓﻌﺎل ﺷﻮﻧﺪ‪ .‬ﻫﻤﭽﻨﯿﻦ‬
‫ﻣﯽﺗﻮان از ﻃﺮﯾﻖ رﺟﯿﺴﺘﺮ )‪ AIC_IMR (Interrupt Mask Register‬وﺿﻌﯿﺖ ﻓﻌﺎل ﺑﻮدن ﯾﺎ ﻧﺒﻮدن وﻗﻔﻪ ﻫﺎ را‬

‫‪6‬‬
‫ﺗﻨﻈﯿﻢ‪ :‬ﻋﻠﯽ اﺑﺮﯾﺸﻤﯽ ﻣﻘﺪم‬ ‫‪www.armcenter.ir‬‬

‫ﻣﺸﺨﺺ ﮐﺮد ﺑﺪﯾﻦ ﺻﻮرت ﮐﻪ اﮔﺮ ﺑﯿﺖ ﻣﺘﻨﺎﻇﺮ ﺑﺎ وﻗﻔﻪ ﻣﻮرد ﻧﻈﺮ در اﯾﻦ رﺟﯿﺴﺘﺮ ﺻﻔﺮ ﺑﺎﺷﺪ ﻏﯿﺮ ﻓﻌﺎل واﮔﺮ ﯾﮏ ﺑﺎﺷﺪ‬
‫ﻓﻌﺎل اﺳﺖ‬

‫ﻫﺮ دو رﺟﯿﺴﺘﺮ ‪ AIC_IECR‬و ‪ AIC_IDCR‬ﺳﺎﺧﺘﺎري ﻣﺸﺎﺑﻪ ﺑﺎ رﺟﯿﺴﺘﺮ ﺑﺎﻻ دارﻧﺪ‪.‬‬

‫ﻫﺮ ﯾﮏ از وﻗﻔﻪﻫﺎي ﺣﺴﺎس ﺑﻪ ﻟﺒﻪ را ﻣﯽﺗﻮان ﺑﺎ ﯾﮏ ﮐﺮدن ﺑﯿﺖ ﻣﺘﻨﺎﻇﺮ در رﺟﯿﺴﺘﺮ ‪ AIC_ICCR‬ﮐﻪ در زﯾﺮ‬
‫ﻧﻤﺎﯾﺶ داده ﺷﺪه اﺳﺖ‪ ،‬ﭘﺎك ﮐﺮد‪ .‬اﯾﻦ ﯾﮏ ﻣﺮﺣﻠﻪ اﺿﺎﻓﯽ ﺑﺮاي وﻗﻔﻪ ﻫﺎي ﺣﺴﺎس ﺑﻪ ﻟﺒﻪ اﺳﺖ ﮐﻪ ﺑﺎﯾﺪ ﺑﻌﺪ از آﺷﮑﺎر‬
‫ﺷﺪن وﻗﻔﻪ ﭘﺮﭼﻢ وﻗﻔﻪ را ﺑﺪﯾﻦ ﺻﻮرت ﭘﺎك ﮐﺮد ﺗﺎ دوﺑﺎره ﺑﻪ اﺷﺘﺒﺎه آن را ﯾﮏ وﻗﻔﻪ ﺟﺪﯾﺪ ﺑﻪ ﺣﺴﺎب ﻧﯿﺎورﯾﻢ‪ .‬وﻟﯽ‬
‫ﺑﺮاي وﻗﻔﻪﻫﺎي ﺣﺴﺎس ﺑﻪ ﺳﻄﺢ اﻧﺠﺎم اﯾﻦ ﮐﺎر ﻧﯿﺎزي ﻧﯿﺴﺖ ﭼﻮن ﺑﻌﺪ از ﺧﻮاﻧﺪن از رﺟﯿﺴﺘﺮ ‪ AIC_IVR‬ﭘﺮﭼﻢ وﻗﻔﻪ‬
‫ﺑﻪ ﺻﻮرت ﺧﻮدﮐﺎر ﭘﺎك ﻣﯽﺷﻮد‪.‬‬

‫‪7‬‬
‫ﺗﻨﻈﯿﻢ‪ :‬ﻋﻠﯽ اﺑﺮﯾﺸﻤﯽ ﻣﻘﺪم‬ ‫‪www.armcenter.ir‬‬

‫اﮔﺮ ﯾﮏ ﯾﺎ ﭼﻨﺪ وﻗﻔﻪ رخ دﻫﺪ و ﺑﻪ آن ﻫﺎ رﺳﯿﺪﮔﯽ ﻧﺸﻮد ﻣﯽﺗﻮان آن ﻫﺎ را در رﺟﯿﺴﺘﺮ ‪ AIC_IPR‬ﻣﺸﺎﻫﺪه ﮐﺮد‪.‬‬

‫ﺻﺪور ﻧﺮم اﻓﺰاري ﻓﺮﻣﺎن وﻗﻔﻪ‬


‫ﻣﯽﺗﻮان ﺑﺎ ﻧﻮﺷﺘﻦ در رﺟﯿﺴﺘﺮ)‪ AIC_ISCR (Interrupt Set Command Register‬ﺑﺮاي ﻫﺮ ﻣﻨﺒﻌﯽ ﮐﻪ ﺑﻪ‬
‫ﺻﻮرت ﺣﺴﺎس ﺑﻪ ﻟﺒﻪ ﺗﻌﺮﯾﻒ ﺷﺪه ﺑﺎﺷﺪ‪ ،‬ﯾﮏ وﻗﻔﻪ اﯾﺠﺎد ﮐﺮد‪ ،‬و ﯾﺎ وﻗﻔﻪ اﯾﺠﺎد ﺷﺪه را ﺑﺎ ﻧﻮﺷﺘﻦ در‬
‫رﺟﯿﺴﺘﺮ)‪ AIC_ICCR (Interrupt Clear Command Register‬ﺣﺬف ﮐﻨﯿﻢ‪ .‬اﮔﺮ وﻗﻔﻪ اي ﺑﻪ ﺻﻮرت‬
‫ﺣﺴﺎس ﺑﻪ ﺳﻄﺢ ﺗﻌﺮﯾﻒ ﺷﺪه ﺑﺎﺷﺪ اﯾﻦ ﻋﻤﻞ ﺑﺮ روي آن ﺗﺎﺛﯿﺮي ﻧﺪارد‪.‬‬

‫‪8‬‬
‫ﺗﻨﻈﯿﻢ‪ :‬ﻋﻠﯽ اﺑﺮﯾﺸﻤﯽ ﻣﻘﺪم‬ ‫‪www.armcenter.ir‬‬

‫ﭘﺎك ﺷﺪن وﻗﻔﻪ ﻣﻨﺎﺑﻊ در رﺟﯿﺴﺘﺮ ‪ AIC_ISR‬ﺑﻌﺪ از ﺧﻮاﻧﺪن از رﺟﯿﺴﺘﺮ ‪ AIC_IVR‬ﺑﻪ ﺻﻮرت اﺗﻮﻣﺎﺗﯿﮏ اﻧﺠﺎم‬
‫ﻣﯽ ﮔﯿﺮد اﯾﻦ وﯾﮋﮔﯽ ﺳﺒﺐ ﮐﺎﻫﺶ ﺑﺮﻧﺎﻣﻪ ﻧﻮﯾﺴﯽ ﻣﯽﺷﻮد‪ .‬وﯾﮋﮔﯽ ﭘﺎك ﺷﺪن اﺗﻮﻣﺎﺗﯿﮏ در ﺻﻮرت اﺳﺘﻔﺎده از اﻣﮑﺎن‬
‫‪ Fast Forcing‬اﻣﮑﺎن ﭘﺬﯾﺮ ﻧﯿﺴﺖ‪.‬‬
‫وﺿﻌﯿﺖ وﻗﻔﻪ ﻫﺎ‬
‫ﺑﺎ رﺟﯿﺴﺘﺮ )‪ AIC_ISR (Interrupt Status Register‬ﻣﯽﺗﻮان ﺷﻤﺎره ‪ ID‬وﻗﻔﻪ اي ﮐﻪ اﮐﻨﻮن رخ داده را‬
‫درﯾﺎﻓﺖ ﮐﺮد‪.‬‬

‫ﺑﺎ رﺟﯿﺴﺘﺮ)‪ AIC_CISR (Core Interrupt Status Register‬ﻣﯽﺗﻮان ﺑﺎ ﺗﻮﺟﻪ ﺑﻪ دو ﻓﯿﻠﺪ ‪ NIRQ‬و ‪NIFQ‬‬
‫وﺿﻌﯿﺖ ﺧﻄﻮط وﻗﻔﻪ ﭘﺮدازﻧﺪه را ﺑﺮرﺳﯽ ﮐﺮد‪.‬‬

‫‪NIRQ‬‬
‫‪ = 0‬ﺧﻄﻮط ‪ IRQ‬ﻏﯿﺮ ﻓﻌﺎل ﻫﺴﺘﻨﺪ‪.‬‬
‫‪ = 1‬ﺧﻄﻮط ‪ IRQ‬ﻓﻌﺎل ﻫﺴﺘﻨﺪ‪.‬‬
‫‪NFIQ‬‬
‫‪ = 0‬ﺧﻄﻮط ‪ FRQ‬ﻏﯿﺮ ﻓﻌﺎل ﻫﺴﺘﻨﺪ‪.‬‬
‫‪ = 1‬ﺧﻄﻮط ‪ FRQ‬ﻓﻌﺎل ﻫﺴﺘﻨﺪ‪.‬‬

‫ﻫﻤﺎن ﻃﻮر ﮐﻪ ﻗﺒﻼً ﮔﻔﺘﻪ ﺷﺪ ﯾﮑﯽ از ﻧﮑﺎت ﺿﺮوري اﯾﻦ اﺳﺖ ﮐﻪ در ﭘﺎﯾﺎن ﻓﺮآﯾﻨﺪ وﻗﻔﻪ ﺑﺎﯾﺪ ﭘﺎﯾﺎن وﻗﻔﻪ را ﺑﺎ ﻧﻮﺷﺘﻦ‬
‫ﻫﺮ ﻣﻘﺪاري در رﺟﯿﺴﺘﺮ )‪AIC_EOICR (END OF INTERRUPT COMMAND REGISTER‬‬
‫ﻣﺸﺨﺺ ﺷﻮد‪.‬‬

‫‪9‬‬
‫ﺗﻨﻈﯿﻢ‪ :‬ﻋﻠﯽ اﺑﺮﯾﺸﻤﯽ ﻣﻘﺪم‬ ‫‪www.armcenter.ir‬‬

‫وﻗﻔﻪ ﺗﻮ در ﺗﻮ‬
‫ﺳﺮوﯾﺲ وﻗﻔﻪ ﺗﻮ در ﺗﻮ)‪ (interrupt nesting‬زﻣﺎﻧﯽ ﺑﻪ ﮐﺎر ﻣﯽرود ﮐﻪ ﺑﺮﻧﺎﻣﻪ در ﺣﺎل اﺟﺮاي روﺗﯿﻦ ﯾﮏ وﻗﻔﻪ ﺑﺎﺷﺪ‬
‫و در ﻫﻤﯿﻦ ﺣﯿﻦ ﯾﮏ وﻗﻔﻪ ﺑﺎ اوﻟﻮﯾﺖ ﺑﺎﻻ ﺗﺮ رخ دﻫﺪ )ﺷﮑﻞ زﯾﺮ(‪ .‬در اﯾﻦ ﻫﻨﮕﺎم ﺧﻄﻮط وﻗﻔﻪ ﭘﺮدازﻧﺪه در اﺧﺘﯿﺎر وﻗﻔﻪ‬
‫ﺑﺎ اوﻟﻮﯾﺖ ﺑﺎﻻﺗﺮ ﻗﺮار ﻣﯽﮔﯿﺮد و ﺑﺮﻧﺎﻣﻪ در ﺣﺎل اﺟﺮا ﻣﺘﻮﻗﻒ و رﺟﯿﺴﺘﺮ ‪ AIC_IVR‬ﺑﺮاي ﺗﻌﯿﯿﻦ ﻣﻨﺒﻊ وﻗﻔﻪ ﺟﺪﯾﺪ‬
‫ﺑﺎﯾﺪ ﺧﻮاﻧﺪه ﺷﻮد‪ .‬در اﯾﻦ زﻣﺎن ﺷﻤﺎره ﻣﻨﺒﻊ وﻗﻔﻪ ﻗﺒﻠﯽ و اوﻟﻮﯾﺖ آن در ﯾﮏ ﺣﺎﻓﻈﻪ ﭘﺸﺘﻪ ذﺧﯿﺮه ﻣﯽ ﺷﻮد ﺗﺎ ﺑﻌﺪ از‬
‫اﺗﻤﺎم روﺗﯿﻦ وﻗﻔﻪ ﺑﺎ اوﻟﻮﯾﺖ ﺑﺎﻻ ﮐﻪ ﺑﺎ ﻧﻮﺷﺘﻦ در رﺟﯿﺴﺘﺮ ‪ AIC_EOICM‬ﻣﺸﺨﺺ ﻣﯽ ﺷﻮد ﺑﻪ اداﻣﻪ اﺟﺮاي روﺗﯿﻦ‬
‫ﻗﺒﻠﯽ ﺑﭙﺮدازد‪.‬‬

‫‪10‬‬
‫ﺗﻨﻈﯿﻢ‪ :‬ﻋﻠﯽ اﺑﺮﯾﺸﻤﯽ ﻣﻘﺪم‬ ‫‪www.armcenter.ir‬‬

‫وﻗﻔﻪ ﺳﺮﯾﻊ )‪(FAST Interrupt‬‬

‫ﺗﻨﻬﺎ ﻣﻨﺒﻊ وﻗﻔﻪ ﺳﺮﯾﻊ ﻣﻨﺒﻊ ﺷﻤﺎره ﺻﻔﺮ ﻣﯽ ﺑﺎﺷﺪ ﻣﮕﺮ در ﻣﻮاردي ﮐﻪ از ﻣﺪ ‪ Fast Forcing‬اﺳﺘﻔﺎده ﮐﻨﯿﻢ‪ .‬اﯾﻦ‬
‫ﻣﻨﺒﻊ ﺑﻪ ﺻﻮرت وﻗﻔﻪ ﺧﺎرﺟﯽ ﺑﻪ ﺻﻮرت ﻣﺴﺘﻘﯿﻢ ﯾﺎ ﺑﺎ اﺳﺘﻔﺎده از ﮐﻨﺘﺮﻟﺮ ‪ PIO‬ﺑﻪ ﯾﮑﯽ از ﭘﯿﻦ ﻫﺎي ﻣﯿﮑﺮو ﻣﺘﺼﻞ‬
‫اﺳﺖ‪.‬‬
‫ﺑﺮاي اﯾﻦ ﻣﻨﺒﻊ ﻫﯿﭻ اوﻟﻮﯾﺘﯽ ﺗﻌﺮﯾﻒ ﻧﺸﺪه اﺳﺖ‪ .‬ﺑﺮاي ﺗﻌﯿﯿﻦ ﻣﺪ ﮐﺎري اﯾﻦ وﻗﻔﻪ از رﺟﯿﺴﺘﺮ ‪ AIC_SMR0‬اﺳﺘﻔﺎده‬
‫ﻣﯽ ﮐﻨﯿﻢ ﮐﻪ ﻓﯿﻠﺪ ‪ PRIOR‬آن ﺑﯽ اﻫﻤﯿﺖ اﺳﺖ وﻧﻮع آن در ﻓﯿﻠﺪ ‪ SRCTYPE‬ﻣﺸﺨﺺ ﻣﯽ ﺷﻮد‪.‬‬
‫ﻫﻤﺎن ﮔﻮﻧﻪ ﮐﻪ ﻗﺒﻼ ﺗﻮﺿﯿﺢ داده ﺷﺪ ﺑﺎ ﻧﻮﺷﺘﻦ ﻣﻘﺪار ‪ 0x1‬در رﺟﯿﺴﺘﺮ ‪ AIC_IECR‬اﯾﻦ ﻣﻨﺒﻊ ﻓﻌﺎل ﻣﯽ ﺷﻮد و ﯾﺎ‬
‫ﺑﺎ ﻧﻮﺷﺘﻦ در رﺟﯿﺴﺘﺮ ‪ AIC_IDCR‬اﯾﻦ ﻣﻨﺒﻊ ﻏﯿﺮ ﻓﻌﺎل ﻣﯽ ﺷﻮد ﻫﻤﭽﻨﯿﻦ ﺑﺎ ﺧﻮاﻧﺪن ﺑﯿﺖ ﺻﻔﺮم رﺟﯿﺴﺘﺮ‬
‫‪ AIC_IMR‬ﻣﺸﺨﺺ ﻣﯽ ﺷﻮد ﮐﻪ آﯾﺎ وﻗﻔﻪ ﺳﺮﯾﻊ ﻓﻌﺎل اﺳﺖ ﯾﺎ ﻧﻪ‪.‬‬
‫ﻫﻨﮕﺎم وﻗﻮع وﻗﻔﻪ ﺳﺮﯾﻊ ﻣﺤﺘﻮاي ‪ AIC_SVR0‬در ‪ AIC_FVR‬ﻗﺎﺑﻞ دﺳﺘﺮس اﺳﺖ وﻫﻨﮕﺎﻣﯽ ﮐﻪ وﻗﻔﻪ اي رخ‬
‫ﻧﺪﻫﺪ ﻣﺤﺘﻮاي اﯾﻦ رﺟﯿﺴﺘﺮ ﻣﻘﺪار ذﺧﯿﺮه ﺷﺪه در رﺟﯿﺴﺘﺮ ‪ AIC_SPU‬اﺳﺖ‪.‬‬

‫وﯾﮋﮔﯽ ‪FAST FORCING‬‬


‫اﯾﻦ وﯾﮋﮔﯽ ﺳﺒﺐ ﻣﯽ ﺷﻮد ﺗﺎ ﻫﺮ ﮐﺪام از وﻗﻔﻪ ﻫﺎي ‪ IRQ‬ﺑﻪ ‪ FIQ‬ﺗﺒﺪﯾﻞ ﺷﻮﻧﺪ‪.‬‬
‫ﻓﻌﺎل وﻏﯿﺮ ﻓﻌﺎل ﺷﺪن اﯾﻦ وﯾﮋﮔﯽ ﺑﻪ ﺗﺮﺗﯿﺐ ﺑﺎ ﯾﮏ ﮐﺮدن ﺑﯿﺖ ﻫﺎي رﺟﯿﺴﺘﺮﻫﺎي ‪AIC_FFER (Fast Forcing‬‬
‫)‪ Enable Register‬و )‪ AIC_FFDR (Fast Forcing Disable Register‬ﻣﯽ ﺑﺎﺷﺪ ﻫﻤﭽﻨﯿﻦ ﻣﯽﺗﻮان ﺑﺎ‬
‫ﺧﻮاﻧﺪن رﺟﯿﺴﺘﺮ )‪ AIC_FFSR (Fast Forcing Status Register‬وﺿﻌﯿﺖ ﻓﻌﺎل ﺑﻮدن ﯾﺎ ﻧﺒﻮدن اﯾﻦ وﯾﮋﮔﯽ‬
‫را ﺑﺮرﺳﯽ ﮐﺮد‪ .‬اﮔﺮ ﺑﯿﺘﯽ از اﯾﻦ رﺟﯿﺴﺘﺮ ﯾﮏ ﺑﺎﺷﺪ ﯾﻌﻨﯽ اﯾﻦ وژﮔﯽ ﺑﺮاي آن ﻣﻨﺒﻊ ﻓﻌﺎل اﺳﺖ‪.‬‬
‫زﻣﺎﻧﯽ ﮐﻪ از ‪ Fast Forcing‬اﺳﺘﻔﺎده ﻣﯽﮐﻨﯿﻢ دﯾﮕﺮ ﻗﺎدر ﺑﻪ اوﻟﻮﯾﺖ ﺑﻨﺪي ﻧﯿﺴﺘﯿﻢ وﻫﻨﮕﺎم وﻗﻮع وﻗﻔﻪ ﻣﻨﺒﻊ وﻗﻔﻪ از‬
‫ﺧﻄﻮط ‪ FIQ‬ﭘﺮدازﻧﺪه اﺳﺘﻔﺎده ﻣﯽ ﮐﻨﺪ‪ .‬اﯾﻦ وﯾﮋﮔﯽ ﺑﺮ روي وﻗﻔﻪ ﺳﺮﯾﻊ ﻣﻨﺒﻊ ﺻﻔﺮ ﺗﺎﺛﯿﺮي ﻧﺪارد‪.‬‬
‫زﻣﺎﻧﯽ ﮐﻪ از ‪ Fast Forcing‬اﺳﺘﻔﺎده ﻣﯽ ﮐﻨﯿﻢ ﺑﺎ ﺧﻮاﻧﺪن از رﺟﯿﺴﺘﺮ ‪ AIC_FVR‬ﻣﻨﺒﻊ وﻗﻔﻪ ﭘﺎك ﻧﻤﯽ ﺷﻮد و‬
‫ﺑﺎﯾﺪ ﺑﺎ ﻧﻮﺷﺘﻦ در رﺟﯿﺴﺘﺮ ‪ AIC_ICCR‬ﻣﻨﺒﻊ وﻗﻔﻪ را ﭘﺎك ﮐﻨﯿﻢ‬
‫ﻧﮑﺘﻪ ‪:1‬‬
‫ﺑﺮ ﺧﻼف ﻗﺒﻞ اﮔﺮ از ‪ Fast Forcing‬اﺳﺘﻔﺎده ﮐﻨﯿﻢ دﯾﮕﺮ ﺑﺎ ﺧﻮاﻧﺪن از رﺟﯿﺴﺘﺮ ‪ AIC_IVR‬ﻣﻨﺒﻊ وﻗﻔﻪ ﭘﺎك ﻧﻤﯽ‬
‫ﺷﻮد ‪ .‬ﺗﻤﺎﻣﯽ ﻣﻨﺎﺑﻌﯽ ﮐﻪ ﺑﻪ ﺻﻮرت ‪ Fast Forcing‬و ﺣﺴﺎس ﺑﻪ ﻟﺒﻪ ﺗﻌﺮﯾﻒ ﺷﺪه اﻧﺪ ﺑﺎﯾﺪ ﺑﺎ ﻧﻮﺷﺘﻦ در رﺟﯿﺴﺘﺮ‬
‫‪ AIC_ICCR‬ﭘﺎك ﺷﻮﻧﺪ‪.‬‬
‫ﻧﮑﺘﻪ‪:2‬‬
‫وﻗﻔﻪ )‪ (system peripheral ID=1‬در واﻗﻊ ﻫﻔﺖ وﻗﻔﻪ ﻣﺸﺘﺮك را ﭘﻮﺷﺶ ﻣﯿﺪﻫﺪ ﮐﻪ ﻋﺒﺎرﺗﻨﺪ از‪:‬‬

‫‪11‬‬
‫ﺗﻨﻈﯿﻢ‪ :‬ﻋﻠﯽ اﺑﺮﯾﺸﻤﯽ ﻣﻘﺪم‬ ‫‪www.armcenter.ir‬‬

‫‪periodic interval timer (PIT) , real time timer (RTT) , watchdog timer (WDT) ,‬‬
‫‪debug-UART (DBGU) , power management controller (PMC), reset controller‬‬
‫‪(RSTC) ,‬و )‪. embedded flash controller (EFC‬‬
‫ﻧﮑﺘﻪ ‪:3‬‬
‫ﻫﻨﮕﺎم وﻗﻮع وﻗﻔﻪ )‪ (AIC‬ﺑﺎﯾﺪ ﻣﻮارد زﯾﺮ را ﺑﺪاﻧﯿﻢ ‪:‬‬
‫‪ ‬آدرﺳﯽ ﮐﻪ ﺑﻪ ان ﭘﺮش ﮐﻨﺪ ‪ ,‬اوﻟﻮﯾﺖ و ﻧﻮع وﻗﻔﻪ )ﺣﺴﺎس ﺑﻪ ﻟﺒﻪ ﯾﺎ ﺣﺴﺎس ﺑﻪ ﺳﻄﺢ(‪.‬‬
‫‪ ‬ﺑﺮاي ﻣﺸﺨﺺ ﮐﺮدن آدرس ‪ 32‬ﺑﯿﺘﯽ رﺟﯿﺴﺘﺮ ‪ AIC_ SVR‬ﺑﺮاي ﻫﺮ وﻗﻔﻪ وﺟﻮد دارد ‪.‬‬

‫ﺑﺮاي ﻓﻬﻤﯿﺪن ﺑﻬﺘﺮ ﻣﻄﺎﻟﺐ اﯾﻦ آﻣﻮزش ﺑﻬﺘﺮ اﺳﺖ ﺑﻪ ﺑﺨﺶ ﭘﺮوژه ﻫﺎ ﻣﺮاﺟﻌﻪ ﮐﻨﯿﺪ ﺗﺎ ﺑﺎ ﯾﮏ ﻣﺜﺎل ﻋﻤﻠﯽ ﻣﻄﺎﻟﺐ‬
‫ﺑﺎﻻ را ﺑﺮرﺳﯽ ﮐﻨﯿﺪ ‪.‬‬

‫‪www.armcenter.org‬‬

‫‪12‬‬

You might also like