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

📄 samuart.c

📁 At91sam7s64+ucosII+pid温度控制
💻 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 + -