|
本帖最后由 ChenXC1121 于 2020-4-18 16:20 编辑
使用STM32L011的RTC功能实现1秒唤醒一次单片机STOP低功耗模式,并进行ADC采样和把数据写入EEPROM,之后又进入STOP模式。一开始还没实现ADC采样和EEPROM功能,只是在RTC中断中对PB1实现电平翻转,然后用50M的逻辑分析仪测得PB1的脉宽为1.000018S,并且这时在退出STOP模式后增加HAL_Delay(50) 50ms的延时,测得PB1的脉宽仍为1.000018S,之后增加ADC采样和EEPROM功能,RTC的初始化函数没修改,只是将前面的50ms延时换成了ADC采样函数和EEPROM写入函数,这时再用逻辑分析仪测量PB1的脉宽,发现竟然变成了1.000109S,很奇怪,不知道是哪里出了问题,请各位大神帮忙看下,感激不尽。。。
使用这个芯片时间不是很长,RTC中断函数不知道会不会有什么标志位没清除,还请高手帮忙指导下,谢谢!
我的主程序流程是每计数5秒就有1秒会执行ADC操作和EEPROM操作,其它4秒都是唤醒后又马上进入低功耗模式,测量出来的波形就是有4个脉宽是1.000018S,1个脉宽是1.000109S。
今天发现我用PA7输出高电平给ADC供电,只要该管脚置高,RTC的中断周期就会从1.000018us变化成1.000076us,难道STM32L0的IO脚输出几mA的电流就会影响到RTC的运行?之后我改用PB7给ADC供电,仍会出现该问题。
下面是我的RTC初始化函数
HAL_StatusTypeDef ret = HAL_OK;
RTCHandle.Instance = RTC;
RTCHandle.Init.HourFormat = RTC_HOURFORMAT_24;
RTCHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
RTCHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;
RTCHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
RTCHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
RTCHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
ret = HAL_RTC_Init(&RTCHandle);
if (ret != HAL_OK) while (1);
stop_rtc_config(0);
stop_rtc_config函数如下:
static void stop_rtc_config(uint32_t sleep)
{
/* Disable Wakeup Counter */
HAL_RTCEx_DeactivateWakeUpTimer(&RTCHandle);
/*## Setting the Wake up time */
HAL_RTCEx_SetWakeUpTimer_IT(&RTCHandle, sleep, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);
}
RTC中断处理函数如下:
void RTC_IRQHandler(void)
{
HAL_RTCEx_WakeUpTimerIRQHandler(&RTCHandle);
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
rtc_flag=1;
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_1);
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|