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

📄 at91sam7x256.txt

📁 AT91SAM7X256 中断方式程序代码
💻 TXT
字号:

//*------------------------- Internal Function --------------------------------
//*----------------------------------------------------------------------------
//* Function Name       : AT91F_TC_Open
//* Object              : Initialize Timer Counter Channel and enable is clock
//* Input Parameters    : <tc_pt> = TC Channel Descriptor Pointer
//*                       <mode> = Timer Counter Mode
//*                     : <TimerId> = Timer peripheral ID definitions
//* Output Parameters   : None
//*----------------------------------------------------------------------------
void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId)
//* Begin
{
    unsigned int dummy;
    //* First, enable the clock of the TIMER
    	AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< TimerId ) ;

    //* Disable the clock and the interrupts
	TC_pt->TC_CCR = AT91C_TC_CLKDIS ;
	TC_pt->TC_IDR = 0xFFFFFFFF ;
    //* Clear status bit
        dummy = TC_pt->TC_SR;
    //* Suppress warning variable "dummy" was set but never used
        dummy = dummy;
    //* Set the Mode of the Timer Counter
	TC_pt->TC_CMR = Mode ;
    //* Enable the clock
	TC_pt->TC_CCR = AT91C_TC_CLKEN ;
//* End
}
//*------------------------- Interrupt Function -------------------------------
//*----------------------------------------------------------------------------
//* Function Name       : timer1_c_irq_handler
//* Object              : C handler interrupt function calAT91B_LED by the interrupts
//*                       assembling routine
//* Output Parameters   : increment count_timer1_interrupt
//*5ms产生一次中断
//*----------------------------------------------------------------------------
void timer1_c_irq_handler(void)	__irq
{
//int tmp;
    unsigned int dummy;
	AT91PS_TC TC_pt = AT91C_BASE_TC1;

    //* AcknowAT91B_LEDge interrupt status
    dummy = TC_pt->TC_SR;
    //* Suppress warning variable "dummy" was set but never used
    dummy = dummy;
//++test1;

/*	if (test1 == 0)
	{	
	AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,LED_R);
	test1 = 1;
	}
	else {
	AT91F_PIO_SetOutput(AT91C_BASE_PIOB,LED_R);
	test1 = 0;
	}
*/

	++count5ms;
	if (count5ms>=20)		//100ms运行一次
	{
		fADov = 1;
		count5ms = 0x00;
		if (comtimeov<210)
			{++comtimeov;}
		if (smsovtime<250)
		{
			++smsovtime;
		}
	}

	++updatalcdtime;
	if (updatalcdtime == 30)
	{
		fsmstime = 1;		//SMS模块通信		
	}
	else if (updatalcdtime == 60)
	{
		fsmsdel = 1;		//SMS消息删除
	}
	else if (updatalcdtime>=100)
	{
		updatalcdtime = 0x00;
		flcdtime = 1;

	}


	*AT91C_AIC_EOICR = *AT91C_PITC_PIVR;
//*AT91C_AIC_EOICR = *AT91C_AIC_EOICR;
}


//*----------------------------------------------------------------------------
//* \fn    AT91F_US_Printk
//* \brief This function is used to send a string through the US channel
//*----------------------------------------------------------------------------
void AT91F_US_Put( char *buffer) // \arg pointer to a string ending by \0
{
	while(*buffer != '\0') {
		while (!AT91F_US_TxReady(COM0));
		AT91F_US_PutChar(COM0, *buffer++);
	}
}





//*----------------------------------------------------------------------------
//* 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;

	//* get Usart status register and active interrupt
	status = USART_pt->US_CSR ;
        status &= USART_pt->US_IMR;


	test1 = USART_pt->US_CSR ;
	test2 = USART_pt->US_IMR;
	test3 = AT91C_US_RXBUFF;

	if ( status & AT91C_US_RXBUFF){
	//* Toggel LED
 //	Trace_Toggel_LED( AT91B_LED1) ;
	//* transfert the char to DBGU
	 if ( first == 0){
 	     COM0->US_RPR = (unsigned int) buff_rx1;
	     COM0->US_RCR = 1;
// 	     pCDC.Write(&pCDC, buff_rx,100);
 	     first =1;
	   }else{
	     COM0->US_RPR = (unsigned int) buff_rx;
	     COM0->US_RCR = 1;
//	     pCDC.Write(&pCDC, buff_rx1,100);
	     first=0;
	   }
	}
//* Check error

	if ( status & AT91C_US_TIMEOUT){
//	 Trace_Toggel_LED( AT91B_LED2) ;
	 status = 100 - COM0->US_RCR;
	 if  (status !=0){
 	   if ( first == 0){
		COM0->US_RPR = (unsigned int) buff_rx1;
		COM0->US_RCR = 1;
// 	        pCDC.Write(&pCDC, buff_rx,status);
 	        first =1;
	   }else{
	        COM0->US_RPR = (unsigned int) buff_rx;
	        COM0->US_RCR = 1;
//	        pCDC.Write(&pCDC, buff_rx1,status);
	        first=0;
	    }
            COM0->US_CR = AT91C_US_STTTO;
          }
	}
	//* Reset the satus bit for error
	 USART_pt->US_CR = AT91C_US_RSTSTA;


	 *AT91C_AIC_EOICR = *AT91C_AIC_EOICR;

}






//*----------------------------------------------------------------------------
//* Function Name       : Usart_c_irq_handler
//* Object              : C handler interrupt function called by the interrupts
//*                       assembling routine
//串口1接收中断
//*----------------------------------------------------------------------------
void Usart1_c_irq_handler(void)	__irq
{
	AT91PS_USART USART_pt = COM1;
	unsigned int status;

	//* get Usart status register and active interrupt
	status = USART_pt->US_CSR ;
        status &= USART_pt->US_IMR;


	test1 = USART_pt->US_CSR ;
	test2 = USART_pt->US_IMR;
	test3 = AT91C_US_RXBUFF;


/**/   
	if ( status & AT91C_US_RXBUFF){

			if (compoint<=15)
				{
					combuf[compoint] = USART_pt->US_RHR;
				}
			if (compoint<15)
				{++compoint;}

 
	     COM1->US_RPR = (unsigned int) smsbuf;
	     COM1->US_RCR = 1;

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

 	++test4;

	 *AT91C_AIC_EOICR = *AT91C_AIC_EOICR;
}



//*----------------------------------------------------------------------------
//* Function Name       : Usart_init
//* Object              : USART initialization
//* Input Parameters    : none
//* Output Parameters   : TRUE
//*----------------------------------------------------------------------------
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;
    first = 0;
    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);

//-------------------COM1--------------------------------
    COM1= AT91C_BASE_US1;
    //* 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_PA5_RXD1    ) |
	 ((unsigned int) AT91C_PA6_TXD1    ) , // 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, AT91B_MCK,AT91C_US_ASYNC_MODE,USART_BAUD_RATE , 0);

    //* Enable usart
    COM1->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;

    //* open Usart interrupt
    AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_US1, USART_INTERRUPT_LEVEL,
                           AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, 0x00);

  	AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US1] = (int)Usart1_c_irq_handler;

    AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US1);
    // Set the PDC
    AT91F_PDC_Open (AT91C_BASE_PDC_US1);
    COM1->US_RPR = (unsigned int) smsbuf;
    COM1->US_RCR = 1;
    first = 0;
    COM1->US_RTOR = 10;		//timeout set  TO*4*bit_time
    //* Enable USART IT error and AT91C_US_ENDRX
     AT91F_US_EnableIt(COM1,AT91C_US_RXBUFF );
}
















/*************************************
函数说明:初始化
*************************************/
void System(void)
{

	uchar i;
   unsigned int val;

	Spi_init ();

	AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, (WR|RD|A0|CS1335|CS811|RES1335|RES811));
	AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, (D0|D1|D2|D3|D4|D5|D6|D7));
	AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, (JK1|JK2|JK3|JK4|JK5|JK6));

	AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, (BELL|LED_G|LED_R));

	AT91F_PIO_ClearOutput(AT91C_BASE_PIOB,BELL);


	AT91F_PIO_CfgInput(AT91C_BASE_PIOA, (KEY1|KEY2|KEY3|KEY4|KEY5|KEY6|KEY7|KEY8));


	AT91F_PIO_SetOutput(AT91C_BASE_PIOB,(WR|RD|A0|CS1335|CS811|RES1335|RES811));

	AT91F_PIO_SetOutput(AT91C_BASE_PIOB,(D0|D1|D2|D3|D4|D5|D6|D7));


	AT91F_PIO_CfgInput(AT91C_BASE_PIOB,(D0|D1|D2|D3|D4|D5|D6|D7));

	AT91F_PIO_CfgInput(AT91C_BASE_PIOB,DIN);


	AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOA);
	AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOB);



	AT91F_TWI_DisableIt(AT91C_BASE_TWI, (AT91C_TWI_TXCOMP|AT91C_TWI_RXRDY|AT91C_TWI_TXRDY|AT91C_TWI_NACK));
	AT91F_TWI_CfgPIO();
	AT91F_TWI_Configure(AT91C_BASE_TWI);

	AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, (TWD|TWCK), 0x00);



	AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, AT91C_ID_TWI);

	AT91F_Write(AT91C_TWI_CWGR, AT91C_TWI_CLDIV);



//---------------------------------------------------------------------

 /* First, enable the clock of the PIO */
//  AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_TWI ) ;

  /* Set the TWI pins controlled by the PIO */
  AT91F_PIO_Enable(AT91C_BASE_PIOA,TWCK|TWD ) ;

  /* then, we configure the PIO Lines corresponding to TWD & TWCK
     to be outputs. */
  AT91F_PIO_CfgOutput (AT91C_BASE_PIOA, TWCK|TWD ) ;

  /* Enable open drain on TWCK / TWD PIO lines */
  AT91C_BASE_PIOA->PIO_MDER = (TWCK|TWD) ;

  /* Disable the pull up on the TWI line */
  AT91C_BASE_PIOA->PIO_PPUDR = (TWCK|TWD) ;

  /* Set TWCK and TWD to high level */
  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, TWCK|TWD ) ;


  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, TWCK|TWD ) ;
  AT91F_PIO_CfgOutput (AT91C_BASE_PIOA, TWD ) ;
  /* Set the TWCK and TWD to send the next start */
  AT91F_PIO_SetOutput(AT91C_BASE_PIOA, TWCK|TWD );


    AT91F_AT24C_MemoryReset (AT91C_BASE_PIOA,
                             AT91C_ID_PIOA,
                             TWCK,
                             TWD);

    /* TWI intialization @ TWI_BUS_CLOCK for all TWI devices
       connected on the bus */
    AT91F_TWI_Open(TWI_BUS_CLOCK);

	ptAt24c1024.PageSize = 256;
    ptAt24c1024.NumOfPage = 512;
    ptAt24c1024.EepromSize = 256*512;
    ptAt24c1024.SlaveAddress = AT24C_I2C_ADDRESS;
    ptAt24c1024.EepromName = AT24C1024;


//------------- USB -------------------------
	AT91F_AIC_ConfigureIt (
			AT91C_BASE_AIC,		// \arg pointer to the AIC registers
			AT91C_ID_IRQ1,		// \arg interrupt number to initialize
			0x07,				// \arg priority to give to the interrupt
			AT91C_AIC_SRCTYPE_HIGH_LEVEL,   // \arg activation and sense of activation
			0x00);
	AT91C_BASE_AIC->AIC_SVR[AT91C_ID_IRQ1] = (unsigned int)IRQ_Eint1 ;


	AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_IRQ1);		//IRQ1使能


//----------ADC----------------------------------
AT91F_ADC_SoftReset (AT91C_BASE_ADC);

//AT91F_ADC_CfgPIO ();


AT91F_ADC_CfgPMC ();


AT91F_ADC_CfgModeReg(AT91C_BASE_ADC,AT91C_ADC_TRGEN_DIS);



AT91F_ADC_CfgTimings (
	AT91C_BASE_ADC, // pointer to a ADC controller
	45, // in MHz 
	2, // in MHz 
	20, // in us 
	5000);	// in ns


//	*AT91C_ADC_CHER = 1 << 5;              // ch = 4
//	*AT91C_ADC_CR   = AT91C_ADC_START;     // Start A/D conversion
//	test3 = AT91F_ADC_GetLastConvertedData(AT91C_BASE_ADC);
//	for (t=0;t<10;++t)
//	{}


AT91F_ADC_EnableChannel(AT91C_BASE_ADC,AT91C_ADC_CH4);

//for (t=0;t<10;++t)
//{}

AT91F_ADC_StartConversion(AT91C_BASE_ADC);


  do {
    val = *AT91C_ADC_SR;                 // Read A/D Status Register
  } while ((val & AT91C_ADC_DRDY) == 0); // Wait for end of A/D Conv.

//while((AT91F_ADC_GetStatus(AT91C_BASE_ADC)&(AT91C_ADC_DRDY))==0x00)
//{}
AT91F_ADC_GetStatus(AT91C_BASE_ADC);

//  *AT91C_ADC_CR   = 0;                   // Stop A/D Conversion
  *AT91C_ADC_CHDR = 0xFF;

AT91F_ADC_GetLastConvertedData(AT91C_BASE_ADC);



//------------------ TC --------------------
    timer_init();

	test1 = 0x00;



//-------------- other ----------------
	distrun = 3;		//显示修改块号

	dispoint = 0x1000;
	smsinitord = 0x00;
	fsmsdelord = 0x00;	
	FMerr = 0x00;
	ADtime = 0x00;

	for (i=0;i<err_numb;++i)
	{
		ferr[i] = 0x00;
		ferrok[i] = 0x00;
	}

//	intermack = *AT91C_AIC_IMR; 


	DelayMs(2);
	redsetdata();
	DelayMs(1);
	redfmdata();


//	clrEEROM();
//	AT91F_PIO_SetOutput(AT91C_BASE_PIOB,BELL);
	savonoff();
}
 





/*************************
*串口发送一个字节
*发送过程中等待,完成才返回
**************************/
void  comsentbyte(uchar b)
{

	AT91F_US_PutChar(COM1, b);

	while (!AT91F_US_TxReady(COM1));

//    while(((pUSART->US_CSR) & AT91C_US_TXRDY) == 0x00);

}














⌨️ 快捷键说明

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