0

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

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

Vector 19 (0x13) = UART_RX

根据意法半导体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,当数据从移位寄存器传输到 Rx 缓冲区时,RXNE 标志(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不能一起使用。我非常需要让这个串行接收中断继续。请帮忙。谢谢

4

3 回答 3

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;
    }
于 2016-11-03T13:00:31.853 回答
0

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

于 2019-12-07T11:22:28.690 回答
0

您忘记添加全局中断标志

asm("rim") ;  //Enable global interrupt
于 2017-03-03T16:18:14.157 回答