**
這個_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的實際值。
那麼(volatile unsigned char *)0x20是乙個固定的指標,是不可變的,不是變數。而char *u則是個指標變數。
再在前面加"*":*(volatile unsigned char *)0x20則變成了變數(普通的unsigned char變數,不是指標變數),如果#define i (*(volatile unsigned char *)0x20),那麼與unsigned char i是一樣了,只不過前面的i的位址是固定的。
stm32 IO復用配置
gpio pinafconfig gpioa,gpio pinsource9,gpio af usart1 gpioa9usart1解析 gpio為埠a的基址 gpio pinsource9 為埠9 gpio af usart1 復用對映,巨集定義為 define gpio af usart1 ui...
stm32 IO口快速操作
使用brr和bsrr暫存器可以方便地快速地實現對埠某些特定位的操作,而不影響其它位的狀態。比如希望快速地對gpioe的位7進行翻轉,則可以 gpioe bsrr 0x80 置 1 gpioe brr 0x80 置 0 如果使用常規 讀 改 寫 的方法 gpioe odr gpioe odr 0x80...
STM32 IO口工作模式
一 推挽輸出 可以輸出高 低電平,連線數字器件 推挽結構一般是指兩個三極體分別受兩個互補訊號的控制,總是在乙個三極體導通的時候另乙個截止。高低電平由ic的電源決定。推挽電路是兩個引數相同的三極體或mosfet,以推挽方式存在於電路中,各負責正負半周的波形放大任務,電路工作時,兩隻對稱的功率開關管每次...