【朱老師課程總結】
第一部分、章節目錄
3.5.1.STM32的GPIO模塊資料手冊詳解1
3.5.2.STM32的GPIO模塊資料手冊詳解2
3.5.3.原理圖分析與MDK工程建立
3.5.4.寫代碼控制GPIO點亮熄滅LED
3.5.5.STM32時鐘設定函式移植與講解1
3.5.6.STM32時鐘設定函式移植與講解2
3.5.7.STM32外設編程經驗總結
第二部分、章節介紹
3.5.1.STM32的GPIO模塊資料手冊詳解1
本節講解STM32資料手冊中GPIO模塊相關的部分,主要是GPIO的各種模式及其配置方法,
3.5.2.STM32的GPIO模塊資料手冊詳解2
本節繼續講解STM32的資料手冊中GPIO部分,主要是GPIO配置的暫存器串列及暫存器位詳解,
3.5.3.原理圖分析與MDK工程建立
本節分析ARM3.0的GPIO控制LED相關的原理圖,并且建立MDK工程,簡單講一下啟動檔案,
3.5.4.寫代碼控制GPIO點亮熄滅LED
本節撰寫代碼控制GPIO以點亮熄滅LED,主要內容是暫存器地址的確定以及使用C語言操作暫存器的編程技巧,
3.5.5.STM32時鐘設定函式移植與講解1
本節移植STM32時鐘設定函式,并且結合前面課程講過的時鐘框圖對時鐘設定函式進行講解
3.5.6.STM32時鐘設定函式移植與講解2
本節移植STM32時鐘設定函式,并且結合前面課程講過的時鐘框圖對時鐘設定函式進行講解
3.5.7.STM32外設編程經驗總結
本節對整個課程進行總結,并對比了51單片機和stm32單片機外設編程的差別,告訴大家stm32學習的關鍵點和思路方法,
第三部分、隨堂記錄
3.5.1.STM32的GPIO模塊資料手冊詳解1
資料手冊第8章:通用和復用功能I/O(GPIO 和AFIO)
3.5.1.1、GPIO功能描述
(1)每個I/O埠(GPIOx)包含的暫存器
- 兩個32位配置暫存器(GPIOx_CRL,GPIOx_CRH)
- 兩個32位資料輸入/輸出暫存器(GPIOx_IDR和GPIOx_ODR)
- 一個32位埠位置位/復位暫存器(GPIOx_BSRR) 置位:寫1,復位:寫0
- 一個16位埠位復位暫存器(GPIOx_BRR) 也是32位暫存器,只不過高16位保留不用!
- 一個32位埠配置鎖定暫存器(GPIOx_LCKR)
PS:BRR和BSRR復位功能相似、在STM32F103C8中每個GPIO埠包括16個引腳
(2)每個埠的每個位可以由軟體分別配置成多種輸入輸出模式,
- 輸入浮空
- 輸入上拉
- 輸入下拉
- 模擬輸入
- 開漏輸出
- 推挽式輸出
- 推挽式復用功能
- 開漏復用功能
詳細了解可以看這個檔案:GPIO輸入輸出模式詳解
(3)每個埠都可以配置三種最大輸出翻轉速度
在配置暫存器里設定即可
后面都是關于硬體設計的,只要做了解即可!
(4)外設的GPIO配置
3.5.2.STM32的GPIO模塊資料手冊詳解2
(1)GPIO暫存器描述
GPIO的暫存器基地址是0x40010800
- 埠配置低暫存器 埠配置低暫存器(GPIOx_CRL) (x=A..E)
- 埠配置高暫存器 埠配置高暫存器(GPIOx_CRH) (x=A..E)
為什么會有兩個埠配置暫存器呢?因為一個埠配置暫存器只能配置8個引腳,兩個就可以配置一個埠!CNFx位和MODE位關聯 - 埠輸入資料暫存器 埠輸入資料暫存器(GPIOx_IDR) (x=A..E)
- 埠輸出資料暫存器 埠輸出資料暫存器(GPIOx_ODR) (x=A..E)
- 埠位設定 埠位設定/ 清除暫存器(GPIOx_BSRR) (x=A..E)
是對ODR位置位/復位
如果BRy和BSy同時被置位,BSy有優先權,
-
埠位清除暫存器 埠位清除暫存器(GPIOx_BRR) (x=A..E)
-
埠配置鎖定暫存器 埠配置鎖定暫存器(GPIOx_LCKR) (x=A..E)
(2)復用
AFIO的起始地址:0x4001 0000
3.5.3.原理圖分析與MDK工程建立
3.5.3.1、硬體接線
(1)杜邦現連接P0埠到LED介面J19,這樣相當于8個LED分別對應PB8-PB15
- PB8—LED0,PB9—LED1...
- PB8-PC15是咱們的P0埠

(2)LED是共陰,所以GPIO輸出0就亮,輸出1就滅!
接線如下:
3.5.3.2、MDK工程建立
(1)根據STC51的經驗
- 打開keil—new project—添加main.c—create hex file—編程運行!我們先試一下!
在main.c中添加代碼!
int main(void)
{
}
- 點擊編譯,發現報錯了!

原因在于,我們沒有給它加啟動檔案!
- 啟動檔案,見過嗎?
在STC51開發時,我們新建一個檔案,他就會添加一個檔案STARTUP.A51,這個就是啟動檔案!在STM32中,啟動檔案是什么呢? - 啟動檔案簡介
- 啟動檔案由匯編撰寫,是系統上電復位后第一個執行的程式,主要做了以下作業:
1、初始化堆疊指標SP=_initial_sp
2\初始化PC 指標=Reset_Handler
3、初始化中斷向量表
4、配置系統時鐘
5、呼叫C 庫函式_main 初始化用戶堆疊,從而最終呼叫main 函式去到C 的世界
啟動檔案中很重要的一段代碼如下,通過這里進入到main函式
; Reset Handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
LDR R0, =__main
BX R0
ENDP
- 在暫存器編程時,大家可以先用下面這個檔案編程,下一節庫函式編程再細講!
-
下載地址
-
再次編譯就無誤了!
至此,一個新建立的工程就算完成了,后面寫完代碼,只需要編譯,接上下載器就可以下載運行了,
PS:啟動檔案詳解
3.5.4.寫代碼控制GPIO點亮熄滅LED
3.5.4.1、編程思路
- 我們通過對GPIO暫存器編程來控制LED的亮滅,需要配置暫存器的輸入輸出模式、需要選擇引腳、需要往輸出暫存器寫值
- 每個GPIO暫存器在記憶體中都有自己的地址,我們可以通過給地址內寫值來配置暫存器
3.5.4.2、暫存器資訊確認
(1)STM32 GPIOB的起始地址是:0x40010C00
(2)有可能涉及到的GPIO的地址:

(3)會用到的暫存器
- 由于PB8-PB15為GPIOB的高八個引腳,所以會使用CRH暫存器
- 因為要做輸出,所以要使用ODR暫存器
- BSRR和BRR可以選用!
3.5.4.3、C語言操作暫存器
(1)ARM是記憶體與IO統一編址的,所以ARM中的所有外設都是通過暫存器的方式來操作的
(2)每個暫存器都有地址,C語言通過這些地址來操作這些暫存器位,用到的C語言技巧主要是C語言的位操作和C語言指標,
(3)常見面試題:用C語言向記憶體地址0x30000004寫入16
*(unsigned int *)0x30000004 = 16; 或者:
unsigned int *p = (unsigned int *)0x30000004; *p = 16;
(4)向CRH暫存器寫內容,將GPIO8-GPIO15配置為輸出模式
通用推挽輸出
CRH = 0x33333333
3.5.5.STM32時鐘設定函式移植與講解1
3.5.6.1、時鐘模塊回顧
(1)一個疑惑:前面代碼并沒有設定時鐘為什么能夠運行
(2)時鐘框圖
3.5.6.2、時鐘設定示例代碼分析
(1)相關暫存器及定義
(2)代碼詳解
RCC->CR 就相當于是rRCC_APB2ENR
3.5.6.3、時鐘代碼移植
3.5.6.STM32時鐘設定函式移植與講解2
3.5.7.STM32外設編程經驗總結
3.5.7.1、STM32和51或其他簡單單片機的相同
(1)開關環境都是Keil
(2)都是看原理圖和資料手冊
(3)都是用C語言
3.5.7.2、STM32和51或其他簡單單片機的不同
(1)工程會更復雜,會用到Keil的一些高級設定
(2)原理圖和資料手冊比簡單單片機更復雜(復雜不是難)
(3)STM32會用到C語言的更多高級特性
3.5.7.3、外設編程思路
(1)都是套路
(2)會出現問題,這時候就需要除錯能力(不一定非要除錯器)
(3)注意熟悉和體會這種套路,后面引入庫函式就是從這里講起的
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/239118.html
標籤:其他
