Skip to content

Commit d8a2d69

Browse files
committed
Working deep sleep via RTC reset, with debug pins
1 parent 6b2c998 commit d8a2d69

File tree

5 files changed

+48
-2
lines changed

5 files changed

+48
-2
lines changed

ports/stm/common-hal/alarm/__init__.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,11 @@ void common_hal_alarm_set_deep_sleep_alarms(size_t n_alarms, const mp_obj_t *ala
141141

142142
//#define NORETURN __attribute__((noreturn))
143143
void NORETURN common_hal_alarm_enter_deep_sleep(void) {
144+
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,1);
145+
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,0);
144146
alarm_pin_pinalarm_prepare_for_deep_sleep();
145-
//port_disable_tick();
147+
port_disable_tick();
148+
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
146149
// alarm_touch_touchalarm_prepare_for_deep_sleep();
147150
// HAL_PWR_EnableBkUpAccess();
148151
// __HAL_RCC_BACKUPRESET_FORCE();

ports/stm/common-hal/alarm/time/TimeAlarm.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#include "supervisor/port.h"
3232
#include "peripherals/rtc.h"
3333

34+
#include STM32_HAL_H
35+
3436
STATIC volatile bool woke_up;
3537

3638
void common_hal_alarm_time_timealarm_construct(alarm_time_timealarm_obj_t *self, mp_float_t monotonic_time) {

ports/stm/peripherals/rtc.c

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ volatile bool alarmed_already[2];
5454
bool peripherals_wkup_on = false;
5555

5656
static void (*wkup_callback)(void);
57-
static void(*alarm_callbacks[2])(void);
57+
static void (*alarm_callbacks[2])(void);
5858

5959
uint32_t stm32_peripherals_get_rtc_freq(void) {
6060
return rtc_clock_frequency;
@@ -154,11 +154,20 @@ void stm32_peripherals_rtc_disable_wakeup_timer(void) {
154154
HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);
155155
}
156156

157+
void stm32_peripherals_reset_alarms(void) {
158+
HAL_RTC_DeactivateAlarm(&hrtc, RTC_ALARM_A);
159+
HAL_RTC_DeactivateAlarm(&hrtc, RTC_ALARM_B);
160+
}
161+
157162
void stm32_peripherals_rtc_assign_alarm_callback(uint8_t alarm_idx, void(*callback)(void)) {
158163
alarm_callbacks[alarm_idx] = callback;
159164
}
160165

161166
void stm32_peripherals_rtc_set_alarm(uint8_t alarm_idx, uint32_t ticks) {
167+
// TEMP: ping set alarm (called by port_interrupt_after_ticks and alarm_time_timealarm_set_alarms)
168+
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,1);
169+
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_6,0);
170+
162171
uint64_t raw_ticks = stm32_peripherals_rtc_raw_ticks(NULL) + ticks;
163172

164173
RTC_AlarmTypeDef alarm;
@@ -187,6 +196,7 @@ void stm32_peripherals_rtc_set_alarm(uint8_t alarm_idx, uint32_t ticks) {
187196
alarm.Alarm = (alarm_idx == PERIPHERALS_ALARM_A) ? RTC_ALARM_A : RTC_ALARM_B;
188197

189198
HAL_RTC_SetAlarm_IT(&hrtc, &alarm, RTC_FORMAT_BIN);
199+
HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
190200
alarmed_already[alarm_idx] = false;
191201
}
192202

@@ -195,6 +205,8 @@ bool stm32_peripherals_rtc_alarm_triggered(uint8_t alarm_idx) {
195205
}
196206

197207
void RTC_WKUP_IRQHandler(void) {
208+
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,1);
209+
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_7,0);
198210
if (wkup_callback) {
199211
wkup_callback();
200212
}
@@ -208,6 +220,10 @@ void RTC_Alarm_IRQHandler(void) {
208220
}
209221

210222
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *_hrtc) {
223+
// TEMP
224+
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,1);
225+
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,0);
226+
211227
if (alarm_callbacks[PERIPHERALS_ALARM_A]) {
212228
alarm_callbacks[PERIPHERALS_ALARM_A]();
213229
}
@@ -216,6 +232,10 @@ void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *_hrtc) {
216232
}
217233

218234
void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *_hrtc) {
235+
//TEMP
236+
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,1);
237+
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,0);
238+
219239
if (alarm_callbacks[PERIPHERALS_ALARM_B]) {
220240
alarm_callbacks[PERIPHERALS_ALARM_B]();
221241
}

ports/stm/peripherals/rtc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ void stm32_peripherals_rtc_set_wakeup_mode_tick(void);
4343
void stm32_peripherals_rtc_enable_wakeup_timer(void);
4444
void stm32_peripherals_rtc_disable_wakeup_timer(void);
4545

46+
void stm32_peripherals_reset_alarms(void);
4647
void stm32_peripherals_rtc_assign_alarm_callback(uint8_t alarm_idx, void(*callback)(void)) ;
4748
void stm32_peripherals_rtc_set_alarm(uint8_t alarm_idx, uint32_t ticks);
4849
bool stm32_peripherals_rtc_alarm_triggered(uint8_t alarm_idx);

ports/stm/supervisor/port.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,10 +173,16 @@ safe_mode_t port_init(void) {
173173
__HAL_RCC_PWR_CLK_ENABLE();
174174
#endif
175175

176+
__HAL_RCC_BACKUPRESET_FORCE();
177+
__HAL_RCC_BACKUPRESET_RELEASE();
178+
176179
stm32_peripherals_clocks_init();
177180
stm32_peripherals_gpio_init();
178181
stm32_peripherals_rtc_init();
179182

183+
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);
184+
stm32_peripherals_reset_alarms();
185+
180186
// Turn off SysTick
181187
SysTick->CTRL = 0;
182188

@@ -233,6 +239,20 @@ void reset_port(void) {
233239
#if CIRCUITPY_PULSEIO || CIRCUITPY_ALARM
234240
exti_reset();
235241
#endif
242+
243+
// TEMP: set up interrupt logging pins
244+
GPIO_InitTypeDef GPIO_InitStruct = {0};
245+
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_7;
246+
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
247+
GPIO_InitStruct.Pull = GPIO_NOPULL;
248+
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
249+
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
250+
GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;
251+
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
252+
253+
// TEMP: ping port init
254+
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,1);
255+
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,0);
236256
}
237257

238258
void reset_to_bootloader(void) {

0 commit comments

Comments
 (0)