first working deep sleep entry with all peripherals enabled prior
This commit is contained in:
parent
cd91b3f540
commit
b6fa0e3b2d
4 changed files with 164 additions and 52 deletions
|
|
@ -1 +1 @@
|
||||||
Subproject commit f41336744c4e2548c8f6ba9b323ae4aa39959f1d
|
Subproject commit 4f11d68e62dcb0e7098eecf357168724a8322d80
|
||||||
|
|
@ -551,16 +551,20 @@ impl App {
|
||||||
pub fn shut_down(&mut self) {
|
pub fn shut_down(&mut self) {
|
||||||
self.interfaces
|
self.interfaces
|
||||||
.pwm_core
|
.pwm_core
|
||||||
.write_amplitude(self.services.led0.channel, 0);
|
.disable(ch32_hal::timer::Channel::Ch1);
|
||||||
self.interfaces
|
self.interfaces
|
||||||
.pwm_core
|
.pwm_core
|
||||||
.write_amplitude(self.services.led1.channel, 0);
|
.disable(ch32_hal::timer::Channel::Ch2);
|
||||||
// self.interfaces
|
self.interfaces
|
||||||
// .pwm_core
|
.pwm_core
|
||||||
// .write_amplitude(self.services.led2.channel, 0);
|
.disable(ch32_hal::timer::Channel::Ch3);
|
||||||
self.interfaces
|
self.interfaces
|
||||||
.pwm_core
|
.pwm_core
|
||||||
.disable(ch32_hal::timer::Channel::Ch4);
|
.disable(ch32_hal::timer::Channel::Ch4);
|
||||||
|
|
||||||
|
self.interfaces.pwm_core.pwm.borrow().shutdown();
|
||||||
|
self.interfaces.adc_core.shutdown();
|
||||||
|
|
||||||
self.interfaces.amp.disable();
|
self.interfaces.amp.disable();
|
||||||
}
|
}
|
||||||
pub fn volume_button(&mut self) {
|
pub fn volume_button(&mut self) {
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ use crate::insert_coin::services::{DacService, LedService, Service, TickService,
|
||||||
// static LED1_DCS: [u8; 5] = [0u8, 25u8, 50u8, 75u8, 100u8];
|
// static LED1_DCS: [u8; 5] = [0u8, 25u8, 50u8, 75u8, 100u8];
|
||||||
|
|
||||||
pub struct SimplePwmCore<'d, T: GeneralInstance16bit> {
|
pub struct SimplePwmCore<'d, T: GeneralInstance16bit> {
|
||||||
pwm: core::cell::RefCell<SimplePwm<'d, T>>,
|
pub pwm: core::cell::RefCell<SimplePwm<'d, T>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'d, T: GeneralInstance16bit> SimplePwmCore<'d, T> {
|
impl<'d, T: GeneralInstance16bit> SimplePwmCore<'d, T> {
|
||||||
|
|
|
||||||
|
|
@ -126,6 +126,10 @@ impl AdcCore {
|
||||||
}
|
}
|
||||||
sum / self.batt_values.len() as u16
|
sum / self.batt_values.len() as u16
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn shutdown(&mut self) {
|
||||||
|
self.adc.shutdown()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
@ -244,7 +248,7 @@ bind_interrupts!(struct Irqs {
|
||||||
use insert_coin::TickTimerService;
|
use insert_coin::TickTimerService;
|
||||||
use insert_coin::{TickService, TickServiceData};
|
use insert_coin::{TickService, TickServiceData};
|
||||||
|
|
||||||
fn app_main(mut p: hal::Peripherals) -> ! {
|
fn app_main(mut p: hal::Peripherals) {
|
||||||
// === output setup ===
|
// === output setup ===
|
||||||
|
|
||||||
// LED0 output setup
|
// LED0 output setup
|
||||||
|
|
@ -309,8 +313,8 @@ fn app_main(mut p: hal::Peripherals) -> ! {
|
||||||
let volume_btn_pin = p.PC6;
|
let volume_btn_pin = p.PC6;
|
||||||
let light_ctrl_btn_pin = p.PC7;
|
let light_ctrl_btn_pin = p.PC7;
|
||||||
let amp_en = p.PC5;
|
let amp_en = p.PC5;
|
||||||
let extra_io_1 = p.PD0;
|
// let extra_io_1 = p.PD0;
|
||||||
let extra_io_2 = p.PD3;
|
// let extra_io_2 = p.PD3;
|
||||||
|
|
||||||
let mut amp_en_output = OutputOpenDrain::new(amp_en, Level::Low, Default::default());
|
let mut amp_en_output = OutputOpenDrain::new(amp_en, Level::Low, Default::default());
|
||||||
let amp = Amplifier::new(amp_en_output);
|
let amp = Amplifier::new(amp_en_output);
|
||||||
|
|
@ -340,6 +344,7 @@ fn app_main(mut p: hal::Peripherals) -> ! {
|
||||||
led0_timer_ms: 100,
|
led0_timer_ms: 100,
|
||||||
led1_timer_ms: 100,
|
led1_timer_ms: 100,
|
||||||
// 4 hours:
|
// 4 hours:
|
||||||
|
// shutdown_timer_s: 1,
|
||||||
shutdown_timer_s: 4 * 60 * 60,
|
shutdown_timer_s: 4 * 60 * 60,
|
||||||
// led2_timer_ms: 100,
|
// led2_timer_ms: 100,
|
||||||
};
|
};
|
||||||
|
|
@ -516,48 +521,8 @@ fn app_main(mut p: hal::Peripherals) -> ! {
|
||||||
// enter standby
|
// enter standby
|
||||||
app::State::DeepSleep => {
|
app::State::DeepSleep => {
|
||||||
app.shut_down();
|
app.shut_down();
|
||||||
|
return;
|
||||||
loop {
|
|
||||||
unsafe {
|
|
||||||
#[allow(static_mut_refs)]
|
|
||||||
INPUT_FLAGS.sense_coin_flag.clear();
|
|
||||||
#[allow(static_mut_refs)]
|
|
||||||
INPUT_FLAGS.main_btn_flag.clear();
|
|
||||||
}
|
}
|
||||||
unsafe { system::enter_standby() };
|
|
||||||
riscv::asm::wfi();
|
|
||||||
unsafe {
|
|
||||||
#[allow(static_mut_refs)]
|
|
||||||
if (INPUT_FLAGS.sense_coin_flag.active()
|
|
||||||
|| (INPUT_FLAGS.main_btn_flag.active()
|
|
||||||
&& main_btn_input.is_high_immediate()))
|
|
||||||
&& app.should_wake()
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let mut config = hal::Config::default();
|
|
||||||
config.rcc = hal::rcc::Config::SYSCLK_FREQ_48MHZ_HSI;
|
|
||||||
unsafe {
|
|
||||||
hal::rcc::init(config.rcc);
|
|
||||||
}
|
|
||||||
unsafe {
|
|
||||||
use hal::pac::Interrupt;
|
|
||||||
use qingke::interrupt::Priority;
|
|
||||||
use qingke_rt::CoreInterrupt;
|
|
||||||
|
|
||||||
system::clear_interrupt(2, 6);
|
|
||||||
|
|
||||||
qingke::pfic::set_priority(CoreInterrupt::SysTick as u8, Priority::P15 as u8);
|
|
||||||
|
|
||||||
qingke::pfic::enable_interrupt(Interrupt::EXTI7_0 as u8);
|
|
||||||
qingke::pfic::enable_interrupt(CoreInterrupt::SysTick as u8);
|
|
||||||
}
|
|
||||||
|
|
||||||
app.set_state(State::Active);
|
|
||||||
}
|
|
||||||
// for everything else, don't do anything
|
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -573,6 +538,137 @@ fn app_main(mut p: hal::Peripherals) -> ! {
|
||||||
// // }
|
// // }
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
use ch32_hal::timer::low_level::{OutputCompareMode, Timer};
|
||||||
|
use ch32_hal::timer::Channel;
|
||||||
|
|
||||||
|
// fn shutdown_main(p: Peripherals) {
|
||||||
|
fn shutdown_main(p: hal::Peripherals) {
|
||||||
|
// drop(p.TIM1);
|
||||||
|
// LED0 output setup
|
||||||
|
let led0_pin = OutputOpenDrain::new(p.PC3, Level::Low, Default::default());
|
||||||
|
let led1_pin = OutputOpenDrain::new(p.PD2, Level::High, Default::default());
|
||||||
|
let led2_pin = OutputOpenDrain::new(p.PA1, Level::High, Default::default());
|
||||||
|
let dac_pin = OutputOpenDrain::new(p.PC4, Level::Low, Default::default());
|
||||||
|
let mut amp_pin = OutputOpenDrain::new(p.PC5, Level::Low, Default::default());
|
||||||
|
amp_pin.set_high();
|
||||||
|
let volume_btn_pin = OutputOpenDrain::new(p.PC6, Level::Low, Default::default());
|
||||||
|
let light_ctrl_btn_pin = OutputOpenDrain::new(p.PC7, Level::Low, Default::default());
|
||||||
|
let usb_detect_input = OutputOpenDrain::new(p.PD5, Level::Low, Default::default());
|
||||||
|
|
||||||
|
let sense_coin_pin = p.PC2;
|
||||||
|
let main_btn_pin = p.PD6;
|
||||||
|
|
||||||
|
unsafe { system::init_gpio_irq(sense_coin_pin.pin(), sense_coin_pin.port(), true, false) };
|
||||||
|
unsafe { system::init_gpio_irq(main_btn_pin.pin(), main_btn_pin.port(), true, true) };
|
||||||
|
|
||||||
|
let sense_coin_pin = Input::new(sense_coin_pin, Pull::None);
|
||||||
|
let main_btn_pin = Input::new(main_btn_pin, Pull::None);
|
||||||
|
|
||||||
|
let mut t = Timer::new(p.TIM1);
|
||||||
|
// // t.stop();
|
||||||
|
// // t.enable_channel(ch32_hal::timer::Channel::Ch1, false);
|
||||||
|
// // t.enable_channel(ch32_hal::timer::Channel::Ch2, false);
|
||||||
|
// // t.enable_channel(ch32_hal::timer::Channel::Ch3, false);
|
||||||
|
// // t.enable_channel(ch32_hal::timer::Channel::Ch4, false);
|
||||||
|
// // t.enable_update_interrupt(false);
|
||||||
|
// // t.set_moe(false);
|
||||||
|
|
||||||
|
t.set_counting_mode(CountingMode::default());
|
||||||
|
t.set_frequency(Hertz::khz(300));
|
||||||
|
t.enable_outputs();
|
||||||
|
t.start();
|
||||||
|
|
||||||
|
[Channel::Ch1, Channel::Ch2, Channel::Ch3, Channel::Ch4]
|
||||||
|
.iter()
|
||||||
|
.for_each(|&channel| {
|
||||||
|
t.set_output_compare_mode(channel, OutputCompareMode::PwmMode1);
|
||||||
|
t.set_output_compare_preload(channel, true);
|
||||||
|
t.set_compare_value(channel, 1000);
|
||||||
|
t.enable_channel(channel, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
// [Channel::Ch1, Channel::Ch2, Channel::Ch3, Channel::Ch4]
|
||||||
|
// .iter()
|
||||||
|
// .for_each(|&channel| {
|
||||||
|
// t.set_output_compare_mode(channel, OutputCompareMode::PwmMode1);
|
||||||
|
// t.set_output_compare_preload(channel, false);
|
||||||
|
// t.enable_channel(channel, false);
|
||||||
|
// });
|
||||||
|
|
||||||
|
// t.stop();
|
||||||
|
// t.disable_outputs()
|
||||||
|
|
||||||
|
// PWM timer setup
|
||||||
|
// let mut pwm = SimplePwm::new(
|
||||||
|
// p.TIM1,
|
||||||
|
// None,
|
||||||
|
// // Some(led2_pin),
|
||||||
|
// None,
|
||||||
|
// None,
|
||||||
|
// None,
|
||||||
|
// Hertz::hz(1),
|
||||||
|
// CountingMode::default(),
|
||||||
|
// );
|
||||||
|
// drop(pwm);
|
||||||
|
|
||||||
|
// pwm.disable();
|
||||||
|
|
||||||
|
riscv::asm::delay(1_000_000);
|
||||||
|
// let sense_coin_pin = p.PC2;
|
||||||
|
// let main_btn_pin = p.PD6;
|
||||||
|
// let volume_btn_pin = p.PC6;
|
||||||
|
// let light_ctrl_btn_pin = p.PC7;
|
||||||
|
|
||||||
|
unsafe { system::enter_standby() };
|
||||||
|
riscv::asm::wfi();
|
||||||
|
|
||||||
|
// t.set_moe(false);
|
||||||
|
// // pwm.shutdown();
|
||||||
|
|
||||||
|
// riscv::asm::delay(1_000_000);
|
||||||
|
|
||||||
|
// unsafe { system::enter_standby() };
|
||||||
|
// riscv::asm::wfi();
|
||||||
|
// let mut b = t.get_compare_value(Channel::Ch1);
|
||||||
|
// b += 1;
|
||||||
|
// loop {
|
||||||
|
// unsafe {
|
||||||
|
// #[allow(static_mut_refs)]
|
||||||
|
// INPUT_FLAGS.sense_coin_flag.clear();
|
||||||
|
// #[allow(static_mut_refs)]
|
||||||
|
// INPUT_FLAGS.main_btn_flag.clear();
|
||||||
|
// }
|
||||||
|
// unsafe { system::enter_standby() };
|
||||||
|
// riscv::asm::wfi();
|
||||||
|
// unsafe {
|
||||||
|
// #[allow(static_mut_refs)]
|
||||||
|
// if (INPUT_FLAGS.sense_coin_flag.active()
|
||||||
|
// || (INPUT_FLAGS.main_btn_flag.active() && main_btn_input.is_high_immediate()))
|
||||||
|
// && app.should_wake()
|
||||||
|
// {
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// let mut config = hal::Config::default();
|
||||||
|
// config.rcc = hal::rcc::Config::SYSCLK_FREQ_48MHZ_HSI;
|
||||||
|
// unsafe {
|
||||||
|
// hal::rcc::init(config.rcc);
|
||||||
|
// }
|
||||||
|
// unsafe {
|
||||||
|
// use hal::pac::Interrupt;
|
||||||
|
// use qingke::interrupt::Priority;
|
||||||
|
// use qingke_rt::CoreInterrupt;
|
||||||
|
|
||||||
|
// system::clear_interrupt(2, 6);
|
||||||
|
|
||||||
|
// qingke::pfic::set_priority(CoreInterrupt::SysTick as u8, Priority::P15 as u8);
|
||||||
|
|
||||||
|
// qingke::pfic::enable_interrupt(Interrupt::EXTI7_0 as u8);
|
||||||
|
// qingke::pfic::enable_interrupt(CoreInterrupt::SysTick as u8);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
#[qingke_rt::entry]
|
#[qingke_rt::entry]
|
||||||
fn main() -> ! {
|
fn main() -> ! {
|
||||||
#[cfg(feature = "enable_print")]
|
#[cfg(feature = "enable_print")]
|
||||||
|
|
@ -588,7 +684,19 @@ fn main() -> ! {
|
||||||
// println!("post");
|
// println!("post");
|
||||||
// debug_main(p);
|
// debug_main(p);
|
||||||
|
|
||||||
|
loop {
|
||||||
|
unsafe {
|
||||||
|
hal::rcc::init(hal::rcc::Config::SYSCLK_FREQ_48MHZ_HSI);
|
||||||
|
}
|
||||||
|
let mut p = unsafe { hal::Peripherals::steal() };
|
||||||
app_main(p);
|
app_main(p);
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
hal::rcc::init(hal::rcc::Config::SYSCLK_FREQ_48MHZ_HSI);
|
||||||
|
}
|
||||||
|
let mut p = unsafe { hal::Peripherals::steal() };
|
||||||
|
shutdown_main(p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[panic_handler]
|
#[panic_handler]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue