USART no está ingresando a ISR STM32F030C8

0

Estoy trabajando en UART utilizando interrupciones en el controlador Stm32F030. He hecho el siguiente inicio.

void fnUart_Init(void)
{
 USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;

/* USART1 For Debug */
/* Enable GPIO clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE);
/* Enable USART clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);


/* USART1 Pins configuration */

    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1); 
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);    

/* Configure pins as AF pushpull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);  

/* USARTx configured as follow:
- BaudRate = 115200 baud  
- Word Length = 8 Bits
- Stop Bit = 1 Stop Bit
- Parity = No Parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
*/
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = 
USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);


/* NVIC configuration */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);


USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); 
/* Enable USART */
USART_Cmd(USART1, ENABLE);
}
  

Inic de UART2

 void fnUart2_Init(void)
{
 USART_InitTypeDef USART_InitStructure;
 NVIC_InitTypeDef NVIC_InitStructure;
 GPIO_InitTypeDef GPIO_InitStructure;

 /* USART1 For Debug */
 /* Enable GPIO clock */
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA , ENABLE);
/* Enable USART clock */
 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);


 /* USART1 Pins configuration 
 /* Connect pin to Periph */
 GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1); 
 GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);    

 /* Configure pins as AF pushpull */
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
 GPIO_Init(GPIOA, &GPIO_InitStructure);  

 /* USARTx configured as follow:
 -  BaudRate = 115200 baud  
 - Word Length = 8 Bits
 - Stop Bit = 1 Stop Bit
 - Parity = No Parity
 - Hardware flow control disabled (RTS and CTS signals)
 - Receive and transmit enabled
 */
  USART_InitStructure.USART_BaudRate = 115200;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = 
  USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(USART2, &USART_InitStructure);

/* NVIC configuration */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
 NVIC_Init(&NVIC_InitStructure);

USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); 
/* Enable USART */
USART_Cmd(USART2, ENABLE);
  }

El IrqHandler es el siguiente

void USART1_IRQHandler(void)
{
  printf("\n\r Inside ISR1");
}

Tengo la siguiente función printf que imprime datos en UART2 cuando se llama a printf.

#define PUTCHAR_PROTOTYPE int std::fputc(int ch, FILE *f)
PUTCHAR_PROTOTYPE
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
USART_SendData(USART2, (uint8_t) ch);

/* Loop until transmit data register is empty */
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
{}
return ch;
}

Mientras que el bucle no tiene nada ejecutándose desde ahora. Los dos UART están inicializados correctamente. Esto se verifica utilizando printf para UART1 y UART2 . Ahora escribí este código mínimo para probar las interrupciones. Estoy enviando cualquier información a través de UART1 a través del software Realterm y el convertidor USB-TTL y verificando en UART2 si se llama o no a USART1_IRQHandler() . No hay respuesta.

También estaba leyendo sobre el estado y las banderas de interrupción. Son un poco confusos. ¿Cuándo usar y borrar esas banderas? ¿Pero primero no entiendo por qué la ejecución no está ingresando al ISR? ¿Me perdí algo en el init? No tengo un depurador conmigo, por lo que usar puntos de interrupción y verificar la ejecución no es aplicable en mi caso. Mi objetivo es enviar los datos recibidos en UART1 a UART2 y los datos de UART2 a UART1. Estoy usando las bibliotecas estándar de periferia y no las bibliotecas HAL. ¿Alguna sugerencia?

    
pregunta NISHIT KHARA

1 respuesta

1

Estoy convencido de que viene en USART1_ISR solo una vez,

necesita borrar el bit relevante Recibir no vacío (RXNE) pendiente USART1 llamando a este USART_ClearITPendingBit(USART1, USART_IT_RXNE); dentro del ISR.

    
respondido por el Abel Tom

Lea otras preguntas en las etiquetas