STM32의 GPIO
1. GPIO 소개
- GPIOx_MODER :
- GPIOx_OTYPER :
- GPIOx_OSPEEDR :
- GPIOx_PUPDR :
- GPIOx_IDR :
- GPIOx_ODR :
- GPIOx_BSRR
- GPIOx_LCKR
- GPIOx_AFRH : 32
- GPIOx_AFRL : 32
각 GPIO 세그먼트마다 16개의 리드아웃이 있어서 사용할 수 있습니다. 리드아웃 표지는 Px0~Px15입니다. 이 점은 K60과 차이가 있습니다.
2. 주요 전기 특성
3. 입력 설정
4. 출력 구성
5. 특수 기능 설정
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. 발 잠금 장치
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 포트 초기화 과정
10. 51 시리즈 8비트 단편기 IO 포트와 주요 차이
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 출력 포인터 변수 주소(16진수)텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.