diff --git a/CHANGELOG.md b/CHANGELOG.md index fdb8be9c..7da0459c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/). There is a feature `cm7` to enable access to these. - Added `delay::Delay::with_source`, a constructor that lets you specify the SysTick clock source (#374). +- Added the capability for `DWT` to do cycle count comparison (#367). +- Updated `SCB.ICSR.VECTACTIVE`/`SCB::vect_active()` to be 9 bits instead of 8. + Also fixes `VectActive::from` to take a `u16` and subtract `16` for + `VectActive::Interrupt`s to match `SBC::vect_active()` (#373). ### Deprecated diff --git a/src/peripheral/scb.rs b/src/peripheral/scb.rs index eeea0c5b..650aede3 100644 --- a/src/peripheral/scb.rs +++ b/src/peripheral/scb.rs @@ -170,9 +170,10 @@ impl SCB { /// Returns the active exception number #[inline] pub fn vect_active() -> VectActive { - let icsr = unsafe { ptr::read(&(*SCB::ptr()).icsr as *const _ as *const u32) }; + let icsr = + unsafe { ptr::read_volatile(&(*SCB::ptr()).icsr as *const _ as *const u32) } & 0x1FF; - match icsr as u8 { + match icsr as u16 { 0 => VectActive::ThreadMode, 2 => VectActive::Exception(Exception::NonMaskableInt), 3 => VectActive::Exception(Exception::HardFault), @@ -274,15 +275,15 @@ pub enum VectActive { /// Device specific exception (external interrupts) Interrupt { - /// Interrupt number. This number is always within half open range `[0, 240)` - irqn: u8, + /// Interrupt number. This number is always within half open range `[0, 512)` (9 bit) + irqn: u16, }, } impl VectActive { - /// Converts a `byte` into `VectActive` + /// Converts a vector number into `VectActive` #[inline] - pub fn from(vect_active: u8) -> Option { + pub fn from(vect_active: u16) -> Option { Some(match vect_active { 0 => VectActive::ThreadMode, 2 => VectActive::Exception(Exception::NonMaskableInt), @@ -300,7 +301,7 @@ impl VectActive { 12 => VectActive::Exception(Exception::DebugMonitor), 14 => VectActive::Exception(Exception::PendSV), 15 => VectActive::Exception(Exception::SysTick), - irqn if irqn >= 16 => VectActive::Interrupt { irqn }, + irqn if (16..512).contains(&irqn) => VectActive::Interrupt { irqn: irqn - 16 }, _ => return None, }) }