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

📄 main.c

📁 开发环境ADS
💻 C
字号:
// ADVREF = 3.3V 
// Include Standard LIB  files
#include "AT91SAM7X-EK.h"
#include "include/AT91SAM7X256.h"
#include "include/lib_AT91SAM7X256.h"

#define AT91_BAUD_RATE				115200
#define	WAIT_TIME					AT91B_MCK
#define USART0_INTERRUPT_LEVEL		6
#define MASTER_CLOCK				48000000
#define MCK							48000000
#define	MCK_CLK						MCK/1000000		//MHz
#define	ADC_CLK						MCK_CLK/12		//MHz MCK_CLK/2---MCK_CLK/128  10bit/5M max  8bit/8M max
#define	START_TIME					2				//us	20 max
#define	TRACK_AND_HOLD_TIME			800				//ns	600 min
#define channel						AT91C_ADC_CH7
#define	ADVREF						3300			//mV
#define	TEN_BIT						1023			//10-bit ADC range

static const char szembed_header[]=
{
"\n\r================================================"
"\n\r==            Test ADC Program                =="
"\n\r================================================\n\r"
};

unsigned char	r_flag;
unsigned char	value_write_flag=0x00;
unsigned int	value_adc;
char			value_write[2]={0};
volatile int	loop;

//*----------------------------------------------------------------------------
//* Function Name       : delay
//* Object              : Wait
//* Input Parameters    : none
//* Output Parameters   : none
//* Functions calAT91B_LED    : none
//*----------------------------------------------------------------------------
void delay ( void )
{
//* Set in Volatile for Optimisation
    volatile unsigned int    i ;
//* loop delay
    for ( i = 0 ;(i < WAIT_TIME/50 );i++ ) ;
}

//*--------------------------------------------------------------------------------------
//* Function Name       : wait
//* Object              : Software waiting loop
//* Input Parameters    : none. Waiting time is defined by the global variable LedSpeed.
//* Output Parameters   : none
//*--------------------------------------------------------------------------------------
void wait ( void )
{
	//Wait at least 10 ms 
    for (loop=0; loop<10000; loop++){};
}

//*----------------------------------------------------------------------------
//* Function Name       : Usart_c_irq_handler
//* Object              : C handler interrupt function 
//* Input Parameters    : none
//* Output Parameters   : none
//*----------------------------------------------------------------------------
void Usart_c_irq_handler(void)
{
	char status;
	AT91PS_USART COM0 = AT91C_BASE_US0;
	//* get Usart status register
	status = COM0->US_CSR;
	if ( status & AT91C_US_RXRDY)
	{
	//* Get byte to write to eeprom
	    value_write[0]=AT91F_US_GetChar(COM0);
	    AT91F_US_PutChar(COM0,value_write[0]);
	    value_write_flag=0x01;
	}
	//* Check error
	if ( status & AT91C_US_FRAME)
	{
		AT91F_US_PutChar (COM0, 'F');
	}
	//* Reset the satus bit
	COM0 ->US_CR = AT91C_US_RSTSTA;
}

//*----------------------------------------------------------------------------
//* Function Name       : Usart_init
//* Object              : USART initialization
//* Input Parameters    : none
//* Output Parameters   : TRUE
//*----------------------------------------------------------------------------
void Usart_init ( void )
{
	AT91PS_USART COM0 = AT91C_BASE_US0;
   	// First, enable the clock of the USART
	AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_US0 ) ;
	//* Configure PIO controllers to periph mode
	AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,
 		((unsigned int) AT91C_PA0_RXD0    ) |
 		((unsigned int) AT91C_PA1_TXD0    ) |
 		((unsigned int) AT91C_PA3_RTS0    ) |
 		((unsigned int) AT91C_PA4_CTS0    ), // Peripheral A
 		0); // Peripheral B
	// Usart Configure
	AT91F_US_Configure (COM0, AT91B_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_FRAME | AT91C_US_RXRDY);
   	//* open Usart 0 interrupt
	AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC,
							AT91C_ID_US0,
							USART0_INTERRUPT_LEVEL,
							AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
							Usart_c_irq_handler);
	AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0);
 	AT91F_US_SendFrame(COM0,(char *)szembed_header,sizeof(szembed_header),0,0);
}


//*----------------------------------------------------------------------------
//* \fn    AT91F_ADC_CfgADC
//* \brief Config ADC 
//*----------------------------------------------------------------------------
void  AT91F_ADC_CfgADC(void)
{
	//* Reset the ADC
	AT91F_ADC_SoftReset(AT91C_BASE_ADC);
    //* Configure ADC Timings
	AT91F_ADC_CfgTimings(AT91C_BASE_ADC, MCK_CLK, ADC_CLK, START_TIME, TRACK_AND_HOLD_TIME);
    //* Enable the ADC channel
    AT91F_ADC_EnableChannel(AT91C_BASE_ADC,channel);
}

void test_adc(void)
{
	AT91PS_USART COM0 = AT91C_BASE_US0;
	unsigned int value_adc_temp;
	// Start one AD conversion
	AT91F_ADC_StartConversion(AT91C_BASE_ADC);
	// wait end of ADC, DATA ready
//	while(!(AT91F_ADC_IsStatusSet(AT91C_BASE_ADC, AT91C_ADC_EOC7 & AT91C_ADC_DRDY)));
	wait();
	// get value of adc
	value_adc=AT91F_ADC_GetConvertedDataCH7(AT91C_BASE_ADC);
	//
	value_adc_temp=value_adc*ADVREF/TEN_BIT;
	
	AT91F_US_PutChar(COM0, value_adc_temp/1000+48 );
	wait();
	AT91F_US_PutChar(COM0, '.' );
	wait();
	AT91F_US_PutChar(COM0, (value_adc_temp/100)%10+48 );
	wait();
	AT91F_US_PutChar(COM0, (value_adc_temp/10)%10+48 );
	wait();
	AT91F_US_PutChar(COM0, value_adc_temp%10+48 );
	wait();
	AT91F_US_PutChar(COM0, 'V' );
	wait();
}

//*--------------------------------------------------------------------------------------
//* Function Name       : Main
//* Object              : Software entry point
//* Input Parameters    : none.
//* Output Parameters   : none.
//*--------------------------------------------------------------------------------------
int main()
{
	AT91PS_USART COM0 = AT91C_BASE_US0;
	Usart_init();
	// Enable User Reset and set its minimal assertion to 960 us
    AT91C_BASE_RSTC->RSTC_RMR = AT91C_RSTC_URSTEN | (0x4<<8) | (unsigned int)(0xA5<<24);
	//open port
	AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOB );
	// Init ADC
	//  \brief Enable Peripheral clock in PMC for ADC
	AT91F_ADC_CfgPMC();
	//  \brief Configure ADTRG to ADC
	AT91F_ADC_CfgPIO();
	//  \brief Config ADC
	AT91F_ADC_CfgADC();

	while(1)
    {
    	if(value_write[0]=='S')
    	{
    		AT91F_US_PutChar(COM0, '\n' );
			wait();
			AT91F_US_PutChar(COM0, '\r' );
			wait();
    		test_adc();
    	}
    	if((value_write_flag==0x01)&&(value_write[0]!='S'))
    	{
    		AT91F_US_PutChar(COM0, '\n' );
			wait();
			AT91F_US_PutChar(COM0, '\r' );
			wait();
    		value_write_flag=0x00;
    	}
    	delay();
    }
}

⌨️ 快捷键说明

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