stm32_f103使用gcc编译的环境下printf打印函数的实现
前记
gcc编译使用的printf打印函数需要的底层函数是和其他编译器不同的,以前的是无法使用的,这里有两种方法,一种是使用gcc库里面的printf函数,自己实现底层IO函数_write。另外一种方法是自己定义 printf函数,这里给出两者实现方法及测试结果。
方法一
假如要使用gcc库里面的printf函数,这里使用底层编译函数是_read()和_write(). 这里的read和write函数需要在system.c自己实现的,具体的实现方法如下所示:
#include <errno.h>
#include <sys/unistd.h> // STDOUT_FILENO, STDERR_FILENO int _write(int file, char *data, int len)
{
if ((file != STDOUT_FILENO) && (file != STDERR_FILENO))
{
errno = EBADF;
return -;
} // arbitrary timeout 1000
HAL_StatusTypeDef status =
HAL_UART_Transmit(&huart1, (uint8_t*)data, len, ); // return # of bytes written - as best we can tell
return (status == HAL_OK ? len : );
}
方法二
其实,说白了只要找到串口写函数,还有另外一种巧妙的方法,就是自制printf函数,不使用库里面的,代码如下所示:
#include <stdio.h>
#include <stdarg.h>
#include <string.h> void vprint(const char *fmt, va_list argp)
{
char string[];
if( < vsprintf(string,fmt,argp)) // build string
{
HAL_UART_Transmit(&huart1, (uint8_t*)string, strlen(string), 0xffffff); // send message via UART
}
} void my_printf(const char *fmt, ...) // custom printf() function
{
va_list argp;
va_start(argp, fmt);
vprint(fmt, argp);
va_end(argp);
}
代码及运行结果
在代码中,这里分别给出两种方法的运行结果,如下所示:
// uart init
MX_DEBUG_USART_Init(); /* 锟斤拷锟接帮拷锟斤拷锟斤拷始锟斤拷 */
KEY_GPIO_Init(); printf("test is init !\n\r");
my_printf("test pressed my printf \n\r"); /* 锟斤拷锟斤拷循锟斤拷 */
while ()
{
if(KEY1_StateRead()==KEY_DOWN)
{
LED1_ON;
printf("key1 pressed!\n\r");
//my_printf("key1 pressed my printf \n\r");
}
if(KEY2_StateRead()==KEY_DOWN)
{
LED2_ON;
printf("key2 pressed!\n\r");
//my_printf("key2 pressed my printf \n\r"); }
if(KEY3_StateRead()==KEY_DOWN)
{
LED1_OFF;
LED2_OFF;
printf("key3 pressed!\n\r");
//my_printf("key3 pressed my printf \n\r"); }
}
运行结果:

参考目录
1 https://electronics.stackexchange.com/questions/206113/how-do-i-use-the-printf-function-on-stm32
2 https://www.openstm32.org/forumthread1055
stm32_f103使用gcc编译的环境下printf打印函数的实现的更多相关文章
- 痞子衡嵌入式:在MDK开发环境下将关键函数重定向到RAM中执行的几种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在MDK开发环境下将关键函数重定向到RAM中执行的几种方法. 这个关键函数重定向到 RAM 中执行系列文章,痞子衡已经写过 <IA ...
- .NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现
原文:.NET环境下有关打印页面设置.打印机设置.打印预览对话框的实现 我个人认为,开发MIS,首先就得解决网格的问题,而开发工具为我们提供了如DataGrid.MSHFlexGrid的控件.其次,是 ...
- 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...
- 痞子衡嵌入式:在IAR开发环境下RT-Thread工程函数重定向失效分析
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下RT-Thread工程函数重定向失效分析. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...
- UA判断打开页面的环境,然后在callBack写相应环境下的回调函数
这是js代码 /* * 2016.11.10 * SunJingxin * V 1.0.0 * */ (function(){ /* * 使用方法: * 一.引入ua.js * 二.直接调用 Mobi ...
- python在windows(双版本)及linux(源码编译)环境下安装
python下载 下载地址:https://www.python.org/downloads/ 可以下载需要的版本,这里选择2.7.12和3.6.2 下面第一个是linux版本,第二个是windows ...
- MySQL主从环境下存储过程,函数,触发器,事件的复制情况
下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...
- git在windows及linux(源码编译)环境下安装
git在windows下安装 下载地址:https://git-scm.com/ 默认安装即可 验证 git --version git在linux下安装 下载地址:https://mirrors.e ...
- linux下printf打印带颜色的字符串
转载:http://blog.chinaunix.net/uid-28917424-id-3889917.html 前不久就在某位同学的博客里看到,但是今天找了好久没找到,就直接google了,现贴出 ...
随机推荐
- put、patch与post区别
idempotent 幂等的 如果一个方法重复执行多次,产生的效果是一样的,那就是idempotent的: idempotent的意思是如果相同的操作再執行第二遍第三遍,結果還是一樣. POST方法 ...
- 忘记linux下的mysql密码,需要重新创建密码123456
你必须要有操作系统的root权限了. # mysqld_safe --skip-grant-tables & &,表示在后台运行,不再后台运行的话,就再打开一个终端咯. # mysql ...
- ETCD监控
Watch key changes Applications can watch on a key or a range of keys to monitor for any updates. Her ...
- Nexus-产品认识
传统的思科数据中心网络架构也包括如下层级结构: • 核心层(一般是Nexus 7K来充当) • 汇聚层(一般也是Nexus 7K充当,可能存在2台,或4台的设备) • 接入层(一般会 ...
- 收藏---wordpress搭建出来的blog
http://blog.luofei.org/2012/02/painters-and-paintings-through-the-eyes-of-faith/
- 关于Android发送邮件
Google 在发表 Android 手机平台时,强调的是超强大的网络支持能力,因此,无论通过 GPRS.3G的电信网络或者是Wifi的无线WLAN网络,都能够发EMAIL. 发送邮件中使用的Inte ...
- SpringBoot启动使用elasticsearch启动异常:Received message from unsupported version:[2.0.0] minimal compatible
SpringBoot启动使用elasticsearch启动异常:Received message from unsupported version:[2.0.0] minimal compatible ...
- redhat 7.6 流量监控命令、软件(3)nethogs 监控进程实时流量
1.解压nethogs tar -zxvpf nethogs_0.8.5.orig.tar.gz 2.直接make,这里报错,提示pcap.h,安装libpcap就可以了 3.如果已经安装,还是报错, ...
- selenium webdriver 小计
getText(),获得标签内文本 getAttribute("title")获得对应的html属性值
- SSH框架整合,启动Tomcat报错:Unable to load configuration
报错信息: 严重: Dispatcher initialization failed Unable to load configuration. - bean - file:/E:/MIKEY/mik ...