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 &quot;usart_printf.h&quot;
#define EXAMPLE_NAME &quot;printf & scanf Testing&quot;
#define EXAMPLE_DATE &quot;2010-01-02&quot;
/*******************************************************************************
函数名: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(&quot;input 3 number a,b,c :
&quot;);
scanf(&quot;%d&quot;, &a);
scanf(&quot;%d&quot;, &b);
scanf(&quot;%d&quot;, &c);
printf(&quot;a=%d, b=%d, c=%d
&quot;,a,b,c);
printf(&quot;input a sting :
&quot;);
scanf(&quot;%s&quot;, str);
printf(&quot;str = %s
&quot;, str);
printf(&quot;
&quot;);
}
}
#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(&quot;Wrong parameters value: file %s on line %d
&quot;, file, line) */
/* Infinite loop */
while (1)
{
}
}
#endif
/**
* @}
*/
/**
* @}
*/
/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
uart.c
/* Includes ------------------------------------------------------------------*/
#include &quot;stm32f10x.h&quot;
#include <stdio.h>
/*******************************************************************************
函数名:Printf**
输 入: 例程名称和例程最后更新日期
输 出:
功能说明:
*/
void Printf**(char *strName, char *strDate)
{
printf(&quot;*************************************************************
&quot;);
printf(&quot;* Example Name : %s
&quot;, strName);
printf(&quot;* Update Date : %s
&quot;, strDate);
printf(&quot;* StdPeriph_Lib Version : V3.1.2
&quot;);
printf(&quot;*
&quot;);
printf(&quot;* Copyright www.armfly.com
&quot;);
printf(&quot;* QQ : 1295744630
&quot;);
printf(&quot;* Email : armfly@qq.com
&quot;);
printf(&quot;*************************************************************
&quot;);
}
/*******************************************************************************
函数名: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);
} |