我是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上注册,
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 buffer not empty (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不能一起使用。我非常需要让这个串行接收中断继续进行。请帮帮忙。谢谢
发布于 2016-11-03 21:00:32
问题是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;
}发布于 2017-03-04 00:18:14
您忘记添加全局中断标志
asm("rim") ; //Enable global interrupt发布于 2019-12-07 19:22:29
它发生在非隔离连接时,每当您连接您的电路板的接地与其他来源的接地(USB<->TTL转换器连接到PC等),在这种情况下,微控制器获得噪声是由于高值SMPS的Y电容器等。
https://stackoverflow.com/questions/40354967
复制相似问题