STM32的printf函数实现方法

发布者:asd999ddd最新更新时间:2017-10-09 来源: eefocus关键字:STM32  printf函数 手机看文章 扫描二维码
随时随地手机看文章

今天调试了stm32f407的ADC,一切顺利,然而用串口发送ADC 结果时都是16进制数,看

着很不爽。于是打算用用牛B 的“printf”函数,按照以前的做法,在main 文件中添加了

“stdio.h”,写好了“printf”函数,沏杯茶,打算边品茶边坐等结果,然而这一坐竟坐了半天也

没见结果。一调试发现程序停在了printf 函数处,百思不得其解,百度之,得答案,不敢独

享,分享如下:STM32串口通信中使用printf 发送数据配置方法(开发环境Keil RVMDK)在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);

}

// 接收数据

intGetKey (void) {

while (!(USART1->SR & USART_FLAG_RXNE));

return ((int)(USART1->DR & 0x1FF));

}

这样在使用printf 时就会调用自定义的fputc 函数,来发送字符。

3、在工程属性的“Target" -> "Code Generation" 选项中勾选"Use MicroLIB"”

MicroLIB 是缺省C 的备份库,关于它可以到网上查找详细资料。

至此完成配置,在工程中可以随意使用printf 向串口发送数据了。

二、第二种方法是在工程中添加“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  printf函数 引用地址:STM32的printf函数实现方法

上一篇:stm32通过i2c存储数据在eeprom
下一篇:STM32中晶振的原理与作用

推荐阅读最新更新时间:2024-03-16 15:39

Event Recoder调试组件在stm32上的使用
本文目标:Event_Recoder调试组件在stm32上的使用 按照本文的描述,应该可以在你所处的硬件上跑通代码。 先决条件:装有编译和集成的开发环境,比如:Keil uVision5。 板子硬件要求:无,属于调试功能。 起源 因为做产品开发,设计东西有时候考虑得多,mcu的并没有多余的串口供使用调试,在调试一些初期进行验证时,必要的调试的打印信息是需要的。 Event Recoder调试组件简介 嵌入式的Event_Recoder调试组件是一种可以在MDK开发环境下使用的高级调试工具,它可以记录软件运行的一些标志信息,并以图形化的形式显示出来。它可以帮助你了解和分析内部操作,支持Keil RTX操作系统调试以及MDK自带的
[单片机]
Event Recoder调试组件在<font color='red'>stm32</font>上的使用
STM32-(24):PWM基础
PWM是Pulse Width Modulation的缩写,即脉冲宽度调制。其通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。 PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制,用来对一个具体模拟信号的电平进行编码。等效的实现是基于采样定理中的一个重要的结论:冲量相等而形状不同的窄脉冲加在具有惯性的环节上时,其效果基本相同。冲量即指窄脉冲的面积。这里所说的效果基本相同,是指该环节的输出响应波形基本相同。 如把各输出波形用傅里叶变换分析,则它们的低频段特性非常接近,仅在高频段略有差异。 为了实现a的效果,可以通过b这种正弦波去模拟达到这种效果。(通过每一段的面积相同
[单片机]
STM32-(24):PWM基础
使用Keil MDK运行第一个STM32程序
1.1.1 使用Keil MDK运行第一个STM32F10X程序 在上一小节中已经详细介绍了使用Keil MDK和标准外设库创建一个工程的过程,下面将介绍基于这个工程来编写一个小程序,通过这个程序我们可以初步了解: STM32标准外设库的简单使用过程 STM32外设的使用方法和大致流程 程序的编译、链接、下载步骤 利用Keil MDK的在线仿真功能进行软件仿真的简要步骤 1. 程序的编写 (1)程序实现的功能 为了方便各位读者的入门和理解,这个小程序的功能非常简单,作为本书功能实践的第一个程序,其功能当然也是最为经典的“Hello World!”了,只不过不是简单的屏幕输出,而是利用硬件的串口进行输出,同时作为单
[单片机]
使用Keil MDK运行第一个<font color='red'>STM32</font>程序
ST的优化代码协助设计人员开发STM32 MCU
中国,2014年5月5日 ——意法半导体新推出的STM32Snippets提供高度优化且立即可用的寄存器级代码段,以最大限度地发挥STM32微控制器应用设计的性能和能效。 寄存器级编程虽然可降低内存占用率,节省宝贵的处理器时钟周期,降低电源电流消耗,但通常需要设计人员花费很多时间精力研究产品手册。精简高效的程序能够提高应用性能并使其达到功耗和成本预设目标,STM32Snippets为开发人员编写这样的程序提供了一条捷径。 STM32Snippets集成在最近发布的可简化产品初始化和代码移植的STM32Cube™软件工具和嵌入式软件内。利用这些工具和软件,开发人员可在高度可移植的STM32Cube™方法与高度优化的
[单片机]
ST的优化代码协助设计人员开发<font color='red'>STM32</font> MCU
STM32 USART出现乱码
USART使用串口助手调试时出现乱码的情况,一般都是波特率的问题,例如:向串口发送“hello world\r\n”,但是串口助手收到的数据却是这样: 于是我仔细检查代码中设置的波特率的大小,发现没错,也是设置为115200,但是串口助手上显示的还是乱码。我再仔细检查与USART相关的代码,包括UASRT初始化、中断、以及发送数据的类型。。。,很绝望,还是没有找出这个BUG! 以下是我的UASRT相关设置代码: void Uart1_Init(void) { //GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStr
[单片机]
STM32的中断系统
STM32具有十分强大的中断系统,将中断分为了两个类型:内核异常和外部中断。并将所有中断通过一个表编排起来,下面是stm32中断向量表的部分内容: 上图-3到6这个区域被标黑了,这个区域就是内核异常。内核异常不能够被打断,不能被设置优先级(也就是说优先级是凌驾于外部中断之上的)。常见的内核异常有以下几种:复位(reset),不可屏蔽中断(NMI),硬错误(Hardfault),其他的也可以在表上找到。 从第7个开始,后面所有的中断都是外部中断。外部中断是我们必须学习掌握的知识,包含线中断,定时器中断,IIC,SPI等所有的外设中断,可配置优先级。外部中断的优先级分为两种:抢占优先级和响应优先级。 什么是抢占优先级?
[单片机]
<font color='red'>STM32</font>的中断系统
STM32-FSMC-NANDFLASH
STM32 FSMC 支持两个NAND闪存块,支持硬件ECC并可检测多达8K字节数据 其地址映射如下图所示 图161 FSMC存储块 NAND和PC卡地址映射 表88 存储器映像和时序寄存器  对于NAND闪存存储器,通用和属性空间又可以在低256K字节部分划分为3个区(见表89) ● 数据区(通用/属性空间的前64K字节区域) ● 命令区(通用/属性空间的第2个64K字节区域) ● 地址区(通用/属性空间的第2个128K字节区域) 表89 NAND存储块选择 应用软件使用这3个区访问NAND闪存存储器: ● 发送命令到NAND闪存存储器:软件只需对命令区的任意一个地址写入命令即可。 ● 指定操作NAND
[单片机]
STM32-FSMC-NANDFLASH
使用ITM机制实现调试stm32单片机
使用ITM机制实现调试stm32单片机,实现printf与scanf。 1. ITM简介 ITM机制是一种调试机制,是新一代调试方式,在这之前,有一种比较出名的调试方式,称为半主机(semihosting)方式。 在pc上编写过C语言的人都知道,printf可以向控制台输出,scanf可以从控制台获取输入,这里的printf/scanf都是标准库函数,利用操作系统的这些函数,我们可以很方便的调试程序。在嵌入式设备上(如stm32单片机平台上)开发工具(如MDK/IAR)也都提供了标准库函,自然也提供了printf/scanf函数,那么这些函数是否可以使用呢? 问题来了,printf向哪里输出呢?并且大部分情况下,也没有键盘,又
[单片机]
使用ITM机制实现调试<font color='red'>stm32</font>单片机
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved