Skip to content

Commit

Permalink
initial CRC support
Browse files Browse the repository at this point in the history
  • Loading branch information
yjh0502 committed May 2, 2020
1 parent 1cb9a17 commit 37fb18c
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 3 deletions.
27 changes: 27 additions & 0 deletions examples/crc.rs
Original file line number Diff line number Diff line change
@@ -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 changes: 39 additions & 0 deletions src/crc.rs
Original file line number Diff line number Diff line change
@@ -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) {
unsafe { self.crc.dr.write(|w| w.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 changes: 2 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,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;
Expand Down
7 changes: 4 additions & 3 deletions src/prelude.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
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;
pub use crate::dma::WriteDma as _stm32_hal_dma_WriteDma;
pub use crate::flash::FlashExt as _stm32_hal_flash_FlashExt;
pub use crate::gpio::GpioExt as _stm32_hal_gpio_GpioExt;
pub use crate::hal::adc::OneShot as _embedded_hal_adc_OneShot;
pub use crate::hal::digital::v2::StatefulOutputPin as _embedded_hal_digital_StatefulOutputPin;
pub use crate::hal::digital::v2::ToggleableOutputPin as _embedded_hal_digital_ToggleableOutputPin;
pub use crate::hal::prelude::*;
pub use crate::rcc::RccExt as _stm32_hal_rcc_RccExt;
pub use crate::dma::CircReadDma as _stm32_hal_dma_CircReadDma;
pub use crate::dma::ReadDma as _stm32_hal_dma_ReadDma;
pub use crate::dma::WriteDma as _stm32_hal_dma_WriteDma;
pub use crate::time::U32Ext as _stm32_hal_time_U32Ext;

0 comments on commit 37fb18c

Please sign in to comment.