|
Sam7ex256 и UART, Не срабатывает прерывание |
|
|
|
Dec 9 2009, 08:05
|

Участник

Группа: Участник
Сообщений: 22
Регистрация: 26-11-09
Пользователь №: 53 887

|
Добрый день, уважаемые эксперты. Недавно взялся изучать ARM (на плате SAM7EX256). Возникла проблема с прерыванием от UART. Перелопатил примеры и точ то нашел на форуме. Ни в какую не хочет работать. Для компиляции использую IAR 5.40. Может еще какие настройки нужны? Нет ли (как в AVR) какой нибудь комады типа SEI? Вот код: CODE #include <board.h> #include <irq/irq.h> #include <usart/usart.h> #include <pmc/pmc.h> #include "lcd.h"
volatile int uart_count_rx_irq; //volatile int uart_count_rx_sim;
void InitFreq(void) { AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS ; AT91C_BASE_WDTC->WDTC_WDMR= AT91C_WDTC_WDDIS; AT91C_BASE_PMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x40 <<8) | AT91C_CKGR_MOSCEN )); while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS)); AT91C_BASE_PMC->PMC_PLLR = AT91C_CKGR_USBDIV_1 | (16<<8) | (AT91C_CKGR_MUL & (72<<16)) | (AT91C_CKGR_DIV & 14); while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK)); while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2 ; while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); AT91C_BASE_PMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK ; while(!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY)); }
void InitPeriphery(void) { //enable the clock of the PIO AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA; //enable the clock of the PIO AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOB;
// BUTTON SW1, SW2 AT91C_BASE_PIOB->PIO_ODR |= BIT24 | BIT25; //Configure in Input AT91C_BASE_PIOB->PIO_PER |= BIT24 | BIT25; //Enable PB24
//Joystick AT91C_BASE_PIOB->PIO_ODR |= BIT7 | BIT8 | BIT9 | BIT14 | BIT15; //Configure in Input AT91C_BASE_PIOB->PIO_PER |= BIT7 | BIT8 | BIT9 | BIT14 | BIT15; //Enable PB25 }
char U0ReadChar(void) { while(!(AT91C_BASE_US0->US_CSR & AT91C_US_RXRDY)); return (AT91C_BASE_US0->US_RHR & 0x1FF); }
void U0WriteChar(char sym) { while(!(AT91C_BASE_US0->US_CSR & AT91C_US_TXRDY)); AT91C_BASE_US0->US_THR = sym & 0x1FF; }
void U0_ISR(void) { unsigned int status;
status = AT91C_BASE_US0->US_CSR;
if ((status & AT91C_US_RXBUFF) == AT91C_US_RXRDY) { uart_count_rx_irq++; U0WriteChar(U0ReadChar()); } }
void U0Init(void) { unsigned int mode = AT91C_US_USMODE_NORMAL | AT91C_US_CLKS_CLOCK | AT91C_US_CHRL_8_BITS | AT91C_US_PAR_NONE | AT91C_US_NBSTOP_1_BIT | AT91C_US_CHMODE_NORMAL;
//For UART0 AT91C_BASE_PIOA->PIO_PDR = BIT0 | BIT1 | BIT27 | BIT28; AT91C_BASE_PIOA->PIO_ASR = BIT0 | BIT1 | BIT27 | BIT28; AT91C_BASE_PIOA->PIO_BSR = 0;
// Enable the peripheral clock in the PMC PMC_EnablePeripheral(AT91C_ID_US0);
//Disable Time Guard AT91C_BASE_US0->US_TTGR = 0; // Configure the USART in the desired mode @115200 bauds USART_Configure(AT91C_BASE_US0, mode, 115200, BOARD_MCK); // Configure the RXBUFF interrupt IRQ_ConfigureIT(AT91C_ID_US0, 0, U0_ISR); //Enable USART int AT91C_BASE_US0->US_IER = AT91C_US_RXRDY; //Enable AIC int IRQ_EnableIT(AT91C_ID_US0);
// Enable receiver & transmitter USART_SetTransmitterEnabled(AT91C_BASE_US0, 1); USART_SetReceiverEnabled(AT91C_BASE_US0, 1); }
void main() { InitFreq(); InitPeriphery(); U0Init(); InitSPI(); InitLCD(); Backlight(BKLGHT_LCD_ON); while(1) { //Left SW if(!((AT91C_BASE_PIOB->PIO_PDSR) & BIT24)) { Backlight(BKLGHT_LCD_ON); } //Right SW if(!((AT91C_BASE_PIOB->PIO_PDSR) & BIT25)) { Backlight(BKLGHT_LCD_OFF); } //Joy Center if(!((AT91C_BASE_PIOA->PIO_PDSR) & BIT15)) { char tmp[] = "000"; tmp[2] = uart_count_rx_irq % 10 + '0'; tmp[1] = (uart_count_rx_irq / 10) % 10 + '0'; tmp[0] = (uart_count_rx_irq / 100) % 10 + '0'; LCDPutStr(tmp, 104, 0, LARGE, BLACK, WHITE);
tmp[2] = uart_count_rx_sim % 10 + '0'; tmp[1] = (uart_count_rx_sim / 10) % 10 + '0'; tmp[0] = (uart_count_rx_sim / 100) % 10 + '0'; LCDPutStr(tmp, 88, 0, LARGE, BLACK, WHITE); } // if(AT91C_BASE_US0->US_CSR & AT91C_US_RXRDY) // { // U0WriteChar(U0ReadChar()); // uart_count_rx_sim++; // }
} }
Сообщение отредактировал Brain_ - Dec 9 2009, 08:06
|
|
|
|
|
 |
Ответов
|
Dec 10 2009, 15:04
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(defunct @ Dec 10 2009, 17:13)  автор имел в виду надо ли что-то дополнительно разрешать глобально или не надо в C main, ответ - не надо. Смелый ответ. Цитата(DpInRock @ Dec 10 2009, 17:39)  Вообще-то в main прерывания разрешать надо. В main программа заходит обычно с запрещенными прерываниями. И этот тоже. Вообще-то я не зря написал, что бесполезно давать советы, не видя стартапа. Их много разных, порой совершенно маразматических. Не надо заниматься гаданием.
|
|
|
|
Сообщений в этой теме
Brain_ Sam7ex256 и UART Dec 9 2009, 08:05 aaarrr Во-первых, если у вас возникли проблемы с прерыван... Dec 9 2009, 14:00 defunct Цитата(aaarrr @ Dec 9 2009, 16:00) __enab... Dec 10 2009, 14:13 DpInRock Вообще-то в main прерывания разрешать надо. В main... Dec 10 2009, 14:39 esaulenka Цитата(DpInRock @ Dec 10 2009, 17:39) ЗЫ ... Dec 10 2009, 15:30 DpInRock ЦитатаНескромный вопрос: а Вы кейл хоть раз видели... Dec 10 2009, 17:02 aaarrr Цитата(DpInRock @ Dec 10 2009, 20:02) Раз... Dec 10 2009, 17:15 DpInRock ЦитатаА почему именно атмеловские?
Ибо очень логич... Dec 10 2009, 17:41 sergeeff Так и где же долгожданный исходник startup'a д... Dec 10 2009, 20:51 Brain_ Прошу прощения, за то что 2 дня не появлялся
Что... Dec 11 2009, 10:35 aaarrr Цитата(Brain_ @ Dec 11 2009, 13:35) Что т... Dec 11 2009, 10:43 DpInRock В ИАР, если руками не говорить про стартап, то его... Dec 11 2009, 11:29 aaarrr Цитата(DpInRock @ Dec 11 2009, 14:29) Пот... Dec 11 2009, 11:40 DpInRock Про отвратнейший - да сойдет. Но для начала - оче... Dec 11 2009, 11:54 Brain_ Старт Ап нашел. Добавил прямо тот который был в
C:... Dec 14 2009, 09:03 aaarrr Цитата(Brain_ @ Dec 14 2009, 12:03) Все т... Dec 14 2009, 17:30 sergeeff Так может вы его пришлете для обозрения? Dec 14 2009, 10:45 Brain_ C удовольствием
CODE
/*
IAR startup file for... Dec 14 2009, 11:28 sergeeff Первое, что в глаза бросается - в main() вы шагает... Dec 14 2009, 13:55 DpInRock А вот религия не позволяет обучиться работе с прер... Dec 14 2009, 16:36 Brain_ Религия тут не при чем На таймере тоже пробовал. ... Dec 14 2009, 17:02 sergeeff Заходите на http://www.atmel.com/dyn/products/tool... Dec 14 2009, 17:19 Brain_ А обработчике я ляп исправил. Спасибо ))
Изначаль... Dec 14 2009, 17:37 aaarrr Хорошо, передача отдельно работает?
Мне, если чес... Dec 14 2009, 17:52 Brain_ Про все ужасы и минусы библиотечных функций я имею... Dec 14 2009, 18:13 aaarrr Цитата(Brain_ @ Dec 14 2009, 21:13) PS Кс... Dec 14 2009, 18:28 sergeeff Вы умеете зажигать/гасить LED? Если умеете, в само... Dec 14 2009, 18:30 Brain_ У меня нету Диодов, зато есть LCD у которого можно... Dec 14 2009, 18:43 sergeeff Первым делом проверить правильность формирования т... Dec 14 2009, 19:30 Brain_ Во всех без исключения примерах настройки AIC один... Dec 14 2009, 19:34 sergeeff Дело не в примерах, а в вашей абсолютно конкретной... Dec 15 2009, 07:05 Brain_ Куда их printf выведет?
Как адреса получить? Dec 15 2009, 09:18 sergeeff Согласно вашему startup'у первые (8+5)*4 адрес... Dec 15 2009, 09:40 DpInRock А где исправленный текст программы?
При разрешенны... Dec 15 2009, 10:26 Brain_ это то что находится по нулевому адресу.
18 0C 06 ... Dec 15 2009, 13:41 aaarrr Цитата(Brain_ @ Dec 15 2009, 16:41) это т... Dec 15 2009, 17:47 sergeeff Ну и сидит тут всякая фигня. Уж точно с адреса 0х2... Dec 15 2009, 17:36 Brain_ Приношу свои извинения, по поводу компостирования ... Dec 17 2009, 10:47
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|