你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 printf程序会跑不起来

[复制链接]
wdshuang09 提问时间:2016-11-5 11:27 /
引用正点原子的printf程序,串口1已正常配制了,发送接收数据正常,现想用printf信息,设置如下
#include "stdio.h"已在头文件中

//加入以下代码,支持printf函数,而不需要选择use MicroLIB          
#if 1
#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 __stdout; /* FILE is typedef’ d in stdio.h. */      
_sys_exit(int x) //定义_sys_exit()以避免使用半主机模式   
{
        x = x;
}
//重定向fputc函数
//printf的输出,指向fputc,由fputc输出到串口
//这里使用串口1(USART1)输出printf信息
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0);//等待上一次串口数据发送完成  
        USART1->DR = (u8) ch;              //写DR,串口1将发送数据
        return ch;
}
#endif

在主函数里引用printf("OK\n");   程序会跑不起来,去掉这条运行正常,有人遇到同样的问题吗?



收藏 1 评论7 发布时间:2016-11-5 11:27

举报

7个回答
feiante 回答时间:2016-11-5 13:05:31
你在线看过吗?如果加上上面这句然后在线看程序连第一条都到不了,那么就是你在编译时,没有勾选Use MicroLIB

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

废鱼 回答时间:2016-11-5 13:42:31
楼主,串口1用普通输出是否正常,如果可以,就是printf的重定向不对。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

衔胆栖冰 回答时间:2016-11-5 17:05:29
我复制一个能用的串口重映射printf函数给你看看。
int fputc(int ch,FILE *f)
{
        USART_SendData(USART1, ch);
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET) { }
        return(ch);
}

其中USART_SendData(USART1, ch);是库函数,如下:
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data));
   
  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}
其中USART_GetFlagStatus(USART1, USART_FLAG_TC)是标准库的,代码如下:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG)
{
  FlagStatus bitstatus = RESET;
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_FLAG(USART_FLAG));
  /* The CTS flag is not available for UART4 and UART5 */
  if (USART_FLAG == USART_FLAG_CTS)
  {
    assert_param(IS_USART_123_PERIPH(USARTx));
  }  
  
  if ((USARTx->SR & USART_FLAG) != (uint16_t)RESET)
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
  return bitstatus;
}
自己看看。代码虽然多了很多,但是是一个能打印的函数。在精简代码过程中,想想哪些能省,哪些不能省。
还有,最好先确定你的串口配置正确,也就是能发送正常。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

peter001 回答时间:2016-11-5 20:27:37
学习一下
assssdz 回答时间:2016-11-6 04:50:23
:)
笑鸟007 回答时间:2016-11-6 09:02:04
楼主问题解决了么?
zengyi703-16313 回答时间:2016-11-7 08:18:32
学习了  

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版