Question
USART_printf not working on STM323221G_eval via GNU_ARM_GCC
Posted on November 27, 2013 at 20:39
Hello,
I haven't been able to get the example: STM32F2xx_StdPeriph_Lib_V1.1.0\Project\STM32F2xx_StdPeriph_Examples\USART\USART_Printf to work. It seems as if the the wrong put_char routine is being overridden. I have verified that USART3 is working correctly. By default, __io_putchar is being overriden (__GNUC__ is defined) and I have verified that I can print a character by calling __io_putchar. If I undefine __GNUC__, then fputc is overridden and I have verified that I can call fputc successfully. Basically, when I call printf, it does not return and does not send anything to usart3. I could rewrite printf, but I don't think I should have to. I am out of ideas! My environment particulars: included c and asm files: STM32F2xx Standard Peripheral Library V1.1.2 - including all src\*.c files and STM32_EVAL\STM322xG_EVAL\stm322xg_eval.c, stm322xg_eval_fsmc_sram.c, stm322xg_eval_ioe.c, stm322xg_eval_lcd.c, and stm322xg_eval_sdio_sd.c CMSIS\CM3\DeviceSupport\system_stm32f2xx.c and startup_stm32f2xx.s and typical syscalls.c and stm32f2xx_it.c and what I believe is a type .ld file: stm32f217vg_flash.ld main.c is listed below. Toolchain: gcc-arm-none-eabi - GNU Tools for ARM Embedded Processors 4.7 - Q3 2013 Compiler flags: -fno-common -mcpu=cortex-m3 -march=armv7-m -mfix-cortex-m3-ldrd -mfpu=vfp -std=gnu99 -mthumb and IDE Code::Blocks 11 Any ideas will be appreciated!!!! Vance Main.c:#include ''stm32f2xx.h''
#include ''stm322xg_eval.h''
#include <
stdio.h
>
USART_InitTypeDef USART_InitStructure;
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
PUTCHAR_PROTOTYPE
{
USART_SendData(EVAL_COM1, (uint8_t) ch);
while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)
{}
return ch;
}
int main(void)
{
#if (1)
STM_EVAL_LEDInit( LED1 );
STM_EVAL_LEDInit( LED2 );
STM_EVAL_LEDInit( LED3 );
STM_EVAL_LEDInit( LED4 );
STM_EVAL_LEDOn(LED1);
#endif
USART_InitStructure.USART_BaudRate = 38400;
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;
STM_EVAL_COMInit(COM1, &USART_InitStructure);
STM_EVAL_LEDOn(LED2);
USART_SendData(EVAL_COM1, 0x49); // Send 'I'
#ifdef __GNUC__
__io_putchar( 0x4A);
#else
fputc( 0x4B, (FILE *)NULL);
#endif // __GNUC__
STM_EVAL_LEDOn(LED3);
printf(''\n\rUSART Printf Example: retarget the C library printf function to the USART\n\r'');
STM_EVAL_LEDOn(LED4);
while (1)
{
}
}
#stm32-standard-peripheral-librar #stm32f2-eval-board