历史上的今天
今天是: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.使用微库,因为使用微库的话,不会使用半主机模式.

方法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;
}
史海拾趣
|
摘要介绍了线性调频( L,FM)脉冲串制式合成孔径雷达(SAR)提高距离向分辨率原理,并且提出线性调频SAR的信号处理算法和步骤,避免了为提高距离向分辨率而加大系统带宽的问题。通过模拟验证了算法的正确性,并分析了计算量。设计了相应的SAR实时成像处 ...… 查看全部问答> |
|
我在过滤驱动中利用IOCTL_STORAGE_QUERY_PROPERTY获取设备的总线信息, U盘和移动硬盘的总线类型都是7,本地硬盘是3. 我现在想知道如何区分U盘和移动硬盘? … 查看全部问答> |
|
void SJA1000_ReadRegister(UINT8 reg, UINT8 *value) { //g_lpBaseSJA1000[8] = reg; //*value = (UINT8)g_lpBaseSJA1000[4]; //*(volatile UCHAR * co ...… 查看全部问答> |
|
head.s文件中有多处b 1b语句什么意思?如下 @ All LED on mov r1, #GPIO_CTL_BASE add r1, r1, #oGPIO_F &nbs ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 福特汽车公司正在利用互联网和无线技术,加速对用于其未来插电式混合动力车和电动车的先进锂离子电池系统的测试和改进。 福特汽车未来的混合动力和电动车都将采用新型锂离子电池系统。这种电 ...… 查看全部问答> |
|
关键字: 智能手机 测试 Windows Mobile 转载:电子工程专辑智能手机是一种功能丰富、第三方应用灵活的高级手持终端,但相比一般手机更容易出现死机、重启等故障问题,这极大地影响了用户的使用体验,从技术层面看,这些主要是 ...… 查看全部问答> |
|
哪位大侠写过基于verilog的超声波测距程序啊?有程序的可以共享下不?没有程序,知道方法的也行,越详细越好。先谢谢了。我邮箱:527058534@qq.com… 查看全部问答> |




