STM32 개인 공부 정리용

살캉쿠·2023년 4월 18일
0

Volatile 사용 이유


  • 컴파일러가 최적화하는 것을 방지하기 위해 사용함.

  • 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;

GPIO 제어


  • 사용회로

    • (MCU PC13핀을 통해 LED 제어함.)


  • HAL Driver를 쓸 경우의 코드는 아래와 같음.

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);
    }
}

  • HAL Driver를 쓰지않고 수동 제어할 경우

    • MX_GPIO_Init()함수를 쓰지않고 수동으로 GPIOC 포트 Clock Enable을 해야함.

      • 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과 같음



    • 수동으로 PORTC의 13번핀을 Write핀으로 설정해야함

      • 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의 값
        업로드중..

        • GPIOC의 13번 핀을 High로 설정하고싶다면 GPIOC 포트 Resiger의 13번 Bit를 1로 설정해주면 됨. (위 데이터 시트 확인.)
        • 즉, *(0x40011000) = 8192임
          (Decimal 8192는 Binary 0x0010000000000000임. 즉 PORTC의 13번 핀을 High로 설정하겠다는 뜻)
        • 또한 *(0x40011000) = (8192<<16)이면 PORTC의 13번 핀을 Low로 설정하겠다는 뜻임.

0개의 댓글