国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

【有那么點詳細的CW32學習筆記】通用異步收發器—中斷接收篇

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

掃碼添加小助手

加入工程師交流群

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

說一下中斷是什么 ,大概就是說,單片機只有一個核,就是只有一個大腦,他無法一核二用地做事,但有時候迫不得已需要去響應一些緊急的命令,就好比你打游戲開團了,你媽喊你去倒開水,倒開水就會觸發咱們人類的“中斷”功能。放在單片機上,進行中斷操作需要以下幾個條件和步驟:擁有 中斷源中斷控制器正常工作觸發中斷保護現場響應中斷恢復現場

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

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

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

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

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

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

恢復現場 ,對應于保護現場,CPU必須在響應中斷之后回到之前被中斷打斷的語句那里繼續執行,取出原路堆棧中的數據就完成了恢復。

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

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

圖片

第一行和第二行的函數均是對內核里的中斷控制器進行寄存器操作。

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

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

圖片

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

圖片

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

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

需要注意的是, 中斷的響應并非一個非常可靠的函數調用 ,一些編譯器會試圖優化掉代碼對某些變量的修改操作(他們可能察覺不到中斷函數的存在而認為變量不需要被修改),因此需要在中斷中修改的變量需要加上“volatile”關鍵字以防止對變量的操作被編譯器優化。

圖片

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

圖片

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

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

圖片

圖片

看來單片機順利接收了數據并進行了回發操作,本節完。

總結:

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

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

3.中斷的執行不可靠,中斷內涉及到修改的變量需要加上volatile防止優化;

4.串口的每一次發送攜帶很少的數據量,因此非常建議使用緩沖區來接收數據,待需要時再主動讀取;

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 異步收發器
    +關注

    關注

    0

    文章

    37

    瀏覽量

    11133
  • CW32
    +關注

    關注

    1

    文章

    299

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    請問CW32中的CW是啥意思?

    CW32中的CW是啥意思?
    發表于 02-02 07:10

    CW32仿真是什么?

    CW32仿真是什么
    發表于 01-05 08:04

    CW32芯片哪些外設接口?

    CW32芯片哪些外設接口
    發表于 12-29 07:23

    請問CW32芯片的特性哪些?

    CW32芯片的特性哪些?
    發表于 12-26 06:14

    請問CW32 UART用于數據收發的具體過程是怎樣的?

    CW32 UART用于數據收發的具體過程是怎樣的?
    發表于 12-24 07:42

    請問CW32系列ADC是否支持同步或異步轉換?

    CW32系列ADC是否支持同步或異步轉換?
    發表于 12-16 08:06

    CW32學習筆記通用異步收發器中斷接收

    接收中斷這一個中斷源,芯片手冊的通用異步收發器章節展示了Uart
    發表于 12-12 07:45

    CW32F030 UART的主要特性

    CW32F030 內部集成 3 個通用異步收發器 (UART),支持異步全雙工、同步半雙工和單線半雙工模式,支持硬件數據流控和多機通信;可編
    發表于 12-11 08:07

    CW32單片機如何讓生活更便捷

    這是一種全新的生活方式,它通過接收并處理傳感的數據,以控制智能馬桶的所有功能。感謝CW32單片機,我們可以在日常生活中無縫地融入這種新的科技。 決定我們如何生活的,已經不再只是我們的選擇,更是我們
    發表于 12-11 06:11

    CW32時鐘運行中失效檢測的流程是什么?CW32時鐘運行中失效檢測注意事項哪些呢?

    CW32時鐘運行中失效檢測的流程是什么?CW32時鐘運行中失效檢測注意事項哪些?
    發表于 12-10 07:22

    使用CW32 MCU來實現UART串口通信與GPIO控制

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

    CW32L010的學習筆記

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

    CW32定時中斷介紹

    ,否則將觸發系統復位。WWDT 通常被用來監測嚴格時間要求的程序執行流程,防止由外部干擾或未知條件造成應用程序的執行異常, 導致發生系統故障。 01 CW32定時中斷 定時
    發表于 12-01 07:08

    CW32 MCU哪些系列?

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

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

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