该方法适用于STM32,实现了使用printf等标准C流函数输出数据的办法,极大的减少了输出串口数据时所需要做的数据处理。
实现原理
在C库中,printf()等输出流函数都是通过fputc()这个函数实现的,所以我们通过重映射的方式,修改这个函数的定义使它输出在STM32的寄存器中,便可以实现使用printf()函数在STM32串口上输出数据的功能。
Keil环境 重映射
在STM32的Keil开发环境中,C的库函数有两种实现方式
使用标准的C函数库
就是我们平常在PC Window平台上用的C库函数,此库的的优点在于实现的功能全面。但是由于这个库基本上是专为PC设计的,故而如果在嵌入式芯片中调用时将会使得工程文件变得十分庞大。
将下列代码加入工程,无需使用#include调用即可生效。
/*
* libc_printf.c
*
* Created on: Dec 26, 2015
* Author: Yang
*
* 使用标准C库时,重映射printf等输出函数的文件
* 添加在工程内即可生效(切勿选择semihost功能)
*/
#include
//include "stm32f10x.h"
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重映射fputc函数,此函数为多个输出函数的基础函数
int fputc(int ch, FILE *f)
{
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
USART_SendData(USART1, (uint8_t) ch);
return ch;
}
MicroLib is a highly-optimized library for ARM-based embedded applications written in C. When compared to the standard C library included with the ARM Compiler toolchain, MicroLib provides significant code size advantages required for many embedded systems. |
摘自Keil官网介绍 <http://www.keil.com/arm/microlib.asp>
基本就是说:Microlib 是缺省 C 库的备选库。 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用。 这些应用程序不在操作系统中运行。microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,例如,memcpy()。
同样的将下列代码加入工程,并在Keil设置中勾选Use MicroLib
/*
* microlib_printf.c
*
* Created on: Dec 26, 2015
* Author: Yang
*
* keil工程内勾选使用microlib时,重映射printf等输出函数的文件
* 添加在工程内即可生效(注意:仅在使用microlib有效)
*/
#ifdef UART_PRINT
#include
//include "stm32f10x.h"
//重映射fputc函数,此函数为多个输出函数的基础函数
int fputc(int ch, FILE *f)
{
// while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //修改此处的while循环条件
// USART_SendData(USART1, (uint8_t) ch); //与寄存器,以修改输出端口
return ch;
}
//输入函数,如上
int GetKey (void)
{
// while (!(USART1->SR & USART_FLAG_RXNE)); //如上
// return ((int)(USART1->DR & 0x1FF));
}
#endif
在GCC开源开发环境中,则可以调用nano_printf.c 等多种方式重映流函数输出端口
关键字:STM32 printf打印 串口数据
引用地址:
STM32中使用printf打印串口数据
推荐阅读最新更新时间:2024-03-16 16:05
STM32学习笔记——PWM基础知识与720电机驱动
1. 定义 脉冲宽度调制:是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。(百度百科)它是一种对模拟信号电平进行数字编码的方法,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。 **SPWM波形:**脉冲宽度按正弦规律变化而和正弦波等效的 PWM 波形。 把正弦半波波形分成N等份,就可把正弦半波看成由N个彼此相连的脉冲所组成的波形。如果把上述脉冲序列用同样数量的等幅而不等宽的矩形脉冲序列代替,使矩形脉冲的中点和相应正弦等分的中点重合,且使矩形脉冲和相应正弦部分面积(即冲量)相等,就得到一组脉冲序列,这就是PWM波形。根据冲量
[单片机]
STM32 IAP的使用关键点
所谓IAP其实就相当于一个小小的bootloader 用来更新程序的 很多产品基本都是程序做好后就直接在产线烧录一次就OK了,但是,但是BUG有时候是无可避免的,经常有产品装好后又要重新拆外壳 取下板子重新上烧录架烧的惨痛经历,所以,这种情况下IAP就很有必要了,只要一个对外的接口就能在线更新了,常用的是USB口,当然要是一定要用串口的话也是可以的 硬件上麻烦一些而已,下面就是例程 typedefvoid(*pFunction)(void); pFunctionJump_To_Application; unsignedlongJumpAddress; if(!Check_Whether_Enter_UpdateMode())/
[单片机]
STM32开启ADC转换
ADON,第一次设置的时候,可以唤醒ADC。 第二次设置ADON,即可执行ADC转换。 所以 对于开启ADC转换,有两种方法:1,可以通过设置ADON开启;2,通过其他触发条件。
[单片机]
基于STM32的GSM短信报警系统的设计与实现
引言 随着我国经济建设的迅速发展和人民群众生活水平的极大提高,人们越来越注重自身所处的环境是否安全。特别是当家中无人或者仅有老人孩子时,家庭成员的生命和财产的安全性越来越受到重视。因此,家庭防盗已成为一个重要的社会问题。目前,许多住宅小区的安防主要依靠传统的机械式(防盗网、防盗窗)防盗系统。这样不仅有碍美观,不符合火灾逃生的要求,而且不能有效地防止坏人的侵入。随着电子技术的飞速发展,防盗报警系统已迫切从原来的简单化、局部化向智能化、集成化发展。当前,GSM短信息服务已作为GSM网络的一种基本业务,基于GSM短信模块与单片机相连接应用于家庭无线防盗报警系统中,让家庭防盗更及时、更方便,以最直观的中文短消息形式,直接把案发地点的情况
[单片机]
STM32值SPI的使用及SPI初始化注意事项
在STM32F10x系列芯片中,虽然所拥有的SPI同步串口数量不相同,但是初始化的方法都是一样的。其中使用SPI时候我们回忆GPIO的使用,要注意6点,我们这里主要讲解一点。 根据系统对该不同功能的要求,初始化不同功能外设,初始化GPIO,初始化SPI同步串口设备就会比较复杂。STM32F10x系列芯片的所有SIP同步串口都是和GPIO共用,SPI的初始化分为2大块,就是SPI所使用的I/O口的初始化和SPI功能的初始化。对于SPI同步串口要用到的引脚,根据数据的方向,要设置GPIO_Mode_IN_FLOATING或者GPIO_Mode_AF_PP复用推免输出。其他的和GPIO引脚设置一样。 至于低于SPI同步串口参数的初始化方
[单片机]
基于STM32的GPS模块驱动(AIR530)
一、概述 由于做项目要用到GPS定位,于是在某宝购买了这款GPS模块。项目采用的MCU是STM32。废话少说,进入正题。 二、GPS模块简介 Air530 模块是一款高性能、高集成度的多模卫星定位导航模块。体积小、功耗低,可用于车载导 航、智能穿戴、无人机等 GNSS 定位的应用中。而且提供了和其他模块厂商兼容的软、硬件接口,大幅 减少了用户的开发周期。 模块支持GPS/Beidou/GLONASS/Galileo/QZSS/SBAS。采用了射频基带一体化设计,集成了 DC/DC、 LDO、 LNA、射频前端、基带处理、32 位 RISC CPU、RAM、FLASH 存储、RTC 和电源管理等功能。提供 超高的性能,即使在弱信
[单片机]
基于STM32步进电机多细分控制的设计
本文主要介绍了一种基于STM32的混合式步进电机控制方案,STM32产生PWM(脉宽调制信号),利用PWM完成DAC转换,通过PWMDAC的输出电压实现对步进电机的多细分控制。该设计相比利用DAC数模转换芯片的设计方案具有电路简单,费效比高的优点,而且可实现步进电机十六分之一步的驱动控制,精度较高。 1、硬件设计 硬件设计框图如图1所示,主要由PC上位机给STM32F103发送控制命令,通过STM32F103控制A3988,从而驱动两个步进电机转动。其中,STM32F103是意法半导体公司生产的基于ARMCortex—M3内核的微控制器,内核架构先进,性能优越,主频可达72MHz,执行效率高,具有较高的运算能力及数据处理功能,
[单片机]
基于STM32的实时心率检测仪设计
一、开发环境介绍 主控芯片: STM32F103ZET6 代码编程软件: keil5 心率检测模块: PulseSensor WIFI模块: ESP8266 --可选的。直接使用串口有线传输给上位机也可以。 上位机: C++(QT) 设计的。 支持PC机电脑、Android手机显示。 与上位机的传输协议: 支持串口传输、WIFI网络传输两种。 如果是PC就可以直接连接串口传输数据,如果不方便可以直接通过WIFI---TCP协议传输。 二、PulseSensor心率模块介绍 PulseSensor 是一款用于脉搏心率测量的光电反射式模拟传感器。 可以将其佩戴于手指、耳垂、手腕等处,通过杜邦线--导线将引脚连接到单片机,可将采集到
[单片机]