📄 samperusart.c
字号:
#ifdef AT91SAM7S32
#include "AT91SAM7S32.h"
#include "lib_AT91SAM7S32.h"
#endif
#ifdef AT91SAM7S64
#include "AT91SAM7S64.h"
#include "lib_AT91SAM7S64.h"
#endif
#include "SAMperUSART.h"
#include "SAMinit.h"
#include <stdio.h>
#include <stdarg.h>
volatile unsigned char tx1_in_ptr=0;
volatile unsigned char tx1_out_ptr=0;
volatile unsigned char uart1_tx_buf[UART1TX_BUF_SIZE]={0};
char usart_print_str[USART_PRINT_BUF_SIZE] = {0}; /* in bss section */
void Usart0Init(void)
{
// clock
AT91F_US0_CfgPMC();
// pin
AT91F_US0_CfgPIO();
//AT91C_BASE_PIOA->PIO_PDR=(1<<5)|(1<<6);
//AT91C_BASE_PIOA->PIO_ASR=(1<<5)|(1<<6); // RXD0,TXD0
// 115200,n,8,1
AT91F_US_Configure(AT91C_BASE_US0,
MCK,
AT91C_US_ASYNC_MODE,
US0_BAUDRATE,
0
);
AT91F_US_EnableTx(AT91C_BASE_US0);
AT91F_US_EnableRx(AT91C_BASE_US0);
//AT91F_PDC_Open(AT91C_BASE_PDC_US0);
}
void Usart0_Putchar(unsigned char ch)
{
while (!AT91F_US_TxReady(AT91C_BASE_US0));
AT91F_US_PutChar(AT91C_BASE_US0, ch);
}
void Usart0_SendStr(char *s)
{
unsigned char tmp=0;
#if 1
{
while(*s != '\0')
{
while (!AT91F_US_TxReady(AT91C_BASE_US0));
AT91F_US_PutChar(AT91C_BASE_US0, *s++);
}
}
//USART_Send_Frame(AT91C_BASE_US0, 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( );
}
#endif
}
void USART_Send_Frame(AT91PS_USART pUSART, char *buffer)
{
unsigned char len = 0;
for (len =0; buffer[len] != '\0'; len++){}
AT91F_US_SendFrame((AT91PS_USART)pUSART, buffer,len,0,0);
/* wait until TX complete */
while(!(pUSART->US_CSR & AT91C_US_TXBUFE));
}
void uprintf(char *fmt,...)
{
va_list ap;
va_start(ap,fmt);
#if USART_PRINT_EN > 0
vsprintf(usart_print_str,fmt,ap);
#else
#ifndef ADS
#warning "USART_PRINT_EN = 0"
#endif
#endif
va_end(ap);
//Usart0_SendStr(usart_print_str);
USART_Send_Frame(AT91C_BASE_US0, usart_print_str);
}
/******************************************************************************/
void Usart0ISR(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
{
}
}
#ifndef AT91SAM7S32
void Usart1Init(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=(MCK>>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 Usart1ISR(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
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -