关于STM32串口printf输出调试信息问题

发布者:不羁少年最新更新时间:2019-01-17 来源: eefocus关键字:STM32  串口  printf输出  调试信息 手机看文章 扫描二维码
随时随地手机看文章

1,遇到的问题(使用HAL库)


在STM32使用过程中,我们程序调试时一般都会用到printf重定向串口输出调试信息来进行程序开发调试,从网上我们找到了重定向的代码部分加入到串口代码文件中,如下:


UART_HandleTypeDef husart_printf;


#ifdef __GNUC__  

/* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf  

set to 'Yes') calls __io_putchar() */  

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)  

#else  

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)  

#endif /* __GNUC__ */  


PUTCHAR_PROTOTYPE

{

  /* Place your implementation of fputc here */

  /* e.g. write a character to the USART2 and Loop until the end of transmission */

    HAL_UART_Transmit(&husart_printf, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;

}


程序编辑好,本以为可以直接打印出消息从串口输出,但是程序下进去并未打印出任何信息到串口,这就奇怪了,难道是上面重定向部分不对吗?


2,找到问题 


在网上又搜索,发现半主机模式这样一个模式。半主机是这么一种机制,它使得在ARM目标上跑的代码,如果主机电脑运行了调试/仿真器,那么该代码可以使用该主机电脑的输入输出设备,即直接可以使用主机电脑的外设实现输入输出调试,并不是使用ARM目标器件的外设输入输出设备。简单来说就是,半主机需要依靠仿真器才可输入输出调试信息。而我们是使用单片机的串口外设,即不使用仿真器,那么我们就必须禁用半主机模式。


3,解决问题


通过上面的了解,我们知道像printf()这类函数是使用了半主机模式,我们现在只需不在半主机模式下使用printf就可以解决问题了。


解决方法1: 


使用微库MicroLIB,MicroLIB是一个C99标准库的微缩版,简称微库,使用微库则不会使用半主机模式故可正常运行并打印调试信息。在使用keil5编程时,配置上勾选Use MicroLIB即可,关于MicroLIB详细信息可以自行搜索。


解决方法2: 


使用标准库,但是禁用半主机模式,如何实现,只需在主程序后添加如下代码即可:


#pragma import(__use_no_semihosting) 

int _sys_exit(int x) 

    x = x; 

struct __FILE 

int handle; 

/* Whatever you require here. If the only file you are using is */ 

/* standard output using printf() for debugging, no file handling */ 

/* is required. */ 

}; 

/* FILE is typedef’ d in stdio.h. */ 

FILE __stdout;


__use_no_semihosting_swi,即不使用半主机模式, 


因程序中并没有对这些函数的底层实现,使得设备运行时会进入软件中断BAEB处,这时就需要__use_no_semihosting_swi这 个声明,使程序遇到这些文件操作函数时不停在此中断处.

关键字:STM32  串口  printf输出  调试信息 引用地址:关于STM32串口printf输出调试信息问题

上一篇:STM32启动文件详细解析
下一篇:关于在stm32中使用printf函数的问题

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

stm32 swd接口定义
有时会有人问起STM32所支持的调试接口有哪些,下面的第一副图是个汇总表。该表按照内核所属对各STM32系列分别做了介绍,里面还包括了各系列芯片所支持的硬件断点数、MCO输出脚【时钟输出脚个数】等。其中ETM接口要结合具体芯片的封装来看,一些小封装芯片可能不支持ETM调试跟踪。 闲话少说,看图说话。 上面几幅图中除了第一幅图表外,其它均为第一幅图提供辅助说明,更多细节需查看相关技术手册。比方MCO输出功能怎么用,SWO怎么操作还需进一步查看相应技术文档。
[单片机]
<font color='red'>stm32</font> swd接口定义
STM32】HAL库-RTC实时时钟
简介 实时时钟是一个独立的定时器 RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变 系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问: 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问。 时钟源 通过设置备份域控制寄存器(RCC_BDCR)里的RTCSEL 位,RTCCLK时钟源可以由HSE/128、LSE或LSI时钟提供。 除非备份域复位,此选择不能被改变。
[单片机]
【<font color='red'>STM32</font>】HAL库-RTC实时时钟
stm32读写nrf24l01复位不通过的问题
通过网上查阅搜索发现,这个问题在别人那里还真出现过。 使用nrf24l01时,按开发板上的复位键,无线模块无法复位,即初始化不成功,但重新上电后,此现象消失,不知道什么情况造成的的, 后来网友建议 这么写 nRF24L01_Write_register(0x00,0x00); delay_ms(100); nRF24L01_Write_register(0x01,0x01); //通道0 自动应答允许 nRF24L01_Write_register(0x02,0x01); //通道0 接收允许 nRF24L01_Write_register(0x03,0x03); //地址宽度为5字节 nRF2
[单片机]
STM32开发板入门教程 - 内部温度传感器
废话少说 先看看他的参数 1. STM32内部温度传感器与ADC的通道16相连,与ADC配合使用实现温度测量; 2. 测量范围 40~125℃,精度 1.5℃。 3. 温度传感器产生一个随温度线性变化的电压,转换范围在2V VDDA 3.6V之间。 转换公式如下图所示: 呵呵 其实 写代码的时候 公式直接简化就得啦 如果测量要求不怎么高的话 呵呵(其实高也高不了 呵呵) 我们都喜欢简单 简单明了 嘿嘿 简化的公式: vu16 Temperature= (1.42 - ADC_Value*3.3/4096)*1000/4.35 + 25; 呵呵 重
[单片机]
<font color='red'>STM32</font>开发板入门教程 - 内部温度传感器
STM32使用systick实现精确延时
SYSTICK寄存器初始化 void SysTick_Configuration(void) { if (SysTick_Config(SystemCoreClock / 100)) { while (1); } NVIC_SetPriority(SysTick_IRQn, 0x0); } SysTick_Config默认时钟为SysTick_CLKSource_HCLK,所以在这之前使用SysTick_CLKSourceConfig()选择系统时钟不会改变systick的时钟 static __INLINE uint32_t SysTick_Config(uin
[单片机]
STM32外部中断和IWDG
实验平台:正点原子战舰开发板 系统:windows 7 64位 编译器:MDK 4.72a 参考例程:ATK串口例程,野火ISO串口例程 外部中断 中断主要分为两种: 1、系统异常中断也可以说的内核异常,这类异常中断有些是不可以控制的,如RESET,NMI,FAULT. 2、外部中断,这些中断都是可以设置的,每个GPIO都可以被设置为中断。 一、NVIC控制器 当要使用中断时候都要对NVIC进行设置 void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct); NVIC_IRQChannel 需要配置的中断线 NVIC_IRQChannelCmd 使能或关闭相应中断向量的
[单片机]
NRF24L01无线串口开发板程序详解
1.源程序开发环境建立 1.1程序编译软件 编译软件用keil C51,打开安装文件,一路点击下一步即可完成。 1.2程序下载软件 使用STC ISP下载软件。 2.源程序文件整体结构 工程中,只有一个main.c文件,所有程序都写在这个文件里面。Reg51.h是包含的头文件。是不是非常简单! 3.源程序执行流程 无线数据处理程序: 串口数据处理程序: 4.串口配置函数 void serial_open(void) { SCON = 0X50; AUXR |= 0X04; TL2 = 0Xc0; // 9600 TH2 = 0Xfd; AUXR|=0X10; } 此串口配置函数,利用单片机内部
[单片机]
NRF24L01无线<font color='red'>串口</font>开发板程序详解
STM32设计的儿童老人GPS防丢定位手环
一、环境介绍 MCU:STM32F103C8T6 GSM模块:GA6--果云 开发软件:Keil5 二、GA6-GSM模块介绍与调试 说明: GA6-B模块供电必须5V,采用电脑USB供电可能不稳定(没有5V,只有4.8V左右),导致模块使用不稳定,发送AT指令没有反应,调试阶段,可将开发板的USB线连接充电宝或者手机充电插头取电。 2.1 GA6-B模块概述 GA6-B 模组: 1. GA6 尺寸 22.8mm x 16.8mm x 2.2 mm; 2. 正常工作温度:-30°C ~ +80°C, 3. 受限工作温度:-40°C ~ -30°C 及+80°C ~+85°C* 4. 工作电压 3.5V-4.2V; 5. 开
[单片机]
<font color='red'>STM32</font>设计的儿童老人GPS防丢定位手环
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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