📄 basic.html
字号:
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'> <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'> <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]> <![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 & 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]> <![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’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]> <![endif]><o:p></o:p></span></p>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -