gitgit 0 22 января, 2008 Опубликовано 22 января, 2008 · Жалоба здравствуйте, я начал зучать контроллер AT91sam7s256 и у меня появилась такая проблема при работе с прерываниями. прерывания от УАРТ происходят только 1 раз. по моей задумке они должны возникать при получении каждого символа с порта. что я сделал не так? привожу текст функций(компилятор IAR). //инициализация void InitUART(void) { // AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA,((unsigned int) AT91C_PA5_RXD0) | ((unsigned int) AT91C_PA6_TXD0 ),0); // Peripheral B AT91C_BASE_PMC->PMC_PCER = 1<<AT91C_ID_US0; AT91C_BASE_US0->US_IDR = (unsigned int) -1; //* Reset receiver and transmitter AT91C_BASE_US0->US_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS ; //* Define the baud rate divisor register AT91F_US_SetBaudrate(AT91C_BASE_US0, MCK, COM0_BAUD); //* Write the Timeguard Register AT91F_US_SetTimeguard(AT91C_BASE_US0, 0); AT91C_BASE_US0->US_MR = 0x08c0; AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_US0, USART_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,(void (*)(void))irq_handler0); //AT91C_BASE_AIC->AIC_FFER=(1 << AT91C_ID_US0); AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_US0); AT91C_BASE_US0->US_IER = AT91C_US_RXRDY; AT91C_BASE_US0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN ; } //обработчик прерывания __ramfunc void irq_handler0() { unsigned int inter; char informstroka[10]; AT91C_BASE_PIOA->PIO_ODSR=(AT91C_BASE_PIOA->PIO_PDSR)|0x08; writeStr("irq_handler0\n\r"); if(((AT91C_BASE_US0->US_IMR) & AT91C_US_RXRDY)!=0) { //printf("asdas"); writeStr("?????????? ?? AT91C_US_RXRDY\n\r"); } inter=AT91C_BASE_AIC->AIC_IVR; writeStr("\n\AT91C_BASE_AIC->AIC_IVR=0x"); writeStr(LWordToHex(informstroka,inter)); writeStr("\n\r"); inter=AT91C_BASE_AIC->AIC_FVR; writeStr("\n\AT91C_BASE_AIC->AIC_FVR=0x"); writeStr(LWordToHex(informstroka,inter)); writeStr("\n\r"); // AT91C_BASE_AIC->AIC_ICCR=(1 << AT91C_ID_US0); AT91C_BASE_US0->US_CR = AT91C_US_RSTSTA; //AT91C_BASE_AIC->AIC_EOICR = 0; } //главная функция void main(void) { unsigned char ii; unsigned int x; a=0; //AT91C_BASE_AIC->AIC_EOICR = 0; InitPIO(); InitUART(); InitSPI(); AT91C_BASE_PIOA->PIO_ODSR=(AT91C_BASE_PIOA->PIO_PDSR)|0x04; writeStr("\n\r?????? ???\n\r"); writeStr("\n\rwhile...\n\r"); ii=0; while(1) { //while(1) PutChar(GetChar()); if((((AT91C_BASE_PIOA->PIO_PDSR)&SW1_MASK)!=0))AT91C_BASE_PIOA->PIO_ODSR=(AT91C_BASE_PIOA->PIO_PDSR)|0x01; else AT91C_BASE_PIOA->PIO_ODSR=(AT91C_BASE_PIOA->PIO_PDSR)&0xfffffffE; if((((AT91C_BASE_PIOA->PIO_PDSR)&SW2_MASK)!=0)) { ii=1; } else { ii=0; info(); } } } //вывод информации void info(void) { char informstroka[15]; unsigned int inf,jj; inf=AT91C_BASE_AIC->AIC_IECR; writeStr("\n\rAT91C_BASE_AIC->AIC_IECR=0x"); writeStr(LWordToHex(informstroka,inf)); inf=AT91C_BASE_AIC->AIC_IDCR; writeStr("\n\rAT91C_BASE_AIC->AIC_IDCR=0x"); writeStr(LWordToHex(informstroka,inf)); inf=(unsigned int)irq_handler0; writeStr("\n\r(unsigned int)irq_handler0=0x"); writeStr(LWordToHex(informstroka,inf)); /*inf=(unsigned int)AT91F_Default_IRQ_handler; writeStr("\n\r(unsigned int)AT91F_Default_IRQ_handler=0x"); writeStr(LWordToHex(informstroka,inf)); inf=(unsigned int)AT91F_Default_FIQ_handler; writeStr("\n\r(unsigned int)AT91F_Default_FIQ_handler=0x"); writeStr(LWordToHex(informstroka,inf));*/ inf=AT91C_BASE_US0->US_IMR; writeStr("\n\rAT91C_BASE_US0->US_IMR=0x"); writeStr(LWordToHex(informstroka,inf)); inf=AT91C_BASE_AIC->AIC_IMR; writeStr("\n\rAT91C_BASE_AIC->AIC_IMR=0x"); writeStr(LWordToHex(informstroka,inf)); inf=AT91C_BASE_AIC->AIC_IPR; writeStr("\n\rAT91C_BASE_AIC->AIC_IPR=0x"); writeStr(LWordToHex(informstroka,inf)); inf=AT91C_BASE_AIC->AIC_ISR; writeStr("\n\rAT91C_BASE_AIC->AIC_ISR=0x"); writeStr(LWordToHex(informstroka,inf)); inf=AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0]; writeStr("\n\rAT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0]=0x"); writeStr(LWordToHex(informstroka,inf)); for(jj=0;jj<31;jj++) { inf=AT91C_BASE_AIC->AIC_SMR[jj]; writeStr("\n\rAT91C_BASE_AIC->AIC_SMR["); writeStr(ByteToHex(informstroka,jj)); writeStr("]=0x"); writeStr(LWordToHex(informstroka,inf)); inf=AT91C_BASE_AIC->AIC_SVR[jj]; writeStr("\n\rAT91C_BASE_AIC->AIC_SVR["); writeStr(ByteToHex(informstroka,jj)); writeStr("]=0x"); writeStr(LWordToHex(informstroka,inf)); } inf=AT91C_ID_US0; writeStr("\n\rAT91C_ID_US0=0x"); writeStr(LWordToHex(informstroka,inf)); inf=(1<<AT91C_ID_US0); writeStr("\n\r(1<<AT91C_ID_US0)=0x"); writeStr(LWordToHex(informstroka,inf)); inf=AT91C_BASE_AIC->AIC_SPU; writeStr("\n\rAT91C_BASE_AIC->AIC_SPU=0x"); writeStr(LWordToHex(informstroka,inf)); inf=AT91C_BASE_AIC->AIC_FFSR; writeStr("\n\rAT91C_BASE_AIC->AIC_FFSR=0x"); writeStr(LWordToHex(informstroka,inf)); inf=AT91C_BASE_AIC->AIC_IVR; writeStr("\n\rAT91C_BASE_AIC->AIC_IVR=0x"); writeStr(LWordToHex(informstroka,inf)); inf=AT91C_BASE_AIC->AIC_FVR; writeStr("\n\rAT91C_BASE_AIC->AIC_FVR=0x"); writeStr(LWordToHex(informstroka,inf)); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 22 января, 2008 Опубликовано 22 января, 2008 · Жалоба Может у меня дежавю, но недавно почти такая же тема была. У вас запись в EOICR закоменнтирована. елси не записать контроллер не будет генерить следующее прерывание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 22 января, 2008 Опубликовано 22 января, 2008 · Жалоба Когда вы создаете сообщение, в форме ввода есть разные кнопочки. При наведении мыши на кнопку с символом # появляется подсказка, что эта кнопка вставляет теги для оформления кода. Если хотите, чтобы вам помогли - оформите свой код этими тегами. Сейчас он совершенно нечитаем, и тратить свое время на форматирование за вас нет никакого желания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gitgit 0 22 января, 2008 Опубликовано 22 января, 2008 · Жалоба если AT91C_BASE_AIC->AIC_EOICR=0 написать, то от 1 символа программа зацикливается на этой функции. с этим не знаю что делать. про вставление тэгов: попробую так делать. пока у меня браузер их не показывает. другой поставлю Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 22 января, 2008 Опубликовано 22 января, 2008 · Жалоба если AT91C_BASE_AIC->AIC_EOICR=0 написать, то от 1 символа программа зацикливается на этой функции. с этим не знаю что делать. про вставление тэгов: попробую так делать. пока у меня браузер их не показывает. другой поставлю Значит вы опять попадаете в прерывание. Скорее всего потому что не считываете данные ( регистр THR) или по ДМА, покрайней мере я не увидел у вас чтения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gitgit 0 22 января, 2008 Опубликовано 22 января, 2008 · Жалоба Вы правы! когда в обработчике прерываний начал считывать регистр приемника AT91C_BASE_US0->US_RHR, все заработало. Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться