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

📄 main-int.c

📁 一个AT91SAM7X256 USART驱动实验
💻 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 + -