STM32F0微控制器快速入門七 UART中斷操作

2021-10-08 02:43:41 字數 2264 閱讀 2131

1.從輪詢到中斷

很多同學都不喜歡用中斷,而偏愛用輪詢的操作方式。

這是不是和我們的天性有關呢?每個人都喜歡一切盡在掌握中,肯定都不喜歡被打斷。我們常常都有這樣的經驗:正在跟別人說一件事,然後突然有個**打進來,call打完後突然記不起來剛才講到哪了!這種糟糕的體驗對我們影響是如此深刻,以至於我們認定機器可能也是這樣吧,頻繁的中斷會不會把事情搞亂呢?好在機器雖然大部分時間都比人笨一些,但在處理這種問題上卻能做到一絲不苟。機器在中斷來的時候總會老老實實地先把當前正在做的記錄下來,然後轉去處理中斷事件,中斷處理完後分毫不差地恢復原來的工作。

仔細想一想,我們是不是也可以在接**前先用個小本兒記錄一下正在講的事情呢?我們為什麼沒有這麼做呢?乙個原因可能手頭正好沒有筆,再乙個我們可能過於自信比機器聰明了吧,當然最有可能的就是我們大多數時候都講的都是很無聊的話題,哈哈。

我們用 keil 開啟下面這個工程:

stm32cube_fw_f0_v1.11.0\projects\stm32f030r8-nucleo\examples\uart\uart_twoboards_comit\mdk-arm\project.uvprojx

這時候我們會發現,如果不仔細看,幾乎看不出和用輪詢操作的**有什麼區別。特別是初始化部分,就是一模一樣的。說好的中斷方式呢?

好,我們往下面找一下終於會發現點兒不同:

在這裡我們發現串列埠傳送呼叫了乙個不同的函式。秘密就在這個函式裡:

hal_uart_transmit_it 這個函式有三個引數:

uart_handletypedef *huart, 讓函式知道處理的是哪個串列埠

uint8_t *pdata, 需要傳送的資料首位址

uint16_t size   傳送資料的大小(長度)

這個函式的三個步驟:

step1: 把待傳送資料區的首位址,長度賦給串列埠的 handle。

step2: 根據引數(8b還是9b),掛載不同的處理函式。

step3: 開中斷(串列埠傳送暫存器空將產生中斷)。

hal_uart_transmit_it 函式執行完這些任務就退出了,主程式可以繼續執行其它的操作。這是和輪詢完全不同的。我們回頭看一下輪詢方式的 hal_uart_transmit 就會發現這個函式一直要等到所有資料都傳送完才退出,在此期間mcu被100%占用,沒有辦法做其它的事情。輪詢方式傳送函式裡有個引數 5000,這是乙個傳送超時引數,不管有沒有傳送完,5秒以後強制退出此函式,防止由於硬體或其它原因卡死在這個函式裡。

2.再談handle

對於 handle 這個詞,我們沒有用"控制代碼"這種翻譯,因為"控制代碼"這個詞本身也是生造出來的,這個詞本身就不太好理解,容易把人引入歧途。所以我們認為 handle 這個詞不翻譯為好。handle 是乙個重要的概念,所以我們需要反覆體會用它來管理硬體模組的好處。

我們可以把它想象成乙個負責裝卸貨船的辦事處,型別宣告(如 uart_handletypedef ) 是乙個建立辦事處的模板。如果有五個碼頭,那就建立五個辦事處,這些辦事處是相似的,但每個辦事處又不同,它們建在不同的碼頭,有不同的人員,可以呼叫不同的車隊。這個辦事處可以等待**機構(mcu)的命令,也可以用更好的辦法。

中斷的方式就像我們給這個辦事處建立乙個自動處理流程,碼頭來了乙個空貨船,則自動觸發辦事處中的一些辦事員調動車隊把貨物運到船上。而輪詢方式就像所有的事情都要等待**指揮中心(mcu)下達命令,即使辦事處一堆人員正無所事事。

下面的 handle 就好比是乙個這樣的辦事處,初始化的過程就是告知它建在 usart1,以及波特率,有無奇偶校驗,停止位等資訊。

hal_uart_transmit_it 函式告知此辦事處有一堆 8bit 貨物在倉庫 atxbuffer 存放,並通過把 txisr 指向適合的車隊( 函式 uart_txisr_8bit ),建立了乙個自動處理流程。

3. 中斷產生,執行的流程

我們從下圖中可以看到從中斷產生到執行的過程,乙個是傳送暫存器空產生中斷時,乙個是傳送完成產生中斷時。

微控制器入門學習七 STM32微控制器學習四 按鍵輸入

按鍵輸入使用gpio的讀取資料功能,用到的庫函式是gpio readinputdatabit 使用的暫存器是gpiox idr。使用的板子的按鍵原理圖如下 從原理圖可看出wk up是高電平有效 key0 key1 key2是低電平有效。結合stm32原理圖看這四個按鍵分別接到了哪些引腳上 上面兩個圖...

STM32F0系列串列埠DMA收發資料

這裡用的庫函式版本,晶元型號為stm32f030c8t6.在用到串列埠dma時,要按以下幾個步驟進行。1.確定使用的串口號,這裡,我用的是usart2,對應復用的引腳是pa2,pa3。再根據資料手冊查詢其對應dma通道。2.先進行串列埠初始化配置 void usart2 init 3.再配置dma初...

微控制器入門學習筆記8 STM32微控制器使用

經常會在某個qq群裡看見某人的qq暱稱的名字 不會32絕不改名 其實無論會不會,之後名稱都改了。stm32微控制器在我看來就三部分組成 各部分的初始化,中斷的使用,main函式內的程式設計。大多數人看stm32韌體庫手冊或者是stm32暫存器手冊,最後用到的其實也就是各部分的初始化。隨著時代的進步,...