📄 samuart.c
字号:
#include "AT91SAM7S128.h"
#include "lib_at91sam7s128.h"
#include "SAMuart.h"
#include "SAMinit.h"
#include <stdio.h>
#include <stdarg.h>
#define rxnum0 AT91C_BASE_US0->RCR
#define rxnum1 AT91C_BASE_US1->RCR
#define txnum0 AT91C_BASE_US0->TCR
#define txnum1 AT91C_BASE_US1->TCR
#define EXT_OC 18432000 // Exetrnal ocilator MAINCK
#define MCK 47923200 // MCK (PLLRC div by 2)
#define MCKKHz (MCK/1000) //
#define USART_INTERRUPT_LEVEL 7
//#define AT91_BAUD_RATE 19200
#define AT91_BAUD_RATE 115200
extern void VECTORED_IRQ_HANDLER(void);
AT91PS_USART COM0 = AT91C_BASE_US0;
AT91PS_USART COM1 = AT91C_BASE_US1;
extern void SARM_IRQ_EN1(void);
extern void SARM_IRQ_DIS1(void);
volatile unsigned char tx1_in_ptr=0;
volatile unsigned char tx1_out_ptr=0;
volatile unsigned char uart1_tx_buf[UART1TX_BUF_SIZE]={0};
volatile unsigned char uart1_rx_buf[UART1TX_BUF_SIZE]={0};
volatile unsigned char tx0_in_ptr=0;
volatile unsigned char tx0_out_ptr=0;
volatile unsigned char uart0_tx_buf[UART0TX_BUF_SIZE]={0};
volatile unsigned char uart0_rx_buf[UART0TX_BUF_SIZE]={0};
static const char atmel_header[]=
{
"\n\r *** Hello world!!! ***\n\r"
" EBD91SAM7S64 Version: 1.1\n\r"
" 2005.7.15\n\r"
};
/*void Uart0Init(void)
{
AT91PS_PDC pPDC;
// clock
AT91C_BASE_PMC->PMC_PCER=(1<<AT91C_ID_US0); // USART0
// pin
AT91C_BASE_PIOA->PIO_PDR=(1<<5)|(1<<6);
AT91C_BASE_PIOA->PIO_ASR=(1<<5)|(1<<6); // RXD0,TXD0
// 115200,n,8,1
AT91C_BASE_US0->US_CR=0xAC; // RX,TX reset; RX,TX disable
AT91C_BASE_US0->US_BRGR=(F_CPU>>4)/US0_BAUDRATE;
AT91C_BASE_US0->US_MR=(4<<9)|AT91C_US_NBSTOP_1_BIT|AT91C_US_CHRL_8_BITS|AT91C_US_CLKS_CLOCK|AT91C_US_USMODE_NORMAL;
//AT91C_BASE_US0->US_CR=0x50; // RXEN,TXEN
//AT91F_PDC_EnableTx(pPDC);
AT91C_BASE_US0->US_IDR=0xF3FFF; // disable all interrupts
// AT91C_BASE_US0->US_IER
} */
//===================================================
//===================================================
void Uart0ISR(void)
{
AT91PS_USART USART_pt = AT91C_BASE_US0;
unsigned int status;
//* get Usart status register
status = USART_pt->US_CSR;
if ( status & AT91C_US_RXRDY){
//* Get byte and send
AT91F_US_PutChar (USART_pt, AT91F_US_GetChar(USART_pt));
}
if ( status & AT91C_US_OVRE) {
//* clear US_RXRDY
AT91F_US_GetChar(USART_pt);
AT91F_US_PutChar (USART_pt, 'O');
}
//* Check error
if ( status & AT91C_US_PARE) {
AT91F_US_PutChar (USART_pt, 'P');
}
if ( status & AT91C_US_FRAME) {
AT91F_US_PutChar (USART_pt, 'F');
}
if ( status & AT91C_US_TIMEOUT){
USART_pt->US_CR = AT91C_US_STTTO;
AT91F_US_PutChar (USART_pt, 'T');
}
//* Reset the satus bit
USART_pt->US_CR = AT91C_US_RSTSTA;
}
//==================================================================
void Uart1ISR(void)
{
AT91PS_USART USART_pt = AT91C_BASE_US1;
unsigned int status;
//* get Usart status register
status = USART_pt->US_CSR;
if ( status & AT91C_US_RXRDY){
//* Get byte and send
AT91F_US_PutChar (USART_pt, AT91F_US_GetChar(USART_pt));
}
if ( status & AT91C_US_OVRE) {
//* clear US_RXRDY
AT91F_US_GetChar(USART_pt);
AT91F_US_PutChar (USART_pt, 'O');
}
//* Check error
if ( status & AT91C_US_PARE) {
AT91F_US_PutChar (USART_pt, 'P');
}
if ( status & AT91C_US_FRAME) {
AT91F_US_PutChar (USART_pt, 'F');
}
if ( status & AT91C_US_TIMEOUT){
USART_pt->US_CR = AT91C_US_STTTO;
AT91F_US_PutChar (USART_pt, 'T');
}
//* Reset the satus bit
USART_pt->US_CR = AT91C_US_RSTSTA;
}
//======================================================
//=======================================================
void Uart0Init(void)
//* Begin
{
//* Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,
((unsigned int) AT91C_PA5_RXD0 ) |
((unsigned int) AT91C_PA6_TXD0 ) |
((unsigned int) AT91C_PA7_RTS0 ) // Peripheral A
,0); // Peripheral B
// First, enable the clock of the PIOB
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_US0 ) ;
// Usart Configure
AT91F_US_Configure (COM0, 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);
// AT91F_US_EnableIt(COM0,AT91C_US_RXRDY);
//* open Usart 1 interrupt
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, VECTORED_IRQ_HANDLER);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
AT91F_US_PutChar (COM0,'X');
if (AT91F_US_TxReady (COM0))
{
AT91F_US_PutChar (COM0,'Z');
}
AT91F_US_SendFrame(COM0,(char *)atmel_header,sizeof(atmel_header),0,0);
//* End
}
void Uart1Init ( void )
//* Begin
{
//* Configure PIO controllers to periph mode
AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,
((unsigned int) AT91C_PA21_RXD1 ) |
((unsigned int) AT91C_PA22_TXD1 ) |
((unsigned int) AT91C_PA24_RTS1 ) |
((unsigned int) AT91C_PA25_CTS1 ), // Peripheral A
0); // Peripheral B
// First, enable the clock of the PIOB
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_US1 ) ;
// Usart Configure
AT91F_US_Configure (COM1, MCK, AT91C_US_ASYNC_MODE, AT91_BAUD_RATE, 0);
// Enable usart
COM1->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
//* Enable USART IT error and RXRDY
AT91F_US_EnableIt(COM1,AT91C_US_TIMEOUT | AT91C_US_FRAME | AT91C_US_OVRE |AT91C_US_RXRDY);
//* open Usart 1 interrupt
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_US1, USART_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, VECTORED_IRQ_HANDLER);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1);
AT91F_US_PutChar (COM1,'X');
AT91F_US_SendFrame(COM1,(char *)atmel_header,sizeof(atmel_header),0,0);
//* End
}
/*
void Uart1Init(void)
{
// clock
AT91C_BASE_PMC->PMC_PCER=(1<<AT91C_ID_US1); // USART1
// pin
AT91C_BASE_PIOA->PIO_PDR=(1<<22)|(1<<21);
AT91C_BASE_PIOA->PIO_ASR=(1<<22)|(1<<21); // RXD1,TXD1
// 115200,n,8,1
AT91C_BASE_US1->US_CR=0xAC;
AT91C_BASE_US1->US_BRGR=(F_CPU>>4)/US1_BAUDRATE;
AT91C_BASE_US1->US_MR=(4<<9)|AT91C_US_NBSTOP_1_BIT|AT91C_US_CHRL_8_BITS|AT91C_US_CLKS_CLOCK|AT91C_US_USMODE_NORMAL;
//AT91C_BASE_US1->US_CR=0x50;
AT91C_BASE_US1->US_IDR=0xF3FFF; // disable all interrupts
AT91C_BASE_US1->US_IER=0x03; // TXRDY , RXRDY
AT91C_BASE_AIC->AIC_IECR |=1<<AT91C_ID_US1;
} */
/*
void UartDInit(void)
{
// clock
AT91C_BASE_PMC->PMC_PCER=(1<<AT91C_ID_SYS);
*AT91C_DBGU_CR = 0x1ac; //reset rx tx,and disrx tx
*AT91C_DBGU_MR = (4<<9)|(0<<14);
*AT91C_DBGU_BRGR = (F_CPU>>4)/USD_BAUDRATE;
*AT91C_DBGU_IDR = 0xFFFFFFFF ;
*AT91C_DBGU_IER = 0X03;
*AT91C_DBGU_CR = 0x50;
AT91C_BASE_AIC->AIC_IECR |= 1<<1;
} */
void Uart_Putchar(unsigned char uart,unsigned char ch)
{
if(uart==0)
{
while(!(AT91C_BASE_US0->US_CSR&0x02));
AT91C_BASE_US0->US_THR=ch;
}
else if(uart==2)
{
while(!(AT91C_BASE_US1->US_CSR&0x02));
AT91C_BASE_US1->US_THR=ch;
}
else if(uart == 3)
{
while(! ((*AT91C_DBGU_CSR) & 0x02));
*AT91C_DBGU_THR=ch;
}
}
/*
void Uart_SendStr(unsigned char uart,char *s)
{
unsigned char tmp=0;
if(!uart) // uart0
{
tmp = tx0_in_ptr;
SARM_IRQ_DIS1( );
while(*s)
{
uart0_tx_buf[tx0_in_ptr]=*s;
s++;
if((++tx0_in_ptr) == UART0TX_BUF_SIZE)
tx0_in_ptr=0;
}
if(tmp==tx0_out_ptr) // 初始化发送
{
//if(++tx1_out_ptr == UART1TX_BUF_SIZE) tx1_out_ptr=0;
if(tx0_out_ptr == UART0TX_BUF_SIZE) tx0_out_ptr=0;
AT91C_BASE_US0->US_THR=uart0_tx_buf[tmp];
AT91C_BASE_US0->US_CR=0x40; //启动发送
}
SARM_IRQ_EN1( );
}
else // uart1 SOFTWARE FIFO
{
tmp=tx1_in_ptr;
SARM_IRQ_DIS1( );
while(*s)
{
uart1_tx_buf[tx1_in_ptr]=*s;
s++;
if((++tx1_in_ptr) == UART1TX_BUF_SIZE)
tx1_in_ptr=0;
}
if(tmp==tx1_out_ptr) // 初始化发送
{
//if(++tx1_out_ptr == UART1TX_BUF_SIZE) tx1_out_ptr=0;
if(tx1_out_ptr == UART1TX_BUF_SIZE) tx1_out_ptr=0;
AT91C_BASE_US1->US_THR=uart1_tx_buf[tmp];
AT91C_BASE_US1->US_CR=0x40; //启动发送
}
SARM_IRQ_EN1( );
}
}
*/
/*
void uprintf(unsigned char uart,char *fmt,...)
{
char str[0x60];
va_list ap;
//SARM_IRQ_DIS1();
va_start(ap,fmt);
vsprintf(str,fmt,ap);
va_end(ap);
//sprintf(str,"CPIV %d PICNT %d\n\r",(value &AT91C_PITC_CPIV),(value &AT91C_PITC_PICNT)>>20);
Uart_SendStr(uart,str);
//SARM_IRQ_EN1();
}
*/
/******************************************************************************/
/*
void Uart0ISR(void)
{
unsigned int s=0;
unsigned char ch=0;
unsigned char cnt=0;
s=AT91C_BASE_US0->US_CSR;
if(s&0x01) // RXRDY
{
ch= AT91C_BASE_US0->US_RHR;
}
if(s&0x02) // TXRDY
{
if(tx0_out_ptr>tx0_in_ptr) cnt= tx0_in_ptr + UART0TX_BUF_SIZE - tx0_out_ptr;
else cnt= tx0_in_ptr - tx0_out_ptr;
if(cnt)
{
AT91C_BASE_US0->US_THR=uart0_tx_buf[tx0_out_ptr];
if(++tx0_out_ptr == UART0TX_BUF_SIZE) tx0_out_ptr=0;
}
else // 发送完成
{
AT91C_BASE_US0->US_CR=0x80; // TXDIS
}
}
}
*/
/*
void Uart1ISR(void)
{
unsigned int s=0;
unsigned char ch=0;
unsigned char cnt=0;
s=AT91C_BASE_US1->US_CSR;
if(s&0x01) // RXRDY
{
ch= AT91C_BASE_US0->US_RHR;
}
if(s&0x02) // TXRDY
{
if(tx1_out_ptr>tx1_in_ptr) cnt= tx1_in_ptr + UART1TX_BUF_SIZE - tx1_out_ptr;
else cnt= tx1_in_ptr - tx1_out_ptr;
if(cnt)
{
AT91C_BASE_US1->US_THR=uart1_tx_buf[tx1_out_ptr];
if(++tx1_out_ptr == UART1TX_BUF_SIZE) tx1_out_ptr=0;
}
else // 发送完成
{
AT91C_BASE_US1->US_CR=0x80; // TXDIS
}
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -