реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопросы нуба, AT91SAM7x
Hellper
сообщение May 5 2009, 09:36
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 13-08-07
Из: Санкт-Петербург
Пользователь №: 29 745



Изучаю AT91SAM7.
Использую Keil + Ulink2 + AT91SAM7X-EK.

как векторизировать прерывания в программе от USART, допустим, при получение байта информации ?

те как указать программе к какой функции необходимо перейти при установке флага.

с использованием API инициализировать:
Код
void init_serial(void)                        /* Initialize Serial Interface */
{
    AT91S_AIC *pAIC = AT91C_BASE_AIC;
                      
      *AT91C_PIOA_PDR = AT91C_PA0_RXD0 |        /* Disable RxD0 Pin */
                      AT91C_PA1_TXD0;         /* Disable TxD0 Pin */

    pUSART->US_CR = AT91C_US_RSTRX |          /* Reset Receiver      */
                      AT91C_US_RSTTX |          /* Reset Transmitter   */
                      AT91C_US_RXDIS |          /* Receiver Disable    */
                      AT91C_US_TXDIS;           /* Transmitter Disable */

      pUSART->US_MR = AT91C_US_USMODE_NORMAL |  /* Normal Mode */
                      AT91C_US_CLKS_CLOCK    |  /* Clock = MCK */
                      AT91C_US_CHRL_8_BITS   |  /* 8-bit Data  */
                      AT91C_US_PAR_NONE      |  /* No Parity   */
                      AT91C_US_NBSTOP_1_BIT;    /* 1 Stop Bit  */

      pUSART->US_BRGR = BRD;                    /* Baud Rate Divisor */

      pUSART->US_IER = AT91C_US_TXRDY;            /*enable rx comp int  */

      pUSART->US_CR = AT91C_US_RXEN  |          /* Receiver Enable     */
                    AT91C_US_TXEN;            /* Transmitter Enable  */

    pAIC->AIC_SMR[AT91C_ID_US0] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 5;
    pAIC->AIC_SVR[AT91C_ID_US0] = (unsigned long) usart_int;
    pAIC->AIC_IECR = (1 << AT91C_ID_US0);
}


а потом в векторе считывать флаги и определять, чем вызвано и как реагировать ?
Код
__irq void usart_int(void)
{

}


что не так ?

Сообщение отредактировал Hellper - May 5 2009, 09:37


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2009, 10:51
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Hellper @ May 5 2009, 13:36) *
что не так ?


Код
pUSART->US_IER = AT91C_US_TXRDY;            /*enable rx comp int  */

Вас интересует RXRDY, а не TX.

Код
pAIC->AIC_SMR[AT91C_ID_US0] = AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE | 5;

Зачем по фронту?

Код
__irq void usart_int(void)
{
    unsigned int csr = *AT91C_US0_CSR;
    if(csr & AT91C_US_RXRDY)
    {
        // Здесь читаем #AT91C_US_RHR, чтобы снять прерывание
    }
    *AT91C_AIC_EOICR = 0;
}
Go to the top of the page
 
+Quote Post
Hellper
сообщение May 5 2009, 12:45
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 13-08-07
Из: Санкт-Петербург
Пользователь №: 29 745



спасибо. заработало. таким образом у меня есть общее прерывание для различных событий, которые необходимо разрешить, а потом достаточно считывать в едином прерывание флаги и писать реакцию ?
Цитата
Зачем по фронту?

по какому событию делать реакцию AIC ?
можете разъяснить назначение файла Retarget.c ?
в SAM7.s происходит первоначальная инициализация и remap. а что еще ?
Прикрепленные файлы
Прикрепленный файл  Retarget.c.txt ( 1.21 килобайт ) Кол-во скачиваний: 18
Прикрепленный файл  SAM7.s.txt ( 14.95 килобайт ) Кол-во скачиваний: 37
 


--------------------
Go to the top of the page
 
+Quote Post
DpInRock
сообщение May 5 2009, 12:49
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



По фронту, наверное, можно, если прерывание одно.
Но если на этом же прерывании еще что-то (а так оно и будет), то необслуженное прерывание может утеряться.

По фронту, к примеру, можно внешние прерывания делать, типа, кнопок там. Даже нужно.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2009, 13:01
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Hellper @ May 5 2009, 16:45) *
таким образом у меня есть общее прерывание для различных событий, которые необходимо разрешить, а потом достаточно считывать в едином прерывание флаги и писать реакцию ?

Угу. Если события будут запрещаться, то нужно еще маску добавить:
Код
unsigned int csr = *AT91C_US0_CSR & *AT91C_US0_IMR;


Цитата(Hellper @ May 5 2009, 16:45) *
по какому событию делать реакцию AIC ?

В 99.99% случаев для внутренних источников нужно использовать прерывание по уровню.

Цитата(Hellper @ May 5 2009, 16:45) *
можете разъяснить назначение файла Retarget.c ?

Он служит для переопределения стандартных функций ввода-вывода.

Цитата(Hellper @ May 5 2009, 16:45) *
в SAM7.s происходит первоначальная инициализация и remap. а что еще ?

Все, что там содержится, подходит под определение "первоначальная инициализация". Уточните вопрос.

Цитата(DpInRock @ May 5 2009, 16:49) *
По фронту, наверное, можно, если прерывание одно.

Даже в этом случае нужно быть осторожным - легко можно получить ситуацию, когда
во время обработки одного события происходит новое. Результат будет столь же печален.

Цитата(DpInRock @ May 5 2009, 16:49) *
По фронту, к примеру, можно внешние прерывания делать, типа, кнопок там. Даже нужно.

Для кнопок вообще не нужно использовать прерывания.
Максимум, чем грозит использование прерывания по уровню для внешнего источника - это
возникновение spurious interrupt. Ничего страшного тут нет.
Go to the top of the page
 
+Quote Post
Hellper
сообщение May 5 2009, 13:24
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 13-08-07
Из: Санкт-Петербург
Пользователь №: 29 745



Цитата
В 99.99% случаев для внутренних источников нужно использовать прерывание по уровню.

оки
Цитата
Для кнопок вообще не нужно использовать прерывания.

угу. имхо, лучше использовать функцию в таймере реагирующую на изменение после фиксации события на ноге мк в течение фиксированого времени срабатывания. полезно для устранения дребезга.
Цитата
Все, что там содержится, подходит под определение "первоначальная инициализация". Уточните вопрос.

изменять в нем что-нибудь потребуется, если идут стандартные задачи (работа с перефирией)? и когда наступит момент, который потребует внимание к данной инициализации ?


--------------------
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 5 2009, 13:36
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Hellper @ May 5 2009, 17:24) *
изменять в нем что-нибудь потребуется, если идут стандартные задачи (работа с перефирией)? и когда наступит момент, который потребует внимание к данной инициализации ?

Вы поймете, когда потребуется что-то менять. Для "стандартных задач" все уже предусмотрено.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 20:41
Рейтинг@Mail.ru


Страница сгенерированна за 0.01413 секунд с 7
ELECTRONIX ©2004-2016