📄 main-int.c
字号:
/**************************************************************************************************
*
* Copyright (C) ART Limited, 2006. All rights reserved.
*
* File: main.c
* Data: 2006.05.16
*
**************************************************************************************************/
#include "project.h"
// ----------------------------------------------------------------------------
// ATMEL Microcontroller Software Support - ROUSSET -
// ----------------------------------------------------------------------------
// DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
// DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// ----------------------------------------------------------------------------
// File Name : interrupt_Usart.c
// Object : USART Interrupt Management
// Creation : JPP 08-Sep-2005
// ----------------------------------------------------------------------------
// Include Standard LIB files
#include "project.h"
#define IAR 1
#define USART_INTERRUPT_LEVEL 7
#define AT91_BAUD_RATE 115200
#define AT91B_MAIN_OSC 18432000 // Main Oscillator
#define AT91B_MCK ((18432000*73/14)/2) // Output PLL Clock
extern void Init_Uart0(void);
//*----------------------------------------------------------------------------
//* Object : C handler interrupt function
//* Input Parameters : none.
//* Output Parameters : none.
//*----------------------------------------------------------------------------
#if IAR
__ramfunc void Usart_c_irq_handler(void)
#else
void __irq Usart_c_irq_handler(void)
#endif
{
unsigned int status;
AT91PS_USART COM0 = AT91C_BASE_US0;
//* get Usart status register
status = COM0->US_CSR;
if(status & AT91C_US_RXRDY)
{
AT91F_US_PutChar (COM0, AT91F_US_GetChar(COM0));
}
if(status & AT91C_US_OVRE)
{
AT91F_US_GetChar(COM0);
AT91F_US_PutChar(COM0, 'O');
}
if(status & AT91C_US_PARE)
{
AT91F_US_PutChar(COM0, 'P');
}
if(status & AT91C_US_FRAME)
{
AT91F_US_PutChar(COM0, 'F');
}
if(status & AT91C_US_TIMEOUT)
{
COM0->US_CR = AT91C_US_STTTO;
AT91F_US_PutChar(COM0, 'T');
}
//* Reset the satus bit
COM0->US_CR = AT91C_US_RSTSTA;
AT91F_AIC_AcknowledgeIt(AT91C_BASE_AIC);
}
//*----------------------------------------------------------------------------
//* Object : USART initialization
//* Input Parameters : none.
//* Output Parameters : none.
//*----------------------------------------------------------------------------
void Usart_init(void)
{
AT91PS_USART COM0 = AT91C_BASE_US0;
//* Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,
((unsigned int) AT91C_PA0_RXD0) |
((unsigned int) AT91C_PA1_TXD0) |
((unsigned int) AT91C_PA3_RTS0) |
((unsigned int) AT91C_PA4_CTS0),
0);
//* First, enable the clock of the USART
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1<<AT91C_ID_US0);
//* Usart Configure
AT91F_US_Configure(COM0, AT91B_MCK, AT91C_US_ASYNC_MODE, AT91_BAUD_RATE, 0);
//* Enable usart
COM0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
//* Enable USART IT error and RXRDY
AT91F_US_EnableIt(COM0,AT91C_US_TIMEOUT | AT91C_US_FRAME | AT91C_US_OVRE |AT91C_US_RXRDY);
//* open Usart 0 interrupt
#if IAR
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
AT91C_ID_US0,
USART_INTERRUPT_LEVEL,
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
Usart_c_irq_handler);
#else
//* Disable the interrupt on the interrupt controller
AT91C_BASE_AIC->AIC_IDCR = 0x1 << AT91C_ID_US0;
//* Save the interrupt handler routine pointer and the interrupt priority
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (unsigned int)Usart_c_irq_handler;
//* Store the Source Mode Register
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US0] = USART_INTERRUPT_LEVEL | AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL;
//* Clear the interrupt on the interrupt controller
AT91C_BASE_AIC->AIC_ICCR = 0x1 << AT91C_ID_US0;
#endif
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_US0);
}
//*--------------------------------------------------------------------------------------
//* Object : Software entry point
//* Input Parameters : none.
//* Output Parameters : none.
//*--------------------------------------------------------------------------------------
int main()
{
Usart_init();
AT91F_US_PutChar (AT91C_BASE_US0, 'X');
AT91F_US_SendFrame(AT91C_BASE_US0, "COM0 TEST OK!\n", 14, 0, 0);
while(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -