Последовательный прием прерываний 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 нФ (могут быть отключены для высокой скорости) на этих линиях и на землю (сторона микроконтроллера) для подавления шумов.