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

📄 text1.c

📁 AT91SAM7X256 中断方式程序代码
💻 C
字号:
#include <AT91SAM7X256.H>
#include <lib_AT91SAM7X256.h>

typedef unsigned char  uint8;   //无符号8位整型变量  
typedef unsigned short uint16;

#define uchar unsigned char
#define USART_INTERRUPT_LEVEL     7
#define AT91B_MCK	(44236800)  // Output PLL Clock (44 MHz)



/////////////////////////////////////////////////////

#define USART_BAUD_RATE           4800    //波特率

#define LONGSENT    11         //一桢数据长度	     66    =   64(数据位) + 2 (校验和); 

#define BELL	(1<<24)		   //蜂鸣器

uint8 sen_buf[LONGSENT] = {0x12,0x23,0x10,0x34,0x56,0x21,0xad,0xcf,0x00,0x00,0x6c};	//存储待发送的数据和接收	PC机发送来得数据
/////////////////////////////////////////////////////////////////





char buf[LONGSENT],rcv_buf[LONGSENT];	  //缓存PC机发送来得数据
int flag = 0,flag_rcv = 0;   //  确定发送正确标志  //接收到完整字符串表制
uint16 buff_rx,compoint= 0;

AT91PS_USART COM0 ;
//*----------------------------------------------------------------------------
//* Function Name       : Usart_c_irq_handler
//* Object              : C handler interrupt function called by the interrupts
//*                       assembling routine
//*----------------------------------------------------------------------------
void Usart_c_irq_handler(void)	__irq
{
	AT91PS_USART USART_pt = COM0;
	unsigned int status;

	status = USART_pt->US_CSR ;
    status &= USART_pt->US_IMR;

	if ( status & AT91C_US_RXBUFF)
		{

			if (compoint<=LONGSENT)
				{
					buf[compoint] = USART_pt->US_RHR;	 //接收到一个字节边产生中断
				}
			if (compoint<LONGSENT)
				{++compoint;} 

 
	     	COM0->US_RPR = (unsigned int) buff_rx;
	     	COM0->US_RCR = 1;



			if (compoint==(LONGSENT))	   //接收PC机发送的数据
				{
				
					compoint = 0;
					flag_rcv = 1;
				
				} 

			if (compoint==6)			  //接收PC返回的确认信号
				{
					if    ((buf[0] == 0x59) && (buf[1] == 0x45) && (buf[2] == 0x53) 
				   		 && (buf[3] == 0x21) && (buf[4] == 0x0D) && (buf[5] == 0x0A))//"YES!",
						{
							compoint = 0;
							flag = 1;
						}
				}

		}	 

	  
		if ( status & AT91C_US_TIMEOUT)	   //超时判断
			{
				USART_pt->US_CR = AT91C_US_STTTO;
		 	
				compoint = 0;              //缓存字符串的数组的指针指向数组首地址
			}



	//* Reset the satus bit for error
	 USART_pt->US_CR = AT91C_US_RSTSTA;


	 *AT91C_AIC_EOICR = *AT91C_AIC_EOICR;

}
 

//----------------------------------------------------------------------------
void Usart_init ( void )
{
 
//-------------COM0-----------------------------
    COM0= AT91C_BASE_US0;
    //* Define RXD and TXD as peripheral
    // Configure PIO controllers to periph mode
    AT91F_PIO_CfgPeriph(
	 AT91C_BASE_PIOA,                      // PIO controller base address
	 ((unsigned int) AT91C_PA0_RXD0    ) |
	 ((unsigned int) AT91C_PA1_TXD0    ) , // 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, AT91B_MCK,AT91C_US_ASYNC_MODE,USART_BAUD_RATE , 0);

    //* Enable usart

  
    COM0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;     //
  
    //* open Usart interrupt
    AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL,
                           AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, 0x00);


  	AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (int)Usart_c_irq_handler ;


    AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
    // Set the PDC
    //  AT91F_PDC_Open *(AT91C_BASE_PDC_US0);
    COM0->US_RPR = (unsigned int) buff_rx;
    COM0->US_RCR = 1;

    COM0->US_RTOR = 10;		//timeout set  TO*4*bit_time
    //* Enable USART IT error and AT91C_US_ENDRX
    AT91F_US_EnableIt(COM0,AT91C_US_RXBUFF | AT91C_US_TIMEOUT );
    //   AT91F_US_EnableIt(COM0,AT91C_US_RXBUFF);


 }
 /*******************************************************************************
函数功能:计算校验和(校验位 = 桢序号 + 数据)桢最后2位为校验和
返回值: 1:校验成功
         0:校验失败
*******************************************************************************/
uint8 check( char m[])                 
{
     uint8 i = 0 ,sum = 0;

     while(i < LONGSENT-2) 
         {
            sum +=  m[i++]    ;
        }
     if   (sum ==  ( (m[LONGSENT-2] << 8)  +  m[LONGSENT-1] ))
		 return  1;
	 else
	 	 return  0;
}
/****************************************************************************
函数说明:rcv_buf[i]为接受字符串的数组
****************************************************************************/
void recive ()
{
		//接收字符串
	int i = 0; 		
	
	while(i < LONGSENT)
		{	
			rcv_buf[i] =	buf[i];	//
			i ++;
		}
			  
	compoint = 0;		
}

/******************************************************************************
主程序:循环发送数据,并检测接收标志,如果检测到开始存储接收到的字符串
*******************************************************************************/
 main()
{ 
	uint16 time = 0;
	Usart_init();


	///////////////////////////////////////////////////////////////////
	AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, BELL);	 //关闭蜂鸣器
//	AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,BELL);
   	////////////////////////////////////////////////////////////////////


	while(1)  
		{	
			   /* 发送部分 */
			if( check( sen_buf))		
				{
					if ( !time )//首次发送某一字符串
						AT91F_US_SendFrame(COM0,(char *)sen_buf,sizeof(sen_buf),0,0);
					if (flag ) //发送成功
						{
							flag = 0;

					///////////////////////////////////////////////////////////////////


							//在数组char sen_buf[LONGSENT]中装入新的即将发送的数据



					///////////////////////////////////////////////////////////////////

						 }
					time = 0;//没有收到确认消息或装载新的数据后继续发送字符串
				}


				/* 接收部分 */
		   	if(	flag_rcv)
				{
					flag_rcv = 0;//清除标志
				if (check( buf)) //验证发送数据桢格式 
						recive();//接收字符串
				}

			   
}	  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -