首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM8中断串行接收

STM8中断串行接收
EN

Stack Overflow用户
提问于 2016-11-01 14:11:05
回答 3查看 7.5K关注 0票数 0

我是STM8新手,正在尝试使用STM8S103F3,使用IAR嵌入式工作台。使用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 Developer:在STM8上注册,

代码语言:javascript
复制
Vector 19 (0x13) = UART_RX

根据意法半导体STM8S.h

代码语言:javascript
复制
#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 buffer not empty (RXNE)设置时,此标志表示Rx缓冲区中有有效的接收数据。当读取SPI_DR时,该标志被复位。然后我写道:

代码语言:javascript
复制
#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不能一起使用。我非常需要让这个串行接收中断继续进行。请帮帮忙。谢谢

EN

回答 3

Stack Overflow用户

发布于 2016-11-03 21:00:32

问题是UART1设置中的一位设置不正确。STM8S103F3中UART1的完整设置现在为(IAR):

代码语言:javascript
复制
  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
EN

Stack Overflow用户

发布于 2017-03-04 00:18:14

您忘记添加全局中断标志

代码语言:javascript
复制
asm("rim") ;  //Enable global interrupt
票数 0
EN

Stack Overflow用户

发布于 2019-12-07 19:22:29

它发生在非隔离连接时,每当您连接您的电路板的接地与其他来源的接地(USB<->TTL转换器连接到PC等),在这种情况下,微控制器获得噪声是由于高值SMPS的Y电容器等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40354967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档