Mục tiêu
- Cấu hình RTC với interrupt trong CubeMX
- Tạo RTC project đơn giản với báo thức theo thời gian định sẵn
Kết quả
- Sử dụng CubeIDE để sinh code RTC
- Cấu hình RTC với HAL
- Kiểm tra lại các chức năng của RTC alarm interrupt
Cấu hình
Tạo project
- Cách làm tương tự như bài hướng dẫn trước File > New > STM32 Project
- Set Internal Alarm trên Alarm A hoặc Alarm B
- Set GPIO chớp LED như là tín hiệu thông báo alarm
Cấu hình clock
- Set clock với tần số tối đa, giống như bài trước
Cấu hình RTC
- RTC > Configuration > Parameter Setting, nhập thông số tùy vào ý thích của bạn
- RTC > Configuration > NVIC Setting > Enable RTC alarm A and B interrupt
Save lại và auto generate code thôi
Workflow
RTC có thể được giữ nguyên trong quá trình RESET (chế độ LP ok)
- Mặc định RTC không được enable
- Ta cần thêm
HAL_PWR_EnableBkUpAccess()
và__HAL_RCC_RTC_ENABLE()
before we trước khi initMX_RTC_Init()
Cấu hình alarm đầu tiên là 1s trong MX_RTC_Init
Tạo RTC interrupt handler và we cấu hình lại Alarm A time với các hàm sau
HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef hrtc)
HAL_RTC_GetAlarm(RTC_HandleTypeDef hrtc, RTC_AlarmTypeDefsAlarm, uint32_t Alarm, uint32_t Format)
HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef hrtc, RTC_AlarmTypeDef*sAlarm, uint32_t Format)
RTC alarm thông báo thành công bởi LED
HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
/* USER CODE BEGIN SysInit */
HAL_PWR_EnableBkUpAccess();//enable PWR backup domain access (RTC,BKReg)
__HAL_RCC_RTC_ENABLE();//Enable RTC. not created by cube because the RTC can run.
/* USER CODE END SysInit */
/* USER CODE BEGIN 4 */
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
RTC_AlarmTypeDef sAlarm;
HAL_RTC_GetAlarm(hrtc, &sAlarm, RTC_ALARM_A, FORMAT_BIN);
if (sAlarm.AlarmTime.Seconds > 58)
{
sAlarm.AlarmTime.Seconds = 0;
}
else
{
sAlarm.AlarmTime.Seconds = sAlarm.AlarmTime.Seconds + 1;
}
while (HAL_RTC_SetAlarm_IT(hrtc, &sAlarm, FORMAT_BIN) != HAL_OK)
{
}
HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_14);
}
/* USER CODE END 4 */
Chương trình bạn có thể tham khảo tại