Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с прерываниями UART stm8l162m8 в IAR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
Gremz
Доброго дня!
Дано: stm8l162m8, компилятор IAR
Столкнулся с такой проблемой, пытаюсь принимать данные по UART с помощью прерывания, но на нем выполнение повисает.
При отладке в обработчик прерывания даже не попадаю.
при приеме в цикле, данные считываются и отправляются...
Подскажите, что я не так делаю?

CODE
#include "iostm8l162m8.h"
#include "intrinsics.h"


main()
{
long i;
unsigned char a=0x30;

CLK_PeripheralClockConfig(CLK_Peripheral_USART1, ENABLE); // включить тактирование UART
__enable_interrupt();

HSE_init (); // инициализация высокоскоростноно кварца и настрой его как основного источника тактирования

USART1_BRR2 = 0x05;
USART1_BRR1 = 0xD0;

USART1_CR2_REN=1; // включить приемник
USART1_CR2_TEN=1; // включить передатчик

USART1_CR2_RIEN=1; // Разрешить прерывание по RXE.

SetBit(PD_DDR,7); // светодиод 1
SetBit(PD_CR1,7);
ClrBit(PD_CR2,7);

SetBit(PD_DDR,6); //светодиод 2
SetBit(PD_CR1,6);
ClrBit(PD_CR2,6);

PD_ODR_bit.ODR7=1;

while(1)
{
asm("bcpl 0x500F,#7") ;
asm("bcpl 0x500F,#6") ;
for(i=0;i<40000;i++)
{
asm("nop"); //для исключения влияния оптимизатора
}
//while (!(USART1_SR_TXE)) {}
//USART1_DR=a ;
if (++a>128)
{
a=0x30;
}
}
}


#pragma vector=USART1_R_OR_vector
__interrupt void UART2_RXE(void)
{
char a;
a=USART1_DR;
USART1_DR=++a; //
}
Stanislav_S
В обработчике прерываний надо сбросить соответствующий флаг - прерывания.
Gremz
Цитата(Stanislav_S @ Sep 12 2011, 12:01) *
В обработчике прерываний надо сбросить соответствующий флаг - прерывания.

а разве при чтении из регистра данных флаг не должен сбрасываться автоматически?
Stanislav_S
Цитата(Gremz @ Sep 14 2011, 14:40) *
а разве при чтении из регистра данных флаг не должен сбрасываться автоматически?

лучше бы даташит почитали бы. там все написано, это все таки хоть и 8 битник, но не AVR sm.gif
Gremz
Цитата(Stanislav_S @ Sep 15 2011, 16:18) *
лучше бы даташит почитали бы. там все написано, это все таки хоть и 8 битник, но не AVR sm.gif


Читал, но возможно какой-то момент упустил. laughing.gif
в даташите написано :

RXNE: Read data register not empty.
This bit is set by hardware when the content of the RDR shift register has been transferred to the
USART_DR register. An interrupt is generated if RIEN=1 in the USART_CR2 register. It is cleared by a
read to the USART_DR register.



Если не сложно, может дадите заведомо рабочий кусок кода с инициализацией USART и прерыванием по приему? Буду премного благодарен
Gremz
По всей видимости проблема заключается в кривости таблицы прерываний которую создает IAR...
Код
    008068    82             DC8       0x82
    008069    00             DC8       0x00
    00806A    82             DC8       0x82
    00806B    91             DC8       0x91
    00806C    82             DC8       0x82        // номер прерыв. 25 (TIM4) <-- адрес  обработки прерывания по Tx появился здесь
    00806D    00             DC8       0x00
    00806E    82             DC8       0x82
    00806F    86             DC8       0x86
    008070    82             DC8       0x82        // номер прерыв. 26 (SPI1) <-- адрес  обработки прерывания по Rx появился здесь
    008071    00             DC8       0x00
    008072    82             DC8       0x82
    008073    7F             DC8       0x7F
    008074    82             DC8       0x82        // номер прерыв. 27 (USART1 Tx /TIM5 ) <<-- Здесь должен быть адрес по Tx
    008075    00             DC8       0x00
    008076    82             DC8       0x82
    008077    91             DC8       0x91
    008078    82             DC8       0x82        // номер прерыв. 28 (USART1 Rx /TIM5 ) <<-- Здесь должен быть адрес по Rx
    008079    00             DC8       0x00
    00807A    82             DC8       0x82
    00807B    91             DC8       0x91
    00807C    82             DC8       0x82
    00807D    00             DC8       0x00
    00807E    82             DC8       0x82

//-----------------------------------**----------------------------------------------------------------------------------
    
    
UART1_RXE:
_interrupt_28:
    00827F    C65231         LD        A, USART1_DR
    008282    C75231         LD        USART1_DR, A
}
    008285    80             IRET

USART1_T_TXE:
_interrupt_27:
    008286    A631           LD        A, #0x31
    008288    C75231         LD        USART1_DR, A
}
    00828B    80             IRET


В итоге попадаем в заглушку и повисаем...

Кто сталкивался с такой проблемой IAR, подскажите что можно сделать?
Gremz
В файле iostm8l162m8.h добавил недостающих номеров прерываний, не помогло....
Подскажите, в каких еще файлах присутствуют описания прерываний, где можно подправить адреса?
Gremz
Написал в IAR....
Ответили, что нашли у себя эту ошибку. Обновление IAR должно выйти в течение нескольких недель.
Так что ждем новой версии IARa
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.