Skip to content

Commit

Permalink
Merge #373
Browse files Browse the repository at this point in the history
373: `SCB.ICSR.VECTACTIVE` is 9 bits, not 8 r=adamgreig a=TDHolmes

Closes #332

Co-authored-by: Tyler Holmes <[email protected]>
  • Loading branch information
bors[bot] and TDHolmes authored Dec 31, 2021
2 parents cde498d + ccdc7cc commit bef6ed1
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 7 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
15 changes: 8 additions & 7 deletions src/peripheral/scb.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down Expand Up @@ -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<Self> {
pub fn from(vect_active: u16) -> Option<Self> {
Some(match vect_active {
0 => VectActive::ThreadMode,
2 => VectActive::Exception(Exception::NonMaskableInt),
Expand All @@ -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,
})
}
Expand Down

0 comments on commit bef6ed1

Please sign in to comment.