본문 바로가기

[ST_MICRO]/STM32WB

STM32WB55 SSM - STM32CubeIDE에서 RTC 테스트

STM32WB는 STM32와 동일한 코드를 이용해서 무선 기능을 사용할 수 있다. 하지만 기존 STM32와 약간 다른 사항들이 있는것 같은데 테스트 하면서 정리해 보자

저전력 모드에서 일정시간(30분) 마다 깨어나서 Zigbee 데이터를 전송하려면 RTC가 필수다. 

 

RTC 기능을 테스트 해 보자.

RTC Enable하면 에러 발생한다.

 

내부 RTC(LSI)로 할당해서 그런것 같다. 외부 RTC(LSE) 로 설정하니 정상 동작 한다.

 

 

 

RTC 초기화 코드

static void MX_RTC_Init(void)
{

  /* USER CODE BEGIN RTC_Init 0 */
#define RTC_ASYNCH_PREDIV    0x7F
#define RTC_SYNCH_PREDIV     0x0FF
  /* USER CODE END RTC_Init 0 */

  RTC_TimeTypeDef sTime = {0};
  RTC_DateTypeDef sDate = {0};
  RTC_AlarmTypeDef sAlarm = {0};

  /* USER CODE BEGIN RTC_Init 1 */

  /* USER CODE END RTC_Init 1 */

  /** Initialize RTC Only
  */
  hrtc.Instance = RTC;
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  hrtc.Init.AsynchPrediv = 127;
  hrtc.Init.SynchPrediv = 255;
  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    Error_Handler();
  }

  /* USER CODE BEGIN Check_RTC_BKUP */
  sTime.Hours = 0x2;
  sTime.Minutes = 0x0;
  sTime.Seconds = 0x0;
  sTime.SubSeconds = 0x0;
  sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
  sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
  sDate.Month = RTC_MONTH_JUNE;
  sDate.Date = 0x16;
  sDate.Year = 0x22;
  if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
  {
    Error_Handler();
  }
}

 

 

RTC 값을 읽어와 출력하면 정상 출력 되는것을 확인 할 수 있다.

static void RTC_CalendarShow(void)
{
  RTC_DateTypeDef sdatestructureget;
  RTC_TimeTypeDef stimestructureget;

  /* Get the RTC current Time */
  HAL_RTC_GetTime(&hrtc, &stimestructureget, RTC_FORMAT_BIN);
  /* Get the RTC current Date */
  HAL_RTC_GetDate(&hrtc, &sdatestructureget, RTC_FORMAT_BIN);

  /* Display time Format : hh:mm:ss */
  printf("%.2d:%.2d:%.2d  ", stimestructureget.Hours, stimestructureget.Minutes, stimestructureget.Seconds);
  /* Display date Format : mm-dd-yy */
  printf("%.2d-%.2d-%.2d\r\n", sdatestructureget.Month, sdatestructureget.Date, 2000 + sdatestructureget.Year);
}

 

 

STM32WB RTC 출력 결과

02:06:30  06-16-2022

02:06:31  06-16-2022

02:06:32  06-16-2022

 

 

이제 RTC 인터럽트 처리를 해 볼까?

기존 STM32와 다른점이 있다. 기존 코드는 RTC 인터럽트 핸들러 에서 1초 단위로 뭔가 처리했는데…

STM32WB는 RTC_IRQHandler 가 없다

void RTC_IRQHandler(void)
{
  /* USER CODE BEGIN RTC_IRQn 0 */
  static uint8_t rtc_first_ignore = 0;

  /* USER CODE END RTC_IRQn 0 */
  HAL_RTC_AlarmIRQHandler(&hrtc);
  /* USER CODE BEGIN RTC_IRQn 1 */

          rtc_flag_set = 1;
          RF433_trans_time++;
          RF433_msg_flag=1;
          
#if     CowWalk_Test
          uint32_t random_number = 0;
                    srand(HAL_GetTick());
    
                    random_number = rand();       
                    
                    random_number = random_number % 1000;

                    Cowstat.AccelIntTable[17][AccelGroup-1] = random_number;
#endif
          
}

 

 

STM32WB 예제를 찾아 보니 RTC_WKUP_IRQHandler 함수가 있다.

이걸 사용하면 될것 같은데…

 

인터럽트 핸들러

void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
	Led1Toggle();
	RTC_CalendarShow();
}

 

이렇게 하니 1초에 한번씩 RTC값을 출력하는 동작을 잘 수행 한다.

 

TimeStamp도 동작하는것을 확인 했다.

 

반응형