分享到plurk 分享到twitter 分享到facebook

版本 1643597ed300a89ba402d6f22da20d19dc1d3dec

General-purpose Input/Output (GPIO)

Introduction - 簡介

General Purpose Input/Output (GPIO) is a generic pin on an integrated circuit whose behavior, including whether it is an input or output pin, can be controlled by the user at run time.

  • GPIO 是種具有彈性且可以藉由軟體控制 (software-controlled) 的數位訊號
  • 常見於開發版邊緣, 以針腳 (Pin) 的形式呈現
    • 這些針腳即是開發版與外界溝通的重要橋樑
    • 簡單例子, 想像成是開關, 使用者可以打開或關閉 (input), 或由開發版來打開或關閉 (output)
  • 每個 GPIO 可以被當成 input, output 或 alternate function
    • alternate function 是指其他的的方程式, 如 I2C, SPI, USART, CCP, PWM, Clock, ADC 等。如何控制則取決於外部設備 (peripheral)

STM324xx Main Feature - STM324xx 特性

GPIO 雖然建立起記憶體與設備之間的橋梁,但也並非我們就可以隨意使用,我們必須要經過設定之後才能讓我們想要的設備正常工作。

  • 所有 GPIO 具有容許較高的電流能力與四種速度選擇,根據不同設定管理雜訊、電耗與電磁波
  • 最大 I/O 切換速度可以支援到 90 MHz
  • STM32F4xx 每個 GPIO Port 有 10 個 32-bit 暫存器 (Register)
    • Configuration Register: GPIOx_MODER, PIOx_OTYPER, GPIOx_OSPEEDR 與 GPIOx_PUPDR
    • Data Register: GPIOx_IDR and GPIOx_ODR
    • Set/Reset Register: GPIOx_BSRR
    • Locking Register: GPIOx_LCKR
    • Alternate Function Selection Register: GPIOx_AFRH 與 GPIOx_AFRL

一個pin通常可被設定成input、output、alternate function或analog,input會有兩種狀態表現(floating, pull-up/down),output也有兩種狀態表現(push-pull with pull-up/pull-down or open drain with pull-up/down)。

  • input/output方向解說 : input是指記憶體方接收來自設備的訊號源,output是指記憶體傳送訊號給設備。

當pin被設定成input時,非analog的設定下,我們可以利用GPIO的input data register(GPIOx_IDR) 或是memory中提供給目標設備的data register (當設成alternate function的時候)去接收data。

當pin被設定成output時,非analog的設定下,GPIO本身有提供output data register (GPIOx_ODR)來對目標設備做控制,但要是pin不是使用原本預先定義好的功能時(非預先定義的功能都算是alternate function的類別),此時要用memory中,另外規劃給目標設備用的register。

如果pin被設成analog的話,無論input or output都會由adc/dac那邊做處理。

Functional Description

input

  • floating vs. pull-up/pull-down

當input pin被處在高阻抗的模式下,若沒有外部訊號源進來的話,此時是無法確定pin的狀態(不能確定現在處在高電位或低電位),除非有外部訊號來驅動電路。換句話說,input floating,這個input電位狀態完全是由外部訊號來決定,沒有訊號驅動的話,就會呈現高阻抗狀態。

剛剛提到floating在沒有外部訊號驅動的情況下是呈現高阻抗狀態(無法確定電位狀態=>不能明確表示現在值是0或1),如果我們需要這個pin有一個明確的預設狀態時,必須借助pull-up(pull-down)resistor來做調整,在pull-up resistor(pull-up外接高電壓,pull-down通常會接地)加入之下,讓pin的維持在明確的高電壓狀態(pull-down則是讓pin維持在低電壓狀態)。舉例來說,如果我們定電壓在3-4 V之間是1的狀態,0-1之間是0的狀態,高阻抗的時候,電壓是不明確的,有可能電壓值會落在1-3之間的不明確地帶,甚至是沒有在任何一個狀態維持一段時間,此時的狀態是未定的,但如果我們加入pull-up resistor的話,這個pin接受來自pull-up另一端的電壓供應,讓pin至少維持在3v以上時,我們就可以確定在沒有外部訊號驅動時,pin是維持在高電位狀態。

pull-up/pull-down電阻在大部分腳位上為40kΩ,在PA10/PB12上為10kΩ。至於其範圍,可以參考Datasheet p.110,Table 47. I/O static characteristics。

output

  • push-pull vs open-drain mode

output處在push-pull模式下時,當output registers為“0”時輸出低電位,“1”時輸出高電位。而在open-drain模式下,“0”輸出低電位,“1”時為高阻抗(Hi-Z)狀態,電位無法確定。此兩種模式下,pin皆可pull-up/pull-down。

當有多個輸出pin在互相連通時(例如一個bus),若有兩個輸出呈不同狀態,電路上的電位便無法確定。因此,除了正在輸出的pin以外,其他pin應在高阻抗態以免干擾。以bus的例子來說,若令所有pin皆在open-drain mode pull-up,並使非輸出端pin為“1”(hi-Z),當輸出pin為“1”時,bus為高電位(因為pull-up);當輸出pin為“0”時,bus為低電位。

analog

前面所述的input/output跟現在要談的類比模式是不一樣的類型,前者的資料型態主要是高低電位的數位型態(0/1的分別),而類比訊號是普遍自然界的訊號型態,故當我們設定成類比輸入的模式時,進來GPIO pin的原始訊號源在還沒經過施密特觸發器(Schmitt trigger)會有另一個線路將訊號做導向(通常是要導到ADC去),另一方面,當我們用了類比輸出模式後,GPIO的內部將會有一條線路接收DAC處理完的類比訊號,在經過此pin傳遞到外部去。

  • 施密特觸發器(Schmitt trigger) : 將類比訊號的波形整成數位電路所能處理的方波波形(處理完只能分辨出高低電位的差別)。

.. image:: /embedded/Schmitt_trigger.jpg (施密特觸發器具有整流效果)

basic structure (P.266, Figure 25. Basic structure of a five-volt tolerant I/O port bit in Reference manual)

.. image:: /embedded/GPIO_basic_src.PNG - VDD:晶片內部的工作電壓 - VDD_FT : I/O port專用電壓,與VDD不同 - VSS:接地點 - protection diode : 防止輸入電壓超過一定範圍。當電壓低於VSS時,電流通過protection diode流入pin;當電壓高於VDD_FT時,電流流出pin。

補充: TTL vs CMOS

  • TTL由電阻器和三極體而組成,CMOS內部零件多以金屬氧化物半導體組成。
  • 就早期而言,TTL的速度較CMOS快,但功耗較高。但近年來CMOS在速度方面已經超越TTL。
  • TTL懸空一般會呈高電位,CMOS則為不定態。

Configuration

Input configuration (P.273, 8.3.9 Input configuration in Reference manual)

.. image:: /GPIO_ Input_configurations.png When the I/O port is programmed as Input:

  • the output buffer is disabled
  • the Schmitt trigger input is activated
    • 這種模式處理的數位訊號只在意高低電位的差別(開關控制)。
  • the pull-up and pull-down resistors are activated depending on the value in the GPIOx_PUPDR register
    • 想要讓pin的state變成一個確定的狀態,可以設定pull-up/pull-down的使用。
  • The data present on the I/O pin are sampled into the input data register every AHB1 clock cycle
    • input data的更新主要就是以AHB1本身的更新週期做決定,每一個cycle抵達時,data register就會根據當時Schmitt trigger整流完的狀態做更新。
  • A read access to the input data register provides the I/O State
    • 對data register的理解,我覺得用’狀態’比’數值’的敘述來的更好(大部分都是開關,就是外部訊號源是否有狀態改變,如 : button的按下與放開),而此處寫I/O state的意思是,即使我們現在是設成output(如 : LED控制),但我們仍然可用input data register來檢查LED現在的狀態。

Output configuration (P.274, 8.3.10 Output configuration in Reference manual)

.. image:: /GPIO_ Output_configurations.png When the I/O port is programmed as output:

.. TODO: Output Control

  • The output buffer is enabled:
    • Open drain mode: A “0” in the Output register activates the N-MOS whereas a “1” in the Output register leaves the port in Hi-Z (the P-MOS is never activated)
    • Push-pull mode: A “0” in the Output register activates the N-MOS whereas a “1” in the Output register activates the P-MOS
    • 如前所述,設定Open drain / Push-pull的使用。
  • The Schmitt trigger input is activated
  • The weak pull-up and pull-down resistors are activated or not depending on the value in the GPIOx_PUPDR register
  • The data present on the I/O pin are sampled into the input data register every AHB1 clock cycle
  • A read access to the input data register gets the I/O state
  • A read access to the output data register gets the last written value
    • 不一定與當下pin的狀態相同

Alternate function configuration (P.275, 8.3.11 Alternate function configuration in Reference manual)

.. image:: /GPIO_Alternate_function_configuration.PNG When the I/O port is programmed as alternate function:

  • The output buffer can be configured as open-drain or push-pull
  • The output buffer is driven by the signal coming from the peripheral (transmitter enable and data)
  • The Schmitt trigger input is activated
  • The weak pull-up and pull-down resistors are activated or not depending on the value in the GPIOx_PUPDR register
  • The data present on the I/O pin are sampled into the input data register every AHB1 clock cycle
  • A read access to the input data register gets the I/O state

Remark:

GPIOx_AFRL[31:0] and GPIOx_AFRH[31:0] provide ways to select alternation functions. However, different alternate functions maps to different bits of ports. For more information, please refer to Table 12. Alternate function mapping from P.73 in STM32F429xx Datasheet.

Analog configuration (P.276, 8.3.12 Analog configuration in Reference manual)

.. image:: /GPIO_Analog_configurations.PNG When the I/O port is programmed as analog configuration:

  • The output buffer is disabled
  • The Schmitt trigger input is deactivated, providing zero consumption for every analog value of the I/O pin. The output of the Schmitt trigger is forced to a constant value (0).
  • The weak pull-up and pull-down resistors are disabled
  • Read access to the input data register gets the value “0”

Note: In the analog configuration, the I/O pins cannot be 5 Volt tolerant. - analog operating voltage (VDDA) max at 3.6V

Note2: Sampling jitter

http://en.wikipedia.org/wiki/Jitter

In analog to digital and digital to analog conversion of signals, the sampling is normally assumed to be periodic with a fixed period—the time between every two samples is the same. If there is jitter present on the clock signal to the analog-to-digital converter or a digital-to-analog converter, the time between samples varies and instantaneous signal error arises.

Registers

GPIO port mode register (GPIOx_MODER) (x = A..I/J/K)

.. image:: /embedded/GPIO_port_mode.png MODERy[1:0]決定第y pin GPIO使用的configuration,2個bit為一組

  • 00: Input
  • 01: output mode
  • 10: Alternate function mode
  • 11: Analog mode
  • 當reset後,GPIOA_MODER=0xA800 0000、GPIOB_MODER=0x0000 0280,其他皆為0。

GPIO port output type register(GPIOx_OTYPER)

.. image:: /embedded/GPIO_port_output_type.png 決定在output時使用的模式(如前面Functional Description.output所述)。

  • 0: Output push-pull
  • 1: Output open-drain
  • reset皆為0x0000 0000

GPIO port output speed register (GPIOx_OSPEEDR)

.. image:: /embedded/GPIO_port_output_speed.png OSPEEDRy[1:0]決定output的速度(取樣頻率)。在不同的電容與電壓(VDD)下,取樣頻率可能不同,以下只列出代表值。

  • 00: Low speed (2MHz)
  • 01: Medium speed (10MHz)
  • 10: Fast speed (50MHz)
  • 11: High speed (100MHz)
  • reset GPIOB_OSPEEDR=0x0000 00C0,其他皆為皆為0x0000 0000
  • 速度越高,雜訊與耗電量越多。
  • 在其他狀態下的速度,可以參考 datasheet p134 table 58. I/O AC Characteristics

Note:

假設input data是0、1、0、1、……的方波,並以V0的速度變化,此時若GPIO本身的取樣頻率是1/2 V0,則取到的data會全是1或全是0,所以了解GPIO的取樣頻率可以讓使用者依input data的頻率選擇適當的速度。

GPIO port pull-up/pull-down register (GPIOx_PUPDR)

.. image:: /embedded/GPIO_port_pull.png PUPDRy[1:0]決定pin y是否pull-up/pull-down

  • 00: No pull-up, pull-down
  • 01: Pull-up
  • 10: Pull-down
  • 11: Reserved
  • reset GPIOA_PUPDR=0x6400 0000、GPIOB_PUPDR=0x0000 0100,其他0x0000 0000。

GPIO port input data register (GPIOx_IDR)

.. image:: /embedded/GPIO_port_input_data.png 讀取IDRy為input y的值。

  • Bits 31:16 Reserved, must be kept at reset value.
  • Bits 15:0 IDRy: Port y input data
  • register為read-only & word mode access only
  • Reset: 0x0000 XXXX (X=undefined)

GPIO port output data register (GPIOx_ODR)

.. image:: /GPIO_port_output_data.png 輸出pin output的值。

  • Bits 31:16 Reserved, must be kept at reset value.
  • Bits 15:0 ODRy: Port output data
  • Reset: 0x0000 0000

GPIO port bit set/reset register (GPIOx_BSRR)

.. image:: /embedded/GPIO_port_set_reset.png set或reset對應pin output data register的值。

  • Bits 31:16 BRy: reset bit y
  • Bits 15:0 BSy: set bit y
  • 0: no action ,1:set/reset
  • write-only ,讀取會得到0
  • Reset: 0x0000 0000

GPIO port configuration lock register (GPIOx_LCKR)

.. image:: /embedded/GPIO_port_configuration_lock.png 若給bit 16(LCKK)一個正確的write sequence,可以鎖住bits [15:0]對應的configurations。 當lock sequence正確執行之後,GPIOx_LCKR在下次reset之前無法修改。

  • Bit 16 LCKK[16]: Lock key
    • 0: Port configuration lock key not active
    • 1: Port configuration lock key active
    • 只能在lock sequence時寫入
  • Bits 15:0 LCKy: lock bit y
    • 0: Port configuration not locked
    • 1: Port configuration locked
  • Lock sequences

.. code-block:: c

WR LCKR[16] = ‘1’ + LCKR[15:0]
WR LCKR[16] = ‘0’ + LCKR[15:0]
WR LCKR[16] = ‘1’ + LCKR[15:0]
RD LCKR
RD LCKR[16] = ‘1’ (optional, confirm only)

在執行中,LCK[15:0]的值不可改變,否則lock失敗。

GPIO alternate function low/high register(GPIOx_AFRL/GPIOx_AFRH)

.. image:: /embedded/GPIO_alternate_function_low.pn .. image:: /embedded/GPIO_alternate_function_high.png 選擇pin y的alternate function。

  • AFRLy/AFRHy : Alternate function selection for bit y
  • AFRLy/AFRHy = 0000~1111 分別對應AF0~AF15

Demo

實驗設備

除了STM32本身外,我們使用一台訊號產生器與一台示波器。 將訊號產生器輸出(+)接到示波器的channel 1(黃色)與PA0,STM32的輸出PG14接示波器的channel 2(藍色),訊號產生器的接地(-)接到STM32的GND與示波器channel 1/2的負極。

.. image:: /embedded/starting_ state.jpg 起始狀態,程式將PA0的輸入GPIOA_IDR shift後送到 GPIOG_ODR,由PG13輸出。

.. image:: /embedded/schmitt_sin.jpg sin波

.. image:: /embedded/schmitt_tri.jpg 三角波

.. image:: /embedded/interrupt_func_delay.jpg visible interrupt delay ,about 2000ns

.. image:: /embedded/interrupt_func_1M.jpg 頻率再增加的結果

.. image:: /embedded/polling_func_delay.jpg 使用polling的結果,delay大約750ns

.. image:: /embedded/pulling_dir_delay.jpg 不用function call,delay大約250ns

.. image:: /embedded/interrupt_dir_delay.jpg interrupt不用function call,delay大約1500ns

.. image:: /embedded/interrupt_func_frqup.jpg 把interrupt頻率加快的結果

.. image:: /embedded/interrupt_func_frqup2.jpg interrupt頻率再增加的結果

.. image:: /embedded/pull_down_res.jpg 一般的下拉電阻

.. image:: /embedded/pull_down_resl.jpg PA10 /PB12

Code Section

sample code download :

.. code-block:: c

git clone https://github.com/chunikuo/stm32F4_GPIO_Demo.git
cd stm32F4_GPIO_demo/

Demo 範例選擇 : * 共有demo1.c, demo2.c, demo3.c, demo4.c * 請在 main.c 修改需要執行的 demo 範例 (同時間只能選擇其中一個範例)

.. code-block:: c

make
make flash

配置說明 :

  • STM32F429I-Discovery Library 的預先定義(in STM32F429I-Discovery/stm32f429i_discovery.h) :

.. code-block:: c

#define LEDn                             4

#define LED4_PIN                         GPIO_Pin_13
#define LED4_GPIO_PORT                   GPIOG
#define LED4_GPIO_CLK                    RCC_AHB1Periph_GPIOG

#define LED3_PIN                         GPIO_Pin_14
#define LED3_GPIO_PORT                   GPIOG
#define LED3_GPIO_CLK                    RCC_AHB1Periph_GPIOG

#define USER_BUTTON_PIN                GPIO_Pin_0
#define USER_BUTTON_GPIO_PORT          GPIOA
#define USER_BUTTON_GPIO_CLK           RCC_AHB1Periph_GPIOA
#define USER_BUTTON_EXTI_LINE          EXTI_Line0
#define USER_BUTTON_EXTI_PORT_SOURCE   EXTI_PortSourceGPIOA
#define USER_BUTTON_EXTI_PIN_SOURCE    EXTI_PinSource0
#define USER_BUTTON_EXTI_IRQn          EXTI0_IRQn 
  • LED 配置
    • Port: G
    • Pin: 13、14。
    • CLK: RCC_AHB1Periph_GPIOG
  • Button 配置
    • Port: A
    • Pin: 0
    • CLK: RCC_AHB1Periph_GPIOA
  • 以上資訊也可以從架構圖, Pin Mapping 與開發版上的標示得知

input 設定 :

  • button initialization(in libstm/Utilities/STM32F4-Discovery/stm32f4_discovery.c) :

.. code-block:: c

void STM_EVAL_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   EXTI_InitTypeDef EXTI_InitStructure;
   NVIC_InitTypeDef NVIC_InitStructure;

   /* 要設定好Clock才能正確更新Button的State,BUTTON_CLK[Button]是指RCC_AHB1Periph_GPIOA */
   RCC_AHB1PeriphClockCmd(BUTTON_CLK[Button], ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

   /* 設定為input mode,我們不給pin任何預設狀態,所PuPd的部份設成NOPULL */
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
   GPIO_InitStructure.GPIO_Pin = BUTTON_PIN[Button];
   GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStructure);

   if (Button_Mode == BUTTON_MODE_EXTI)
   {
     /* 啟用interrupt並建立好與button腳位的連結 */
     SYSCFG_EXTILineConfig(BUTTON_PORT_SOURCE[Button], BUTTON_PIN_SOURCE[Button]);

     /* Configure Button EXTI line */
     EXTI_InitStructure.EXTI_Line = BUTTON_EXTI_LINE[Button];
     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
     EXTI_InitStructure.EXTI_LineCmd = ENABLE;
     EXTI_Init(&EXTI_InitStructure);

     /* Enable and set Button EXTI Interrupt to the lowest priority */
     NVIC_InitStructure.NVIC_IRQChannel = BUTTON_IRQn[Button];
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

     NVIC_Init(&NVIC_InitStructure); 
   }
 }
  • Button interrupt handler(in main.c)

.. code-block:: c

void EXTI0_IRQHandler(void) 
{
  /* 當Button按下後觸發interrupt,用自定義變數紀錄Button state的改變。 */
  UserButtonPressed = 0x01;

  /* Clear the EXTI line pending bit */
  EXTI_ClearITPendingBit(USER_BUTTON_EXTI_LINE);
}

output 設定 :

  • LED initialization (in libstm/Utilities/STM32F4-Discovery/stm32f4_discovery.c) :

.. code-block:: c

void STM_EVAL_LEDInit(Led_TypeDef Led)
{
  GPIO_InitTypeDef  GPIO_InitStructure;

  /* LED是屬於Port D,要設定好Clk讓Port D可以正確被更新 */
  RCC_AHB1PeriphClockCmd(GPIO_CLK[Led], ENABLE);

  /* 設定各LED對應的腳位,output type設成push-pull,並使用pull-up電阻,LED初始化完成時,會呈現高電位狀態(亮燈)。 */
  GPIO_InitStructure.GPIO_Pin = GPIO_PIN[Led];
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure);
}

main.c :

  • main function :

.. code-block:: c

int main(void)
{
  RCC_ClocksTypeDef RCC_Clocks;

  /* button初始化,並使用interrupt。 */
  STM_EVAL_PBInit(BUTTON_USER, BUTTON_MODE_EXTI); 

  /* 初始化需要用到的LED。 */
  STM_EVAL_LEDInit(LED4);
  STM_EVAL_LEDInit(LED3);
  STM_EVAL_LEDInit(LED5);
  STM_EVAL_LEDInit(LED6);

  /* 初始化有使用到pull-up電阻,預設會亮燈,在這邊把燈關掉。 */
  STM_EVAL_LEDOff(LED4);
  STM_EVAL_LEDOff(LED3);
  STM_EVAL_LEDOff(LED5);
  STM_EVAL_LEDOff(LED6);

  /* 初始化自定義變數 */
  UserButtonPressed = 0x00;

  /* Create a task to flash the LED. */
  xTaskCreate(LED_task,
         (signed portCHAR *) "LED Flash",
         512 /* stack size */, NULL,
         tskIDLE_PRIORITY + 5, NULL);

  /* Create a task to button check. */
  xTaskCreate(button_task,
         (signed portCHAR *) "User Button",
         512 /* stack size */, NULL,
         tskIDLE_PRIORITY + 5, NULL);

  /* Start running the tasks. */
  vTaskStartScheduler(); 

  return 0;
}
  • LED control task

.. code-block:: c

static void LED_task(void *pvParameters)
{
  RCC_ClocksTypeDef RCC_Clocks;
  uint8_t togglecounter = 0x00;

  while(1)
  {    
      /* Toggle LED5 */
      STM_EVAL_LEDToggle(LED5);
      vTaskDelay(100);
      /* Toggle LED6 */
      STM_EVAL_LEDToggle(LED6);
      vTaskDelay(100);
  }
}
  • Button check task :

.. code-block:: c

static void button_task(void *pvParameters)
{
   	    while (1)
        {
            /* Waiting User Button is pressed */
	        if (UserButtonPressed == 0x01)
	        {
  	            /* Toggle LED4 */
  	            STM_EVAL_LEDToggle(LED4);
  	            vTaskDelay(100);
  	            /* Toggle LED3 */
  	            STM_EVAL_LEDToggle(LED3);
  	            vTaskDelay(100);
  	        }
  	        /* Waiting User Button is Released */
  	        while (STM_EVAL_PBGetState(BUTTON_USER) == Bit_SET);
  	        UserButtonPressed = 0x00;
  	   }
  }

Supplement

  • 一些有預設控制元件的腳位
    • LD3:綠色,連接到PG13
    • LD4:紅色,連接到PG14
    • B1(USER):連接到PA0
    • B2(RESET):連接到NRST,用於重置

Q & A

1. STM32 RCC clock

System clock setup

  • Internal High Speed Clock (HSI)

  • External High Speed Clock (HSE)

  • Phase locked Loop (PLL)

Bus clock setup

  • Advanced High Performance Bus (AHB)

  • Low speed Advanced Peripherial Bus (APB1)

  • High speed Advanced Peripherial Bus (APB2)

Reference

  • General Purpose Input/Output - Wikipedia, the free encyclopedia <http://en.wikipedia.org/wiki/General_Purpose_Input/Output>_
  • STM32F429xx Datasheet<http://www.st.com/web/en/resource/technical/document/datasheet/DM00071990.pdf>_
  • STM32F42xxx Reference Manual<http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf>_
  • ` - CLK: RCC_AHB1Periph_GPIOGhttp://mikrocontroller.bplaced.net/wordpress/wp-content/uploads/2013/10/Pinbelegung_f429_v100.html`_
  • STM32F4-Discovery 中文使用手冊</embedded/STM32-Discovery-Manual-Chinese.pdf>_
  • 稀里糊塗學 STM32 第二講:源源不絕</embedded/learn-stm32-part-2.pdf>_
  • GPIO PPT</embedded/GPIO_v3.ppt>_