历史上的今天
返回首页

历史上的今天

今天是:2024年08月22日(星期四)

正在发生

2018年08月22日 | stm32 printf 死机

2018-08-22 来源: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.使用微库,因为使用微库的话,不会使用半主机模式.




方法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;

}



推荐阅读

史海拾趣

Bridgelux公司的发展小趣事

被收购后,Bridgelux并没有停止创新的步伐。公司继续加大研发投入,推出了一系列具有创新性的LED照明产品。同时,公司还积极拓展市场,与全球各地的客户建立了广泛的合作关系。通过不断提升产品质量和服务水平,Bridgelux逐渐在LED照明领域树立了良好的口碑,成为了行业的佼佼者。

这五个故事展示了Bridgelux公司在电子行业中的发展历程和取得的成就。从创立初期的艰难起步,到技术突破与创新,再到与Cree公司的专利纠纷与和解,以及被CEC和重庆临空收购后的持续发展与创新,Bridgelux始终保持着对技术的追求和对市场的敏锐洞察。正是这些努力和坚持,使得Bridgelux在竞争激烈的电子行业中脱颖而出,成为了LED照明领域的领军企业。

Gruner AG公司的发展小趣事
CTR是光耦合器的一个重要参数,它表示光电晶体管集电极电流与LED正向电流之间的比例关系。在设计电路时,需要根据CTR的值来确定电路的工作状态。
Amulet Technologies公司的发展小趣事
明确电路需要实现的功能,如信号传输、电气隔离、放大等。
博众电气(BOZHONG ELECTRIC)公司的发展小趣事

随着企业实力的不断增强和产品质量的不断提升,博众电气开始积极寻求市场扩张的机会。公司凭借优质的产品和服务,成功开拓了多个国内外市场,并与众多知名企业建立了长期稳定的合作关系。

同时,博众电气还注重品牌建设和推广。公司积极参与各类行业展会和论坛,展示公司的最新产品和技术成果;还通过广告宣传、社交媒体等多种渠道提升品牌知名度和影响力。这些举措使得博众电气的品牌形象和市场地位得到了进一步提升。

以上只是博众电气在电子行业发展的几个可能的关键阶段和事实的概括性描述。实际上,博众电气的发展历程可能远比这复杂和丰富。作为一家在电子行业中崭露头角的企业,博众电气未来的发展值得期待。

FUJITSU(富士通)公司的发展小趣事

在产品研发和技术创新的同时,艾迈斯(AMASS)公司也注重品牌建设和市场推广。公司积极参加各种行业展会和交流活动,与业界同行建立了广泛的合作关系。同时,艾迈斯还通过广告宣传、媒体报道等多种方式提升品牌知名度和影响力。这些努力使得艾迈斯在电子行业中的地位逐渐提升,成为了业内颇具影响力的品牌之一。

西安航天民芯公司的发展小趣事

随着公司业务的不断拓展和市场规模的逐步扩大,西安航天民芯吸引了众多投资者的关注。多家知名投资机构纷纷入股公司,为公司的发展提供了强大的资本支持。这些资金的注入不仅加速了公司的技术研发和市场拓展步伐,也为公司的持续发展注入了新的活力。

这五个故事展示了西安航天民芯公司在电子行业中的发展历程和取得的成就。通过不断地技术创新和市场拓展,西安航天民芯已经逐渐成为了电子行业中的领军企业之一,为行业的发展做出了积极的贡献。

问答坊 | AI 解惑

[====================]wince 5.0 C# numericUpDown 控件不能显示小数

点上 点下 都没用??? 这是为何啊 谁在 wince  下用过这 倒霉的控件啊 …

查看全部问答>

求购RVDS3.1,价格好商量

哪位朋友能提供RVDS3.1,不管什么版,能用就行,价格好商量。MSN:spark_huo@hotmail.com   QQ:2758884…

查看全部问答>

usb NRZI编码及同步问题

1、NRZI 即0翻转非归灵编码方式,遇0则跳变,遇1则维持前一状态的电平,这样做有什么好处,还有为什么当遇到一大串连续的1时候,即没有跳变的时候就会失去同步呢?同步序列不是在数据包的开始吗,后面的位为什么和同步有关了? 2、同步是怎么完成 ...…

查看全部问答>

220V控制5V

接在交流220V电压电路上的开关 我要用单片机来读这个开关的断开或闭合 有哪些方法? (就像5V控制220V可用继电器,反过来220V控制5V呢) …

查看全部问答>

请问有没有支持redhat9的无线网卡啊

请问有没有支持redhat9的无线网卡啊,我在市场上找的全部都是支持Windows的…

查看全部问答>

stm32f的io开漏输出最大可吸入多大电流?

                                  …

查看全部问答>

TI大学计划资料-PPT

本帖最后由 dontium 于 2015-1-23 13:10 编辑 TI大学计划资料-PPT   包含噪声控制,高速信号链中的PCB设计,电源PCB设计 …

查看全部问答>

XDATA超出范围

小弟刚接触ZIGBEE,打算用两个CC2530开发板做点对点的无线收发,可是走到一半时发现程序跑飞,不知道为什么,报的错是下面这个啊,希望前辈们指点一下啊 Tue Apr 10 13:03:07 2012: The stack pointer for stack \'XdataStack\' (currently XData:0 ...…

查看全部问答>

【视频分享】MSP430 医疗产品应用

简介:MSP430 是一款超低功耗单片机,非常适合便携式产品以及便携式医疗产品的应用。设计便携式医疗产品通常要求较低的系统成本、最低的系统功耗以及实现较高的测量精度。TI 为医疗成像提供完整的模拟信号链和嵌入式处理解决方案,旨在以更快速度为 ...…

查看全部问答>