Semiconductor, Embedded/2. STM32, Arduino

STM32 - HAL Driver / 프로잭트 생성 / GPIO (+실습)

잇(IT) 2024. 5. 17. 14:09

STM32F429의 핀 이름이 P(Port)로 시작하는 모든 핀들은 GPIO로 사용이 가능하다.

PA~PH 포트까지 0~15번까지 총 16개의 핀으로 구성되어 있다.


- HAL Driver

 

MCU의 주변장치를 제어하는 동작은 HAL(Hardware Abstraction Layer)에서 이루어진다.

이를 위하여 HAL 레벨에는 여러 개의 파일들이 있으며 이러한 파일의 묶음을 HAL 드라이버라고 한다.

 

HAL 드라이버는 주변장치의 구동을 위해 다음과 같은 종류의 데이터 구조체를 가진다.

1. 주변장치 핸들링용 구조체

2. 초기화 및 동작 조건 설정용 구조체

3. 작업 수행용 구조체

 

1. 주변장치 핸들 구조체(Peripheral handle structures)

주변장치 핸들 구조체는 주변장치/모듈의 설정, 레지스터 등과 관련된 사항을 다루기 위한 용도로 사용된다.

GPIO 핸들 구조체인 PPP_HandleTypeDef는 stm32f4xx_hal_time.h에 정의되어 있다.

다음의 주변장치들은 핸글 구조체를 사용하지 않는다.

- GPIO

- SYSTICK, NVIC

- PWR, RCC, FLASH

 

2. 초기화 및 동작 조건 설정용 구조체

주변장치의 초기화 및 동작 조건 설정을 위한 것이며 이 구조체는 PPP_InitTypeDef *handle 형태의 이름을 가진다.

초기화 및 동작 조건 설정용 구조체는 stm32f4xx_hal_gpio.h에 정의되어 있다.

 

3. 작업 수행용 구조체

특정한 작업을 수행하기 위해 API 함수 내에서 사용되는 구조체이다.

작업 수행용 구조체의 예는 HAL_PPP_Process(PPP_HandleTypeDef *hadc, PPP_ProcessConfig *sConfig)와 같이 사용한다.


- HAL 인터럽트 핸들러 및 콜백(callback) 함수

 

주변장치 드라이버는 API외에도 다음과 같은 인터럽트 핸들러(interrupt handler)와 콜백 함수(callback function)를 가진다.

1. 주변장치 인터럽트 핸들러

 

HAL_PPP_IRQHandler()

주변장치 인터럽트 핸들러이며 이 함수는 반드시 "stm32f4_it.c"에서 호출되어야 한다.

ex) HAL_GPIO_EXTI_IRQHandler(), HAL_TIM_IRQHandler()

 

콜백 함수(User callback functions)

사용자가 API에 전달할 수 있는 사용자 제공 함수


프로젝트 생성( Board Selector / MCU/MPU Selector)

 

https://insoobaik.tistory.com/604

 

ARM - 코드 분석 (GPIO 구동용 함수 분석 / Board Select & MCU/MPU 차이)

GPIO 구동용 함수 STM32F429의 HAL 드라이버의 GPIO 구동용 함수에는 크게 3가지가 있다.1. 초기화 및 초기화 해제용 함수2. 입출력용 함수3. 인터럽트 처리용 함수 1. 초기화 및 초기화 해제용 함수HAL_G

insoobaik.tistory.com

Board Selector와 MCU/MPU Selector의 차이는 위 글을 참고한다.


  • Board Selector: 보드에 맞춘 포괄적인 초기화 코드가 포함된다. 예를 들어, 보드에 있는 LED, 버튼 등의 주변 장치에 대한 설정이 포함된다.
  • MCU/MPU Selector: 선택한 MCU/MPU에 대한 기본 초기화 코드만 포함된다. 사용자는 필요한 주변 장치를 직접 설정해야 한다.

 

Board Selector

 

MCU/MPU Selector


실습

1. CN10 커넥터의 8번핀 CubeIDE에서 input으로 15번핀에 LED를 연결하여 
버튼을 누르는 동안 LED가 켜지도록 HAL Driver를 이용하여 프로그래밍

2. Board Selector가 아닌 MCU/MPU Selector를 통해 새로운 프로젝트를 생성하여 
위 예제를 똑같이 구현

 


1. Board Selector를 사용한 방법

...
  
  while (1)
  {
	  if(HAL_GPIO_ReadPin(GPIOF, GPIO_PIN_14) == GPIO_PIN_SET){
		  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
	  }
	  else
	  {
		  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
	  }
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
  
  ...

 



2. MCU/MPU Selector

MCU/MPU Selector의 경우 Board Selector와 달리 기본 코드만 제공되기 때문에 주변기기에 대한 헤더 파일 및 초기화를 전부 작성해줘야 한다.

마찬가지로 GPIO Input, Output 설정을 해준다.

 

GPIO를 사용하기 때문에 

main.c 파일에 gpio.h 헤더파일을 추가해주어야 한다.

 

추가적으로 MCU/MPU Selector의 경우 HAL_Init() 및 SystemClock_Config()와 같은 기본 코드만 제공하기 때문에 GPIO를 사용하기 위해서 헤더 파일과 함께 GPIO Port, Pin들을 초기화 해주는 코드를 입력해주어야 한다.

작동시키는 코드는 Board Selector의 경우와 동일하다.

 

MCU/MPU를 통해 똑같이 구성한 것을 확인할 수 있다.


!!!!!!!!!! 참고 사항 !!!!!!!!!!

위 항목을 체크해주어야 .h .c 파일을 추가해줄 때 한 쌍씩 생성하여 적용시켜준다. 위 항목을 체크하지 않으면 임의의 .c .h 파일 작성시 에러가 발생할 수 있다.

 

추가로 Pin의 Input Output이 변경된 경우 Code Generate를 새롭게 해준 다음 다시 프로그램을 실행시켜줘야 한다.

 

728x90