STM32F1 RTC 当成 ms 等级计时 / 延迟使用
这一天天的, 用 F103C8不好吗? 一定要改 F103C6
Timer 少一个, 捣鼓了一下, 用 RTC SECIE 来作, 不很准, 够用。
( OWIE : CNT Overflow, ALRIE: Alarm IE 这两个不适用)
概念上是以 STM32 RTC 使用 内部 LSI 40KHz 当 Clock.
/*
* AsynchPrediv = 38, 39, 40
* 这数值依每一个STM32内部 LSI 40KHz 来微调.
* 以实际系统为准, 在 DEBUG 模式中的数据不准!
*/
hrtc.Instance = RTC;
hrtc.Init.AsynchPrediv = 39;
hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
HAL_RTC_Init(&hrtc);
要自己打开 RTC.CRH SECIE 中断
void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
{
if(rtcHandle->Instance==RTC)
{
/* USER CODE BEGIN RTC_MspInit 0 */
/* USER CODE END RTC_MspInit 0 */
HAL_PWR_EnableBkUpAccess();
/* Enable BKP CLK enable for backup registers */
__HAL_RCC_BKP_CLK_ENABLE();
/* RTC clock enable */
__HAL_RCC_RTC_ENABLE();
/* RTC interrupt Init */
HAL_NVIC_SetPriority(RTC_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(RTC_IRQn);
/* USER CODE BEGIN RTC_MspInit 1 */
// Set CNF for program RTC->CRH
RTC->CRL |= RTC_CRL_CNF;
RTC->CRH |= RTC_CRH_SECIE;
/* USER CODE END RTC_MspInit 1 */
}
}
在 RTC IRQ中, 加上 Tick++
uint32_t msRTC_Tick = 0;
void RTC_IRQHandler(void)
{
// RTOFF must 1 , before change RTC Registers
if(RTC_FLAG_RTOFF && RTC->CRL)
{
// Make sure IRQ actibe by SECF
if( RTC->CRL && RTC_FLAG_SEC )
{
// Clear SECF flag
RTC->CRL &= (~RTC_FLAG_SEC);
++msRTC_Tick;
}
}
}
STM32F1 RTC 当成 ms 等级计时/延迟使用 @LSI 40KHz
资料, 仅供参考。
数据剪辑自原厂规格书, 版权归原所有人拥有。
档案取自互联网!如有侵权或不适用情形, 请联系移除!
** 使用有风险, 请详阅原厂使用说明!
** 范例码为自用,请谨慎引用, Ctrl-C, Ctrl-V结果自行承担!