加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

STM32程序死循环在BEAB BKPT 0xAB汇编的解决办法。【转】

(2012-05-04 20:28:50)
标签:

杂谈

分类: arm
以前使用printf 都很顺利,程序可以很自然地通过串口输出字符串,最近使用printf时,程序总是进不去,就是连MAIN函数都不会执行了,只要把printf屏蔽了,软件就可以正常运行
使用的是STM32芯片
仿真的时候程序就是一直在:
0x08002628 BEAB      BKPT     0xAB0,
动都不动

这个问题的解决办法是:
在项目设置中 选择 target选项卡 然后选择 USE Mcrolib 这样就可以了
就是说要用printf函数时要用"Use MicroLIB"库,即: C 微库(microlib)

还有一种方法:
标准库函数的默认输出设备是显示器,要实现在串口或LCD输出,必须重定义标准库函数里调用的与输出设备相关的函数,printf输出到串口,只需将putc里面的输出指向串口就行,另外在使用标准库函数时必须避免半主机模式,方法是在main文件里加代码:_sys_exit(int x)  
 
x = x;  
 


  但是在使用时务必注意,正常情况下以上两种方法都能解决问题,如果还是解决不了就要检查你的程序中有什么其他的代码影响了,
    我的情况是,单独打印完全正常,一加到我的其他程序中就会停在
0x08002628 BEAB      BKPT     0xAB0, 这个地方,后来才发现,我的main.c中

有一个条件编译
#ifdef  USE_FULL_ASSERT
如下:


  1. #ifdef  USE_FULL_ASSERT

  2. void assert_failed(uint8_t* file, uint32_t line)
  3. {
  4.   
  5.   
  6.   while (1)
  7.   {
  8.   }
  9. }
  10. #endif

复制代码
而我把下面一段代码放错位置了

  1. PUTCHAR_PROTOTYPE
  2. {

  3. USART_SendData(USART1, (u8) ch);


  4. while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) {
  5. }

  6. return ch;
  7. }
复制代码
把上面的代码放在了

#ifdef  USE_FULL_ASSERT
.................................
#endif

中间了,而 USE_FULL_ASSERT  又没有定义过,所以出现了没法解决的问题,在这里提醒大家注意,遇到问题一定要认真的检查了!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有