先說結(jié)果,可能是stm32調(diào)試功能/keil軟件/調(diào)試器(試過STLINK和JLINK兩種)的問題,不是代碼;
1、入坑
配置完串口后,可以發(fā)送數(shù)據(jù)到串口助手,但不能接收數(shù)據(jù)并做處理,所以第一步,想確定有沒有接收到單個(gè)字節(jié)進(jìn)入中斷。
開始打斷點(diǎn)調(diào)試,發(fā)現(xiàn)串口數(shù)據(jù)寄存器DR能收到數(shù)據(jù),串口狀態(tài)寄存器SR也有標(biāo)志的變化,但就是進(jìn)不了中斷服務(wù)函數(shù)的判斷,反復(fù)檢查配置、各種百度、直到替換為最簡單的工程只保留串口,仍然不能解決。
2、串口狀態(tài)寄存器
串口狀態(tài)寄存器,顯示了串口是否發(fā)送完成、接收到數(shù)據(jù)等,就是我們主要觀察的寄存器。
3、具體現(xiàn)象
3.1、初始狀態(tài)
斷點(diǎn)打在判斷是否收到數(shù)據(jù)的if語句,此時(shí),狀態(tài)寄存器SR=0xC0,未收到數(shù)據(jù),數(shù)據(jù)寄存器DR=0x00;
3.2、進(jìn)不去接收判斷
通過串口助手發(fā)送0x01,狀態(tài)寄存器SR=0xF0,表示收到數(shù)據(jù)RXNE=1,DR=0x01,收到數(shù)據(jù)和發(fā)送數(shù)據(jù)一致。
此時(shí)一切正常,理論上單步執(zhí)行后,應(yīng)該進(jìn)入if的內(nèi)容執(zhí)行接收數(shù)據(jù)的操作,但是直接跳到了else,再看狀態(tài)寄存器SR=0xC0,接收數(shù)據(jù)的標(biāo)志沒了RXNE=0,所以無法接收數(shù)據(jù)。
為什么RXNE標(biāo)志位被清掉了呢?
看手冊有兩種情況,一是讀數(shù)據(jù)寄存器,二是寫0。
但是我們既沒有去讀DR,更沒有寫0,只是單步執(zhí)行就自動(dòng)被清掉了。
3.3、修改斷點(diǎn)位置,正常進(jìn)入接收
通過串口助手發(fā)送0x02,狀態(tài)寄存器SR=0xF0,表示收到數(shù)據(jù)RXNE=1,DR=0x02,收到數(shù)據(jù)和發(fā)送數(shù)據(jù)一致,并且進(jìn)入if判斷內(nèi)部,可正常接收數(shù)據(jù)。
?4、反思
配置出問題,可第一時(shí)間從單個(gè)功能的工程入手,直接在現(xiàn)有代碼上調(diào)試會(huì)有更多不確定的因素,更浪費(fèi)時(shí)間精力。文章來源:http://www.zghlxwxcb.cn/news/detail-715675.html
不要太相信打斷點(diǎn)調(diào)試,可能會(huì)有些代碼不能正常執(zhí)行,尤其是遇到和手冊中描述不一致的地方,奇奇怪怪的時(shí)候。文章來源地址http://www.zghlxwxcb.cn/news/detail-715675.html
到了這里,關(guān)于stm32_斷點(diǎn)調(diào)試無法進(jìn)入串口接收中斷的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!