Немного разобрался с AT91SAM7S64 управляю по TWI микросхемой PCA9685 шевелю сервомашинками, с USART тоже вроде все работает, но не могу разобраться с прерыванием по приходу данных в USART прерывание устанавливается один первый раз потом сбрасываю и больше не реагирует, что только не пробовал, может кто сталкивался, подскажите? Еще вопрос такой почему у меня в коде в Keil uVision4 не работает инструкция типа A = A + B; что мешает проводить подобные арифметические операции? И еще вопрос по преобразованию типов как преобразовать unsigned int -> char для последующей отправки по USART?
- Код: Выделить всё
void CPUinit()
{
//AIC_IDCR регистр запрещения прерываний
AT91C_BASE_AIC->AIC_IDCR = 0x1 << AT91C_ID_US0;
//AIC_SVR регистр вектора источника прерываний 0-31
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] = (unsigned long) Usart_c_irq_handler;
//AIC_SMR регистр режима источника прерываний 0-31
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US0] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | USART_INTERRUPT_LEVEL;//AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE//AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL
//AIC_ICCR регистр команды сброса прерываний
AT91C_BASE_AIC->AIC_ICCR = 0x1 << AT91C_ID_US0;
//AT91C_BASE_AIC->AIC_ICCR = 0;
AT91C_BASE_AIC->AIC_IECR = 0x1 << AT91C_ID_US0;//AIC_IECR регистр команды разрешения прерываний
}
//======================================================
void InitUSART0(unsigned long int baudrate)
{
//US_IER регистр разрешения прерываний от USART (разрешение прерываний при приеме символа USART0)
AT91C_BASE_US0->US_IER = (0x1 << 5);//***???***AT91C_US_RXRDY (0x1 << 0) / AT91C_US_TXRDY (0x1 << 1)
AT91C_BASE_US0->US_CR = AT91C_US_RXEN | /* Receiver Enable */
AT91C_US_TXEN; /* Transmitter Enable */
//AIC_ICCR регистр команды сброса прерываний
AT91C_BASE_AIC->AIC_ICCR = 0x1 << AT91C_ID_US0;
}
//======================================================
//Обработчик прерываний от USART0
void Usart_c_irq_handler(void)
{
unsigned int status;
unsigned int i1 = 0;
//получение регистра состояния USART0 и номера активного прерывания
status = AT91C_BASE_US0->US_CSR ;//US_CSR регистр состояния канала USART
status &= AT91C_BASE_US0->US_IMR;//US_IMR регистр маски прерываний от USART
//если это прерывание при приеме символа USART0, то обработать его
/*if(status & AT91C_US_RXRDY)
{
data = read_char_USART0();
}*/
status = 0;
data = 0;
AT91C_BASE_PIOA->PIO_SODR = LED3;
for(i1 = 0; i1<2000000; i1++)
{
//***
}
AT91C_BASE_PIOA->PIO_CODR = LED3;
//=======================================
//Reset the satus bit for error
AT91C_BASE_US0->US_CR = AT91C_US_RSTSTA;//***???***
//=======================================
AT91C_BASE_AIC->AIC_EOICR = 0;
}