⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basic.html

📁 针对at91sam7a3为主芯片开发板开发的中断应用程序
💻 HTML
📖 第 1 页 / 共 2 页
字号:
  EN-US'><o:p></o:p></span></p>
  </td>
 </tr>
 <tr>
  <td width="33%" valign=top style='width:33.82%;padding:5.25pt 5.25pt 5.25pt 5.25pt'>
  <p class=MsoNormal><span lang=EN-US style='mso-ansi-language:EN-US'>&nbsp;<o:p></o:p></span></p>
  </td>
  <td width="65%" valign=top style='width:65.66%;padding:5.25pt 5.25pt 5.25pt 5.25pt'>
  <p><b><span lang=EN-US style='font-size:10.0pt;mso-ansi-language:EN-US'>Startup
  Files</span></b><span lang=EN-US style='mso-ansi-language:EN-US'><o:p></o:p></span></p>
  </td>
 </tr>
 <tr>
  <td width="33%" valign=top style='width:33.82%;padding:5.25pt 5.25pt 5.25pt 5.25pt'>
  <p><span lang=EN-US style='font-size:10.0pt;mso-ansi-language:EN-US'>srcxxx/Cstartup.xxx
  </span><span lang=EN-US style='mso-ansi-language:EN-US'><o:p></o:p></span></p>
  </td>
  <td width="65%" valign=top style='width:65.66%;padding:5.25pt 5.25pt 5.25pt 5.25pt'>
  <p><b><span lang=EN-US style='font-size:10.0pt;mso-ansi-language:EN-US'>AT91SAM7A3</span></b><span
  lang=EN-US style='font-size:10.0pt;mso-ansi-language:EN-US'> microcontroller
  reset entry point</span><span lang=EN-US style='mso-ansi-language:EN-US'><o:p></o:p></span></p>
  </td>
 </tr>
 <tr>
  <td width="33%" valign=top style='width:33.82%;padding:5.25pt 5.25pt 5.25pt 5.25pt'>
  <p><span lang=EN-US style='font-size:10.0pt;mso-ansi-language:EN-US'>srcxxx/Cstartup_SAM7.c</span><span
  lang=EN-US style='mso-ansi-language:EN-US'><o:p></o:p></span></p>
  </td>
  <td width="65%" valign=top style='width:65.66%;padding:5.25pt 5.25pt 5.25pt 5.25pt'>
  <p><b><span lang=EN-US style='font-size:10.0pt;mso-ansi-language:EN-US'>AT91SAM7A3</span></b><span
  lang=EN-US style='font-size:10.0pt;mso-ansi-language:EN-US'> initialization
  called by the assembly code and by the Cstartup</span><span lang=EN-US
  style='mso-ansi-language:EN-US'><o:p></o:p></span></p>
  </td>
 </tr>
 <tr>
  <td width="33%" valign=top style='width:33.82%;padding:5.25pt 5.25pt 5.25pt 5.25pt'>
  <p class=MsoNormal><span lang=EN-US style='mso-ansi-language:EN-US'>&nbsp;<o:p></o:p></span></p>
  </td>
  <td width="65%" valign=top style='width:65.66%;padding:5.25pt 5.25pt 5.25pt 5.25pt'>
  <p><b><span lang=FR style='font-size:10.0pt;mso-ansi-language:FR'>C Files</span></b><span
  lang=FR style='mso-ansi-language:FR'><o:p></o:p></span></p>
  </td>
 </tr>
 <tr>
  <td width="33%" valign=top style='width:33.82%;padding:5.25pt 5.25pt 5.25pt 5.25pt'>
  <p><span lang=FR style='font-size:10.0pt;mso-ansi-language:FR'>../src/main.c</span><span
  lang=FR style='mso-ansi-language:FR'><o:p></o:p></span></p>
  </td>
  <td width="65%" valign=top style='width:65.66%;padding:5.25pt 5.25pt 5.25pt 5.25pt'>
  <p><span lang=EN-US style='font-size:10.0pt;mso-ansi-language:EN-US'>Main
  entry point </span><span lang=EN-US style='mso-ansi-language:EN-US'><o:p></o:p></span></p>
  </td>
 </tr>
 <tr>
  <td width="33%" valign=top style='width:33.82%;padding:5.25pt 5.25pt 5.25pt 5.25pt'>
  <p><i><span lang=EN-US style='font-size:10.0pt;mso-ansi-language:EN-US'>ext_irq.c</span></i><span
  lang=EN-US style='mso-ansi-language:EN-US'><o:p></o:p></span></p>
  </td>
  <td width="65%" valign=top style='width:65.66%;padding:5.25pt 5.25pt 5.25pt 5.25pt'>
  <p><span lang=EN-US style='font-size:10.0pt;mso-ansi-language:EN-US'>External
  interrupt handler for the FIQ</span><span lang=EN-US style='mso-ansi-language:
  EN-US'><o:p></o:p></span></p>
  </td>
 </tr>
 <tr>
  <td width="33%" valign=top style='width:33.82%;padding:5.25pt 5.25pt 5.25pt 5.25pt'>
  <p><i><span lang=FR style='font-size:10.0pt;mso-ansi-language:FR'>interrupt_timer.c</span></i><span
  lang=FR style='mso-ansi-language:FR'><o:p></o:p></span></p>
  </td>
  <td width="65%" valign=top style='width:65.66%;padding:5.25pt 5.25pt 5.25pt 5.25pt'>
  <p><span lang=FR style='font-size:10.0pt;mso-ansi-language:FR'>Timer
  interrupt management</span><span lang=FR style='mso-ansi-language:FR'><o:p></o:p></span></p>
  </td>
 </tr>
</table>

<p class=MsoNormal><span lang=FR style='mso-ansi-language:FR'><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></span></p>

<p class=MsoNormal><!-- ******* Description  ********** !--><a
name=Description><b><span lang=EN-US style='mso-ansi-language:EN-US'>Description:</span></b></a><b><span
lang=EN-US style='mso-ansi-language:EN-US'><o:p></o:p></span></b></p>

<p class=MsoNormal style='margin-left:36.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>In background one led (LED1) is blinking simply
by writing directly in the PIO interface.<o:p></o:p></span></p>

<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:12.0pt;
margin-left:36.0pt'><span lang=EN-US style='mso-ansi-language:EN-US'>The LED2
is blinking by the software AIC interrupt after ten blink of LED1.<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:36.0pt'><a name="Interrupt_Action"><b><span
lang=EN-US style='mso-ansi-language:EN-US'>Interrupt Action</span></b></a><b><span
lang=EN-US style='mso-ansi-language:EN-US'><o:p></o:p></span></b></p>

<p class=MsoNormal style='margin-left:36.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>- When you push on SW4, the PIO interface is
activated and uses the PIO interrupt routine. This interrupt has the priority
level 2 . If you keep SW5 in position you maintain the interrupt handler and
suppress the lower interrupt task.<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:36.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>- The timer interrupt increment the global
variables named count_timer0_interrupt and count_timer1_interrupt. Each timer manages
the corresponding LED (LED3 &amp; LED4). The following table describes the
interrupt level associated to the peripherals. <o:p></o:p></span></p>

<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:12.0pt;
margin-left:36.0pt'><a name="Interrupt_Implementation"><span lang=EN-US
style='mso-ansi-language:EN-US'><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></span></a></p>

<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:12.0pt;
margin-left:36.0pt'><span style='mso-bookmark:Interrupt_Implementation'><b><span
lang=EN-US style='mso-ansi-language:EN-US'>Interrupt Implementation</span></b></span><b><span
lang=EN-US style='mso-ansi-language:EN-US'><o:p></o:p></span></b></p>

<p class=MsoNormal style='margin-left:36.0pt'><b><span lang=EN-US
style='mso-ansi-language:EN-US'>Interrupt initialization<o:p></o:p></span></b></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>- Initialization of the Interrupt stack. This
initialization is performed in the <b>Cstartup.xxx</b> file. The IRQ_ENTRY
macro used, needs only 2x32-bit stack level. The first 32-bit for the link
address and the second for the application status register.<o:p></o:p></span></p>

<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:12.0pt;
margin-left:72.0pt'><span lang=EN-US style='mso-ansi-language:EN-US'>IRQ_STACK_SIZE
EQU (2*8*4) ; 2 words per interrupt priority level<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>The FIQ does not need specific stack as this
interruption is not interruptible by other interrupts.<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'><br>
- Configure the Peripheral<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:108.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Enable the corresponding clock: see function
named AT91F_PMC_EnablePeriphClock<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:108.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Select the corresponding I/O in peripheral
mode: see function named AT91F_PIO_CfgPeriph<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:108.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Configure all peripheral registers<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Set the AIC: see function named
AT91F_AIC_ConfigureIt<o:p></o:p></span></p>

<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:12.0pt;
margin-left:72.0pt'><span lang=EN-US style='mso-ansi-language:EN-US'>Enable
this interrupt in the AIC: see function named AT91F_AIC_EnableIt<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:36.0pt'><b><span lang=EN-US
style='mso-ansi-language:EN-US'>Interrupt Handling Entry</span></b><span
lang=EN-US style='mso-ansi-language:EN-US'><o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Save lr, spsr_irq and r0<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Get the vector address in the IVR Register<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Acknowledge the interrupt in the ACI vectoring<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Switch in System Mode<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>- Only one link register saves the interrupt
return address<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>- Priority needs to manage nested interrupt and
to enable the next interrupt (clear I bit)<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Save the context (scratched registers only) <o:p></o:p></span></p>

<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:12.0pt;
margin-left:72.0pt'><span lang=EN-US style='mso-ansi-language:EN-US'>Call the C
handler (IVR) <o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:36.0pt'><b><span lang=EN-US
style='mso-ansi-language:EN-US'>Interrupt Handling Exit</span></b><span
lang=EN-US style='mso-ansi-language:EN-US'> <o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Restore the context<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Disable Interrupt<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Switch back in IRQ Mode<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Write AIC_EOICR<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Restore r0 and spsr_irq<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Restore lr directly in pc<o:p></o:p></span></p>

<p class=MsoNormal style='margin-top:0cm;margin-right:0cm;margin-bottom:12.0pt;
margin-left:72.0pt'><span lang=EN-US style='mso-ansi-language:EN-US'>Because
adjusted in entry sequence<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:36.0pt'><a name="Interrupt_detection"><b><span
lang=EN-US style='mso-ansi-language:EN-US'>Interrupt Detection</span></b></a><b><span
lang=EN-US style='mso-ansi-language:EN-US'><o:p></o:p></span></b></p>

<p class=MsoNormal style='margin-left:36.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>When an interrupt source is detected, AIC
asserts NIRQ<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=FR style='mso-ansi-language:
FR'>- AIC de-asserts the NIRQ<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>- AIC determines the highest level pending and
enabled interrupt source<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>- AIC pushes the level of the current interrupt
in hardware stack<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>- AIC clears the interrupt if it&#8217;s edge
triggered<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>- AIC returns the vector corresponding to the
current interrupt<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:36.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>Interrupt Service Routine re-enables as soon as
possible the interrupt at processor level<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:36.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>A highest-level interrupt can occur and
restarts this sequence<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:36.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>The Interrupt Service Exit code disables the
interrupt at processor level and writes the End Of Interrupt Command Register<o:p></o:p></span></p>

<p class=MsoNormal style='margin-left:72.0pt'><span lang=EN-US
style='mso-ansi-language:EN-US'>- AIC pops from its hardware stack the current
level<o:p></o:p></span></p>

<p style='margin-left:36.0pt'><span lang=EN-US style='mso-ansi-language:EN-US'>Interrupt
Handling Entry <!-- ******* Interrupt level  ********** !--><o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='mso-ansi-language:EN-US'><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></span></p>

</div>

</body>

</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -