历史上的今天
返回首页

历史上的今天

今天是:2025年08月13日(星期三)

正在发生

2021年08月13日 | STM32中重定义printf函数

2021-08-13 来源:eefocus

标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数.


例如:printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下:

 #ifdef __GNUC__ 

 #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) 

 #else 

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

 #endif  

   

 PUTCHAR_PROTOTYPE

  { 

       USART_SendData(USART1, (uint8_t) ch); 

       while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

       return ch; 

  }


因printf()之类的函数,使用了半主机模式。使用标准库会导致程序无法运行, 以下是解决方法: 


方法1.使用微库,因为使用微库的话,不会使用半主机模式.

f20b83b9636945b032825648fc31f9c6.jpg?imageView2/2/w/550

方法2.仍然使用标准库,在主程序添加下面代码: 

#pragma import(__use_no_semihosting)  

_sys_exit(int x)  {  x = x;  } 

 struct __FILE  {  

int handle;  

};  

FILE __stdout; 

另一个高手的讲解 刚开始学stm32,顺着gpio、uart。。。的顺序慢慢爬 初始化的方法学习了马老师的STM32_Init.h****,自己英文还可以,加上avr的基础还不错,所以gpio和时钟配置都很顺利 碰到uart就头大了,看到各种例程里都是printf()函数,自己也想用,毕竟是avr想用却开销不了的东西。但是我自己写的程序里一旦出现printf,单片机的不干活了。查论坛首先发现要重定义fputc函数,照做了,还是不行。 后来怀疑是uart1初始化问题,用自己写的put_c函数却没问题。 后来又发现一种说法,需要避免使用semihosting(半主机模式),我也把代码加进去了(改fputc去掉了),还是不行。 再一想,重定义fputc是绝对必须的,加上了之后问题解决,成功使用printf("(敏感词0373) n");输出了,哈哈 *************************************************************************************************** 

以上废话,可以不看。 简单地说:想在mdk 3.80a中用printf,需要同时重定义fputc函数和避免使用semihosting(半主机模式),  论坛里应该有完整介绍这个的帖子,但是我没搜到,也许是沉了。重发出来希望能帮上像我这样的菜鸟们。 需要添加以下代码 #pragma import(__use_no_semihosting)  /****************************************************************************** 

*标准库需要的支持函数

  ******************************************************************************/ 

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;  ///

  /// 定义_sys_exit()以避免使用半主机模式  ///

  ///  ///  

_sys_exit(int x) 

    x = x; 

int fputc(int ch, FILE *f)

{    

//USART_SendData(USART1, (u8) ch);  

  USART1->DR = (u8) ch;          /* Loop until the end of transmission */    

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)  

  {  

  }

    return ch;

}


推荐阅读

史海拾趣

Cedrat Technologies公司的发展小趣事

海洋勘探、水下通信和声学测量等领域对精准探测和数据采集有着极高的要求。Cedrat Technologies凭借其高性能压电陶瓷传感器技术,成功开发出用于声纳阵列系统的探测和成像设备。这些设备能够精确接收和分析水下环境中的声波,实现目标探测和数据采集。这一创新应用不仅拓展了电子行业的应用范围,也为海洋科学研究和工程实践提供了有力的技术支持。

DAESAN公司的发展小趣事

随着全球化进程的加速,DAESAN公司开始将目光投向国际市场。他们制定了详细的国际化战略,积极拓展海外市场。通过与国外企业的合作和交流,DAESAN公司逐渐建立起全球化的生产和销售网络。他们的产品不仅畅销亚洲市场,还成功打入欧美等发达国家市场。国际化战略的实施,使DAESAN公司的品牌知名度和影响力得到了显著提升。

Fairchild (ON Semiconductor)公司的发展小趣事

1957年,被誉为“八叛逆”的八位年轻科学家在罗伯特·诺伊斯的带领下,离开了肖克利半导体实验室,创立了Fairchild Semiconductor公司。这八位科学家,包括诺伊斯、戈登·摩尔等人,后来都成为了硅谷科技产业的领军人物。Fairchild的成立不仅为硅谷的发展奠定了坚实的基础,更为电子行业培养了大量的人才,被誉为“人才摇篮”。

Amphion Semiconductor Ltd公司的发展小趣事

随着技术的不断进步和市场的不断扩大,Fairchild Semiconductor开始将目光投向全球市场。公司积极开拓海外市场,与全球各地的企业建立合作关系,共同推动半导体技术的发展。通过不断努力,Fairchild逐渐在全球半导体市场中占据了重要地位。

Everbuild公司的发展小趣事

为了进一步扩大市场份额,Everbuild开始积极拓展国际市场。公司派遣专业的团队参加国际电子产品展览会,与国际知名厂商进行技术交流和合作。同时,Everbuild还针对不同国家和地区的市场需求,推出了定制化的电子产品解决方案。这些努力使Everbuild的产品逐渐进入国际市场,并赢得了越来越多客户的信任和支持。

Aavid Niagra公司的发展小趣事

近年来,电子行业正经历着深刻的变革,新兴技术的不断涌现对传统散热技术提出了严峻挑战。Aavid Niagra公司面对这一变革,积极调整战略方向,加大在新兴技术领域的研究力度。通过与高校、研究机构的合作,公司成功研发出了一系列适应新兴技术需求的散热产品,成功应对了行业变革带来的挑战。

问答坊 | AI 解惑

线性调频脉冲串制式合成孔径雷达实时成像

摘要介绍了线性调频( L,FM)脉冲串制式合成孔径雷达(SAR)提高距离向分辨率原理,并且提出线性调频SAR的信号处理算法和步骤,避免了为提高距离向分辨率而加大系统带宽的问题。通过模拟验证了算法的正确性,并分析了计算量。设计了相应的SAR实时成像处 ...…

查看全部问答>

信号完整性和印制电路版 (美) Douglas Brooks

呵呵,没钱了,买点珍藏的东西来换点钱用了…

查看全部问答>

基于单片机的智能充电器设计,求助!

谁有关于这个的资料给我一份吧,还有我不知道用51做还是用ACR做,还是用什么ICF做!…

查看全部问答>

在DDK中如何区分U盘和移动硬盘?

我在过滤驱动中利用IOCTL_STORAGE_QUERY_PROPERTY获取设备的总线信息, U盘和移动硬盘的总线类型都是7,本地硬盘是3. 我现在想知道如何区分U盘和移动硬盘? …

查看全部问答>

sja1000读写问题

void SJA1000_ReadRegister(UINT8 reg, UINT8 *value) {         //g_lpBaseSJA1000[8] = reg;         //*value = (UINT8)g_lpBaseSJA1000[4];         //*(volatile UCHAR * co ...…

查看全部问答>

vivi-bootloader 问题

head.s文件中有多处b 1b语句什么意思?如下 @ All LED on         mov        r1, #GPIO_CTL_BASE         add        r1, r1, #oGPIO_F     &nbs ...…

查看全部问答>

福特加速电池测试 2012年前推出两款纯电动车

本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 福特汽车公司正在利用互联网和无线技术,加速对用于其未来插电式混合动力车和电动车的先进锂离子电池系统的测试和改进。 福特汽车未来的混合动力和电动车都将采用新型锂离子电池系统。这种电 ...…

查看全部问答>

智能手机成熟稳定性的关键——选对平台

关键字: 智能手机  测试  Windows Mobile  转载:电子工程专辑智能手机是一种功能丰富、第三方应用灵活的高级手持终端,但相比一般手机更容易出现死机、重启等故障问题,这极大地影响了用户的使用体验,从技术层面看,这些主要是 ...…

查看全部问答>

求基于verilog的超声波测距程序

哪位大侠写过基于verilog的超声波测距程序啊?有程序的可以共享下不?没有程序,知道方法的也行,越详细越好。先谢谢了。我邮箱:527058534@qq.com…

查看全部问答>

哪个大神知道“守护天使”--一款保护儿童的智能手环用的是什么传感器

哪个大神知道“守护天使”--一款保护儿童的智能手环用的是什么传感器? 想了解这方面的信息。 可以请吃饭的!…

查看全部问答>