【前言】
前面我使用TM1637作为时间显示,他的休眠电流还是有700微安的,所以还是不是很好做为的时钟来使用,后面想找个LCD断码屏来,但是没有合适的,翻了一下仓库,找到了一个NOKIA5110显示屏。查了一下参数,他的休眠参数与显示的电流是非常小的。想当年诺基来的手机可以充满电用好几个星期的。所以用这款显示屏来制作一个时钟。
【移植驱动】
NOKIA5110的stm32在网上的驱动非常好找,我在http://stm32f4-discovery.com/pcd8544-nokia-33105110-lcd-stm32f429-discovery-library/
找到一个现成的驱动。
把他移植到工程中,先配置好接口如下:
CLK PA5
DIN PA7
RST PB3
CE PA15
DC PA9
*/
LCD_setRST(GPIOB, GPIO_PIN_3);
LCD_setCE(GPIOA, GPIO_PIN_15);
LCD_setDC(GPIOA, GPIO_PIN_9);
LCD_setDIN(GPIOA, GPIO_PIN_7);
LCD_setCLK(GPIOA, GPIO_PIN_5);
LCD_init();
【配置RTC】
我这里使用每一秒RTC唤醒一次:
/** Enable the Alarm A
*/
sAlarm.AlarmTime.Hours = 0x0;
sAlarm.AlarmTime.Minutes = 0x0;
sAlarm.AlarmTime.Seconds = 0x1;
sAlarm.AlarmTime.SubSeconds = 0x0;
sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
sAlarm.AlarmMask = RTC_ALARMMASK_ALL;
sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
sAlarm.AlarmDateWeekDay = 0x1;
sAlarm.Alarm = RTC_ALARM_A;
if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
【主程序】
为了实现更低的休眠电流,我设计了一个计数器,如果连继10秒没有动作,就把NOKIA5110显示关闭。当按键按下时,再初始化一下NOKIA5110。
while (1)
{
cnt++;
if(cnt>10){
NOKIA5110_CloseDisplay();
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);
}
else {
HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
/* Get the RTC current Date */
HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
sprintf(buff,"%02d:%02d:%02d",sTime.Hours,sTime.Minutes,sTime.Seconds);
LCD_print(buff, 2, 2);
HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
【实验效果】
显示时间:

工作电流:

关闭显示:

【总结】
休眠电流为87微安,非常理想了。stm32C0x进和HAL_PWR_EnterSTANDBYMode
由于不能保存RTC的时钟,要不然可以下降到20微安左右。