roboforum.ru

Технический форум по робототехнике.

Вопросы по AT91SAM7S64

Вопросы по AT91SAM7S64

rihkov » 17 янв 2018, 20:36

Здравствуйте!
Немного разобрался с 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;
}

Re: Вопросы по AT91SAM7S64

Korbofos » 01 апр 2018, 08:26

у меня at91sam3x8e зависал из-за прерывания по уходу байта, приходилось проверять в прерывании есть ли ещё данные на отправку, если нет отключать прерывание(иначе прерывание бесконечно срабатывало). посмотрите на форуме атмел, я там нашёл решение своей проблемы.

Re: Вопросы по AT91SAM7S64

rihkov » 01 апр 2018, 13:27

Проблему решил, нужно каждый раз снова включать бит установки прерывания, после того как оно отработает.

Re: Вопросы по AT91SAM7S64

Seggio » 19 авг 2021, 09:22

Почитай PDC с microsin.net. PERIPH_TCR=0 выключение PDC ,а вдруг

Re: Вопросы по AT91SAM7S64

rihkov » 19 авг 2021, 16:59

Год сообщения посмотри!
Тем же годом перешел на STM32 и проблемы исчезли!


Rambler\'s Top100 Mail.ru counter