2016-11-01 4 views
0

IAR Embedded Workbench를 사용하여 STM8을 처음 사용하고 STM8S103F3을 사용하려고합니다. C를 사용하여 레지스터를 직접 사용하고 싶습니다. 그물에 수많은 좋은 자습서 및보기가 있기 때문에 나는 14400의 보드, 8N2에 serial를 필요로하고, UART 전송을 얻는 것은 쉽다. 그런 다음 UART가 인터럽트를 받도록해야합니다. 다른 작업은 수행하지 않습니다. 그것이 문제입니다. iostm8s103f3.h에 따르면 (IAR) 실버 라이트 개발자에 따르면,하는 0x14 벡터 UART1_R_IDLE, UART1_R_LBDF, UART1_R_OR, UART1_R_PE, UART1_R_RXNESTM8 인터럽트 직렬 수신

5 개 인터럽트가 다음과 같습니다 STM8에 레지스터,

Vector 19 (0x13) = UART_RX 

는 ST에 따르면,이 마이크로 마지막 샘플링 클록 E에 설정된 STM8S 참고서 RM0016 RXNE 플래그 (비어 있지 수신 버퍼)에 따르면
#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.h dge, ) 데이터가 시프트 레지스터에서 Rx 버퍼로 전송 될 때 발생합니다. SPI_DR 레지스터에서 데이터를 읽을 준비가되었음을 나타냅니다. 수신 버퍼가 비어 있지 않음 (RXNE) 이 플래그가 설정되면 수신 버퍼에 수신 된 유효한 데이터가 있음을 나타냅니다. 이 플래그는 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 설정에서 한 비트가 잘못 설정되었습니다. STM8S103F3에서 UART1에 대한 전체 설정이 이제 (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 
관련 문제