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