chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

說一下中斷是什么 ,大概就是說,單片機只有一個核,就是只有一個大腦,他無法一核二用地做事,但有時候迫不得已需要去響應(yīng)一些緊急的命令,就好比你打游戲開團了,你媽喊你去倒開水,倒開水就會觸發(fā)咱們?nèi)祟惖摹爸袛唷惫δ?。放在單片機上,進行中斷操作需要以下幾個條件和步驟:擁有 中斷源 、 中斷控制器正常工作觸發(fā)中斷 、 保護現(xiàn)場 、 響應(yīng)中斷恢復(fù)現(xiàn)場 。

看名字可能會比較抽象,我來具體解釋一下。

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

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

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

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

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

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

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

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

圖片

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

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

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

圖片

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

圖片

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

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

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

圖片

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

圖片

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

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

圖片

圖片

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

總結(jié):

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

2.同一個中斷可能會有多個中斷源;

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

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

審核編輯 黃宇

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

    關(guān)注

    0

    文章

    37

    瀏覽量

    11096
  • CW32
    +關(guān)注

    關(guān)注

    1

    文章

    281

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    使用CW32 MCU來實現(xiàn)UART串口通信與GPIO控制

    處理函數(shù)。當串口接收到數(shù)據(jù)后,通過中斷判斷數(shù)據(jù)內(nèi)容,并根據(jù)接收到的字符控制GPIO,點亮或熄滅LED。 這個簡單的例子展示了如何通過CW32 MCU的UART串口
    發(fā)表于 12-04 08:17

    CW32單片機在智能馬桶的應(yīng)用

    1.溫度感應(yīng)與控制 智能馬桶內(nèi)設(shè)有溫度傳感,通過CW32單片機的處理,可以實時感知到用戶所需的座圈溫度并根據(jù)用戶的設(shè)定進行調(diào)節(jié)。當溫度過高或過低時,單片機將發(fā)出信號,通過控制模塊對座圈的加熱或制冷
    發(fā)表于 12-04 08:01

    如果CW32芯片鎖死什么方法可以解鎖嗎?

    之前用別家芯片容易出現(xiàn)芯片鎖死的情況,解鎖一般可以用ISP,請問,如果CW32芯片鎖死,什么方法可以解鎖嗎?
    發(fā)表于 12-04 07:50

    基于芯源CW32 MCU的LED閃爍示例及代碼分析

    最近我在項目中使用了芯源的CW32 MCU,這是一款非常適合物聯(lián)網(wǎng)和低功耗應(yīng)用的微控制。在初步學(xué)習(xí)和使用中,我做了一個簡單的LED閃爍實驗,通過這篇帖子給大家分享一下代碼及相關(guān)的配置步驟。 硬件
    發(fā)表于 12-04 06:52

    CW32的I2C是否好用?照比ST的來說?

    最初STM32F103的硬件I2C是bug的,容易出現(xiàn)超時等待,那么請問,CW32的I2C有沒有類似于STM32F103的BUG呢?CW32的I2C是否比較穩(wěn)定
    發(fā)表于 12-04 06:02

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

    串口中斷CW32單片機的串口好幾種工作方式,異步全雙工,同步半雙工,單線半雙工,由于沒有DMA通道,為了避免頻繁的進入中斷,采用串口
    發(fā)表于 12-01 08:26

    cw32 systick怎么用?

    cw32 systick怎么用
    發(fā)表于 12-01 08:10

    CW32定時中斷介紹

    ,否則將觸發(fā)系統(tǒng)復(fù)位。WWDT 通常被用來監(jiān)測嚴格時間要求的程序執(zhí)行流程,防止由外部干擾或未知條件造成應(yīng)用程序的執(zhí)行異常, 導(dǎo)致發(fā)生系統(tǒng)故障。 01 CW32定時中斷 定時
    發(fā)表于 12-01 07:08

    CW32 MCU用什么IDE開發(fā)?

    推薦使用IAR Embedded Workbench for ARM、Keil μVision for ARM等IDE開發(fā)CW32 MCU應(yīng)用,其中新版本IAR EWARM直接支持CW32 MCU,Keil MDK-ARM則需要安裝CW
    發(fā)表于 11-12 07:52

    CW32 MCU哪些系列?

    目前CW32 MCU通用高性能MCU、安全低功耗MCU、無線射頻MCU等3個系列。其中射頻MCU集成了無線收發(fā)器,主要包括CW32R031
    發(fā)表于 11-12 07:34

    CW32 MCU的工作電壓、工作溫度是多少?

    CW32通用型MCU工作電壓是1.65V~5.5V,射頻MCU工作電壓則是1.8V/2.2V~3.6V;通用CW32F系列MCU,比如:CW
    發(fā)表于 11-12 06:49

    CW32 MCU用什么仿真開發(fā)?

    理論上各主流IDE枚舉的、支持ARM Cortex內(nèi)核的所有硬件仿真,比如:J-LINK,ULINK,DAP,ST-Link等,都可以仿真、下載CW32 MCU的應(yīng)用代碼。如果想實現(xiàn)量產(chǎn)或者離線下載應(yīng)用代碼,則必須配套支持CW32
    發(fā)表于 11-12 06:01

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

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

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

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

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

    電子發(fā)燒友網(wǎng)站提供《TMS320DM643 DMP通用異步收發(fā)器(UART)手冊.pdf》資料免費下載
    發(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)手冊