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

 
 
 
Reply to this topicStart new topic
> Проблема с прерываниями UART stm8l162m8 в IAR
Gremz
сообщение Sep 12 2011, 05:18
Сообщение #1





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



Доброго дня!
Дано: 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; //
}
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Sep 12 2011, 08:01
Сообщение #2


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



В обработчике прерываний надо сбросить соответствующий флаг - прерывания.


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
Gremz
сообщение Sep 14 2011, 10:40
Сообщение #3





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



Цитата(Stanislav_S @ Sep 12 2011, 12:01) *
В обработчике прерываний надо сбросить соответствующий флаг - прерывания.

а разве при чтении из регистра данных флаг не должен сбрасываться автоматически?
Go to the top of the page
 
+Quote Post
Stanislav_S
сообщение Sep 15 2011, 12:18
Сообщение #4


извечный пессимист
*****

Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125



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

лучше бы даташит почитали бы. там все написано, это все таки хоть и 8 битник, но не AVR sm.gif


--------------------
Slaves are those of this world
Given freedom to lay chains upon The Master
The wolf is no longer free
Release the chains and come for me
Go to the top of the page
 
+Quote Post
Gremz
сообщение Sep 16 2011, 05:02
Сообщение #5





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



Цитата(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 и прерыванием по приему? Буду премного благодарен
Go to the top of the page
 
+Quote Post
Gremz
сообщение Sep 19 2011, 11:05
Сообщение #6





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



По всей видимости проблема заключается в кривости таблицы прерываний которую создает 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, подскажите что можно сделать?
Go to the top of the page
 
+Quote Post
Gremz
сообщение Sep 29 2011, 04:04
Сообщение #7





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



В файле iostm8l162m8.h добавил недостающих номеров прерываний, не помогло....
Подскажите, в каких еще файлах присутствуют описания прерываний, где можно подправить адреса?
Go to the top of the page
 
+Quote Post
Gremz
сообщение Oct 7 2011, 03:54
Сообщение #8





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



Написал в IAR....
Ответили, что нашли у себя эту ошибку. Обновление IAR должно выйти в течение нескольких недель.
Так что ждем новой версии IARa
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:48
Рейтинг@Mail.ru


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