This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

USARTx->DR doesn't change value

Hi everyone,

Currently I'm working with the STM32L152D-EVAL board and what I want is to send a message using USART1 interface. I tried it in several ways (also with the example codes) but it seems that is no way to change the value of USART1->DR register's value and send something through serial line.

This is the code I'm using:

/**
  ******************************************************************************
  * @file    GPIO/IOToggle/main.c
  * @author  MCD Application Team
  * @version V1.1.0
  * @date    24-January-2012
  * @brief   Main program body
  ******************************************************************************
  * @attention
  *
  * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
  * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
  * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
  * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
  * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
  * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
  *
  * FOR MORE INFORMATION PLEASE READ CAREFULLY THE LICENSE AGREEMENT FILE
  * LOCATED IN THE ROOT DIRECTORY OF THIS FIRMWARE PACKAGE.
  *
  * <h2><center>© COPYRIGHT 2012 STMicroelectronics</center></h2>
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
//#include "stm32l1xx.h"

#ifdef USE_STM32L152D_EVAL
  #include "stm32l152d_eval.h"
#elif defined USE_STM32L152_EVAL
  #include "stm32l152_eval.h"
#endif

/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
void USART_initialize();

/**
  * @brief  Main program
  * @param  None
  * @retval None
  */
int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured,
       this is done through SystemInit() function which is called from startup
       file (startup_stm32l1xx_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32l1xx.c file
     */

        USART_initialize();

  while (1)
  {
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //wait until buffer is empty (TXE=0)
        USART_SendData(USART1, 'O');
        while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //wait until buffer is empty (TXE=0)
        USART_SendData(USART1, 'K');

  }
}

void USART_initialize(){
        GPIO_InitTypeDef GPIO_Initconfig_uartport;
        USART_InitTypeDef USART_Initconfig_structure;

        /* Clock initialization */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //USART
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //GPIOA

        //PA9 (Tx), PA10 (Rx)
         // Connect PXx to USARTx_Tx*/
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
         // Connect PXx to USARTx_Rx*/
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

        // Configure USART Tx as alternate function
        GPIO_Initconfig_uartport.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
        GPIO_Initconfig_uartport.GPIO_Mode = GPIO_Mode_AF; //Mux out USART1 Rx & Tx with alternate function
        GPIO_Initconfig_uartport.GPIO_OType = GPIO_OType_PP;
        GPIO_Initconfig_uartport.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Initconfig_uartport.GPIO_Speed = GPIO_Speed_40MHz;

        GPIO_Init(GPIOA, &GPIO_Initconfig_uartport);

        /* USART communication parameters configuration */
        USART_Initconfig_structure.USART_BaudRate = 9600;
        USART_Initconfig_structure.USART_WordLength = USART_WordLength_8b;
        USART_Initconfig_structure.USART_StopBits = USART_StopBits_1;
        USART_Initconfig_structure.USART_Parity = USART_Parity_No;
        USART_Initconfig_structure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS;
        USART_Initconfig_structure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

        USART_Init(USART1, &USART_Initconfig_structure);
        USART_Cmd(USART1 , ENABLE);
}


#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

/******************* (C) COPYRIGHT 2012 STMicroelectronics *****END OF FILE****/

The HAL function provided by ST is:

/**
  * @brief  Transmits single data through the USARTx peripheral.
  * @param  USARTx: Select the USART peripheral.
  *   This parameter can be one of the following values:
  *   USART1, USART2, USART3, UART4 or UART5.
  * @param  Data: the data to transmit.
  * @retval None.
  */
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data));


/* Transmit Data */ USARTx->DR = (Data & (uint16_t)0x01FF); }

Do any of you know what am I missing/doing wrong?

Thanks in advance,
Kepa