欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 51單片機中使用printf后,怎么屏蔽中斷? [打印本頁]

作者: TLHZP    時間: 2021-10-6 19:39
標題: 51單片機中使用printf后,怎么屏蔽中斷?
51結構的單片機,型號MSC1211,開發工具為mdk530。使用printf函數向串口0傳數據。同時,程序中還需要通過串口0接收上位機下發的數據,所以打開了串口0中斷。遇到問題如下:
為了使用printf,串口0初始化時,運行了語句TI=1;
因為打開了串口0中斷,所以TI=1使得程序觸發并響應串口0中斷。在中斷響應中,如果運行TI=0,則printf會失效;如果不運行TI=0,則程序會反復觸發并響應串口0中斷,從而耗費大量的CPU時間。
我想使用printf函數,但是不希望反復觸發串口0中斷。正確的做法應該是怎樣的呢?望指教,謝謝!



作者: 188610329    時間: 2021-10-7 00:31
照理,應該是讓你不要用printf。但是看你那么執著。
那么,printf 之前 ES = 0; printf 之后 ES = 1;
作者: datouyuan    時間: 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;}
}

作者: datouyuan    時間: 2021-10-7 09:50
putchar()函數忘記返回值了。

char putchar (char c) {
while(bTI==0) {bTI=0;SBUF = c;}
return c;
}
作者: datouyuan    時間: 2021-10-7 10:20
188610329 發表于 2021-10-7 00:31
照理,應該是讓你不要用printf。但是看你那么執著。
那么,printf 之前 ES = 0; printf 之后 ES = 1;

樓主既然用了串口中斷,他肯定有同時收發多個字符的需求,你這種解決辦法不能滿足。
假如單片機有足夠的資源,可參考keil幫助手冊的方法,發送和接收都是非阻塞的。


作者: TLHZP    時間: 2021-10-7 10:44
datouyuan 發表于 2021-10-7 09:29
bit bTI=1;//增加一標志位。
在中斷響應中
if(TI){TI=0;bTI=1;}

謝謝回復!
putchar函數是在哪個文件里面定義的?
作者: npn    時間: 2021-10-7 10:46
如果要屏蔽所有中斷,你可以這樣寫:
  1. _push_(IE);        //位于頭文件 intrins.h
  2. IE = 0;                //關閉所有中斷
  3. //此處添加你要的代碼
  4. _pop_(IE);
復制代碼

作者: datouyuan    時間: 2021-10-8 09:13
TLHZP 發表于 2021-10-7 10:44
謝謝回復!
putchar函數是在哪個文件里面定義的?

printf ()輸出到哪是由putchar函數決定的。
keil自帶的putchar函數是輸出到串口,你可以改成輸出到任何地方。
在你代碼中任何位置寫了putchar函數,就可以替換掉keil自帶的putchar函數。
作者: datouyuan    時間: 2021-10-8 09:29
npn 發表于 2021-10-7 10:46
如果要屏蔽所有中斷,你可以這樣寫:

關總中斷應該下列代碼
  1. EA=0;
  2. //此處添加你要的代碼
  3. EA=1;
復制代碼

所有MCU都有總中斷開關指令。我剛學習arm時在芯片手冊你找不到這指令時用過和你類似的方法,后來才知道這是內核指令,是由arm公司指定,和芯片公司無關。
作者: 鄭漢松    時間: 2021-10-8 10:45
之前也遇到過你這個問題,后來通過重定義putchar函數解決了
作者: TLHZP    時間: 2021-10-31 12:51
在各位的熱心回復下,問題圓滿解決了,感謝!
作者: dzc3458    時間: 2021-11-1 16:17
EA是總這段
作者: dzc3458    時間: 2021-11-1 16:17
EA是總中斷,EA=0的話不會有任何中斷




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1