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