this is one of my first step for getting started with a STM32 mikrocontroller. I want to enable the USART2 at the extension connector (PIN16) of my Primer2. I use the USART-example code from the Ride7 library calling "Polling" and made some midifications cause of the platform "Primer2". After compiling with Ride7, flashing with RFlasher7 and pushing the button, the LCD-backlight is switching on, but the TX pin has no output. It only toggle to high.
The code tranfer should not be the problem because I am able to Flash the µC with a LED-blinking-demo that works.
Does anybody has a idea where my mistake is?
I use the code below.
Thanks in advance,
FunRice
/******************** (C) COPYRIGHT 2008 STMicroelectronics ******************** * File Name : main.c * Author : MCD Application Team * Version : V2.0.3 * Date : 09/22/2008 * Description : Main program body ******************************************************************************** * 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. *******************************************************************************/
/* Includes ------------------------------------------------------------------*/ #include "stm32f10x_lib.h"
/* Enable the USART1 */ USART_Cmd(USART1, ENABLE);
/* Enable the USART2 */ USART_Cmd(USART2, ENABLE);
while(TxCounter != 0) { /* Send one byte from USART1 to USART2 */ USART_SendData(USART2, TxBuffer[TxCounter++]);
/* Loop until USART1 DR register is empty */ while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET) { }
/* Loop until the USART2 Receive Data Register is not empty */ while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) { }
/* Store the received byte in RxBuffer */ RxBuffer[RxCounter++] = (USART_ReceiveData(USART1) & 0x7F);
} /* Check the received data with the send ones */ TransferStatus = Buffercmp(TxBuffer, RxBuffer, TxBufferSize); /* TransferStatus = PASSED, if the data transmitted from USART1 and received by USART2 are the same */ /* TransferStatus = FAILED, if the data transmitted from USART1 and received by USART2 are different */
while (1) { } }
/******************************************************************************* * Function Name : RCC_Configuration * Description : Configures the different system clocks. * Input : None * Output : None * Return : None *******************************************************************************/ void RCC_Configuration(void) { /* RCC system reset(for debug purpose) */ RCC_DeInit();
/* Enable HSE */ RCC_HSEConfig(RCC_HSE_ON);
/* Wait till HSE is ready */ HSEStartUpStatus = RCC_WaitForHSEStartUp();
/******************************************************************************* * Function Name : NVIC_Configuration * Description : Configures Vector Table base location. * Input : None * Output : None * Return : None *******************************************************************************/ void NVIC_Configuration(void) { #ifdef VECT_TAB_RAM /* Set the Vector Table base location at 0x20000000 */ NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); #else /* VECT_TAB_FLASH */ /* Set the Vector Table base location at 0x08000000 */ NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); #endif }
/******************************************************************************* * Function Name : Buffercmp * Description : Compares two buffers. * Input : - pBuffer1, pBuffer2: buffers to be compared. * : - BufferLength: buffer's length * Output : None * Return : PASSED: pBuffer1 identical to pBuffer2 * FAILED: pBuffer1 differs from pBuffer2 *******************************************************************************/ TestStatus Buffercmp(u8* pBuffer1, u8* pBuffer2, u16 BufferLength) { while(BufferLength--) { if(*pBuffer1 != *pBuffer2) { return FAILED; }
pBuffer1++; pBuffer2++; }
return PASSED; }
#ifdef DEBUG /******************************************************************************* * Function Name : assert_failed * Description : Reports the name of the source file and the source line number * where the assert_param error has occurred. * Input : - file: pointer to the source file name * - line: assert_param error line source number * Output : None * Return : None *******************************************************************************/ void assert_failed(u8* file, u32 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 2008 STMicroelectronics *****END OF FILE****/
Use USART2 instead for external serial com. USART1 pins are used for something else in the OS. Can't remember off hand what. I could only get USART2 to work good though. Here's my UART init function:
/* USART2 configuration ------------------------------------------------------*/ /* USART2 configured as follow: - BaudRate = 9600 baud - Word Length = 8 Bits - One Stop Bit - No parity - Hardware flow control disabled (RTS and CTS signals) - Receive and transmit enabled - USART Clock disabled - USART CPOL: Clock is active low - USART CPHA: Data is captured on the second edge - USART LastBit: The clock pulse of the last data bit is not output to the SCLK pin */
/* Flash 2 wait state */ *(vu32 *)0x40022000 = 0x02;
/* Set CPU clock */ //UTIL_SetPll( UTIL_ReadBackupRegister( BKP_PLL ) ); //YRT 20081025 : data compaction in bit format UTIL_SetPll( UTIL_ReadBackupRegister( BKP_SYS2 ) & 0x0007 );
Sorry, I forgot to say, that I don´t use the CircleOS. Unfortunately I can not test your USART-Init immediately, but in the evening. As soon as I can I will post the result.
One other thing to check is while in debug mode look at the UART peripheral while paused after you init the port. You should see values indicated. If not, something is not configured correctly.
If not using the OS, you should be able to use both ports. Look at the Primer2 manual extension pin section to see all the devices connected to the pins your trying to use. For debugging, I've tied the RX and TX lines together with a jumper also. This helped testing UART interrupt action.
I tested your code with the same negativ result. For testing the communication, I use the logic-analyser from Saleae. They say that the input high voltage is 2 to 5.25V. The TX-pin is about 2,8V but my logic-analyser detect it as low. It works fine at my 5V-projects. By connecting a storage oscilloscope i could see the byte. So, your and my code works and i have to complain at Saleae!
That's interesting. I have the same logic analyser. I used it to test things also but with no problem. I was thinking recently about changing the input pin to on a floating input but a GPIO_Mode_IPU which is an input with pullup. Can you try that and see what it does?
That is weird. The specs located here indicate and input high signal is from 2V to 5.25V: http://www.saleae.com/logic/specs/ . I've worked with a 1-wire device on one of the extension pins from the Primer2 and used the Logic device to capture what's going on with no problem. You may have a bad Logic device. Have you tried other channels?