我是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无法使用 一起。 我非常需要让这个串行接收中断。请帮忙。 谢谢
答案 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(可高速使用的电容器)即可,以抑制噪声。