📄 main.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 + -