当前位置:网站首页>STM32 printf问题总结 semihosting microLIB理解
STM32 printf问题总结 semihosting microLIB理解
2022-07-29 05:23:00 【BobBobBao】
STM32使用printf问题总结
背景:使用STM32F4开发板串口时,想用c语言自带的printf函数把字符串输出到串口调试助手。
- 首先需要重定义fputc()、fgetc()函数
///重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口DEBUG_USART */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
return (ch);
}
///重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
int ch;
HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);
return (ch);
}
勾选options for Target–>Target–>Use MicroLIB,使用MicroLIB库。
-microLIB 是标准C库的一个备选库,用于极少内存的嵌入式硬件中。
-microLIB不支持标准库
-主要完成以下工作:
-创建一个可执行C程序的环境:创建一个堆栈、创建一个堆(如果需要)、初始化程序用到的库
-调用main()开始执行半主机(semi-hosting):它是一种机制,使得运行在ARM目标机上的代码能够通信,并使用运行了调试器的主机上的Input/Output工具
-开发初期,开发者可能根本不知道该ARM器件上有什么输入输出设备,而半主机机制使得开发者不用知道ARM器件的外设,利用主机电脑的外设就可以实现输入输出调试。
-如果要使用ARM器件上的输入、输出设备,首先要关闭semihosting。然后再将输入输出重定向到ARM器件上。

-microLIB 编译时通过Low-Level Functions与硬件连接,采用删减版high-level functions,没用system I/O functions。如果不使用microLIB库,而使用标准库(默认使用semihosting),调用printf()之类的函数,会导致死机。解决方法:
-在程序中添加编译设置,不使用semihosting
//C语言中
#pragma import(__use_no_semihosting_swi)
//汇编语言中
IMPORT __use_no_semihosting_swi
参考:
边栏推荐
猜你喜欢
随机推荐
兼容cc1101/cmt2300-DP4301 SUB-1G 无线收发芯片
Hal library learning notes-12 SPI
1、 Transmission of file stream on Web page
Hal library learning notes - 8 use of serial communication
Beijing Baode & taocloud jointly build the road of information innovation
HAL库学习笔记- 8 串口通信之概念
Improve quality with intelligence financial imaging platform solution
HAL学习笔记 - 7 定时器之高级定时器
Pytorch Basics (Introductory)
三、如何搞自定义数据集?
一、PyTorch Cookbook(常用代码合集)
Tf.get in tensorflow_ Detailed explanation of variable() function
2、 During OCR training, txt files and picture data are converted to LMDB file format
CS4344国产替代DP4344 192K 双通道 24 位 DA 转换器
扬尘噪声监控系统
智能温度控制系统
Power Bi report server custom authentication
入门到入魂:单片机如何利用TB6600高精度控制步进电机(42/57)
SimpleFOC调参1-力矩控制
物联网倾斜监测解决方案









