cancel
Showing results for 
Search instead for 
Did you mean: 

stm32f4 read data from pc's com port

d4ng3r09
Associate II
Posted on May 10, 2015 at 15:40

I managed to send via stm32f4 data using usb and vcp.What i am trying to do now is to read data from pc .In order to check what is read through usb i send it again to the pc.

My problem is that the board seems to ignore the data sent by the pc . I am using micro c 's serial terminal to read and write data. Can you help me please?

#define HSE_VALUE ((uint32_t)8000000) /* STM32 discovery uses a 8Mhz external crystal */
#include ''stm32f4xx_conf.h''
#include ''stm32f4xx.h''
#include ''stm32f4xx_gpio.h''
#include ''stm32f4xx_rcc.h''
#include ''stm32f4xx_exti.h''
#include ''usbd_cdc_core.h''
#include ''usbd_usr.h''
#include ''usbd_desc.h''
#include ''usbd_cdc_vcp.h''
#include ''usb_dcd_int.h''
volatile uint32_t ticker, downTicker;
/*
* The USB data must be 4 byte aligned if DMA is enabled. This macro handles
* the alignment, if necessary (it's actually magic, but don't tell anyone).
*/
__ALIGN_BEGIN USB_OTG_CORE_HANDLE USB_OTG_dev __ALIGN_END;
void init();
void ColorfulRingOfDeath(void);
/*
* Define prototypes for interrupt handlers here. The conditional ''extern''
* ensures the weak declarations from startup_stm32f4xx.c are overridden.
*/
#ifdef __cplusplus
extern ''C'' {
#endif
void SysTick_Handler(void);
void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void OTG_FS_IRQHandler(void);
void OTG_FS_WKUP_IRQHandler(void);
#ifdef __cplusplus
}
#endif
int main(void)
{ uint8_t theByte[1];
theByte[0]=123;
//theByte[1]=95;
/* Set up the system clocks */
SystemInit();
/* Initialize USB, IO, SysTick, and all those other things you do in the morning */
init();
GPIO_SetBits(GPIOD,GPIO_Pin_14);
while (1)
{
VCP_get_string(&theByte);
VCP_send_buffer(&theByte, 1);
}
}
void init()
{
/* STM32F4 discovery LEDs */
GPIO_InitTypeDef LED_Config;
/* Always remember to turn on the peripheral clock... If not, you may be up till 3am debugging... */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
LED_Config.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
LED_Config.GPIO_Mode = GPIO_Mode_OUT;
LED_Config.GPIO_OType = GPIO_OType_PP;
LED_Config.GPIO_Speed = GPIO_Speed_25MHz;
LED_Config.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &LED_Config);
/* Setup SysTick or CROD! */
if (SysTick_Config(SystemCoreClock / 1000))
{
ColorfulRingOfDeath();
}
/* Setup USB */
USBD_Init(&USB_OTG_dev,
USB_OTG_FS_CORE_ID,
&USR_desc,
&USBD_CDC_cb,
&USR_cb);
return;
}
/*
* Call this to indicate a failure. Blinks the STM32F4 discovery LEDs
* in sequence. At 168Mhz, the blinking will be very fast - about 5 Hz.
* Keep that in mind when debugging, knowing the clock speed might help
* with debugging.
*/
void ColorfulRingOfDeath(void)
{
uint16_t ring = 1;
while (1)
{
uint32_t count = 0;
while (count++ < 
500000
);
GPIOD->BSRRH = (ring << 
12
);
ring
= ring << 1;
if (ring >= 1<<
4
)
{
ring
= 
1
;
}
GPIOD->BSRRL = (ring << 
12
);
}
}
/*
* Interrupt Handlers
*/
void SysTick_Handler(void)
{
ticker++;
if (downTicker > 0)
{
downTicker--;
}
}
void NMI_Handler(void) {}
void HardFault_Handler(void) { ColorfulRingOfDeath(); }
void MemManage_Handler(void) { ColorfulRingOfDeath(); }
void BusFault_Handler(void) { ColorfulRingOfDeath(); }
void UsageFault_Handler(void){ ColorfulRingOfDeath(); }
void SVC_Handler(void) {}
void DebugMon_Handler(void) {}
void PendSV_Handler(void) {}
void OTG_FS_IRQHandler(void)
{
USBD_OTG_ISR_Handler (&USB_OTG_dev);
}
void OTG_FS_WKUP_IRQHandler(void)
{
if(USB_OTG_dev.cfg.low_power)
{
*(uint32_t *)(0xE000ED10) &= 0xFFFFFFF9 ;
SystemInit();
USB_OTG_UngateClock(&USB_OTG_dev);
}
EXTI_ClearITPendingBit(EXTI_Line18);
}

3 REPLIES 3
Posted on May 10, 2015 at 17:58

Not sure I understand exactly what you're expecting here. The STM32 can't really initiate the read from the PC, the PC needs to be running an app that delivers data to you, or you create a protocol for them to interact. Say whether it's using an XMODEM or YMODEM type protocol to send, or request to be sent, a file. Or something like the Flash Loader Demonstrator type thing where the PC application implements a protocol across a serial connection.

Tips, buy me a coffee, or three.. PayPal Venmo Up vote any posts that you find helpful, it shows what's working..
d4ng3r09
Associate II
Posted on May 11, 2015 at 14:58

As i said i am using Micro c for pic 's serial terminal to communicate with the board.

Posted on May 11, 2015 at 21:13

As i said i am using Micro c for pic 's serial terminal to communicate with the board.

I'm not familiar with that, how does it differ materially with any other Terminal type application (Hyperterminal, TeraTerm, RealTerm, ClearTerm, et al)

As I recall the USB VCP in-bound data via VCP_DataRx(), there you can buffer it however you want or output via a real USART.
Tips, buy me a coffee, or three.. PayPal Venmo Up vote any posts that you find helpful, it shows what's working..