1. 程式人生 > >微控制器系列——ST_LINK及中斷

微控制器系列——ST_LINK及中斷

1.1  ST_LINK連線(知識拓展)

    1.1.1 參考網址:

1.2 報錯

      報錯1:老師給了老版的st-link安裝包(具體版本忘了),安裝後,裝置管理器一直無法識別,後改用新版本安裝即能正常使用,但有意思的是,老版對有些人也是可以用的。具體原因不詳,能用就行了。

 2.1 中斷

     看完上述資料,仍然一臉懵逼,不明白所謂的中斷向量是什麼,所謂下降沿觸發的事件模式是什麼,也很想知道,所謂的中斷存在的意義是什麼,所以,繼續深挖。

    什麼是中斷向量

   (1) 中斷向量是指中斷髮生以後,程式會按照中斷型別執行不同的中斷服務程式,這個中斷向量就是這些

中斷處理函式的入口地址。      具體為什麼叫向量,我認為,中斷是有優先順序的,程式會按照優先順序從高到低依次查詢,突出一個方向性,所以叫向量。(來自百度問答)

      順便明白了向量表:CPU是根據中斷號獲取中斷向量值,即對應中斷服務程式的入口地址值。因此為了讓CPU由中斷號查詢到對應的中斷向量,就需要在記憶體中建立一張查詢表,即中斷向量表(在32位保護模式下該表稱為中斷描述符表)。

      突然聯想到,當初莫名其妙加入的庫中,有這樣的介紹:

    大致知道他跟中斷有關,查了一下,記住這句話就行了:這是一個中斷處理檔案,_it結尾,就是interrupt(中斷)的意思。而且不能過於拘泥,因為發現有的論壇中提出:最近在寫stm32的中斷示例程式,發現main.c主檔案沒有#include“stm32f10x_it.h”檔案,我寫的中斷函式也能正常執行,為什麼會這樣呢,求大神能解釋一下。

大神解釋為:在startup_xxxxxxx.s這個檔案裡面宣告過的,所以中斷服務函式名稱需要遵循一定的規範,一般都不改,直接用。找到一篇具體關於標頭檔案的介紹:https://blog.csdn.net/wqx521/article/details/50925553。簡單看了看,跟評論一個心情:寫的挺詳細的,雖然我還是看不太懂。。。不過也增長了不少知識。由於知識有限,這個坑不敢往下挖,所以中斷向量就挖到這裡。(其實不能說自己看完理解的有多深刻,但是比一點都不知道強得多)

下降沿觸發的事件模式

     簡單查了查,感覺這個時候百度文庫最靠譜:

   簡單和前面文獻中的知識聯想,其實就是高低電平變化的事件。

中斷存在的意義是什麼

   (1) 找到一篇在我理解範圍內,令我瞬間將所有散亂的思緒連起來的簡短文章:

    其中有兩句話值得回味:

  • 中斷是一種處理器外設進行通訊的機制
  • 中斷是“上層應用”與“底層程式碼”的“分割邊界”。

(2)第二篇

其開頭段簡直不要太....:

所有的事物都是依靠中斷來解決問題的。計算機更是如此,依靠時鐘發生器,人為的設定沒幾個時鐘週期做一個任務,不管是否做完,一旦規定的時間到了,那麼就要強制“中斷”,以作下一個任務……就這樣,直道所有的任務都作過了(但不一定都做完畢),再接著做第一個沒有做完的任務,就這樣走而復始迴圈工作。完成所謂的“多工”。

要不然,一個cpu,如果即能一邊打字,一邊看到螢幕呢?這就是一個cpu核心,不斷地一會檢測鍵盤,一會檢測螢幕…… 還有就是軟中斷,具體詳細的細節,可以參考微機原理。(本段來自 wlf_go 的CSDN 部落格 )

3.1 實戰

    因為了解上面那麼多其實只是一個插曲,目的還是想簡單瞭解一下綜合知識和背景,現在以dht11溫溼度感測器進行實戰(其實就是根據原始碼自己理一遍思路)。

  還是採取樹形的結構,從應用函式到底層庫。

3.1.1 main.c

對於溫溼度感測器,應用就是讀取資料,其在主函式中的呼叫如圖:

 進入定義:

理一下程式碼思路:

(1)buffer 傳進來的是陣列首地址

原因;

       DHT11data資料格式:

  一次傳輸40位資料=8bit溼度整數資料+8bit溼度小數資料+8bint溫度整數資料+8bit溫度小數資料+8bit校驗位

(2)dht11_reset()

過程對應於:(dht11百度文庫應用文件:

   (3)在繼續時,突發好奇,想了解其中頻繁見到的assert——param函式:

作用:在韌體庫中,它的作用就是檢測傳遞給函式的引數是否是有效的引數

(4)dht11_scan:

由於直接看原始碼,可以看懂原始碼但不理解思路,所以找到了一篇關於GPIO的文章

找到:GPIO_ReadInputDataBit(GPIOx,GPIO_Pin_y);//讀取單個輸入埠的資料

(5)唯一不明白的是,在很多函式中,都存在 while(*==reset),while(*==set),不過具體函式功能都看得出來,對於這個程式碼的理解不是很清楚。

(6)到此有個最大的疑惑讓我莫名其妙:

看原始碼是因為覺得裡面會存在終端的問題,因為在此之前我一直以為感測器和微控制器通訊是串列埠通訊,因而會存在終端問題,然而現實是........他連串列埠標頭檔案都不包括,只是將引腳模式修改過.......所以我看原始碼看半天,只是修改了誤區,稍微瞭解了dht11這個感測器。

(7)PS:寫部落格是覺得有些東西記在電腦上查詢不方便,所以如果真的有大佬默默無聞的看到這裡,求放過。下午有時間去用串列埠通訊,真正去領悟一下中斷。另外:在修改原始碼的前提下使用OLED,簡直不要太簡單,不過就是對於其物理上的理解一點都沒有。