컴파일러가 최적화하는 것을 방지하기 위해 사용함.
ex) 0x03번지가 GPIO 핀 중 하나고 LED를 제어한다고할 때 Volatile을 사용하지 않으면 컴파일러가 최적화를 해버려서 LED ON 신호는 무시해버린다.
- 내가 원하는 동작
*a = 0x03; // 포인터변수 a에 0x03 번지 주소 저장 0x03 |= 1; // LED ON 0x03 |= 0; // LED OFF ```
- LED ON 신호 무시(컴파일러 최적화)
*a = 0x03; // 0x03 |= 1; (컴파일러 최적화) 0x03 |= 0;
int main()
{
HAL_Init(); //HAL Driver 초기화
SystemClock_Config(); //Clock 설정
MX_GPIO_Init(); //GPIO Pin 초기화
while(1)
{
HAL_GPIO_WritePin(GPIO_LED_GPIO_Port, GPIO_LED_Pin, RESET); // LED ON
HAL_Delay(100);
HAL_GPIO_WritePin(GPIO_LED_GPIO_Port, GPIO_LED_Pin, SET); // LED OFF
HAL_Delay(100);
}
}
MX_GPIO_Init()함수 안에 있는 __HAL_RCC_GPIOC_CLK_ENABLE() 함수(GPIOC의 CLK을 Enable해주는 함수)를 대체해야함.
MX_GPIO_Init()함수 내에 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPCEN) 역할을 대체해야함.
SET_BIT()함수는 각 매개변수들을 or연산한 것임.
SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOCEN)은 RCC->APB2ENR의 주소값(40021018)과 RCC_APB2ENR_IOCEN(16)을 or연산한 주소값임.
즉 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_IOCEN)는
*(0x40021018) |= 16 과 동일함.
__HAL_RCC_GPIOC_CLK_ENABLE()은 *(0x40021018) |= 16과 같음
HAL_GPIO_WritePin() 기능을 대체해야함. 해당 함수는 GPIO 포트의 set/reset register를 제어하는 함수임.
Port bit set/reset register (GPIOx_BSRR) 구조
HAL_GPIO_WritePin() 구조
PORTC Bit set/reset register 주소 및 GPIO_PIN_13의 값