Easyelectronics.ru

Электроника для всех
Текущее время: 23 апр 2019, 23:15

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: Помогите с юартом, заход в прерывание только один раз ((((
СообщениеДобавлено: 09 сен 2011, 23:04 
Здравствуйте!

Зарегистрирован: 24 авг 2011, 15:47
Сообщения: 1
Помогите с юартом, заход в прерывание только один раз ((((

#include "AT91SAM7S64.h"


#define EXT_OC 18432000 // External Oscillator MAINCK
#define MCK 47923200 // MCK (PLLRC div by 2)
#define MCKKHz (MCK/1000) // MCK in kHz
#define BR 115200 /* Baud Rate */
#define BRD (MCK/16/BR) /* Baud Rate Divisor */

char read;
AT91S_USART * pUSART0 = AT91C_BASE_US0; /* Global Pointer to USART0 */
int sendchar (int ch);

void Usart0_CIrqHandler(void)
{
read = AT91C_BASE_US0->US_RHR;
sendchar(read);
AT91C_BASE_AIC->AIC_EOICR = 0;

}

int sendchar (int ch)
{ /* Write character to Serial Port */
if (ch == '\n') { /* Check for CR */
while (!(pUSART0->US_CSR & AT91C_US_TXRDY)); /* Wait for Empty Tx Buffer */
pUSART0->US_THR = '\r'; /* Output CR */
}
while (!(pUSART0->US_CSR & AT91C_US_TXRDY)); /* Wait for Empty Tx Buffer */
return (pUSART0->US_THR = ch); /* Transmit Character */
}

int main (void)
{


//enable clock PIO for advanced PIO operation
AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_PIOA)|(1<<AT91C_ID_US0);
//USO setup
//set periphal A
AT91C_BASE_PIOA->PIO_PDR = AT91C_PA5_RXD0 | AT91C_PA6_TXD0 ;
AT91C_BASE_PIOA->PIO_ASR = AT91C_PA5_RXD0 | AT91C_PA6_TXD0;

// Baud Rate Divisor
AT91C_BASE_US0->US_BRGR = BRD;
AT91C_BASE_US0->US_MR = AT91C_US_PAR_NONE | AT91C_US_CHRL_8_BITS;
AT91C_BASE_US0->US_IDR = 0;
AT91C_BASE_US0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
AT91C_BASE_US0->US_RTOR = 0;
AT91C_BASE_AIC->AIC_IDCR = (1 << AT91C_ID_US0);
//US0 interrupt handler
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_US0] =(unsigned int) Usart0_CIrqHandler;
//RXRDY interrupt
AT91C_BASE_US0->US_IER = AT91C_US_RXRDY;
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_US0] = AT91C_AIC_SRCTYPE_HIGH_LEVEL | 3;
AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_US0);
AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_US0);

while (1)
{

}

}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Помогите с юартом, заход в прерывание только один раз ((((
СообщениеДобавлено: 21 окт 2011, 16:55 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
Код не смотрел толком, но по теме сразу могу привести пару мест, где покопаться (тем более, что код у вас тут совсем не полностью ;-) )

В стартапе процессора (ассемблеровский код) надо настроить стек для всех режимов (ну или для тех, которые планируете использовать) : IRQ, FIQ, SVC, USER...

Потом там же в стартапе определить функций (тоже ассемблеровские) на каждый тип ексепшинов.
Одной из таких функций будет функция IRQ, куда управление попадает при любом прерывании AIC (это если вы выбрали тип прерываний IRQ). В этой функции вам надо будет пробежаться по регистрам AIC и определить номер прерывания, которое вызвалось и прыгнуть по соответствующему вектору из массива AT91C_BASE_AIC->AIC_SVR[].
Еще один момент - если вдруг попозже надумаете использовать что то типа FreeRTOS, то функции прерываний должны быть откомпилированы в режиме ARM, а обычная программа - в режиме THUMB. Иначе работать будет не долго ;-)
Точного кода сейчас не скажу, так как под рукой его нету. Как до дому доберусь, так смогу подсказать точнее.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB