2016-11-01 3 views
0

Я новичок в STM8 и пытаюсь использовать STM8S103F3, используя IAR Embedded Workbench. Используя C, я хотел бы использовать регистры напрямую. Мне нужен серийный номер на 14400 бодах, 8N2, и получить передачу UART легко, так как в сети есть множество хороших учебников и примеров. Тогда необходимо, чтобы UART получил прерывание, ничего больше не будет. В этом проблема. Согласно iostm8s103f3.h (ИАР) есть 5 прерываний на 0x14 вектора UART1_R_IDLE, UART1_R_LBDF, UART1_R_OR, UART1_R_PE, UART1_R_RXNESTM8 прерывание последовательного приема

В соответствии с Silverlight Developer: Регистры на STM8,

Vector 19 (0x13) = UART_RX 

В соответствии с ST Микроэлектроника STM8S.h

#define UART1_BaseAddress  0x5230 
#define UART1_SR_RXNE ((u8)0x20) /*!< Read Data Register Not Empty mask */ 
#if defined(STM8S208) ||defined(STM8S207) ||defined(STM8S103)  ||defined(STM8S903) 
#define UART1 ((UART1_TypeDef *) UART1_BaseAddress) 
#endif /* (STM8S208) ||(STM8S207) || (STM8S103) || (STM8S903) */ 

Согласно STM8S Справочное руководство RM0016 RXNE флаг (Rx буфер не пуст) установлен на последней выборки часов е dge, , когда данные передаются из регистра сдвига в буфер Rx. Указывает, что данные готовы к чтению из регистра SPI_DR. Rx buffer not empty (RXNE) При установке этот флаг указывает, что в Rx-буфере есть допустимые принятые данные. Этот флаг сбрасывается при чтении SPI_DR. Тогда я писал:

#pragma vector = UART1_R_RXNE_vector //as iostm8s103f3 is used, that means 0x14 
__interrupt void UART1_IRQHandler(void) 
{ unsigned character recd; 
    recd = UART1_SR; 
    if(1 == UART1_SR_RXNE) recd = UART1_DR; 

и т.д. Не хорошо, я постоянно получать прерывания, UART1_SR_RXNE установлен, но UART1_DR пуст, и никто не UART получать случилось. Я отключил все остальные прерывания Я могу видеть, что может это вектор, и все равно ничего хорошего. SPI также устанавливает этот флаг, предположительно, UART и SPI не могут использоваться вместе . Мне очень нужно, чтобы это последовательное прерывание приема принималось. Пожалуйста помоги. Спасибо

ответ

0

Проблема была некорректно задана в настройке UART1. Полная установка для UART1 в STM8S103F3 теперь (IAR):

void InitialiseUART() 
{  
    unsigned char tmp = UART1_SR; 
    tmp = UART1_DR; 
    // Reset the UART registers to the reset values. 
    UART1_CR1 = 0; 
    UART1_CR2 = 0; 
    UART1_CR4 = 0; 
    UART1_CR3 = 0; 
    UART1_CR5 = 0; 
    UART1_GTR = 0; 
    UART1_PSCR = 0; 
    // Set up the port to 14400,n,8,2. 
    UART1_CR1_M = 0;   // 8 Data bits. 
    UART1_CR1_PCEN = 0;   // Disable parity. 
    UART1_CR3  = 0x20;  // 2 stop bits  
    UART1_BRR2  = 0x07;  // Set the baud rate registers to 14400 
    UART1_BRR1  = 0x45;  // based upon a 16 MHz system clock. 
    // Disable the transmitter and receiver. 
    UART1_CR2_TEN = 0;  // Disable transmit. 
    UART1_CR2_REN = 0;  // Disable receive. 
    // Set the clock polarity, clock phase and last bit clock pulse. 
    UART1_CR3_CPOL = 0; 
    UART1_CR3_CPHA = 0; 
    UART1_CR3_LBCL = 0; 
    // Set the Receive Interrupt RM0016 p358,362 
    UART1_CR2_TIEN = 0;  // Transmitter interrupt enable 
    UART1_CR2_TCIEN = 0;  // Transmission complete interrupt enable 
    UART1_CR2_RIEN = 1;  // Receiver interrupt enable 
    UART1_CR2_ILIEN = 0;  // IDLE Line interrupt enable 

    // Turn on the UART transmit, receive and the UART clock. 
    UART1_CR2_TEN = 1; 
    UART1_CR2_REN = 1; 
    UART1_CR1_PIEN = 0; 
    UART1_CR4_LBDIEN = 0; 
    } 
    //----------------------------- 
    #pragma vector = UART1_R_RXNE_vector 
    __interrupt void UART1_IRQHandler(void) 
    { 
     byte recd; 
     recd = UART1_DR; 
     //send the byte to circular buffer; 
    } 
0

Вы забыли добавить глобальный флаг прерывания

asm("rim") ; //Enable global interrupt 
Смежные вопросы