Последовательный прием прерываний STM8

Я новичок в STM8 и пытаюсь использовать STM8S103F3, используя IAR Embedded Workbench. Используя C, я люблю использовать регистры напрямую. Мне нужен последовательный порт на 14400 бод, 8N2, и получить передачу по UART легко, так как в сети есть множество хороших учебных пособий и примеров. Тогда нужно, чтобы UART получал прерывание, больше ничего не будет. Это проблема. Согласно iostm8s103f3.h (IAR) имеется 5 прерываний для вектора 0x14 UART1_R_IDLE, UART1_R_LBDF, UART1_R_OR, UART1_R_PE, UART1_R_RXNE

По словам разработчика 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 Флаг RXNE (Rx-буфер не пустой) устанавливается на последнем фронте тактовой частоты дискретизации, когда данные передаются из регистра сдвига в 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 не могут использоваться вместе. Мне очень нужно, чтобы этот серийный прием прерывался. Пожалуйста помоги. Спасибо

2 ответа

Проблема была неправильно установлена ​​в настройке UART1. The complete setup for the UART1 in the STM8S103F3 is now(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;
    }

Вы забыли добавить глобальный флаг прерывания

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

Это происходит при неизолированных соединениях всякий раз, когда вы подключаете заземление вашей платы к заземлению другого источника (преобразователь USB<->TTL, подключенный к ПК и т. Д.). В этом случае микроконтроллер получает шум из-за конденсатора Y высокой емкости SMPS и т. Д. Просто подключите свой RX и линии TX через резистор 1 кОм и поместите конденсаторы 1 нФ (могут быть отключены для высокой скорости) на этих линиях и на землю (сторона микроконтроллера) для подавления шумов.

Другие вопросы по тегам