历史上的今天
今天是:2025年01月17日(星期五)
2019年01月17日 | 关于STM32串口printf输出调试信息问题
2019-01-17 来源:eefocus
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启动文件详细解析
史海拾趣
|
今天帮公司筛选简历,感受颇多!我所在的是一家大型企业。从收到的简历数量可以看出来 1200+份简历,从中选出150+份进行笔试。 比例:8选1 机缘凑巧去帮老总们筛选简历,感受颇多。 觉得有必要跟还在找工作的师弟师妹们说说一些需要注 ...… 查看全部问答> |
|
我是第一次作这方面的东西: 我感觉:首先要判断次外设的存在(包括他的插入于拔除) 向外设发送控制命令(包括向他提供数据)。 不知道思路是不是有问题,请各位给个思路。 … 查看全部问答> |
|
8MB SPI FlashIC卡读卡控制芯片和卡座由于成本控制原因,199元销售的板子里不包含上述模块,对于此消息发布较晚,给部分网友造成了误解,我们深表歉意,希望大家能够继续给我们指正,谢谢!… 查看全部问答> |
|
C5000音频电容触摸套件套件具体指标如下:MP3 Encode & DecodeSD Card File SystemUSB Mass Storage ClassOLED, CodecUART client interface可使用该套件配合launchpad制作音乐播放器:MP3 PlayerVoice RecorderFire Alarm – MSP430 detects tem ...… 查看全部问答> |
|
MSP430F149的定时器A的连续计数模式的CCR0的作用?增计数模式是从0增加到CCR0就复位,增减计数模式是从0增加到CCR0,在减到0。可是连续计数模式呢?CCR0的作用?… 查看全部问答> |
|
大学堂新课上线:《 CC1120 Sub1G 开发套件动手实践》 大学堂有新课程上线啦! 《 CC1120 Sub1G 开发套件动手实践》:https://www.eeworld.com.cn/training/2014/wuxian_0117/382.html 该视频系列基于芯威科技CC1120开发套件,演示了如何使用SmartRF控制软件实现简单的数据包收发,如何理解和 ...… 查看全部问答> |
|
本帖最后由 shower.xu 于 2014-1-24 11:03 编辑 港版ipad mini2 16G,2300未拆封,包邮顺丰。支付宝交易。 … 查看全部问答> |
|
本帖最后由 人民币的幻想 于 2015-11-24 10:36 编辑 视频里演示测量心率时,使用手腕部分更能快速得到准确值。因此,后期考虑将心率做成手表形式。 … 查看全部问答> |
|
1.安装ccs5.3,下载破解序列号,复制到C:\\ti\\ccsv5\\ccs_base\\DebugServer\\license下 2.我使用的是合众达的560plus仿真器,去其官网下载ccs4.1的驱动,兼容ccs5,安装路径一定要设置在C:\\ti\\ccsv5\\ccs_base否则无法识别其仿真器(我一开始 ...… 查看全部问答> |




