AnsweredAssumed Answered

STM32F3 Discovery USART1 Problem

Question asked by sohaeng.lee on Jan 10, 2016
Latest reply on Jan 11, 2016 by sohaeng.lee
Hi

2 days ago, i was trying to commucate between STM32F3-Disco and USB CP232 connecter.
so, i was connect GPIOA 9,10 and USB CP232 Tx,Rx port.   (See attatched Photos)
but, wrong character displayed in Token2Shell(Serial communication program).

what is wrong in my source code?



                                                               
           
//
            // main.c
            //
            #include <stdio.h>
            #include <stddef.h>
            #include "stm32f30x.h"
            #include "stm32f30x_conf.h"
            #include "stm32f30x_it.h"   // must need because _delay_ms, _ns
           
           
#include "usart1.h"
           
           
// using CMSIS arm_math must include this.
            #include "arm_math.h"
           
           
void Clock_Init(void);
            void GPIOE_Init(void);
            void GPIOA_Init(void);
           
           
void Clock_Init(void)
            {
             RCC_HSEConfig(RCC_HSE_ON);       // enables HighSpeedExternal HSE oscillator
                while(!RCC_WaitForHSEStartUp());  // wait till clock stabilizes
            }
           
           
void GPIOE_Init(void)                    // PE8 .. PE15 Output for LEDs
            {                          // ResetClockControl RCC
                GPIO_InitTypeDef GPIO_InitStructure;
           
           
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOE,ENABLE); // enables clock to portE
           
           
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;          // _IN  _AF:Alternate  _AN:Analog
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      // _2MHz  _10MHz
                GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;         // _PP:Push/Pull _OD:OpenDrain
                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;       // _UP   _DOWN
                GPIO_Init(GPIOE,&GPIO_InitStructure);
            }
           
           
void GPIOA_Init(void)                    // PA0  Input for User Button
            {                          // ResetClockControl RCC
                GPIO_InitTypeDef GPIO_InitStructure;
           
           
 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE); // enables clock to portA
           
           
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;           // _OUT  _AF:Alternate  _AN:Analog
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      // _2MHz  _10MHz
                GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;         // _PP:Push/Pull _OD:OpenDrain
                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;         // _NOPULL  _UP   _DOWN
                GPIO_Init(GPIOA,&GPIO_InitStructure);
            }
           
           
int main(void)
            {
             RCC_ClocksTypeDef Rcc_Clocks;
           
           
 SystemInit();
             Clock_Init();
             GPIOE_Init();    // pin 8,9,10,11,12,13,14,15
             GPIOA_Init();      // pin 0
             USART1_Init();
           
           
 RCC_GetClocksFreq(&Rcc_Clocks);
             if(SysTick_Config(Rcc_Clocks.SYSCLK_Frequency/1000000)) while(1);
           
           
// if(Rcc_Clocks.SYSCLK_Frequency==72000000L) GPIO_SetBits(GPIOE,GPIO_Pin_12);
           
           
 SerialPutString("Can u see me?\r\n");
           
           
 while(1)
             {
              GPIO_SetBits(GPIOE,GPIO_Pin_8); // |GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_SetBits(GPIOE,GPIO_Pin_9); // |GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_SetBits(GPIOE,GPIO_Pin_10); // |GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_SetBits(GPIOE,GPIO_Pin_11); // |GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_SetBits(GPIOE,GPIO_Pin_12); // |GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_SetBits(GPIOE,GPIO_Pin_13); // |GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_SetBits(GPIOE,GPIO_Pin_14); // |GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_SetBits(GPIOE,GPIO_Pin_15); // |GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_ResetBits(GPIOE,GPIO_Pin_8); //|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_ResetBits(GPIOE,GPIO_Pin_9); //|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_ResetBits(GPIOE,GPIO_Pin_10); //|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_ResetBits(GPIOE,GPIO_Pin_11); //|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_ResetBits(GPIOE,GPIO_Pin_12); //|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_ResetBits(GPIOE,GPIO_Pin_13); //|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_ResetBits(GPIOE,GPIO_Pin_14); //|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              GPIO_ResetBits(GPIOE,GPIO_Pin_15); //|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
              _delay_ms(50);
              USART_SendData(USART1, 'A');
              USART_SendData(USART1, 'B');
              USART_SendData(USART1, 'C');
              USART_SendData(USART1, 'D');
           
           
 }
           
           
    return 0;
            } 
           
           
 /*
             * usart1.c
             *
             *  Created on: Jan 9, 2016
             *      Author: sohaeng
             */
            #include <stdio.h>
            #include "usart1.h"
           
           

            void USART1_Init(void)                 // GPIOA의 9,10 pin을 사용함. 반드시 먼저 GPIOA 초기화 필요함.
            {
             USART_InitTypeDef   USART_InitStructure;
             NVIC_InitTypeDef     NVIC_InitStructure;
                GPIO_InitTypeDef   GPIO_InitStructure;
           
           
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;           // _AF
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      // _2MHz  _10MHz
                GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;         // _PP:Push/Pull _OD:OpenDrain
                GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;         // _NOPULL  _UP   _DOWN
                GPIO_Init(GPIOA,&GPIO_InitStructure);
           
           
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9 , GPIO_AF_7);
                GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_7);
           
           
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); // Enable USART1
           
           
    USART_DeInit(USART1);
                USART_InitStructure.USART_BaudRate = 115200;
                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(USART1,&USART_InitStructure);
           
           
    USART_Cmd(USART1, ENABLE);
           
           
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // enable the USART1 receive interrupt
           
           
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;            // we want to configure the USART1 interrupts
                NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;    // this sets the priority group of the USART1 interrupts
                NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;         // this sets the subpriority inside the group
                NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            // the USART1 interrupts are globally enabled
                NVIC_Init(&NVIC_InitStructure);                         // the properties are passed to the NVIC_Init function which takes care of the low level stuff
           
           
//  NVIC_EnableIRQ(USART1_IRQn);
            }
           
           
// SerialPutChar
            // 한문자 출력 , USART_SendData(USART1, c)
            void SerialPutChar(char c)
            {
             USART1->TDR = ((u16)c & (u16)0x01FF);
             while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
            }
           
           
// SerialPutString
            // 문자열 출력
            void SerialPutString(char *c)
            {
             while(*c) USART_SendData(USART1, *c++);
            // while(*c) SerialPutChar(*c++);
            }
           
           
// USART1_IRQHandler
            // GetChar interrupt Call
            // USART1 입력설정 플래그가 세트되면 호출됨.
            void USART1_IRQHandler(void)
            {
             uint16_t C;
             char      s[20];
           
           
 if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
             {
              C = USART_ReceiveData(USART1);
              USART_ClearITPendingBit(USART1,USART_IT_RXNE);
           
           
  sprintf(s,"Data : %c : %#x\r\n",C,C);
              SerialPutString(s);
              SerialPutString("\r\n");
             }
            }
           
           
           




Outcomes