STM8中断串行接收

时间:2016-11-01 06:11:05

标签: c embedded interrupt iar stm8

我是STM8的新手,并尝试使用IAR Embedded Workbench来使用STM8S103F3。 使用C,我喜欢直接使用寄存器。 我需要14400波特,8N2的串行,并且让UART传输变得简单,因为网上有很多很好的教程和示例。 然后需要让UART接收中断,没有别的办法。 那就是问题所在。 根据iostm8s103f3.h(IAR),0x14向量上有5个中断 UART1_R_IDLE,UART1_R_LBDF,UART1_R_OR,UART1_R_PE,UART1_R_RXNE

根据Silverlight开发人员:STM8上的注册,

Vector 19 (0x13) = UART_RX

根据ST Microelectronics 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缓冲区非空)在最后一个采样时钟边沿上置1, 当数据从移位寄存器传输到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无法使用 一起。 我非常需要让这个串行接收中断。请帮忙。 谢谢

3 个答案:

答案 0 :(得分:1)

问题是在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;
    }

答案 1 :(得分:0)

您忘记添加全局中断标志

asm("rim") ;  //Enable global interrupt

答案 2 :(得分:0)

每当您将电路板的接地与其他信号源的接地(USB <-> TTL转换器连接至PC等)连接时,都会在非隔离连接中发生,在这种情况下,微控制器由于高价值SMPS的Y电容器等而产生噪声。 只需通过1K电阻器连接您的RX和TX线,并在这些线上并在接地(微控制器侧)上放置1nF(可高速使用的电容器)即可,以抑制噪声。