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

📄 samperusart.c

📁 S64和VS1003的MP3播放实现的源代码/
💻 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 + -