no se puede hacer funcionar el usart en stm32f3discovery

0

He estado tratando de hacer que usart funcione en el tablero de descubrimiento stm32f3 por un tiempo. Estoy usando un FTDI básico de 3.3V de sparkfun para este propósito. Hasta ahora, no he visto nada del programa.

El programa se da a continuación:

    /* Includes ------------------------------------------------------------------*/
#include <stm32f30x.h>
#include <stm32f30x_rcc.h>
#include <stm32f30x_rcc.c>
#include <stm32f30x_gpio.h>
#include <stm32f30x_gpio.c>
#include <stm32f30x_misc.h>
#include <stm32f30x_misc.c>
#include <stm32f30x_tim.h>
#include <stm32f30x_tim.c>
#include <stm32f30x_usart.h>
#include <stm32f30x_usart.c>
//#include <arm_math.h>

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
volatile int ms;

/* Private function prototypes -----------------------------------------------*/

/* Private functions ---------------------------------------------------------*/
void SysTick_Handler(void)
{
  ms++;
    if (ms>99){
        USART_SendData(USART1,'S');
        while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET){}
        ms=0;
    }
}

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
    USART_InitTypeDef USART_InitStruct;

    /*GPIO configuration for indicator LED*/
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE,ENABLE);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(GPIOE,&GPIO_InitStruct);

    //Turn LED on
    GPIO_SetBits(GPIOE,GPIO_Pin_8);

    /*GPIO configuration for USART. PA2 = USART2_TX, PA3 = USART2_RX*/
    //Enable clock for GPIOA
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;

    GPIO_Init(GPIOA,&GPIO_InitStruct);

    //AF configuration
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_7);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_7);

    /*USART configuration*/
    USART_Cmd(USART2, ENABLE);

    USART_InitStruct.USART_BaudRate = 9600;
  USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  USART_InitStruct.USART_StopBits = USART_StopBits_1;
  USART_InitStruct.USART_Parity = USART_Parity_No;
  USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART2, &USART_InitStruct);

    //Enable RXNE interrupt
    USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
    //Enable USART global interrupt
    NVIC_EnableIRQ(USART2_IRQn);

    if (SysTick_Config(SystemCoreClock / 1000))
  { 
    /* Capture error */ 
    while (1);
  }

  while (1)
  {

  }
}

void USART2_IRQHandler(void){
    /*RXNE handler*/
    if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET){
        /*If recieved 't', toggle LED, transmit 'T'*/
        if((char)USART_ReceiveData(USART2) == 't'){
            /*Toggle LED*/
            if (GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_8)){
                GPIO_ResetBits(GPIOE,GPIO_Pin_8);
            }
            else{
                GPIO_SetBits(GPIOE,GPIO_Pin_8);
            }

            /*USART_SendData(USART1,'T');
            while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET){}*/
        }
    }
}

Estoy usando el IDE de Keil uvision 5.

Gracias.

EDITAR: El código actual se da a continuación:

/* Includes ------------------------------------------------------------------*/
#include <stm32f30x.h>
#include <stm32f30x_rcc.h>
#include <stm32f30x_rcc.c>
#include <stm32f30x_gpio.h>
#include <stm32f30x_gpio.c>
#include <stm32f30x_misc.h>
#include <stm32f30x_misc.c>
#include <stm32f30x_tim.h>
#include <stm32f30x_tim.c>
#include <stm32f30x_usart.h>
#include <stm32f30x_usart.c>
//#include <arm_math.h>

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
volatile int ms;

/* Private function prototypes -----------------------------------------------*/

/* Private functions ---------------------------------------------------------*/
void SysTick_Handler(void)
{
  ms++;
    if (ms>99){
        USART_SendData(USART1,'S');
        while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET){};
        if (GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_12)){
                GPIO_ResetBits(GPIOE,GPIO_Pin_12);
        }
        else{
                GPIO_SetBits(GPIOE,GPIO_Pin_12);
        }
        ms=0;
    }
}

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */
int main(void)
{
  GPIO_InitTypeDef GPIO_InitStruct;
    USART_InitTypeDef USART_InitStruct;

    /*GPIO configuration for indicator LED*/
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE,ENABLE);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;

    GPIO_Init(GPIOE,&GPIO_InitStruct);

    //Turn LED on
    GPIO_SetBits(GPIOE,GPIO_Pin_8|GPIO_Pin_12);

    /*GPIO configuration for USART. PA2 = USART2_TX, PA3 = USART2_RX*/
    //Enable clock for GPIOA
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;

    GPIO_Init(GPIOA,&GPIO_InitStruct);

    //AF configuration
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_7);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_7);

    /*USART configuration*/
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
    USART_Cmd(USART2, ENABLE);

    USART_InitStruct.USART_BaudRate = 9600;
  USART_InitStruct.USART_WordLength = USART_WordLength_8b;
  USART_InitStruct.USART_StopBits = USART_StopBits_1;
  USART_InitStruct.USART_Parity = USART_Parity_No;
  USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_Init(USART2, &USART_InitStruct);

    //Enable RXNE interrupt
    USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
    GPIO_SetBits(GPIOE,GPIO_Pin_9);
    //Enable USART global interrupt
    NVIC_EnableIRQ(USART2_IRQn);
    GPIO_SetBits(GPIOE,GPIO_Pin_10);

    if (SysTick_Config(SystemCoreClock / 1000))
  { 
    /* Capture error */ 
    while (1);
  }
    GPIO_SetBits(GPIOE,GPIO_Pin_11);

  while (1)
  {

  }
}

void USART2_IRQHandler(void){
    /*RXNE handler*/
    if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET){
        /*If recieved 't', toggle LED, transmit 'T'*/
        if((char)USART_ReceiveData(USART2) == 't'){
            /*Toggle LED*/
            if (GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_8)){
                GPIO_ResetBits(GPIOE,GPIO_Pin_8);
            }
            else{
                GPIO_SetBits(GPIOE,GPIO_Pin_8);
            }

            /*USART_SendData(USART1,'T');
            while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET){}*/
        }
    }
}

No hay respuesta del programa en este momento. (TX es constante a 3.3V, RX a 0v).

ACTUALIZACIÓN: he intentado usar USART1 en su lugar, y todavía no obtengo respuesta. Los otros cambios incluyen mover la parte de transmisión del código al bucle while y probar con GPIO_PuPd_UP, GPIO_PuPd_DOWN y GPIO_PuPd_NOPULL, sin resultados. Actualmente, cuando se usa USART2, el TX (PA2) está en una constante de 3.3V, y RX (PA3) en 0v. Al trasladarlo a USART1, ambos (PC4, PC5) parecen estar en una constante de 3.3V.

ACTUALIZACIÓN: La TX del USART está funcionando ahora, tuve que habilitar el USART después de inicializarlo, no antes, como se explica aquí: enlace

    
pregunta 884-15-X-C

1 respuesta

4

necesita habilitar el reloj periférico para USART2 explícitamente, usando esta llamada

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

antes de habilitar USART2 con USART_Cmd(USART2, ENABLE);

También asegúrate de que tu archivo startup_xx.s conoce el USART2_IRQ_Handler

    
respondido por el Abel Tom

Lea otras preguntas en las etiquetas