13290|16

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

只要使用printf函数,硬件仿真就不正常 [复制链接]

为什么我只要使用printf函数,硬件仿真就不正常,死在汇编“0x080016AC BEAB      BKPT     0xAB”位置不动。怎么也想不明白啊。
请教各位啊,两天了卡在这里。
此帖出自stm32/stm8论坛

最新回复

                                 我也遇到这样的情况,用printf()需要重定向fputc()函数只要在程序加入以下代码就可以了。/*************************************************函数: PUTCHAR_PROTOTYPE功能: 重定向C库prinf函数参数: 无返回: 无**************************************************/int fputc(int ch, FILE *f){  /* Place your implementation of fputc here */  /* e.g. write a character to the USART */  USART_SendData(USART2, (u8) ch);  /* Loop until the end of transmission */  while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)  {  }  return ch;}   详情 回复 发表于 2008-4-14 11:29
点赞 关注
 

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

俺觉得还是自己做个串口的驱动来代替printf()~~~

                                 虽然俺还没开始用,但俺从不用它~~~
此帖出自stm32/stm8论坛
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

记得在C51里使用printf的时候,需要先将TI置1

这个“TI = 1;”可是很精妙的。

至于你用的环境……看看putchar()的实现就知道了。也可以参考一下例程。
此帖出自stm32/stm8论坛
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 

"手动激活发送"~~~几乎所有的MCU/ARM都可以实现~~~

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

90

帖子

0

TA的资源

一粒金砂(初级)

5
 

printf是通过putchar函数来输出字符流的。

printf是通过putchar函数来输出字符流的。
以下是putchar的最简单实现:
char putchar (char c)
{
    while (!TI)//等待前一个字符发送完成
        ;
    TI = 0;
    return (SBUF = c);//发送当前字符
    //然后在串口发送字符的时间里,printf继续处理后续字符……运用了统筹方法
}

所以,开机初始化的时候,要先“TI = 1;”,让printf能工作起来。
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 

不建议自己去做太多重复劳动……

对于格式化输出来说,printf是最好的;

其次是sprintf+Send_String(Buff,Len)

printf不占用过多的缓冲区,它是边处理边输出的。

那种输出一个整数还要:
i=Num/1000;//千位
j=Num%1000;
……
的方法是很蠢而且很浪费激情的。


此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(高级)

7
 

sprintf确实是最方便的~~~但printf并不适用于中断发送方式

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

8
 

mohanwei说的对

printf会调用putchar函数
可以通过修改这个函数使输出转到串口或者LCD或者其它。
此帖出自stm32/stm8论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 

虽然很好,但while (!Uart0_Send_Ready)就不完美了~~~

                                 发送实际还是查询方式~~~
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

10
 

要想做到自动发送,就要用sprintf+缓冲区的方式了

边处理边输出恰好是printf的优势。实际用到显示的地方都是人机交互的,速度如果太快,反而不好了……

假设波特率是9600bps,printf和中断自动发送的整体速度是几乎一摸一样,因为在等待前一个字符发送的时间里,printf已经处理好了下一个字符。
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 

不能这么说~~~在多任务处理时,"寸金寸光阴"~~~

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

12
 

假设波特率是9600bps,那么发送一个字节是1.1ms

发送1000个字节就是1.1s

Send_Array(Buff,Len);约1.1s,偏差几十us;CPU不能干别的事,占用Buff

printf约1.1s,偏差几十us;CPU不能干别的事,不占用Buff

Auto_Send=1(在串口中断+全局变量,自动发送);约1.1s,偏差几十us;CPU可以干别的事,占用Buff

如果有OS,以上三种情况CPU都可以干别的事。
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

13
 

ST的STM32固件库中就有一个这方面的例子


https://bbs.eeworld.com.cn/upfiles/img/200712/20071216192222218.pdf
请看USART下的Example7
 
9楼的帖子不错,虽然是51下面的,但有借鉴作用。相信结合STM32固件库中的例子,应该很容易在STM32上实现的。鉴于天冷了,9楼要裤子穿,就送一条吧(潜台词:下不为例),嘿嘿。
 
现在希望楼主现身,说说你问的是什么芯片,根据你给的信息我猜不出来。
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

14
 

工作在中断方式下干嘛呢?putchar还是在查询等待中啊...

                                 printf能不能改造得不等待呢?
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

15
 

哈哈~~~这种方法...没话说~~~

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

16
 

不等待就是sprintf+Auto_Send=1了,需要占用大量缓冲区

                                 要不就上OS。
此帖出自stm32/stm8论坛
 
 
 

回复

22

帖子

0

TA的资源

一粒金砂(初级)

17
 

我是这样解决的

我也遇到这样的情况,用printf()需要重定向fputc()函数
只要在程序加入以下代码就可以了。
/*************************************************
函数: PUTCHAR_PROTOTYPE
功能: 重定向C库prinf函数
参数: 无
返回: 无
**************************************************/
int fputc(int ch, FILE *f)
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the USART */
  USART_SendData(USART2, (u8) ch);

  /* Loop until the end of transmission */
  while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)
  {
  }
  return ch;
}
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表