【STM32微控制器學習】第四課:GPIO控制LED

搞嵌入式的Lucas發表於2020-12-21

【朱老師課程總結】

第一部分、章節目錄

3.5.1.STM32的GPIO模組資料手冊詳解1
3.5.2.STM32的GPIO模組資料手冊詳解2
3.5.3.原理圖分析與MDK工程建立
3.5.4.寫程式碼控制GPIO點亮熄滅LED1
3.5.5.寫程式碼控制GPIO點亮熄滅LED2
3.5.6.STM32時鐘設定函式移植與講解1
3.5.7.STM32時鐘設定函式移植與講解2
3.5.8.STM32時鐘設定函式移植與講解3
3.5.9.STM32時鐘設定函式移植與講解4
3.5.10.STM32時鐘設定函式移植與講解5
3.5.11.在PZ6806L開發板上實現GPIO和時鐘程式設計控制
3.5.12.在PZ6808L開發板上實現GPIO和時鐘程式設計控制1
3.5.13.在PZ6808L開發板上實現GPIO和時鐘程式設計控制2
3.5.14.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點亮熄滅LED1
    本節編寫程式碼控制GPIO以點亮熄滅LED,主要內容是暫存器地址的確定以及使用C語言操作暫存器的程式設計技巧。
3.5.5.寫程式碼控制GPIO點亮熄滅LED2    
    本節解決了時鐘模組沒開啟的問題,並且定義了巨集來訪問暫存器,使我們的程式碼更加規範。
3.5.6.STM32時鐘設定函式移植與講解1
    本節移植STM32時鐘設定函式,並且結合前面課程講過的時鐘框圖對時鐘設定函式進行講解
3.5.7.STM32時鐘設定函式移植與講解2
    本節接上節繼續移植時鐘部分的設定程式碼,到了HSE時鐘穩定階段
3.5.8.STM32時鐘設定函式移植與講解3    
    本節完成時鐘設定的原始碼移植並且進行測試。
3.5.9.STM32時鐘設定函式移植與講解4
    本節使用除錯的方式尋找程式碼中的問題,解決了超時計算的bug和if判斷中的bug,但是時鐘還是有問題不能工作
3.5.10.STM32時鐘設定函式移植與講解5    
    本節新增了FLASH ACR暫存器相關的操作程式碼後,時鐘終於正常工作了。並且通過flash函式的閃爍速度對比可以明顯看出PLL啟動後主頻發生了改變。
3.5.11.在PZ6806L開發板上實現GPIO和時鐘程式設計控制    
    本節在PZ6806L開發板上移植實現GPIO的控制和時鐘模組的程式設計,這種移植可以讓大家學會在不同硬體差異下程式設計的相同點和不同點。
3.5.12.在PZ6808L開發板上實現GPIO和時鐘程式設計控制1    
    本節在PZ6808L開發板上移植實現GPIO的控制和時鐘模組的程式設計,讓大家看看在F4上程式設計和F1上有什麼差異
3.5.13.在PZ6808L開發板上實現GPIO和時鐘程式設計控制2    
    本節接上節在PZ6808L開發板上移植實現GPIO的控制和時鐘模組的程式設計.
3.5.14.STM32外設程式設計經驗總結
    本節對整個課程進行總結,並對比了51微控制器和stm32微控制器外設程式設計的差別,告訴大家stm32學習的關鍵點和思路方法。        

第三部分、隨堂記錄

3.5.1.STM32的GPIO模組資料手冊詳解1


3.5.2.STM32的GPIO模組資料手冊詳解2


3.5.3.原理圖分析與MDK工程建立

3.5.3.1、硬體接線
(1)杜邦現連線P0埠到LED介面J12,這樣相當於8個LED分別對應PB8-PB15
(2)因為GPIO接到了LED的正極,所以輸出1就表示亮,0表示滅
3.5.3.2、MDK工程建立
注意:微控制器中用到的C語言其實不是標準的,而是有點定製性的C語言。
之前認識:整個程式從main函式開始執行,main執行完了整個程式就完了。
起始程式碼:從CPU復位開始執行的第1句指令,到main函式之前所做的事情就是起始程式碼。
3.5.3.3、關於其實程式碼
(1)其實程式碼是哪裡來的
(2)不同的CPU的其實程式碼一般是不同的
(3)起始程式碼是用匯編寫的,一般不需要看懂,知道點就行了


3.5.4_5.寫程式碼控制GPIO點亮熄滅LED1_2

3.5.4.1、暫存器資訊確認
(1)STM32 PortB的起始地址是:0x40010C00
(2)有可能涉及到的GPIO的地址:
    暫存器名    偏移量        暫存器地址
    GPIOB_CRL    0x00        0x40010C00
    GPIOB_CRH    0x04        0x40010C04            *
    GPIOB_IDR    0x08        0x40010C08
    GPIOB_ODR    0x0C        0x40010C0C            *
    GPIOB_BSRR    0x10        0x40010C10            ?
    GPIOB_BRR    0x14        0x40010C14            ?
    
3.5.4.2、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;


3.5.6_7.STM32時鐘設定函式移植與講解1_2

3.5.6.1、時鐘模組回顧
(1)一個疑惑:前面程式碼並沒有設定時鐘為什麼能夠執行
(2)時鐘框圖
3.5.6.2、時鐘設定示例程式碼分析
(1)相關暫存器及定義
(2)程式碼詳解
RCC->CR 就相當於是rRCC_APB2ENR


3.5.6.3、時鐘程式碼移植


3.5.8_9_10.STM32時鐘設定函式移植與講解3_4_5    


3.5.11.在PZ6806L開發板上實現GPIO和時鐘程式設計控制

硬體:LED1-8接PC0-7,GPIO接到負極所以輸出0就亮


3.5.12_13.在PZ6808L開發板上實現GPIO和時鐘程式設計控制1_2

硬體:LED1-2接PF9-10,GPIO接負極輸出0就亮

學到了什麼:
1、F1和F4在暫存器級別是不相容的,F1的程式不能直接拿過來到F4去用
2、不管是F1還是F4(甚至是其他的ARM的CPU),他們寫程式碼的思路和方法都是一樣的,用到的C語言的技巧和除錯思路也是一樣的
3、當你接觸一個新東西的時候,有很多未知會帶來一些不可知的變化和bug,這個時候需要耐心和毅力,去和能work的正確的示例去對比,去查詢,去發現,去驗證。
4、F4的開發比F1要複雜一些,所以學習要強調按部就班,有F1基礎後再去學F4,F4的開發更多依賴於庫(官方事先準備好的一些程式碼)基本上不會自己完全從頭去操作暫存器去寫了。


3.5.14.STM32外設程式設計經驗總結

3.5.14.1、STM32和51或其他簡單微控制器的相同
(1)開關環境都是Keil
(2)都是看原理圖和資料手冊
(3)都是用C語言
3.5.14.2、STM32和51或其他簡單微控制器的不同
(1)工程會更復雜,會用到Keil的一些高階設定
(2)原理圖和資料手冊比簡單微控制器更復雜(複雜不是難)
(3)STM32會用到C語言的更多高階特性
3.5.14.3、外設程式設計思路
(1)都是套路
(2)會出現問題,這時候就需要除錯能力(不一定非要偵錯程式)
(3)注意熟悉和體會這種套路,後面引入庫函式就是從這裡講起的


 

相關文章