/var/www/restricted/ssh/stm32/www/stm32circle/ STM CircleOS forum / USART2 at the extension connector of Primer2

Username:     
Password:     
             

Forum

# 1   2010-01-22 12:15:56 USART2 at the extension connector of Primer2

FunRice
Member
Registered: 2009-10-19
Posts: 18

USART2 at the extension connector of Primer2

Hello,

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"


/* Private typedef -----------------------------------------------------------*/
typedef enum { FAILED = 0, PASSED = !FAILED} TestStatus;

/* Private define ------------------------------------------------------------*/
#define TxBufferSize   (countof(TxBuffer))

/* Private macro -------------------------------------------------------------*/
#define countof(a)   (sizeof(a) / sizeof(*(a)))

/* Private variables ---------------------------------------------------------*/
USART_InitTypeDef USART_InitStructure;
u8 TxBuffer[] = "Buffer Send from USART1 to USART2 using Flags";
u8 RxBuffer[TxBufferSize];
u8 TxCounter = 1, RxCounter = 0; 
TestStatus TransferStatus = FAILED; 
ErrorStatus HSEStartUpStatus;

/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
TestStatus Buffercmp(u8* pBuffer1, u8* pBuffer2, u16 BufferLength);
u8 index = 0;


/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
#ifdef DEBUG
  debug();
#endif

  /* System Clocks Configuration */
  RCC_Configuration();
       
  /* NVIC configuration */
  NVIC_Configuration();

  /* Configure the GPIO ports */
  GPIO_Configuration();

/* USART1 and USART2 configuration ------------------------------------------------------*/
  /* USART and USART2 configured as follow:
        - BaudRate = 230400 baud 
        - Word Length = 8 Bits
        - One Stop Bit
        - Even parity
        - Hardware flow control disabled (RTS and CTS signals)
        - Receive and transmit enabled
  */
  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_Even;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
 
  /* Configure USART1 */
  USART_Init(USART1, &USART_InitStructure);
  /* Configure USART2 */
  USART_Init(USART2, &USART_InitStructure);
 
  /* 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();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);

    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
 
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
   
  /* Enable USART1, GPIOA, GPIOD and AFIO clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA |RCC_APB2Periph_GPIOA
                         | RCC_APB2Periph_AFIO, ENABLE);
  /* Enable USART2 clock */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
}

/*******************************************************************************
* Function Name  : GPIO_Configuration
* Description    : Configures the different GPIO ports.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

//#ifdef USE_STM3210B_EVAL
  /* Enable the USART2 Pins Software Remapping */
//  GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);
//#endif

  /* Configure USART1 Tx (PA.09) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USART2 Tx (PA.02) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USART1 Rx (PA.10) as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USART2 Rx (PA.03) as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
}

/*******************************************************************************
* 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****/

Offline

 

# 2   2010-01-22 12:43:32 USART2 at the extension connector of Primer2

logictechs
Member
Registered: 2009-05-07
Posts: 68

Re: USART2 at the extension connector of Primer2

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:

void InitUSART(void)
{
  /* Enable GPIOx clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

/* Enable USART2 clock */

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);   

  GPIO_InitTypeDef GPIO_InitStructure;
  /* Configure USART2 Tx (PA.2) as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USART2 Rx as input floating */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure);


/* 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
  */

  USART_InitTypeDef USART_InitStructure;
  USART_ClockInitTypeDef USART_ClockInitStructure;
  /* USART configuration ------------------------------------------------------*/

  USART_InitStructure.USART_BaudRate = 9600;
  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);


  /* Configure USART2 */
  USART_Init(USART2, &USART_InitStructure);
   
  /* Enable USART2 Receive and Transmit interrupts */
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
 
  /* Enable the USART2 */
  USART_Cmd(USART2, ENABLE);
}

My RCC config function:

void RCC_Configuration( void )
    {

    /* SYSCLK, HCLK, PCLK2 and PCLK1 configuration */

    /* RCC system reset(for debug purpose) */
    RCC_DeInit();

    /* Enable HSE */
    RCC_HSEConfig( RCC_HSE_ON );

    /* Wait till HSE is ready */
    while( RCC_GetFlagStatus( RCC_FLAG_HSERDY ) == RESET )
        {;}

    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);

    /* HCLK = SYSCLK */
    RCC_HCLKConfig( RCC_SYSCLK_Div1 );

    /* PCLK2 = HCLK */
    RCC_PCLK2Config( RCC_HCLK_Div1 );

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config( RCC_HCLK_Div2 );

    /* ADCCLK = PCLK2/6 */
    RCC_ADCCLKConfig( RCC_PCLK2_Div6 );

    /* 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 );

    /* Enable GPIOB & GPIOB clock */
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );

    /* Enable GPIOB clock */
    //RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );

    /* Enable TIM2 */
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2, ENABLE );
    }


Good luck

Offline

 

# 3   2010-01-22 13:31:46 USART2 at the extension connector of Primer2

FunRice
Member
Registered: 2009-10-19
Posts: 18

Re: USART2 at the extension connector of Primer2

Hello logictechs,

thank you for your answer.

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.


Regards FunRice

Offline

 

# 4   2010-01-22 16:36:00 USART2 at the extension connector of Primer2

logictechs
Member
Registered: 2009-05-07
Posts: 68

Re: USART2 at the extension connector of Primer2

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.

Offline

 

# 5   2010-01-22 21:14:42 USART2 at the extension connector of Primer2

FunRice
Member
Registered: 2009-10-19
Posts: 18

Re: USART2 at the extension connector of Primer2

Hello,

I found a strange hardware failure !

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!

Thank you very much for your help!


Regards, FunRice

Last edited by FunRice (2010-01-22 21:15:45)

Offline

 

# 6   2010-01-23 00:58:02 USART2 at the extension connector of Primer2

logictechs
Member
Registered: 2009-05-07
Posts: 68

Re: USART2 at the extension connector of Primer2

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?

Offline

 

# 7   2010-01-23 20:29:45 USART2 at the extension connector of Primer2

FunRice
Member
Registered: 2009-10-19
Posts: 18

Re: USART2 at the extension connector of Primer2

Hi logictechs,

I connect my analyser to GND and VCC @ 2,89V and my analyser detect it as low, unbelievable !
It must be a hardware failure.

Regards, FunRice

Offline

 

# 8   2010-01-23 21:28:13 USART2 at the extension connector of Primer2

logictechs
Member
Registered: 2009-05-07
Posts: 68

Re: USART2 at the extension connector of Primer2

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?

Offline

 

# 9   2010-01-23 21:32:01 USART2 at the extension connector of Primer2

logictechs
Member
Registered: 2009-05-07
Posts: 68

Re: USART2 at the extension connector of Primer2

I also tried working with I2C on the external connector and posted on this forum a pic  of the pin action using Logic.  It's located here:  http://www.stm32circle.com/forum/viewtopic.php?id=685

Offline

 

# 10   2010-01-23 22:37:09 USART2 at the extension connector of Primer2

FunRice
Member
Registered: 2009-10-19
Posts: 18

Re: USART2 at the extension connector of Primer2

Yes, I tried the other channels. It's a bad device. The analyser is only a few month old, so Saleae has to change it.

Regards, FunRice

Offline

 

Board footer