You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

252 lines
4.7 KiB

/*
guihal.c
*/
#include "stm32l031xx.h"
#include "gui.h"
/*============================================*/
/* reset */
void do_reset(void)
{
/* clear the display first, to provide some visual feedback to the user */
u8g2_ClearDisplay(gui_menu.u8g2);
__disable_irq();
/* Deactivate tamper so that the uC can be programmed via UART */
/* This is required, because RX pin is shared with Tamp2 */
RTC->WPR = 0x0ca; /* disable RTC write protection */
RTC->WPR = 0x053;
EXTI->IMR &= ~EXTI_IMR_IM19; /* disable tamper irq */
RTC->TAMPCR = 0; /* clear tamper detection */
RTC->WPR = 0; /* disable RTC write protection */
RTC->WPR = 0;
/* execute reset */
NVIC_SystemReset();
}
/*============================================*/
/* load & store from/to permanent memory */
/* 5x 32bit */
void store_gui_data(uint32_t *data)
{
RTC->BKP0R = data[0];
RTC->BKP1R = data[1];
RTC->BKP2R = data[2];
RTC->BKP3R = data[3];
RTC->BKP4R = data[4];
}
void load_gui_data(uint32_t *data)
{
int i;
for( i = 0; i < GUI_ALARM_CNT; i++ )
data[i] = 0;
data[0] = RTC->BKP0R;
data[1] = RTC->BKP1R;
data[2] = RTC->BKP2R;
data[3] = RTC->BKP3R;
data[4] = RTC->BKP4R;
}
/*============================================*/
/* input */
int is_por_reset(void)
{
return 1;
}
int is_button_reset(void)
{
return 0;
}
uint32_t get_boot_status_register(void)
{
/* POR: 00001100 (POR=1, PIN=1), reset pin has RC network connected */
/* Boot via NVIC: 00011100, compared to POR, the SW Reset flag is also set */
return RCC->CSR >> 24;
}
extern volatile unsigned long PWR_CSR_Backup;
uint32_t get_pwr_status_register(void)
{
/*
Bit 1 SBF: Standby flag
This bit is set by hardware and cleared only by a POR/PDR (power-on reset/power-down
reset) or by setting the CSBF bit in the PWR power control register (PWR_CR)
0: Device has not been in Standby mode
1: Device has been in Standby mode
Bit 0 WUF: Wakeup flag
This bit is set by hardware and cleared by a system reset or by setting the CWUF bit in the
PWR power control register (PWR_CR)
0: No wakeup event occurred
1: A wakeup event was received from the WKUP pin or from the RTC
POR (voltage off-on): 00
Reset Button: 00
WUF Reset: 11
*/
return PWR_CSR_Backup & 255;
}
extern volatile unsigned long ResetReason;
uint32_t get_reset_reason(void)
{
return ResetReason;
}
extern volatile unsigned long RTCWUCount;
uint32_t get_wakeup_count(void)
{
return RTCWUCount;
}
int is_dst_by_date(uint8_t region);
uint32_t get_dst_by_date(void)
{
return is_dst_by_date(1);
}
uint32_t get_dst_by_RTC(void)
{
uint32_t dst_state = 0;
if ( RTC->CR & RTC_CR_BCK ) /* BKP flag in the CR register */
dst_state = 1;
return dst_state;
}
/*============================================*/
/* output */
void SetAlarmSequence(const uint8_t *alarm_sequence);
extern const uint8_t ASeqTrippleBeep[];
void enable_alarm(void)
{
SetAlarmSequence(ASeqTrippleBeep);
}
void disable_alarm(void)
{
SetAlarmSequence(NULL);
}
void set_time(uint8_t ht, uint8_t ho, uint8_t mt, uint8_t mo, uint8_t st, uint8_t so)
{
uint32_t v;
v = ht;
v <<= 4,
v |= ho;
v <<= 4;
v |= mt;
v <<= 4;
v |= mo;
v <<= 4;
v |= st;
v <<= 4;
v |= so;
__disable_irq();
RTC->WPR = 0x0ca; /* disable RTC write protection */
RTC->WPR = 0x053;
RTC->ISR = RTC_ISR_INIT; /* request RTC stop */
while((RTC->ISR & RTC_ISR_INITF)!=RTC_ISR_INITF) /* wait for stop */
;
RTC->PRER = 0x07f00ff; /* 1 Hz clock */
RTC->TR = v;
RTC->ISR =~ RTC_ISR_INIT; /* start RTC */
RTC->WPR = 0; /* enable RTC write protection */
RTC->WPR = 0;
__enable_irq();
}
/*
weekday: 0 = monday
*/
void set_date(uint8_t yt, uint8_t yo, uint8_t mt, uint8_t mo, uint8_t dayt, uint8_t dayo, uint8_t weekday)
{
uint32_t v;
v = yt;
v <<= 4,
v |= yo;
v <<= 3;
v |= weekday+1; /* monday starts with 1 on the STM32L0 */
v <<= 1;
v |= mt;
v <<= 4;
v |= mo;
v <<= 4;
v |= dayt;
v <<= 4;
v |= dayo;
__disable_irq();
RTC->WPR = 0x0ca; /* disable RTC write protection */
RTC->WPR = 0x053;
RTC->ISR = RTC_ISR_INIT; /* request RTC stop */
while((RTC->ISR & RTC_ISR_INITF)!=RTC_ISR_INITF) /* wait for stop */
;
RTC->PRER = 0x07f00ff; /* 1 Hz clock */
RTC->DR = v;
RTC->ISR =~ RTC_ISR_INIT; /* start RTC */
RTC->WPR = 0; /* enable RTC write protection */
RTC->WPR = 0;
__enable_irq();
}
/* value 1..7, 0 is default (do not set) */
void set_contrast(void)
{
uint8_t v = gui_data.contrast;
if ( v > 0 )
{
v = v * 36;
u8g2_SetContrast(gui_menu.u8g2, v);
}
}