總網頁瀏覽量

2020年4月23日 星期四

1 STM32 GPIO 重點整理(二)

對STM32L1系列,針對Cat.1 and Cat.2器件,它的中斷系統有45個可遮罩中斷(maskable interrupt)。有16級優先次序可設定(16 programmable priority levels),是由4個bit來設定其優先級,分佈情形如下圖:




外界中斷/事件控制器(External interrupt/event controller EXTI)

它是由24個邊緣檢知器組成(edge detectors for generating event/interrupt requests),有三種觸發模式:上升緣、下降緣、或只要上升緣下降緣任一種,可以產生24個中斷請求 (  Cat.1 和 Cat.2 器件只有23個) ,硬體架構如下圖:


GPIO當中斷源使用時,屬於外界中斷,共佔用了7個向量資源,如上表中粉紅色框框所示,標示為: EXTI0,EXTI1,EXTI2,EXTI3,EXTI4 ,EXTI9_5,EXTI15_10共7個。其中GPIO5~GPIO9共用同一個中斷,GPIO10~GPIO15共用同一個中斷,其硬體架構如下圖所示:




EXTI16~EXTI23的配置如下:    
                                               
• EXTI line 16 連接 PVD 輸出
• EXTI line 17 連接 RTC Alarm 事件
 • EXTI line 18 連接USB Device FS wakeup事件
 • EXTI line 19 連接 RTC Tamper and TimeStamp 事件
 • EXTI line 20 連接 RTC Wakeup 事件
 • EXTI line 21 連接 Comparator 1 wakeup 事件
 • EXTI line 22 連接Comparator 2 wakeup 事件
 • EXTI line 23 連接 channel acquisition 中斷

和以上外界中斷相關的暫存器(EXTI registers)如下:




由以上的MAP圖表,可知GPIO5~9GPIO10~15各共用一個中斷,可由暫存器的4BIT以決定是那一個GPIO  PORT使用該PIN用來做中斷源,以避免混淆。

                                                           中斷服務流程


EXTI 產生外部中斷事件,主程式會中斷執行,先去執行中斷服務函式,完成中斷服務函式後,再回主程式繼續執行。以EXTI15_10為例說明:

1. EXTI15_10_IRQHandler函式為外部中斷10~15號線的中斷服務函式,當外部中斷10~15號線產生外部中斷時會呼叫EXTI15_10_IRQHandler函式,中斷當前執行的程式,處理器開始執行中斷服務函式內的程式,執行完之後繼續執行中斷前的程式。

2. 因為STM32L1的硬體結構決定了外部中斷10~15號線共用一個中斷向量,因此只能擁有一 個中斷服務函式。而HAL架構使用 HAL_GPIO_EXTI_IRQHandler()函式和HAL_GPIO_EXTI_Callback()函式,讓使用者以為每個外部中斷線都擁有自己的中斷服務函式。

3. 實際上,EXTI15_10_IRQHandler函式是在stm32l1xx_it.c的程式中定義,並呼叫了HAL_GPIO_EXTI_IRQHandler(GPIO_PIN)

4. HAL_GPIO_EXTI_IRQHandler( )是在stm32l1xx_hal_gpio.c中定義。該函式判斷外部中斷是由哪一號外部中斷線產生的,並且清除中斷掛起暫存器中的對應位,然後呼叫外部中斷回撥函式HAL_GPIO_EXTI_Callback(),並將產生外部中斷的中斷線(GPIO_PIN)作為引數傳遞給外部中斷回撥函式HAL_GPIO_EXTI_Callback()

5. 而上面的所有工作都由STM32CubeMX幫我們做好了,我們只需要在main.c檔案中重定義 HAL_GPIO_EXTI_Callback()函式就行了。

6. 因為所有外部中斷都會呼叫HAL_GPIO_EXTI_Callback()函式,所以我們需要在 HAL_GPIO_EXTI_Callback()函式內部根據輸入的GPIO_PIN引數判斷是哪一號外部中斷線 產生了外部中斷,然後根據不同的外部中斷執行不同的程式碼。

7. 因此我們使用語句if(GPIO_PIN == GPIO_PIN_No)的方式判斷該外部中斷是否是由外部中斷GPIO_PIN_No號線產生的,然後執行後面程式碼。

註:中斷優先順序(不僅限於外部中斷), 可以在STM32CubeMX中的NVIC Configuration中設定。



















2020年4月2日 星期四

1 STM32 GPIO 重點整理(一)


學任何一種MCU,最重要的一課,就是要把GPIO搞清楚,以下是用STM32 L1系列所做的重點整理,其餘系列也是一樣,可以參考。
註:在圖上按左鍵可放大圖檢示

GPIO基本結構




















GPIO可以設為4種模式之一:
1.  General input
2.  General output
3.  Analog
4.  AF(Alternate function)

General input   可設為以下三種之一:
1. Input floating
2. Input pull-up
3. Input pull-down

General output  可設為以下二種之一:
1. Output open-drain with pull-up or pull-down 
2. Output push-pull with pull-up or pull-down

AF(Alternate function) 可設為以下二種之一:
1. Alternate function push-pull with pull-up or pull-down
2. Alternate function open-drain with pull-up or pull-down

有關GPIO的使用,原文有詳細說明,節錄如下:

































I/O配置為INPUT

























I/O配置為OUTPUT



























I/O PORT 配置為OUTPUT時,注意:

Open drain mode
mode下,P-MOS完全沒作用,output register "0"使 N-MOS 導通,輸出為 Low
"1"使N-MOS 關閉,I/O在高阻抗狀態(Hi-Z)

Push-pull mode
N-MOS 導通,P-MOS 就會關閉,輸出為 Low
P-MOS 導通,N-MOS 就會關閉,輸出為 High
因為 N-MOS P-MOS 的狀態都相反,所以稱為 push-pull
output register "0"使 N-MOS導通"1"使 P-MOS導通

綜上所述,要讓Output值同設定值,要將Output mode設為Push-pull mode

I/O PORT 配置AF(Alternate function)













I/O PORT 配置Analog



註:
在電源重啟後,所有的 Pin 都是 Input FloatingGPIO 切換到其他功能都是關閉的。直到 reset完成,GPIOA13-15 GPIOB3-4 才會切換到 JTAG 用於除錯。此時,
PA15: JTDI in pull-up
PA14: JTCK/SWCLK in pull-down
PA13: JTMS/SWDAT in pull-up
PB4:  NJTRST in pull-up
PB3: JTDO in floating state

UART1_TX(PA9) / UART1_RX(PA10) 來當成 UART loader,用來更新 Firmware


OnLine

counter