📄 samuart.c
字号:
#include "AT91SAM7S64.h"
#include "SAMuart.h"
#include "SAMinit.h"
#include <stdio.h>
#include <stdarg.h>
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};
void Uart0Init(void)
{
// 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
AT91C_BASE_US0->US_IDR=0xF3FFF; // disable all interrupts
// AT91C_BASE_US0->US_IER
}
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 Uart_Putchar(unsigned char uart,unsigned char ch)
{
if(!uart)
{
while(!(AT91C_BASE_US0->US_CSR&0x02));
AT91C_BASE_US0->US_THR=ch;
}
else
{
while(!(AT91C_BASE_US1->US_CSR&0x02));
AT91C_BASE_US1->US_THR=ch;
}
}
void Uart_SendStr(unsigned char uart,char *s)
{
unsigned char tmp=0;
if(!uart) // uart0
{
while(*s)
{
Uart_Putchar(uart,*s);
s++;
}
}
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
{
}
}
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 + -