저번에도 말 했지만, 일단은 HAL은 하드웨어 가상 층의 약자.
원래는 회로 동작으로 제어해야 할 하드웨어를, 가상적으로 하드웨어로 제어하는 것.
분석할 함수
HAL_Init()
MX_GPIO_Init()
HAL_GPIO_WritePin(핀포트, 핀, 쓸지안쓸지.)
먼저 HAL_Init()
여기에
#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE()
내부에 이 함수를 사용하는데, #define 쫌 오래되서 까먹음.
#define은 상수 정의용으로,
전처리기라고 해서 컴파일 하기 전에 처리된다. 그래서, 걍 어디서든 쓸 수 있는걸로 앎.
근데 저거는 단순 텍스트 치환용임. 그래서 변수 주소 찾아서 값 찾아오는 그런 상수같은 느낌이랑은 좀 다름.
걍 단순하게 텍스트를 치환해버리는 거.
단점은 타입 안정성 없음. 걍 치환해버리는거니.
그래서 현대에서는 뭐 const라고 따로 나왔나 봄. 상수 정의용으로는.
매크로 함수도
#define SQUARE(x) x * x
int result = SQUARE(3 + 2); // 3 + 2 * 3 + 2 = 11 (의도한 25 아님)
// (3 + 2) * (3 + 2)가 되는게 아니고 그대로 치환시켜버리는 거라.
이렇게 그대로 치환시켜주는거라, 의도한 답과 다를 수 있음.
근데, 임베디드 시스템은 코드도 적고 자원 소모에 신경을 많이 써야 해서, 이거 씀.
함수 호출은 뭐 돌아올 주소, 이런 거 다 내부적으로 메모리에 저장해야 되서, 오버헤드가 좀 있음.
범용컴퓨터는 성능이 꽤 괜찮으니 걍 쓰는데, 임베디드는 싸이클이고, 성능이 제한적이니.
근데 저거는 그냥 치환이니, 따지고 보자면 하드코딩이나 마찬가지.
위의 저런 경우만 좀 조심해서 사용하면 될 듯.
또 주의점.
#include해서 헤더로 포함 시, 여러 c파일이나 h파일에서 사용할 수 있는데,
그럴 경우 겹칠 수 있음.
그럴 경우 헤더가드를 쓰거나 한다.
근데 그래도 같은 이름 전처리기로 쓰는 건 주의를 해야 할 듯.
아마 줄 순서에 따라 바뀔 듯.
#define MAX 100
#define MAX 50
이면 50일 듯.
#define MAX 100
#define MAX 50
#include "config.h"
했는데 저기 안에 MAX 25면 25가 될 듯.
# 들어가 있는 건 다 전처리기 작업이니.
여튼 전처리기 이야기 했고,

저 HAL_Init()
HAL 라이브러리에 대하여 초기화 하는 함수 살펴 보겠음.
들어가 보면,
HAL_StatusTypeDef HAL_Init(void)
{
/* Configure Flash prefetch */
#if (PREFETCH_ENABLE != 0)
#if defined(STM32F101x6) || defined(STM32F101xB) || defined(STM32F101xE) || defined(STM32F101xG) || \
defined(STM32F102x6) || defined(STM32F102xB) || \
defined(STM32F103x6) || defined(STM32F103xB) || defined(STM32F103xE) || defined(STM32F103xG) || \
defined(STM32F105xC) || defined(STM32F107xC)
/* Prefetch buffer is not available on value line devices */
__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
#endif
#endif /* PREFETCH_ENABLE */
/* Set Interrupt Group Priority */
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
/* Use systick as time base source and configure 1ms tick (default clock after Reset is HSI) */
HAL_InitTick(TICK_INT_PRIORITY);
/* Init the low level hardware */
HAL_MspInit();
/* Return function status */
return HAL_OK;
}
이렇게 되어 있음.
걔중에서,
__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
이거 먼저.
HAL라이브러리는 여러 파일로 나눠놨음.
설정같은 건 h파일에, 실제로 좀 계산되는 함수는 c파일로 해놨나 봄.
위에 함수같은게 c파일.
c도 여러개, h도 여러 개.
__HAL_FLASH_PREFETCH_BUFFER_ENABLE();
이거는, HAL 라이브러리 중 h 파일 하나에
#define __HAL_FLASH_PREFETCH_BUFFER_ENABLE() (FLASH->ACR |= FLASH_ACR_PRFTBE)
이렇게 정의되어 있음.
'임베디드' 카테고리의 다른 글
| 1. OT (0) | 2026.01.29 |
|---|---|
| HAL 라이브러리 안 쓰고 LED 제어 구현 (0) | 2025.09.13 |
| GPIO 제어해보기 (0) | 2025.09.09 |
| 임베디드 코드 (0) | 2025.09.09 |
| 코드 입력 주의점 (0) | 2025.09.09 |