一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【有那么點(diǎn)詳細(xì)的CW32學(xué)習(xí)筆記】通用異步收發(fā)器—中斷接收篇

CW32生態(tài)社區(qū) ? 來(lái)源:CW32生態(tài)社區(qū) ? 作者:CW32生態(tài)社區(qū) ? 2023-11-17 17:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

上回說(shuō)到單片機(jī)Uart發(fā)送,我們編寫(xiě)了一個(gè)發(fā)送函數(shù)循環(huán)發(fā)送固定的字符串,這回我們講Uart的中斷接收功能。

說(shuō)一下中斷是什么 ,大概就是說(shuō),單片機(jī)只有一個(gè)核,就是只有一個(gè)大腦,他無(wú)法一核二用地做事,但有時(shí)候迫不得已需要去響應(yīng)一些緊急的命令,就好比你打游戲開(kāi)團(tuán)了,你媽喊你去倒開(kāi)水,倒開(kāi)水就會(huì)觸發(fā)咱們?nèi)祟?lèi)的“中斷”功能。放在單片機(jī)上,進(jìn)行中斷操作需要以下幾個(gè)條件和步驟:擁有 中斷源 、 中斷控制器正常工作 、 觸發(fā)中斷 、 保護(hù)現(xiàn)場(chǎng)響應(yīng)中斷 、 恢復(fù)現(xiàn)場(chǎng)

看名字可能會(huì)比較抽象,我來(lái)具體解釋一下。

中斷源 ,單片機(jī)上會(huì)有很多的中斷源,也就是有很多辦法、或者說(shuō)“渠道”去觸發(fā)中斷,Uart外設(shè)就有很多觸發(fā)中斷的辦法,而我們本文涉及到的就是接收信息會(huì)觸發(fā)的中斷,具體怎么觸發(fā)的,后文會(huì)詳細(xì)解釋。

中斷控制器 ,這個(gè)東西是一個(gè)物理存在于單片機(jī)內(nèi)核里面的一塊數(shù)字電路,這一塊電路的功能就是用來(lái)管理中斷的。對(duì)于一些老舊型號(hào)的單片機(jī),比如C51單片機(jī),他內(nèi)部也有這個(gè)東西,只不過(guò)其中斷優(yōu)先級(jí)是固定的,這個(gè)控制器只扮演了“總閘”這樣的角色。再看CW32這種32位單片機(jī),使用cortex-M0+內(nèi)核, 擁有可編程的中斷控制器 ,單片機(jī)上會(huì)有很多個(gè)中斷源,但這是內(nèi)核可以使用和管理的部分,芯片制造廠使用這一款內(nèi)核制造單片機(jī),并不會(huì)用到所有的中斷資源,不只是搭載的功能有限,還受限于封裝,很多中斷資源會(huì)被閑置。但是 只要使用芯片的中斷 , 都必須正確配置內(nèi)核里面的中斷控制器否則中斷是無(wú)法工作的 ,因?yàn)椴徽搯纹瑱C(jī)外設(shè)設(shè)計(jì)的如何天花亂墜, 外設(shè)只負(fù)責(zé)觸發(fā)中斷 , 而響應(yīng)中斷的一定是內(nèi)核

中斷的觸發(fā) ,前面提到了中斷源, 一個(gè)指定的中斷只能由特定的、與其綁定的中斷源觸發(fā),一個(gè)中斷可能綁定多個(gè)中斷源但是只會(huì)有一個(gè)與中斷綁定的中斷服務(wù)函數(shù) ,至于什么是中斷服務(wù)函數(shù),后文會(huì)解釋。那這個(gè)時(shí)候肯定會(huì)有讀者問(wèn)了“那單片機(jī)如何在一個(gè)中斷里面區(qū)分不同的中斷源呢?”,單片機(jī)對(duì)不同的中斷源,都設(shè)計(jì)了中斷標(biāo)志位,假設(shè)有ABC三個(gè)中斷源,那他們就對(duì)應(yīng)了3個(gè)標(biāo)志位(3比特位),沒(méi)觸發(fā)中斷的時(shí)候,ABC的中斷標(biāo)志位就是默認(rèn)值0,如果觸發(fā)中斷, 電路硬件會(huì)對(duì)其對(duì)應(yīng)的標(biāo)志比特位進(jìn)行置位操作 ,也叫置1操作,該比特位會(huì)變成1。這個(gè) 置位行為會(huì)直接反饋到內(nèi)核的中斷控制器,隨后內(nèi)核會(huì)對(duì)中斷信號(hào)進(jìn)行響應(yīng) 。

保護(hù)現(xiàn)場(chǎng) ,看名字似乎和編程關(guān)系不大,這個(gè)名詞在教科書(shū)上的中斷章節(jié)會(huì)高頻出現(xiàn)。我們無(wú)法預(yù)測(cè)中斷會(huì)在什么時(shí)候到來(lái),CPU也不能一直傻傻地等中斷到來(lái),所以不需要響應(yīng)中斷的時(shí)候,CPU還是照常工作的。想象現(xiàn)在CPU正在執(zhí)行一個(gè)函數(shù)function(),倘若函數(shù)還未執(zhí)行完成,中斷被觸發(fā),CPU應(yīng)該怎么做?是放下function函數(shù)不管不顧直接去響應(yīng),抑或是先做點(diǎn)什么?顯而易見(jiàn),后者更好更合理,需要做的,正是保護(hù)現(xiàn)場(chǎng),函數(shù)執(zhí)行到哪一步,CPU就會(huì)把執(zhí)行到這一步的CPU數(shù)據(jù)(不只是我們要看的數(shù)據(jù),還包括了程序執(zhí)行的情況)存放到堆棧中,在中斷響應(yīng)完成之前,這些數(shù)據(jù)都會(huì)被封存,以避免響應(yīng)完成后數(shù)據(jù)的丟失。

響應(yīng)中斷 ,這個(gè)是大部分人最關(guān)心的部分,因?yàn)檫@個(gè)部分直接涉及到中斷服務(wù)函數(shù)的編寫(xiě)。在一切準(zhǔn)備就緒后,CPU會(huì)放棄下一條需要執(zhí)行的語(yǔ)句并直接進(jìn)入中斷服務(wù)函數(shù) ,這里需要理解 “中斷服務(wù)函數(shù)”它仍然是個(gè)函數(shù) ,初學(xué)者可能會(huì)認(rèn)為,C語(yǔ)言的函數(shù)需要調(diào)用才會(huì)被執(zhí)行,這里沒(méi)被調(diào)用卻被執(zhí)行了,那肯定不是函數(shù)。實(shí)際上看過(guò)單片機(jī)原理或者了解過(guò)計(jì)算機(jī)原理的小伙伴會(huì)告訴你,CPU內(nèi)部會(huì)有一個(gè)程序指針,程序指針會(huì)按照代碼編譯之后的邏輯去依次指向需要被執(zhí)行的函數(shù),單片機(jī)進(jìn)入中斷服務(wù)函數(shù)的原理就是直接設(shè)置這個(gè)指針指向中斷服務(wù)函數(shù),之后CPU就能執(zhí)行中斷代碼響應(yīng)中斷了。

恢復(fù)現(xiàn)場(chǎng) ,對(duì)應(yīng)于保護(hù)現(xiàn)場(chǎng),CPU必須在響應(yīng)中斷之后回到之前被中斷打斷的語(yǔ)句那里繼續(xù)執(zhí)行,取出原路堆棧中的數(shù)據(jù)就完成了恢復(fù)。

掌握中斷相關(guān)的知識(shí)后,我們就可以自己編寫(xiě)和中斷相關(guān)的代碼了,編寫(xiě)程序時(shí),基本上只需要注意中斷標(biāo)志位、中斷服務(wù)函數(shù)、中斷控制器就可以,保護(hù)現(xiàn)場(chǎng)什么的單片機(jī)會(huì)自己完成。

在包含了必要的頭文件之后,在初始化函數(shù)中加入下圖的代碼即可完成對(duì)中斷控制器的設(shè)置:

圖片

第一行和第二行的函數(shù)均是對(duì)內(nèi)核里的中斷控制器進(jìn)行寄存器操作。

解釋一下第二行的設(shè)置中斷優(yōu)先級(jí),這里涉及到一個(gè)中斷嵌套的概念,中斷不會(huì)只有一個(gè),并且很有可能下一個(gè)中斷觸發(fā)的時(shí)候,上一個(gè)中斷還沒(méi)有執(zhí)行完,此時(shí)就需要嚴(yán)格設(shè)置中斷優(yōu)先級(jí),在單片機(jī)中,根據(jù)內(nèi)核用戶(hù)手冊(cè),優(yōu)先級(jí)從0開(kāi)始遞增, 優(yōu)先級(jí)數(shù)字越低,其優(yōu)先級(jí)越高 , 高優(yōu)先級(jí)中斷可以直接打斷低優(yōu)先級(jí)中斷的響應(yīng),立刻響應(yīng)高優(yōu)先級(jí)中斷 ,形成中斷嵌套,這里設(shè)置為1是因?yàn)檫@個(gè)回發(fā)功能不算很重要的功能,相比之下嘀嗒定時(shí)器會(huì)為單片機(jī)程序提供時(shí)基信號(hào),其優(yōu)先級(jí)應(yīng)該更高。關(guān)于優(yōu)先級(jí)的具體解釋?zhuān)梢赃M(jìn)行網(wǎng)上搜索或是查看《cortex-M0+內(nèi)核手冊(cè)》。

關(guān)于最后一行代碼,CW_UART1這個(gè)外設(shè)擁有很多個(gè)中斷源,這些中斷源的使用是獨(dú)立的,這里只使用了接收中斷這一個(gè)中斷源,芯片手冊(cè)的通用異步收發(fā)器章節(jié)展示了Uart中斷包含的中斷源。

圖片

當(dāng)有數(shù)據(jù)進(jìn)入單片機(jī)的Uart1接收緩沖區(qū)時(shí),接收中斷會(huì)觸發(fā),中斷標(biāo)志位置1,程序跳轉(zhuǎn)至Uart1的中斷服務(wù)函數(shù)。單片機(jī)幾乎所有的中斷服務(wù)函數(shù)都會(huì)由一個(gè)單獨(dú)的文件收錄,名為interrupt_xxxx.c或者xxxx_it.c。這里貼一張簡(jiǎn)易的中斷服務(wù)函數(shù)代碼,其功能是在盡量不破壞單片機(jī)實(shí)時(shí)性的情況下把數(shù)據(jù)放入一個(gè)既有的數(shù)組。

圖片

前文有提到,硬件會(huì)根據(jù)中斷標(biāo)志位決定是否進(jìn)入中斷服務(wù)函數(shù),如果不在中斷服務(wù)函數(shù)中清除中斷標(biāo)志位,單片機(jī)就會(huì)反復(fù)進(jìn)入中斷,導(dǎo)致程序死在中斷里。

說(shuō)一下代碼的思路,len是一個(gè)變量,是緩沖區(qū)內(nèi)非空數(shù)據(jù)的個(gè)數(shù);data_rx是一個(gè)字符數(shù)組,作為接收緩沖區(qū),緩沖區(qū)大小為200;進(jìn)入中斷之后首先判斷緩沖區(qū)是否還有位置,也就是len是否超出緩沖區(qū)數(shù)組下標(biāo)上限,超出則判定為緩沖區(qū)已滿(mǎn),丟掉后續(xù)所有的數(shù)據(jù)直到緩沖區(qū)有空位;變量 Rx_Flag是一個(gè)8位無(wú)符號(hào)數(shù),作為緩沖區(qū)有數(shù)據(jù)&緩沖區(qū)滿(mǎn)的標(biāo)志位使用;對(duì)于接收的所有數(shù)據(jù),均會(huì)判斷是否是“rn”,這個(gè)字符串在編碼中是換行符,只要判斷到最近接收的兩個(gè)字節(jié)數(shù)據(jù)是連續(xù)的0X0D和0X0A,就認(rèn)定接收到換行符,本次數(shù)據(jù)接收完畢,Rx_Flag置1表示完成一次完整的數(shù)據(jù)接收。

需要注意的是, 中斷的響應(yīng)并非一個(gè)非??煽康暮瘮?shù)調(diào)用 ,一些編譯器會(huì)試圖優(yōu)化掉代碼對(duì)某些變量的修改操作(他們可能察覺(jué)不到中斷函數(shù)的存在而認(rèn)為變量不需要被修改),因此需要在中斷中修改的變量需要加上“volatile”關(guān)鍵字以防止對(duì)變量的操作被編譯器優(yōu)化。

圖片

到目前位置,數(shù)據(jù)其實(shí)已經(jīng)被保存在數(shù)組data_rx里面了,但這段數(shù)據(jù)我們從外部是看不到的,也看不到是否是我們?cè)O(shè)想的功能完成的接收,所以我編寫(xiě)了如下函數(shù),此函數(shù)可以在Uart1完成了一次完整的數(shù)據(jù)接收(Rx_Flag置1)后立刻回發(fā)接收的數(shù)據(jù),并清空接收緩沖區(qū),允許進(jìn)行下一次接收。

圖片

因?yàn)楹瘮?shù)包含發(fā)送功能,所以保留了超時(shí)跳出的保險(xiǎn)措施。這里解釋一下time_ms這個(gè)變量的作用,該變量定義在嘀嗒定時(shí)器文件中,并在嘀嗒定時(shí)器中斷服務(wù)函數(shù)中遞增1,即每1ms該變量都會(huì)增加1,作為毫秒計(jì)數(shù)值使用,本系列教程大部分實(shí)時(shí)性較弱的功能都會(huì)依賴(lài)此功能進(jìn)行定時(shí)。如有疑問(wèn)可以移步《內(nèi)核外設(shè)-嘀嗒定時(shí)器》章節(jié)學(xué)習(xí)。

在輪詢(xún)中加入這個(gè)回發(fā)函數(shù),最大發(fā)送容忍時(shí)間100ms,并設(shè)置間隔1000ms發(fā)送一次“success”+“換行符”。隨后在串口助手中發(fā)送不超過(guò)200字節(jié)的文本數(shù)據(jù),即可驗(yàn)證接收是否成功。

圖片

圖片

看來(lái)單片機(jī)順利接收了數(shù)據(jù)并進(jìn)行了回發(fā)操作,本節(jié)完。

總結(jié):

1.注意理解中斷的概念;

2.同一個(gè)中斷可能會(huì)有多個(gè)中斷源;

3.中斷的執(zhí)行不可靠,中斷內(nèi)涉及到修改的變量需要加上volatile防止優(yōu)化;

4.串口的每一次發(fā)送攜帶很少的數(shù)據(jù)量,因此非常建議使用緩沖區(qū)來(lái)接收數(shù)據(jù),待需要時(shí)再主動(dòng)讀?。?/p>

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 異步收發(fā)器
    +關(guān)注

    關(guān)注

    0

    文章

    37

    瀏覽量

    11011
  • CW32
    +關(guān)注

    關(guān)注

    1

    文章

    255

    瀏覽量

    1252
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何使用新版本J-Flash編程CW32 MCU?

    CW32 MCU器件支持包JlinkDevices_WHXY.rar解壓到新建的JlinkDevices子目錄即可。 4、運(yùn)行JFlash.exe,通過(guò)Jlink連接CW32 MCU測(cè)試板,進(jìn)行編程測(cè)試
    的頭像 發(fā)表于 07-01 15:05 ?144次閱讀
    如何使用新版本J-Flash編程<b class='flag-5'>CW32</b> MCU?

    第二十四章 通用同步異步收發(fā)器(USART)

    本文介紹了W55MH32的通用同步異步收發(fā)器(USART),其支持全雙工異步通信、NRZ格式,具分?jǐn)?shù)波特率發(fā)生,可編程數(shù)據(jù)字長(zhǎng)、停止位等。
    的頭像 發(fā)表于 05-29 15:44 ?1636次閱讀
    第二十四章 <b class='flag-5'>通用</b>同步<b class='flag-5'>異步</b><b class='flag-5'>收發(fā)器</b>(USART)

    STM32Cube學(xué)習(xí)筆記 (十六全)

    資料介紹: STM32Cube學(xué)習(xí)筆記,一步一步手把手帶你進(jìn)入STM32Cube的世界,包括點(diǎn)燈,按鍵,串口,ADC,DAC等等一共16。 純分享貼,需要可以直接下載附件獲取完
    發(fā)表于 03-22 17:02

    代碼+案例+生態(tài):武漢芯源半導(dǎo)體CW32嵌入式開(kāi)發(fā)實(shí)戰(zhàn)正式出版

    尊敬的各位電子工程師、嵌入式開(kāi)發(fā)愛(ài)好者們:大家好!今天,我們懷著無(wú)比激動(dòng)與自豪的心情,向大家宣布一個(gè)重大喜訊——武漢芯源半導(dǎo)體的單片機(jī)CW32正式出書(shū)啦!《基于ARMCortex-M0+的CW32
    的頭像 發(fā)表于 03-03 15:15 ?695次閱讀
    代碼+案例+生態(tài):武漢芯源半導(dǎo)體<b class='flag-5'>CW32</b>嵌入式開(kāi)發(fā)實(shí)戰(zhàn)正式出版

    代碼+案例+生態(tài):武漢芯源半導(dǎo)體CW32嵌入式開(kāi)發(fā)實(shí)戰(zhàn)正式出版

    關(guān)于 CW32 單片機(jī)的書(shū)籍。在這本書(shū)中,我們從最基礎(chǔ)的知識(shí)講起,詳細(xì)介紹了 CW32 單片機(jī)的硬件架構(gòu)、內(nèi)核特性、存儲(chǔ)系統(tǒng)以及各類(lèi)外設(shè)功能。無(wú)論是剛剛踏入嵌入式開(kāi)發(fā)領(lǐng)域的新手,還是經(jīng)驗(yàn)豐富的專(zhuān)業(yè)人士
    發(fā)表于 03-03 15:14

    74ALVCH16601 18位通用總線收發(fā)器規(guī)格書(shū)

    電子發(fā)燒友網(wǎng)站提供《74ALVCH16601 18位通用總線收發(fā)器規(guī)格書(shū).pdf》資料免費(fèi)下載
    發(fā)表于 02-19 15:39 ?0次下載
    74ALVCH16601 18位<b class='flag-5'>通用</b>總線<b class='flag-5'>收發(fā)器</b>規(guī)格書(shū)

    無(wú)線收發(fā)器工作原理,無(wú)線收發(fā)器怎么使用

    無(wú)線收發(fā)器作為現(xiàn)代通信技術(shù)的重要組成部分,廣泛應(yīng)用于各個(gè)領(lǐng)域,包括無(wú)線通信、物聯(lián)網(wǎng)、遠(yuǎn)程控制和無(wú)線傳感網(wǎng)絡(luò)等。本文將深入探討無(wú)線收發(fā)器的工作原理,同時(shí)提供詳細(xì)的使用方法。
    的頭像 發(fā)表于 01-29 15:31 ?1434次閱讀

    74ALVCH162601通用總線收發(fā)器規(guī)格書(shū)

    電子發(fā)燒友網(wǎng)站提供《74ALVCH162601通用總線收發(fā)器規(guī)格書(shū).pdf》資料免費(fèi)下載
    發(fā)表于 01-23 17:14 ?0次下載
    74ALVCH162601<b class='flag-5'>通用</b>總線<b class='flag-5'>收發(fā)器</b>規(guī)格書(shū)

    TMS320DM643 DMP通用異步收發(fā)器(UART)手冊(cè)

    電子發(fā)燒友網(wǎng)站提供《TMS320DM643 DMP通用異步收發(fā)器(UART)手冊(cè).pdf》資料免費(fèi)下載
    發(fā)表于 12-16 10:10 ?0次下載
    TMS320DM643 DMP<b class='flag-5'>通用</b><b class='flag-5'>異步</b><b class='flag-5'>收發(fā)器</b>(UART)手冊(cè)

    CW32L010學(xué)習(xí)筆記

    記錄CW32L010學(xué)習(xí)過(guò)程
    的頭像 發(fā)表于 11-15 17:40 ?3286次閱讀
    <b class='flag-5'>CW</b>32L010<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>

    射頻收發(fā)器就是基帶嗎

    射頻收發(fā)器(RF Transceiver)和基帶(Baseband)是無(wú)線通信系統(tǒng)中兩個(gè)不同的概念,它們?cè)诠δ芎驮O(shè)計(jì)上有所區(qū)別。射頻收發(fā)器主要負(fù)責(zé)無(wú)線信號(hào)的發(fā)送和接收,而基帶則處理信號(hào)的數(shù)字處理部分
    的頭像 發(fā)表于 09-20 11:12 ?942次閱讀

    射頻收發(fā)器屬于什么類(lèi)別

    射頻收發(fā)器(RF Transceiver)是無(wú)線通信系統(tǒng)中的關(guān)鍵組件,它負(fù)責(zé)將數(shù)字信號(hào)轉(zhuǎn)換為無(wú)線電波(發(fā)射)以及將無(wú)線電波轉(zhuǎn)換為數(shù)字信號(hào)(接收)。射頻收發(fā)器的設(shè)計(jì)和應(yīng)用非常廣泛,包括但不限于移動(dòng)通信
    的頭像 發(fā)表于 09-20 11:06 ?810次閱讀

    光纖收發(fā)器怎么判斷好壞

    光纖收發(fā)器作為光纖通信系統(tǒng)中的關(guān)鍵設(shè)備,其性能直接影響到整個(gè)網(wǎng)絡(luò)的傳輸質(zhì)量和穩(wěn)定性。因此,準(zhǔn)確判斷光纖收發(fā)器的好壞是確保網(wǎng)絡(luò)正常運(yùn)行的重要步驟。以下是從多個(gè)方面綜合評(píng)估光纖收發(fā)器好壞的詳細(xì)
    的頭像 發(fā)表于 08-26 15:11 ?2090次閱讀

    光纖收發(fā)器的作用、使用方法及應(yīng)用

    具有以下功能: 1.1 信號(hào)轉(zhuǎn)換:光纖收發(fā)器可以將電信號(hào)轉(zhuǎn)換為光信號(hào),也可以將光信號(hào)轉(zhuǎn)換為電信號(hào),實(shí)現(xiàn)信號(hào)的傳輸和接收。 1.2 信號(hào)放大:光纖收發(fā)器具有信號(hào)放大功能,可以提高信號(hào)的傳輸距離和質(zhì)量。 1.3 信號(hào)隔離:光纖
    的頭像 發(fā)表于 08-23 09:51 ?4753次閱讀

    光纖收發(fā)器怎么區(qū)分發(fā)射端和接收

    光纖收發(fā)器是一種將電信號(hào)轉(zhuǎn)換為光信號(hào),或者將光信號(hào)轉(zhuǎn)換為電信號(hào)的設(shè)備,廣泛應(yīng)用于通信、網(wǎng)絡(luò)、安防等領(lǐng)域。在光纖收發(fā)器的使用過(guò)程中,正確區(qū)分發(fā)射端和接收端是非常重要的。 一、光纖收發(fā)器
    的頭像 發(fā)表于 08-23 09:43 ?5432次閱讀