在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。
下面就说一下使用printf需要做哪些配置。
有两种配置方法:
一、对工程属性进行配置,详细步骤如下
1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。
2、在main文件中重定义函数。如下:
int fputc(int ch, FILE *f) // 发送数据
{
USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等
while (!(USART1->SR & USART_FLAG_TXE));
return (ch);
}
int GetKey (void) // 接收数据
{
while (!(USART1->SR & USART_FLAG_RXNE));
return ((int)(USART1->DR & 0x1FF));
}
这样在使用printf时就会调用自定义的fputc函数,来发送字符。
3、在工程属性的 “Target” -> “Code Generation” 选项中勾选 “Use MicroLIB”
MicroLIB 是缺省C的备份库,关于它可以到网上查找详细资料。
二、第二种方法是在工程中添加“Regtarge.c”文件
1、在main文件中包含 “stdio.h” 文件
2、在工程中创建一个文件保存为 Regtarge.c , 然后将其添加工程中在文件中输入如下内容:
#include #include #pragma import(__use_no_semihosting_swi) extern int SendChar(int ch); // 声明外部函数,在main文件中定义 extern int GetKey(void); struct __FILE { int handle; // Add whatever you need here }; FILE __stdout; FILE __stdin; int fputc(int ch, FILE *f) { return (SendChar(ch)); } int fgetc(FILE *f) { return (SendChar(GetKey())); } void _ttywrch(int ch) { SendChar (ch); } int ferror(FILE *f) { // Your implementation of ferror return EOF; } void _sys_exit(int return_code) { label: goto label; // endless loop } 3、在main文件中添加定义以下两个函数 int SendChar (int ch) { while (!(USART1->SR & USART_FLAG_TXE)); // USART1 可换成你程序中通信的串口 USART1->DR = (ch & 0x1FF); return (ch); } int GetKey (void) { while (!(USART1->SR & USART_FLAG_RXNE)); return ((int)(USART1->DR & 0x1FF)); } 至此完成配置,可以在main文件中随意使用 printf 。
上一篇:STM32波特率设置
下一篇:DMA+ADC单通道转换、多通道转换
推荐阅读
史海拾趣
Proteus版本7.1,可以在迅雷搜狗里面搜,可以下载。 里面附源程序 [ 本帖最后由 cqzy6666 于 2009-4-10 20:39 编辑 ]… 查看全部问答∨ |
|
北京三恒星科技公司(www.sanhengxing.com)是一家专门研发DSP/EDA/ARM开发板、仿真器、实验箱,从事单片机硬件和软件应用及教育的企业,承接单片机项目、电子产品设计开发板的开发(包括DSP、ARM、EDA、51单片机编程器,仿真器等系列产品),并整理了 ...… 查看全部问答∨ |
从Nandflash启动的Bootload已经可以运行了,现在我想在做一个Norflash上的Bootload。从s3c2440的datasheet里面看,boot internal sram(4kb)的地址是0x40000000,所以我在用ADS调试Bootload的时候,ro地址只能设置为这个才能运行。我的疑问是,为 ...… 查看全部问答∨ |
S3C2450在wince5.0下用mediaplayer播放MP4的疑问? 硬件:S3C2450 主频400/533M,RAM:256M DDR2,LCD:7寸,分辨率800×480 OS:WINCE5.0 这样的环境下,用WINCE自带的MediaPlayer,能否流畅播放MP4? 7寸屏是固定的,播放视频时可适当下调整显示分辨率,不知道最大能流畅播放多少分辨率的视频! 考 ...… 查看全部问答∨ |
|
需要输出500hz的方波,但是只输出20个周期。 我自己的方案,使用定时器输出500hz的方波,利用系统滴答始终计数40ms,然后关闭定时器。(此方案有个问题,经常会出现,定时器不工作的时候,一直处于高电平。) 在网上看到有用两个定时器,一 ...… 查看全部问答∨ |
|
各种AD例程里面几乎都有一句 while( (HWREG(ADC_BASE + ADC_O_X_SSFSTAT) & 0x00000100) ); /* 等待FIFO 0为非空,即等待转换*/ 这个ADC_O_X_SSFSTAT的宏定义附近是…… #define ADC_O_EMUX   ...… 查看全部问答∨ |
设计资源 培训 开发板 精华推荐
- 【有奖直播】:Microchip ATmega4809系列单片机简介
- 3小时实战+剖析:TI工程师手把手带你全面入门MSP430(限量售$4.3开发套件,助你参与动手实验)
- 有奖直播|5G多场景终端应用对连接器的新要求及Molex的5G连接方案
- 答题有礼: 寻觅可靠的触控、手势控制解决方案?快来认识新一代AVR DA单片机
- 【EEWORLD第九届社区明星人物】11月明星人物
- EEWorld十五周年,感恩同行!盘点那些难忘的小确幸~
- #最能打国产芯#能打入汽车电子这片地的国产芯,有多少啦?
- 评论赢京东卡,探秘美光内存和存储解决方案!
- 看MPLAB® Harmony集成软件框架之学习篇 你来评论我送礼!
- 更好的供电方式:使用更小、更轻的电源模块加速车辆电气化