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

 
 
> Проблема с прерываниями 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
 
Start new topic
Ответов
Gremz
сообщение Sep 19 2011, 11:05
Сообщение #2





Группа: Участник
Сообщений: 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



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 07:21
Рейтинг@Mail.ru


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