main.rs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. #![cfg_attr(test, allow(unused_imports))]
  2. #![cfg_attr(not(test), no_std)]
  3. #![cfg_attr(not(test), no_main)]
  4. // pick a panicking behavior
  5. #[cfg(not(test))]
  6. use core::panic::PanicInfo; // custom panic handler
  7. // use cortex_m::asm;
  8. use core::{cell::RefCell, ops::DerefMut};
  9. use cortex_m::{interrupt::free, interrupt::Mutex, peripheral::NVIC};
  10. use cortex_m_rt::entry;
  11. use cortex_m_semihosting::hprintln;
  12. // use stm32l4::stm32l4x2::interrupt;
  13. use stm32l4xx_hal::{
  14. delay::Delay,
  15. gpio::State,
  16. gpio::{Edge, Input, Output, PullUp, PushPull, PA3, PC15},
  17. interrupt, pac,
  18. prelude::*,
  19. rcc,
  20. stm32::Interrupt,
  21. };
  22. static FAULT_INT: Mutex<RefCell<Option<PA3<Input<PullUp>>>>> = Mutex::new(RefCell::new(None));
  23. static FAULT_LED: Mutex<RefCell<Option<PC15<Output<PushPull>>>>> = Mutex::new(RefCell::new(None));
  24. #[cfg(not(test))]
  25. #[entry]
  26. fn main() -> ! {
  27. hprintln!("Hello, world!").unwrap();
  28. // Acquire a singleton instance for the chip's peripherals
  29. let mut dp = pac::Peripherals::take().unwrap();
  30. let cp = pac::CorePeripherals::take().unwrap();
  31. // let cp = cortex_m::Peripherals::take().unwrap();
  32. // Consume the raw peripheral and return a new object that implements a higher level API
  33. let mut flash = dp.FLASH.constrain();
  34. let mut rcc = dp.RCC.constrain();
  35. let mut pwr = dp.PWR.constrain(&mut rcc.apb1r1);
  36. // Configure clocks to run at maximum frequency off internal oscillator
  37. let clocks = rcc
  38. .cfgr
  39. .pll_source(rcc::PllSource::HSI16)
  40. .sysclk(80.mhz())
  41. .hclk(80.mhz())
  42. .pclk1(80.mhz())
  43. .pclk2(80.mhz())
  44. .freeze(&mut flash.acr, &mut pwr);
  45. // Split GPIO peripheral into independent pins and registers
  46. // let mut gpiob = dp.GPIOB.split(&mut rcc.ahb2);
  47. let mut gpioa = dp.GPIOA.split(&mut rcc.ahb2);
  48. let mut gpioc = dp.GPIOC.split(&mut rcc.ahb2);
  49. // Configure fault LED output on PC15
  50. let fault_led = gpioc.pc15.into_push_pull_output_with_state(
  51. &mut gpioc.moder,
  52. &mut gpioc.otyper,
  53. State::Low,
  54. );
  55. // Store fault LED in global static variable as it is accessed in interrupts
  56. free(|cs| {
  57. FAULT_LED.borrow(cs).replace(Some(fault_led));
  58. });
  59. // Configure fault input interrupt on PA3
  60. let mut fault_int = gpioa
  61. .pa3
  62. .into_pull_up_input(&mut gpioa.moder, &mut gpioa.pupdr);
  63. fault_int.make_interrupt_source(&mut dp.SYSCFG, &mut rcc.apb2);
  64. fault_int.enable_interrupt(&mut dp.EXTI);
  65. fault_int.trigger_on_edge(&mut dp.EXTI, Edge::FALLING);
  66. // Configure NVIC mask to enable interrupt source
  67. unsafe {
  68. NVIC::unmask(Interrupt::EXTI3);
  69. }
  70. // Store fault input in global static variable as it is accessed in interrupt
  71. free(|cs| {
  72. FAULT_INT.borrow(cs).replace(Some(fault_int));
  73. });
  74. // Start with HV PSU disabled (enable pin on PA2)
  75. let mut _hv_en =
  76. gpioa
  77. .pa2
  78. .into_push_pull_output_with_state(&mut gpioa.moder, &mut gpioa.otyper, State::Low);
  79. // Configure abstract timer that operates off systick timer
  80. let mut timer = Delay::new(cp.SYST, clocks);
  81. loop {
  82. timer.delay_ms(1000_u32);
  83. set_fault_led(State::High);
  84. timer.delay_ms(1000_u32);
  85. set_fault_led(State::Low);
  86. }
  87. }
  88. fn set_fault_led(on: State) {
  89. free(|cs| {
  90. let mut led_ref = FAULT_LED.borrow(cs).borrow_mut();
  91. if let Some(ref mut led) = led_ref.deref_mut() {
  92. match on {
  93. State::High => led.set_high().unwrap(),
  94. State::Low => led.set_low().unwrap(),
  95. };
  96. }
  97. });
  98. }
  99. #[interrupt]
  100. fn EXTI3() {
  101. free(|cs| {
  102. let mut nfault_ref = FAULT_INT.borrow(cs).borrow_mut();
  103. if let Some(ref mut nfault) = nfault_ref.deref_mut() {
  104. if nfault.check_interrupt() {
  105. hprintln!("Fault pin interrupt triggered!").unwrap();
  106. // nfault.clear_interrupt_pending_bit();
  107. panic!();
  108. }
  109. }
  110. });
  111. }
  112. #[panic_handler]
  113. #[cfg(not(test))]
  114. /// Custom panic handler
  115. fn panic(info: &PanicInfo) -> ! {
  116. if let Some(location) = info.location() {
  117. hprintln!(
  118. "Panic in file '{}' at line {}",
  119. location.file(),
  120. location.line()
  121. )
  122. .unwrap();
  123. } else {
  124. hprintln!("Panic'd!").unwrap();
  125. }
  126. loop {
  127. continue;
  128. }
  129. }
  130. #[cfg(test)]
  131. mod test {
  132. use super::*;
  133. fn add(a: i32, b: i32) -> i32 {
  134. a + b
  135. }
  136. #[test]
  137. fn foo() {
  138. println!("tests work!");
  139. assert!(2 == add(1, 1));
  140. }
  141. }