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

📄 samuart.c

📁 ucos2在at91sam64dk上的移植程序-mcuzone
💻 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 + -