STM32의 GPIO

11933 단어 단편기stm32GPIO

1. GPIO 소개

  • 유니버설 IO 포트마다 네 개의 32비트 설정 레지스터가 있는데 각각
  • - GPIOx_MODER   :     
    - GPIOx_OTYPER  :    
    - GPIOx_OSPEEDR :    
    - GPIOx_PUPDR   :    
    
  • 32비트 데이터 로딩
  • - GPIOx_IDR  :        
    - GPIOx_ODR  :       
    
  • 32비트 설정/리셋 레지스터:
  • - GPIOx_BSRR
    
  • 32비트 잠금 장치:
  • - GPIOx_LCKR
    
  • 두 가지 추가 기능 선택 레지스터:
  • - GPIOx_AFRH :  32 
    - GPIOx_AFRL : 32 
    

    각 GPIO 세그먼트마다 16개의 리드아웃이 있어서 사용할 수 있습니다. 리드아웃 표지는 Px0~Px15입니다. 이 점은 K60과 차이가 있습니다.

    2. 주요 전기 특성

  • 출력 상태: 위로 당기고 아래로 당기며 모두 밀어 출력, 누출
  • 데이터 출력 레지스터(GPIOx ODR) 또는 외곽 장치(alternate function output)에서 IO 인발
  • 로 데이터 출력
  • 입출력 포트당 시계 속도
  • 옵션
  • 입력 상태: 부동점, 위로 당기기, 논리
  • 데이터 입력 레지스터(GPIOx IDR) 또는 외곽 장치(alternate function input)에서 IO 인덱스
  • 로 데이터 입력
  • 비트 조작 레지스터(GPIOx BSRR)는 GPIOx 에 사용ODR 비트 조작
  • 3. 입력 설정

  • 출력 버퍼 금지
  • 슈미트 촉발 입력 활성화
  • 풀다운 저항 상태는 GPIOx 에 따라 다름PUPDR 레지스터 값
  • 입출력 포트의 현재 상태는 AHB1 클럭 주기마다 입력 데이터 레지스터
  • 로 전송됩니다.
  • 입력 데이터 레지스터의 읽기 조작으로 IO구를 획득한 상태
  • 4. 출력 구성

  • 출력 버퍼 기능:
  • 누출 모드: 출력 레지스터는 0으로 N-MOS를 활성화하고 1은 저항 상태(P-MOS는 활성화되지 않음)
  • 푸시 모드: 출력 레지스터 값이 0이면 N-MOS 출력 레지스터 값이 1이면 P-MOS 활성화
  • 슈미트 촉발 입력 활성화
  • 약한 위로 당기기 저항이 활성화
  • 입출력 포트의 현재 상태는 AHB1 클럭 주기마다 입력 데이터 레지스터
  • 로 전송됩니다.
  • 입력 데이터 레지스터의 읽기 조작으로 IO구를 획득한 상태
  • 출력 데이터 레지스터의 읽기 동작을 마지막으로 기록한 상태
  • 5. 특수 기능 설정

  • 출력 설정은 누출 또는 푸시
  • 로 되어 있음
  • 출력 버퍼는 외부에서 온 신호에 의해 지배된다
  • 슈미트 촉발 입력 활성화
  • 약한 위로 당기기 저항이 활성화
  • 입출력 포트의 현재 상태는 AHB1 클럭 주기마다 입력 데이터 레지스터
  • 로 전송됩니다.
  • 입력 데이터 레지스터의 읽기 조작으로 IO구를 획득한 상태
  • 6. GPIO 작업의 인스턴스인 LED 램프의 작업(PF9 PF10)

    //      
    #define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region
    
    //        
    #define APB1PERIPH_BASE PERIPH_BASE
    #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
    #define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)
    #define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000)
    
    //AHB1    
    /*!< AHB1 peripherals */
    #define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000)
    #define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400)
    #define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800)
    #define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00)
    #define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000)
    #define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400)
    #define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800)
    #define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00)
    #define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000)
    #define GPIOJ_BASE (AHB1PERIPH_BASE + 0x2400)
    #define GPIOK_BASE (AHB1PERIPH_BASE + 0x2800)

    실례: 간단한 gpio 초기화

    void gpio_init(GPIOx_SELECT gpiox, GPIOx_pn_SELECT gpiox_pn, \
                   GPIO_PULL_TYPE pull, GPIO_IO_TYPE io, GPIO_STATUS_TYPE stat, GPIO_OUTPUT_TYPE otype)
    {
        GPIO_TypeDef *GPIOx;
    
        /* Get the GPIOx's GPIO_TypeDef struct */
        GPIOx = BYM_GET_GPIO_struct(gpiox);
    
        RCC->AHB1ENR  |= (1 << gpiox);  //Enable the clock of GPIOx
    
        /* Set the io type of GPIOx's pn */
        GPIOx->MODER  &= ~(3 << (gpiox_pn * 2));       //Clear the old register data
        GPIOx->MODER  |= (io << (gpiox_pn * 2));        //Set the mode of GPIOx's pn
    
        /* Set the io ouput type of GPIOx's pn */
        GPIOx->OTYPER &= ~(1 << gpiox_pn);             //Clear the old register data
        GPIOx->OTYPER |= (otype << gpiox_pn);           //Set the output type of GPIOx's pn
    
        /* Pull down or pull up or nothing for GPIOx's pn */
        GPIOx->PUPDR  &= ~(3 << (gpiox_pn * 2));       //Clear the old register data
        GPIOx->PUPDR  |= (pull << (gpiox_pn * 2));
    
        /* Only set the pin status when the 'io' value is 'BYM_GPO' */
        if(io == BYM_GPO)
        {
            GPIOx->ODR  &= ~(1 << gpiox_pn);
            GPIOx->ODR  |= (stat << gpiox_pn);
        }   
    }

    예: 입출력 포트 상태 가져오기

    /* * Get GPIO pin status */
    uint32_t gpio_get(GPIOx_SELECT gpiox, GPIOx_pn_SELECT gpiox_pn)
    {
        GPIO_TypeDef *GPIOx;
    
        /* Get the GPIOx's GPIO_TypeDef struct */
        GPIOx = BYM_GET_GPIO_struct(gpiox);
    
        return ((GPIOx->IDR) & (1 << gpiox_pn));
    }
    //       
    /* GPIO        */
    typedef enum
    {
        BYM_GPIOA, BYM_GPIOB, BYM_GPIOC, BYM_GPIOD,
        BYM_GPIOE, BYM_GPIOF, BYM_GPIOG, BYM_GPIOH,
        BYM_GPIOI, BYM_GPIOJ, BYM_GPIOK,
    }GPIOx_SELECT;
    
    /* GPIO         */
    typedef enum
    {
        BYM_Px0,    BYM_Px1,    BYM_Px2,    BYM_Px3,    BYM_Px4,    BYM_Px5,    BYM_Px6,    BYM_Px7,
        BYM_Px8,    BYM_Px9,    BYM_Px10,   BYM_Px11,   BYM_Px12,   BYM_Px13,   BYM_Px14,   BYM_Px15,
    }GPIOx_pn_SELECT;
    
    /*         */
    typedef enum
    {
        BYM_NO_PULL,
        BYM_PULL_UP,
        BYM_PULL_DOWN,
    }GPIO_PULL_TYPE;
    
    /*        */
    typedef enum
    {
        BYM_PUSH_PULL,
        BYM_OPEN_DRAIN,
    }GPIO_OUTPUT_TYPE;
    
    /* IO         */
    typedef enum
    {
        BYM_GPI,    BYM_GPO,
        BYM_GPALT,  BYM_GPANA,
    }GPIO_IO_TYPE;
    
    /*                    */
    typedef enum
    {
        BYM_LOW_LEVEL,
        BYM_HIGH_LEVEL,
    }GPIO_STATUS_TYPE;
    
    /* Get the GPIO's GPIO_TypeDef struct */
    #define BYM_GET_GPIO_struct(gpiox) \
        ((GPIO_TypeDef *)(AHB1PERIPH_BASE + (gpiox * 0x400)))

    7. GPIO 포트의 다양한 추가 주변 장치 기능

    AF0     system
    AF1     TIM1/TIM2
    AF2     TIM3~TIM5
    AF3     TIM8~TIM11
    AF4     I2C1~I2C3
    AF5     SPI1~SPI2
    AF6     SPI3
    AF7     USART1~USART3
    AF8     USART4~USART6
    AF9     CAN1/CAN2,TIM12~TIM14
    AF10    OTG_FS,OTG_HS
    AF11    ETH
    AF12    FSMC,SDIO,OTG_HS(1)
    AF13    DCMI
    AF14    
    AF15    EVENTOUT
    

    8. 발 잠금 장치

  • 파이프 자물쇠는 레지스터의 일련의 조작을 통해 gpio 파이프 상태 잠금에 도달하고 다음 CPU 리셋이나 gpio 파이프 모듈 리셋이 있을 때까지 상태 변경을 허용한다
  • GPIOx로LCKR 레지스터는 쓰기 작업을 수행합니다
  • .
    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/*          gpio            */

    9. 하나의 GPIO 포트 초기화 과정

  • 이 GPIO 세그먼트 시계 켜기(모든 칩 칩 안팎 장치는 시계를 먼저 켜야 함), AHB1ENR(GPIO는 AHB1 버스에 속함)
  • 세그먼트에 설치할 GPIO 배너 번호 선택
  • 레지스터에 대한 모드 설정, 입력 출력 방식, 속도, 트랙 복용, 위로 당기기 등
  • 10. 51 시리즈 8비트 단편기 IO 포트와 주요 차이

  • 차이점:
  • 옵션인 풀다운 저항
  • 입출력 주파수 설정 가능
  • 잠금 장치
  • 명확한 입출력 상태
  • 공통점:
  • 주변 장치 기능 설정 가능
  • 푸시, 누출, 일반 IO구 3가지 모드
  • 좋은 웹페이지 즐겨찾기