|
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 9 2009, 14:00
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Во-первых, если у вас возникли проблемы с прерываниями, обязательно прикладывайте к сообщению стартап код, иначе советы давать бесполезно. Далее: Код if ((status & AT91C_US_RXBUFF) == AT91C_US_RXRDY) Это условие не выполнится никогда. Цитата(Brain_ @ Dec 9 2009, 11:05)  Нет ли (как в AVR) какой нибудь комады типа SEI? Код I_BIT EQU 0x80
mrs r0, CPSR bic r0, r0, #I_BIT msr CPSR_c, r0 Код #include <intrinsics.h>
__enable_interrupt();
|
|
|
|
|
Dec 10 2009, 14:13
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(aaarrr @ Dec 9 2009, 16:00)  __enable_interrupt(); Оно то есть, но 1. обычно часто глобальное разрешение прерываний делается в стартапе. 2. CPSR из user mode менять нельзя. автор имел в виду надо ли что-то дополнительно разрешать глобально или не надо в C main, ответ - не надо.
|
|
|
|
|
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 программа заходит обычно с запрещенными прерываниями. И этот тоже. Вообще-то я не зря написал, что бесполезно давать советы, не видя стартапа. Их много разных, порой совершенно маразматических. Не надо заниматься гаданием.
|
|
|
|
|
Dec 10 2009, 17:02
|

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

|
Цитата Нескромный вопрос: а Вы кейл хоть раз видели? Скромно отвечу: и видеть не собираюсь. Хватает ИАР. Тем более что и топикастер о нем спрашивает. Цитата И этот тоже. Раз автор копается в примерах, то не встречал в атмеловских примерах user mode. Вообще ни в одном месте. Да и в иаровских примерах тоже. Подозреваю, что user мод никто не использует. Даже майкрософт. http://www.wasm.ru/article.php?article=securewincearmНе проверял, не знаю. Но нет причин не доверять.
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Dec 10 2009, 17:15
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(DpInRock @ Dec 10 2009, 20:02)  Раз автор копается в примерах, то не встречал в атмеловских примерах user mode. А почему именно атмеловские? Мало ли примеров в интернете. Цитата(DpInRock @ Dec 10 2009, 20:02)  Подозреваю, что user мод никто не использует. Даже майкрософт. Вот кусочек из кейловского примера: Код Mode_USR EQU 0x10
; Enter User Mode and set its Stack Pointer MSR CPSR_c, #Mode_USR IF :DEF:__MICROLIB
EXPORT __initial_sp
ELSE
MOV SP, R0 SUB SL, SP, #USR_Stack_Size
ENDIF
; Enter the C code
IMPORT __main LDR R0, =__main BX R0 ИМХО, господа, ответственнее надо относится к раздаче советов. В частности, не нужно гадать, что там может быть написано в стартапе, если он не приложен к сообщению. И нет такого понятия, как "стандартный стартап", ибо стандарта на стартапы в природе нет.
|
|
|
|
|
Dec 11 2009, 10:35
|

Участник

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

|
Прошу прощения, за то что 2 дня не появлялся  Что такое sturt up?, где его искать? и в чем его писать? Если можете, дайте ссылку почитать..
|
|
|
|
|
Dec 11 2009, 11:40
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(DpInRock @ Dec 11 2009, 14:29)  Потом оставляете этот стартап для себя на пожизненно. Вредный совет. У этого стартапа отвратнейший обработчик прерываний. Цитата(DpInRock @ Dec 11 2009, 14:29)  При этом sys даже не планируется к использованию... Для всяких абортов стек определяют, а для сиса - нет. SP для SYS и USER вообще-то один.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|