STM32使用printf函数的步骤和注意事项

这篇具有很好参考价值的文章主要介绍了STM32使用printf函数的步骤和注意事项。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第一种方法: 使用微库:

1,在KEIL中勾选 Use MicroLIB . 即使用微库.
STM32使用printf函数的步骤和注意事项
2, 在代码中添加 如下代码 (目的是为了调用stdio库中的print 函数)

 #include "stdio.h"  //支持print 一般添加到main.h中

3,在uart.c 填加如下代码 (目的是为了重定向 stdio库中的print 函数 )

//重定向print
int fputc(int ch, FILE *f)//printf
{
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET); //485发送使能端口 没有可去掉
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1,0xffff);  //发送一个字节的数据到你希望的串口
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET); //485发送使能端口 没有可去掉
	return (ch);
}

第二种方法: 不使用微库,使用标准C库,声明不使用半主机模式

1, 在代码中添加 如下代码 (目的是为了调用stdio库中的print 函数)

 #include "stdio.h"  //支持print 一般添加到main.h中

2, 关闭半主机模式,并重定向printf

#pragma import(__use_no_semihosting)//不使用半主机模式

//避免使用半主机模式
void _sys_exit(int x)
{
	x = x;
}
//标准库需要支持的函数
struct __FILE
{
	int handle;
};
FILE __stdout;

//重定向print
int fputc(int ch, FILE *f)//printf
{
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET); //485发送使能端口 没有可去掉
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1,0xffff);  //发送一个字节的数据到你希望的串口
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET); //485发送使能端口 没有可去掉
	return (ch);
}

解释:

想要明白为什么会有使用微库和不使用微库这两种方案,需要先搞明白一个概念 半主机模式

半主机模式概念:
半主机是用于 ARM 目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机。 例如,使用此机制可以启用 C 库中的函数,如 printf() 和 scanf(),来使用主机的屏幕和键盘,而不是在目标系统上配备屏幕和键盘。
这种机制很有用,因为开发时使用的硬件通常没有最终系统的所有输入和输出设备。 半主机可让主机来提供这些设备。
简单来说: 半主机模式就是 比如我们的开发板没有 键盘和屏幕 ,但是,使用半主机模式后,我们就可以利用仿真器或其他连接到电脑(主机),使用电脑(即主机)的屏幕和键盘通过printf() 和 scanf() 来与开发板交互。
这种方式常用于调试。

单片机想要使用printf() 和 scanf() 函数遇到的问题

单片机使用 printf() 和 scanf() 函数时 ,只是希望通过自身硬件带有的串口,打印或接收数据。所以此时的单片机并不是工作在半主机模式的。
而我们通常使用的C库 中 printf() 和 scanf() 函数 是需要工作在半主机模式,通过主机的屏幕和键盘才可以使用的。

我们是如何解决的
可以看到 想要解决单片机使用 C库 中 printf() 和 scanf() 函数,首先要解决的一个问题就是要让单片机在使用printf() 和 scanf() 函数 不要工作在半主机模式。

方案1在KEIL中勾选 Use MicroLIB . 即使用微库. (因为微库是一个压缩库,而微库中的printf() 和 scanf() 函数 就不是工作在半主机模式下的)想要了解微库和标准C库区别的朋友可自行百度,这里不在叙述。

方案2继续使用标准的C库,在代码中声明不使用半主机模式.

解决完半主机模式的问题之后,我们还要对printf() 和 scanf() 函数进行重写 (重定向),因为不管是标准的C库还是微库中printf() 和 scanf() 函数,都是不能直接通过串口进行输入输出的。(况且开发库的人也不知道你的单片机有没有串口),所以需要我们进行重写底层库函数,当我们使用 printf() 和 scanf() 函数时 直接调用我们单片机中的串口发送或接收函数即可。

说明 : 因为单片机一般都是为了打印输出调试数据,很少使用接收数据,所以这里并没有 在代码中给出 scanf() 函数重写的方法, 但原理都是一样的。

最后思考:

其实我们使用printf() 函数目的就是为了通过串口数据打印输出我们想要的调试信息,而这些调试信息大多是汉字或各种字符串, 而通常我们的串口函数 都是只支持 int 型数据。 如果我们的串口函数也能支持 汉字,即支持字符串的编解码, 那同样我们也可以直接通过 串口函数进行 调试信息的收发了。 也就没有必要去使用printf() 函数了。

但是,轮子已经有了,我们只要稍加改造即可使用。 就没有必要再去造轮子了文章来源地址https://www.toymoban.com/news/detail-402871.html

到了这里,关于STM32使用printf函数的步骤和注意事项的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32H723配置以太网+Freertos注意事项

    由于STM32H743涨价到300元以上,项目换用了Pin2Pin替换的STM32H723,看上去cpu运行速度快了20%达到550Mhz。 但是内存布局存在很大不一样,而且ST官方代码库升级迭代快,要手动修改地方每个版本不一样,在有H743的经验下,花了2天时间搞好了记录一下。很多信息来源于英文ST支持论

    2023年04月18日
    浏览(39)
  • STM32cubeMX配置工程(全过程+修改MCU方法+注意事项)

    1.修改默认的固件包下载路径,避免占用C盘空间 2、选择ACCESS TO MCU 3、在跳出的界面中的Part Number中搜索对应的芯片型号 4、选好后在右下角双击对应的芯片,然后跳出配置界面 左边可以配置外设,右边可以配置每个IO口的功能 System Core包括GPIO、RCC时钟、看门狗、DMA等系统外设

    2024年02月17日
    浏览(58)
  • STM32:利用PWM波控制飞盈电调过程和注意事项

    在进行模型控制的过程中,如四旋翼无人机等,需要用到电机,这些电机需要通过电调来控制电机的转速。在电调模块中带有的说明书一般都是利用遥控器进行控制,有些情况需要自己通过信号控制电调,而非遥控器,这个时候需要用到单片机生成PWM波。 电调的型号和种类繁

    2024年02月16日
    浏览(37)
  • 使用 Netty 实现群聊功能的步骤和注意事项

    通过之前的文章介绍,我们可以深刻认识到Netty在网络编程领域的卓越表现和强大实力。这篇文章将介绍如何利用 Netty 框架开发一个 WebSocket 服务端,从而实现一个简单的在线聊天功能。 文章中所提供的代码仅供参考,旨在帮助无 Netty 经验的开发人员快速上手。 请注意,这

    2024年02月10日
    浏览(49)
  • 基于Clion的STM32开发环境搭建及注意事项(现阶段最便捷可靠)

    STM32的使用的比较多的IDE是MDK,其拥有强大的调试功能,但由于MDK的代码补全功能及其难用,以及调试功能全英文界面入门门槛较高,先推荐一套无比好用的STM32开发环境——Clion。基于Clion强大的代码补全、各种多样化的功能、插件以及调试功能,可以让开发者在开发STM32的过

    2024年02月10日
    浏览(45)
  • (五)【Jmeter】使用代理录制HTTP脚本操作步骤及注意事项

    前置信息 软件 版本 Jmeter 5.6.3 服务 网址 备注 drupal http://192.168.88.88:18080/ (二)【Jmeter】专栏实战项目靶场drupal部署 用户名 密码 test1 test1 test2 test2 实操记录 1、启动jmeter,操作顺序见下图 2、在视图面板添加如下信息,点击 开始

    2024年02月19日
    浏览(54)
  • 【STM32备忘录】【STM32WB系列的BLE低功耗蓝牙】一、测试广播配置搜不到信号的注意事项

    WB系列是双核单片机,用户写M4,无线协议栈使用M0 新买到手的单片机,需要自己刷入使用的无线协议栈 刷入无线协议栈的途径是通过一个叫FUS的东东,类似于bootloader,这个FUS新买的芯片通常已经刷好,但版本不一定是最新的(如果没有需要自己刷入) 刷入FUS和无线协议栈需要

    2024年03月16日
    浏览(57)
  • STM32F103C8T6---定时器1&定时器8输出PWM信号注意事项

    博主今天在驱动定时器1的通道1输出PWM信号的时候,遇到了好多问题,在这里指出,警醒自己的同时希望能给各位带来帮助 首先,第一个错误, 第一:PA8引脚默认模式就是定时器1的通道一,我们在代码里面,直接 将PA8的输出模式改为复用推挽输出,不要去重定向它,也不要

    2024年02月16日
    浏览(46)
  • android studio 使用MQTT协议连接onenet 注意事项和相关函数

    一、注意事项: 1.添加依赖: 2.在注册表允许打开网络 3.在application     /application之间添加用于支持 MQTT(Message Queuing Telemetry Transport)通信协议的 Eclipse Paho Android 服务。 4.打开项目中的 gradle.properties 文件,并确保以下属性设置为true------更新所有的支持库到AndroidX中。 二、

    2024年04月26日
    浏览(48)
  • 一篇博客学会系列(1) —— C语言中所有字符串函数以及内存函数的使用和注意事项

    目录 1、求字符串长度函数 1.1、strlen 2、字符串拷贝(cpy)、拼接(cat)、比较(cmp)函数 2.1、长度不受限制的字符串函数 2.1.1、strcpy 2.1.2、strcat 2.1.3、strcmp 2.2、长度受限制的字符串函数 2.2.1、strncpy 2.2.2、strncat 2.2.3、strncmp 3、字符串查找函数 3.1、strstr 3.2、strtok 4、错误信息报告函数

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包