找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2446|回复: 12
收起左侧

51单片机中使用printf后,怎么屏蔽中断?

[复制链接]
ID:970163 发表于 2021-10-6 19:39 | 显示全部楼层 |阅读模式
51结构的单片机,型号MSC1211,开发工具为mdk530。使用printf函数向串口0传数据。同时,程序中还需要通过串口0接收上位机下发的数据,所以打开了串口0中断。遇到问题如下:
为了使用printf,串口0初始化时,运行了语句TI=1;
因为打开了串口0中断,所以TI=1使得程序触发并响应串口0中断。在中断响应中,如果运行TI=0,则printf会失效;如果不运行TI=0,则程序会反复触发并响应串口0中断,从而耗费大量的CPU时间。
我想使用printf函数,但是不希望反复触发串口0中断。正确的做法应该是怎样的呢?望指教,谢谢!


回复

使用道具 举报

ID:624769 发表于 2021-10-7 00:31 | 显示全部楼层
照理,应该是让你不要用printf。但是看你那么执著。
那么,printf 之前 ES = 0; printf 之后 ES = 1;
回复

使用道具 举报

ID:887371 发表于 2021-10-7 09:29 | 显示全部楼层
bit bTI=1;//增加一标志位。
在中断响应中
if(TI){TI=0;bTI=1;}
修改putchar()函数,把TI替换成bTI。
char putchar (char c) {
while(bTI==0) {bTI=0;SBUF = c;}
}
回复

使用道具 举报

ID:887371 发表于 2021-10-7 09:50 | 显示全部楼层
putchar()函数忘记返回值了。

char putchar (char c) {
while(bTI==0) {bTI=0;SBUF = c;}
return c;
}
回复

使用道具 举报

ID:887371 发表于 2021-10-7 10:20 | 显示全部楼层
188610329 发表于 2021-10-7 00:31
照理,应该是让你不要用printf。但是看你那么执著。
那么,printf 之前 ES = 0; printf 之后 ES = 1;

楼主既然用了串口中断,他肯定有同时收发多个字符的需求,你这种解决办法不能满足。
假如单片机有足够的资源,可参考keil帮助手册的方法,发送和接收都是非阻塞的。 屏幕截图 2021-10-07 101341.jpg

回复

使用道具 举报

ID:970163 发表于 2021-10-7 10:44 来自手机 | 显示全部楼层
datouyuan 发表于 2021-10-7 09:29
bit bTI=1;//增加一标志位。
在中断响应中
if(TI){TI=0;bTI=1;}

谢谢回复!
putchar函数是在哪个文件里面定义的?
回复

使用道具 举报

ID:57657 发表于 2021-10-7 10:46 | 显示全部楼层
如果要屏蔽所有中断,你可以这样写:
  1. _push_(IE);        //位于头文件 intrins.h
  2. IE = 0;                //关闭所有中断
  3. //此处添加你要的代码
  4. _pop_(IE);
复制代码
回复

使用道具 举报

ID:887371 发表于 2021-10-8 09:13 | 显示全部楼层
TLHZP 发表于 2021-10-7 10:44
谢谢回复!
putchar函数是在哪个文件里面定义的?

printf ()输出到哪是由putchar函数决定的。
keil自带的putchar函数是输出到串口,你可以改成输出到任何地方。
在你代码中任何位置写了putchar函数,就可以替换掉keil自带的putchar函数。
回复

使用道具 举报

ID:887371 发表于 2021-10-8 09:29 | 显示全部楼层
npn 发表于 2021-10-7 10:46
如果要屏蔽所有中断,你可以这样写:

关总中断应该下列代码
  1. EA=0;
  2. //此处添加你要的代码
  3. EA=1;
复制代码

所有MCU都有总中断开关指令。我刚学习arm时在芯片手册你找不到这指令时用过和你类似的方法,后来才知道这是内核指令,是由arm公司指定,和芯片公司无关。
回复

使用道具 举报

ID:514901 发表于 2021-10-8 10:45 | 显示全部楼层
之前也遇到过你这个问题,后来通过重定义putchar函数解决了
回复

使用道具 举报

ID:970163 发表于 2021-10-31 12:51 | 显示全部楼层
在各位的热心回复下,问题圆满解决了,感谢!
回复

使用道具 举报

ID:964308 发表于 2021-11-1 16:17 来自手机 | 显示全部楼层
EA是总这段
回复

使用道具 举报

ID:964308 发表于 2021-11-1 16:17 来自手机 | 显示全部楼层
EA是总中断,EA=0的话不会有任何中断
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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