OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5347|回复: 8

printf 函数需要引用什么头文件? 加上这段程序就死机

[复制链接]

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
发表于 2016-10-8 17:50:22 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 dreamARM 于 2016-10-8 17:52 编辑

printf 写到主程序里,不光不输出数据,整个程序都没有任何动作,如果不用它,直接用USART_SendData发数据就好用,大家写程序遇到过这个问题吗?  主代码如下:

#include "stm32f10x.h"
#include "delay.h"
#include "exti.h"
#include "usart.h"
#include "stdio.h"
#include "sys.h"

void USART1_IRQHandler(void)
{
        u8 res;
        if(USART_GetITStatus(USART1,USART_IT_RXNE))
        {
                res=USART_ReceiveData(USART1);
                USART_SendData(USART1,res);
        }
}
int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
         My_USART1_Init();        
         delay_init();                     //延时函数初始化         
         while(1)
         {
                 USART_SendData(USART1,0xaa);
//                                 printf("that is a hero lies in you\r\n");  //  不屏蔽这段整个程序都不好用
                 delay_ms(100);
         }         
}
此程序功能是串口平时发OxAA,同时如果接收到数据就发送接收的。
问题是: 加了printf 编译不报错,但整个程序就不好使了,就是那种完全没有反应(也不发0xaa)如果屏蔽printf 程序就好用了,
几天了,问题还是没弄明白,求解?  谢谢大家!!

@zuozhongkai



最佳答案

查看完整内容[请看2#楼]

参考我们的串口通信实验,加入半主机模式代码。才可以,否则会死机。 或者勾选use microlib也可以。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-10-8 17:50:23 | 显示全部楼层
参考我们的串口通信实验,加入半主机模式代码。才可以,否则会死机。  或者勾选use microlib也可以。
回复

使用道具 举报

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
 楼主| 发表于 2016-10-9 17:00:18 | 显示全部楼层
正点原子 发表于 2016-10-8 17:50
参考我们的串口通信实验,加入半主机模式代码。才可以,否则会死机。  或者勾选use microlib也可以。

对,就是死机状态!  我就是按照视频来写的呀。到底是什么原因呢? 因为没有引用库函数吗?
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2016-6-23
在线时间
5 小时
发表于 2016-10-18 12:49:57 | 显示全部楼层
正点原子 发表于 2016-10-8 17:50
参考我们的串口通信实验,加入半主机模式代码。才可以,否则会死机。  或者勾选use microlib也可以。

#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;
};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{        
        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
        USART1->DR = (u8) ch;      
        return ch;
}
#endif
半主机模式是什么,我也遇到了同样的模式,加入了这样的代码,还是会死机,另外怎么勾选use microlib,没有找到呀
回复

使用道具 举报

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
 楼主| 发表于 2016-10-18 18:02:03 | 显示全部楼层
落叶随风 发表于 2016-10-18 12:49
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
...

这个我找到了,你去下载配置那个页面,就是配置J LINK的那个父菜单。 但是勾选了还是没有用 @正点原子
回复

使用道具 举报

1

主题

19

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-9-11
在线时间
12 小时
发表于 2016-10-18 18:14:32 | 显示全部楼层
我也是出现了这个问题,按教程使用打印的方法就司机了。啥反应都没有。不知道是不是我用系统那个简单定时器做了一个led闪烁的原因。使用了中断。你们认真看那下那节教程。使用打印之前好像把中断有关的函数都给屏蔽了。我屏蔽了函数还是不行。到现在还没解决。就没折腾了
回复

使用道具 举报

3

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2016-6-23
在线时间
5 小时
发表于 2016-10-18 18:54:29 | 显示全部楼层
wangci152006 发表于 2016-10-18 18:14
我也是出现了这个问题,按教程使用打印的方法就司机了。啥反应都没有。不知道是不是我用系统那个简单定时器 ...

我现在不死机了,但是串口发送接受的数据是不对的,死机的问题或许我可以帮你解决,Q3469220370
回复

使用道具 举报

1

主题

19

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2016-9-11
在线时间
12 小时
发表于 2016-10-18 19:30:46 | 显示全部楼层
落叶随风 发表于 2016-10-18 18:54
我现在不死机了,但是串口发送接受的数据是不对的,死机的问题或许我可以帮你解决,Q3469220370

好的。 我加你QQ。串口发送接收数据不对你看下是不是单片机串口接收的缓存区问题。
回复

使用道具 举报

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
 楼主| 发表于 2016-10-21 14:56:53 | 显示全部楼层
正点原子 发表于 2016-10-8 17:50
参考我们的串口通信实验,加入半主机模式代码。才可以,否则会死机。  或者勾选use microlib也可以。

请问,半主机模式代码是哪段,视频里没讲,所以不知道在哪段
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-24 06:35

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表