规范库函数的默许输出设备是显示器,要实现在串口或LCD输出,有必要重界说规范库函数里调用的与输出设备相关的函数.
例如:printf输出到串口,需求将fputc里边的输出指向串口(重定向),办法如下:#ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endifPUTCHAR_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(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;
}