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도 동작하는것을 확인 했다.
반응형