5.2.5 端口輸出數據寄存器:GPIOx_ODR(x=A..E)
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
- | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
Bit 15~Bit 0:端口輸出數據(這些位屬于只讀并只能以字的形式操作)
注:在輸入模式下,ODR的數據可以控制端口內部是上拉還是下拉,寫入1意味著端口上拉輸入。
5.3 GPIO的輸入與輸出例程
我們現在在PA0端口接一個按鍵,PA端口接一個LED,當按下按鍵的時候,LED以100ms亮,100ms滅,抬起按鍵后LED常亮。
(1)在stm32f103x.h文件中添加GPIO的結構體和地址映射。
(2)在HEADERWARE目錄下創建GPIO文件夾,并創建gpio.c和gpio.h兩個文件。
(3)在gpio.h文件中輸入以下內容:
(4)在gpio.c文件中輸入以下內容
(5)將gpio.c文件和gpio.h文件添加進項目
(6)在1.c文件中輸入以下內容:
注:實驗中,按鍵一端接GND,LED一端接VCC,所以按鍵是檢測到0代表按下,端口輸出低電平代表LED點亮。
5.4 CM3內核的位帶操作
Cortex-M3內核中有一個非常有用的功能,叫做位帶操作,支持了位帶操作以后,可以使用普通的加載/存儲指令來對單一的比特進行讀寫。在CM3中,有兩個區中實現了位帶。其中一個是SRAM區的最低1MB范圍,第二個則是片內外設區的最低1MB范圍。這兩個區中的地址除了可以像普通的RAM一樣使用外,它們還都有自己的“位帶別名區”,位帶別名區把每個比特膨脹成一個32位的字。當你通過位帶別名區訪問這些字時,就可以達到訪問原始比特的目的。下圖從另一個側面演示比特的膨脹對應關系。
欲設置地址0x20000000中的比特2,則使用位帶操作的設置過程如下圖所示。
30年前其實就已經有位帶操作的概念了,自8051單片機開始,到現在的CM3內核,位帶操作有什么優越性呢?最容易想到的就是通過GPIO的管腳來單獨控制每盞LED的點亮與熄滅。另一方面,也對操作串行接口器件提供了很大的方便(典型如74HC165,CD4094)。位帶操作使代碼更簡潔,這只是位帶操作優越性的初等體現,位帶操作還有一個重要的好處是在務中,用于實現共享資源在任務間的“互鎖”訪問。多任務的共享資源必須滿足一次只有一個任務訪問它——亦即所謂的“原子操作”。
5.5 利用位帶操作實現GPIO的輸入與輸出
現在利用位帶操作來實現上一題目中的功能。
(1)在sys.h文件中添加實現位帶操作的代碼。
(2)修改gpio.h中的代碼如下圖所示。
(3)修改gpio.c中的代碼如下圖所示。
(4)修改1.c中的代碼如下圖所示。
5.6 外部中斷的實現
關于STM32F103的中斷機制在之前已經詳細講述過,現在利用外部中斷來實現上一題目的功能。
(1)修改gpio.c中的代碼如下圖所示。
(2)添加代碼到文件stm32f103.h中。
(3)修改1.c中的代碼如下圖所示。
-
IO
+關注
關注
0文章
435瀏覽量
39080 -
adc
+關注
關注
98文章
6438瀏覽量
544112 -
STM32
+關注
關注
2266文章
10873瀏覽量
354838
發布評論請先 登錄
相關推薦
評論