2016-11-01 29 views
0

IAR Embedded Workbenchを使用してSTM8を初めて使用し、STM8S103F3を使用しようとしています。 Cを使って、私はレジスタを直接使うのが好きです。 ネット上には数多くの良いチュートリアルとサンプルがあるので、私は14400ボー、8N2でシリアルが必要で、UARTの送信は簡単です。 それから、UARTが割り込みで受信する必要があります。他には何もしません。 それが問題です。 STM8にレジスタ、STM8割り込みシリアル受信

Vector 19 (0x13) = UART_RX 

STによると: はiostm8s103f3.h(IAR)によれば、シルバー開発によると0x14のベクター UART1_R_IDLE、UART1_R_LBDF、UART1_R_OR、UART1_R_PE、UART1_R_RXNE

に5つの割り込みがありますマイクロエレクトロニクス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バッファない空)が最後のサンプリングクロックEに設定されていますデータがシフトレジスタからRxバッファに転送されるときには、 となります。 これは、データがSPI_DRレジスタから読み込み可能であることを示します。 Rxバッファが空でない(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セットアップで1ビットが正しく設定されていませんでした。 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