Browse Source

initial CRC support

Jihyun Yu 4 năm trước cách đây
mục cha
commit
d1ad35972c
4 tập tin đã thay đổi với 69 bổ sung0 xóa
  1. 27 0
      examples/crc.rs
  2. 39 0
      src/crc.rs
  3. 2 0
      src/lib.rs
  4. 1 0
      src/prelude.rs

+ 27 - 0
examples/crc.rs

@@ -0,0 +1,27 @@
+//! CRC calculation
+
+#![deny(unsafe_code)]
+#![no_main]
+#![no_std]
+
+use panic_halt as _;
+
+use cortex_m_rt::entry;
+use cortex_m_semihosting::hprintln;
+use stm32f1xx_hal::{pac, prelude::*};
+
+#[entry]
+fn main() -> ! {
+    let p = pac::Peripherals::take().unwrap();
+
+    let mut rcc = p.RCC.constrain();
+    let mut crc = p.CRC.new(&mut rcc.ahb);
+
+    crc.reset();
+    crc.write(0x12345678);
+
+    let val = crc.read();
+    hprintln!("found={:08x}, expected={:08x}", val, 0xdf8a8a2bu32).ok();
+
+    loop {}
+}

+ 39 - 0
src/crc.rs

@@ -0,0 +1,39 @@
+//! CRC
+
+use crate::pac::CRC;
+use crate::rcc::{Enable, AHB};
+
+/// Extension trait to constrain the CRC peripheral
+pub trait CrcExt {
+    /// Constrains the CRC peripheral to play nicely with the other abstractions
+    fn new(self, ahb: &mut AHB) -> Crc;
+}
+
+impl CrcExt for CRC {
+    fn new(self, ahb: &mut AHB) -> Crc {
+        CRC::enable(ahb);
+        Crc { crc: self }
+    }
+}
+
+/// Constrained CRC peripheral
+pub struct Crc {
+    crc: CRC,
+}
+
+impl Crc {
+    pub fn read(&self) -> u32 {
+        self.crc.dr.read().bits()
+    }
+
+    pub fn write(&mut self, val: u32) {
+        self.crc.dr.write(|w| w.dr().bits(val))
+    }
+
+    pub fn reset(&self) {
+        self.crc.cr.write(|w| w.reset().set_bit());
+        // calling CRC::dr::write() just after CRC::cr::reset() will not work as expected, and
+        // inserting single nop() seems to solve the problem.
+        cortex_m::asm::nop();
+    }
+}

+ 2 - 0
src/lib.rs

@@ -128,6 +128,8 @@ pub mod backup_domain;
 #[cfg(feature = "device-selected")]
 pub mod bb;
 #[cfg(feature = "device-selected")]
+pub mod crc;
+#[cfg(feature = "device-selected")]
 pub mod delay;
 #[cfg(feature = "device-selected")]
 pub mod dma;

+ 1 - 0
src/prelude.rs

@@ -1,5 +1,6 @@
 pub use crate::adc::ChannelTimeSequence as _stm32_hal_adc_ChannelTimeSequence;
 pub use crate::afio::AfioExt as _stm32_hal_afio_AfioExt;
+pub use crate::crc::CrcExt as _stm32_hal_crc_CrcExt;
 pub use crate::dma::CircReadDma as _stm32_hal_dma_CircReadDma;
 pub use crate::dma::DmaExt as _stm32_hal_dma_DmaExt;
 pub use crate::dma::ReadDma as _stm32_hal_dma_ReadDma;