打印

学习 scanf 开发板范例 链接 出错 Undefined symbol __vfscanf_char_file (referred

[复制链接]
398|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linking...
.Objoutput.axf: Error: L6218E: Undefined symbol __vfscanf_char_file (referred from __0scanf.o).
.Objoutput.axf: Not enough information to list image symbols.
.Objoutput.axf: Finished: 1 information, 0 warning and 1 error messages.
Target not created

为什么编译出现上述错误?初学scanf,希望得到指点,不胜感激...

main.c

#include "stm32f10x.h"
#include <stdio.h>
#include "usart_printf.h"

#define EXAMPLE_NAME        "printf & scanf Testing"
#define EXAMPLE_DATE        "2010-01-02"

/*******************************************************************************
        函数名:main
        输  入:
        输  出:
        功能说明:用户程序入口
*/
int main(void)
{
        /*
                这个函数是ST库中的函数,函数实体在
                LibrariesCMSISCoreCM3system_stm32f10x.c

                配置内部Flash接口,初始化PLL,配置系统频率
                系统时钟缺省配置为72MHz,你如果需要更改,则需要去修改相关的头文件中的宏定义
        */
        SystemInit();

        /* 配置串口, 该函数在usart_printf.c */
        USART_Configuration();

        /* 通过串口输出例程名和更新日期 */
        Printf**(EXAMPLE_NAME, EXAMPLE_DATE);

        /* KEIL 下,编译scanf,功能正确,但是在IAR下编译,scanf会遗漏首字符(原因待查) */
        while (1)
        {
                int a,b,c;
                char str[200];

                printf("input 3 number a,b,c :
");

                scanf("%d", &a);
                scanf("%d", &b);
                scanf("%d", &c);
                printf("a=%d, b=%d, c=%d
",a,b,c);

                printf("input a sting :
");
                scanf("%s", str);

                printf("str = %s
", str);
                printf("
");
        }
}

#ifdef  USE_FULL_ASSERT

/**
  * @brief  Reports the name of the source file and the source line number
  *   where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t 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
", file, line) */

  /* Infinite loop */
  while (1)
  {
  }
}
#endif

/**
  * @}
  */

/**
  * @}
  */

/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/


uart.c

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include <stdio.h>

/*******************************************************************************
        函数名:Printf**
        输  入: 例程名称和例程最后更新日期
        输  出:
        功能说明:
*/
void Printf**(char *strName, char *strDate)
{
        printf("*************************************************************
");
        printf("* Example Name : %s
", strName);
        printf("* Update Date  : %s
", strDate);
        printf("* StdPeriph_Lib Version : V3.1.2
");
        printf("*
");
        printf("* Copyright www.armfly.com
");
        printf("* QQ    : 1295744630
");
        printf("* Email : armfly@qq.com
");
        printf("*************************************************************
");
}

/*******************************************************************************
        函数名:USART_Configuration
        输  入:
        输  出:
        功能说明:
        初始化串口硬件设备,未启用中断。
        配置步骤:
        (1)打开GPIO和USART的时钟
        (2)设置USART两个管脚GPIO模式
        (3)配置USART数据格式、波特率等参数
        (4)最后使能USART功能
*/
void USART_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;

        /* 第1步:打开GPIO和USART部件的时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

        /* 第2步:将USART Tx的GPIO配置为推挽复用模式 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);

        /* 第3步:将USART Rx的GPIO配置为浮空输入模式
                由于CPU复位后,GPIO缺省都是浮空输入模式,因此下面这个步骤不是必须的
                但是,我还是建议加上便于阅读,并且防止其它地方修改了这个口线的设置参数
        */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        /*  第3步已经做了,因此这步可以不做
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        */
        GPIO_Init(GPIOA, &GPIO_InitStructure);


        /* 第4步:配置USART参数
            - BaudRate = 115200 baud
            - Word Length = 8 Bits
            - One Stop Bit
            - No parity
            - Hardware flow control disabled (RTS and CTS signals)
            - Receive and transmit enabled
        */
        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);

        /* 第5步:使能 USART, 配置完毕 */
        USART_Cmd(USART1, ENABLE);

        /* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去
                如下语句解决第1个字节无法正确发送出去的问题 */
        USART_ClearFlag(USART1, USART_FLAG_TC);     /* 清发送外城标志,Transmission Complete flag */
}

/*******************************************************************************
        函数名:fputc
        输  入:
        输  出:
        功能说明:
        重定义putc函数,这样可以使用printf函数从串口1打印输出
*/
int fputc(int ch, FILE *f)
{
        /* Place your implementation of fputc here */
        /* e.g. write a character to the USART */
        USART_SendData(USART1, (uint8_t) ch);

        /* Loop until the end of transmission */
        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
        {}

        return ch;
}

/*******************************************************************************
        函数名:fputc
        输  入:
        输  出:
        功能说明:
        重定义getc函数,这样可以使用scanff函数从串口1输入数据
*/
int fgetc(FILE *f)
{
        /* 等待串口1输入数据 */
        while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET)
        {}

        return (int)USART_ReceiveData(USART1);
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

384

主题

384

帖子

0

粉丝