關於 IO uint32 t 中的

2021-09-19 12:42:17 字數 1258 閱讀 4506

這個_io 是指靜態 這個 _io 是指靜態 volatile uint32_t 是指32位的無符號整形變數uint32_t 是指32位的無符號整形變數;

搞stm32這麼久了,經常看到stm32裡面庫檔案裡面有用「_io」定義的變數,查過一下當時記住了,過段時間又給忘記了。所以才特意的寫乙個博文來記住。

volatile

volatile 型別是這樣的,其資料確實可能在未知的情況下發生變化。比如,硬體裝置的終端更改了它,現在硬體裝置往往也有自己的私有記憶體位址,比如視訊記憶體,他們一般是通過映象的方式,反映到一段特定的記憶體位址當中,這樣,在某些條件下,程式就可以直接訪問這些私有記憶體了。另外,比如共享的記憶體位址,多個程式都對它操作的時候。你的程式並不知道,這個記憶體何時被改變了。如果不加這個voliatile修飾,程式是利用catch當中的資料,那個可能是過時的了,加了 voliatile,就在需要用的時候,程式重新去那個位址去提取,保證是最新的。歸納起來如下:

1. volatile變數可變允許除了程式之外的比如硬體來修改他的內容 

2. 訪問該資料任何時候都會直接訪問該位址處內容,即通過cache提高訪問速度的優化被取消

對於((volatile unsigned long ) 0xe0028000)為隨硬體需要定義的一種位址,前面加上「」指標,為直接指向該位址,整個定義約定符號iopin代替,呼叫的時候直接對指向的位址暫存器寫內容既可。這實際上就是記憶體對映機制的方便性了。其中volatile關鍵字是嵌入式系統開發的乙個重要特點。上述表示式拆開來分析,首先(volatile unsigned long *) 0xe0028000的意思是把0xe0028000強制轉換成volatile unsigned long型別的指標,暫記為p,那麼就是#define a *p,即a為p指標指向位置的內容了。這裡就是通過記憶體定址訪問到暫存器a,可以讀/寫操作。

對於(volatile unsigned char *)0x20我們再分析一下,它是由兩部分組成:

1)(unsigned char *)0x20,0x20只是個值,前面加(unsigned char *)表示0x20是個位址,而且這個位址型別是unsigned char ,意思是說讀寫這個位址時,要寫進unsigned char 的值,讀出也是unsigned char 。

2)volatile,關鍵字volatile 確保本條指令不會因c 編譯器的優化而被省略,且要求每次直接讀值。例如用while((unsigned char *)0x20)時,有時系統可能不真正去讀0x20的值,而是用第一次讀出的值,如果這樣,那這個迴圈可能是個死迴圈。用了volatile 則要求每次都去讀0x20的實際值。

關於STM32中CAN中斷的使用

如果你用的can引腳是pa11和pa12,接收中斷用can1 rx0 irqn。如果can引腳用的是pb8和pb9,也就是用重定義的引腳,接收中斷用can1 rx1 irqn。由於pa11和pa12也是usb的引腳,所以非互聯型且帶can控制器的微控制器的庫檔案在起名字時用了usb lp can1 ...

關於STM32中定義陣列的問題

功能描述 今天做資料採集,tim2定時中斷20ms採集一次資料,並存入乙個陣列中。採集完4000個資料後,用串列埠將這4000個資料依次傳送給上位機。問題描述 debug中對陣列指標add watch,發現指標由0增加至1後就不再增加,懷疑tim2配置有問題,只進了一次中斷。於是查了半天關於定時中斷...

統計中的t檢驗

1.什麼情況下,應用t檢驗 1.已知總體的均值m,或者我們假設了乙個總體均值m 2.我們知道樣本的個數n,樣本的的方差var,樣本的均值m 3.我們假設總體,或者樣本都是服從正太分布的。2.我們的目的,就是要檢驗這個總體均值m是否合理 3.具體步驟 參考 t檢驗的步驟 1 建立虛無假設h 0 1 2...