Skip to content

Commit

Permalink
Merge #116
Browse files Browse the repository at this point in the history
116: Add SysTick flags r=adamgreig a=qwerty19106

CMSIS core headers contains SCB_ICSR_PENDSVSET_*** and SCB_ICSR_PENDSTSET_*** definitions, which I need in my projects. In CMSIS it is used to check, set and clear this flags (rtx_core_cm.h and os_systick.c).

I suggest adding it to scb.rs. I put initial commit, but I need help to add compiler barriers where its are needed.

For details, see CMSIS:
[CMSIS_5/CMSIS/Core/Include/core_cm3.h](https://github.com/ARM-software/CMSIS_5/blob/develop/CMSIS/Core/Include/core_cm3.h)  (or other core_cm{X}.h)
[CMSIS_5/CMSIS/RTOS2/RTX/Source/rtx_core_cm.h)](https://github.com/ARM-software/CMSIS_5/blob/develop/CMSIS/RTOS2/RTX/Source/rtx_core_cm.h)
[CMSIS_5/CMSIS/RTOS2/Source/os_systick.c)](https://github.com/ARM-software/CMSIS_5/blob/develop/CMSIS/RTOS2/Source/os_systick.c)

FIX: I have not seen that PENDSV is already added. I review PENDST code to be like PENDSV.


Co-authored-by: qwerty19106 <qwerty19106@gmail.com>
  • Loading branch information
bors[bot] and qwerty19106 committed Oct 3, 2018
2 parents 062147b + 2cb6f4b commit e3b7357
Showing 1 changed file with 38 additions and 10 deletions.
48 changes: 38 additions & 10 deletions src/peripheral/scb.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ use volatile_register::RW;
#[cfg(not(armv6m))]
use super::cpuid::CsselrCacheType;
#[cfg(not(armv6m))]
use super::CPUID;
#[cfg(not(armv6m))]
use super::CBP;
#[cfg(not(armv6m))]
use super::CPUID;
use super::SCB;

/// Register block
Expand Down Expand Up @@ -604,13 +604,18 @@ impl SCB {
/// Initiate a system reset request to reset the MCU
pub fn system_reset(&mut self) -> ! {
::asm::dsb();
unsafe { self.aircr.modify(|r|
SCB_AIRCR_VECTKEY | // otherwise the write is ignored
unsafe {
self.aircr.modify(
|r| {
SCB_AIRCR_VECTKEY | // otherwise the write is ignored
r & SCB_AIRCR_PRIGROUP_MASK | // keep priority group unchanged
SCB_AIRCR_SYSRESETREQ // set the bit
) };
SCB_AIRCR_SYSRESETREQ
}, // set the bit
)
};
::asm::dsb();
loop { // wait for the reset
loop {
// wait for the reset
::asm::nop(); // avoid rust-lang/rust#28728
}
}
Expand All @@ -619,6 +624,9 @@ impl SCB {
const SCB_ICSR_PENDSVSET: u32 = 1 << 28;
const SCB_ICSR_PENDSVCLR: u32 = 1 << 27;

const SCB_ICSR_PENDSTSET: u32 = 1 << 26;
const SCB_ICSR_PENDSTCLR: u32 = 1 << 25;

impl SCB {
/// Set the PENDSVSET bit in the ICSR register which will pend the PendSV interrupt
pub fn set_pendsv() {
Expand All @@ -629,9 +637,7 @@ impl SCB {

/// Check if PENDSVSET bit in the ICSR register is set meaning PendSV interrupt is pending
pub fn is_pendsv_pending() -> bool {
unsafe {
(*Self::ptr()).icsr.read() & SCB_ICSR_PENDSVSET == SCB_ICSR_PENDSVSET
}
unsafe { (*Self::ptr()).icsr.read() & SCB_ICSR_PENDSVSET == SCB_ICSR_PENDSVSET }
}

/// Set the PENDSVCLR bit in the ICSR register which will clear a pending PendSV interrupt
Expand All @@ -640,4 +646,26 @@ impl SCB {
(*Self::ptr()).icsr.write(SCB_ICSR_PENDSVCLR);
}
}

/// Set the PENDSTCLR bit in the ICSR register which will clear a pending SysTick interrupt
#[inline]
pub fn set_pendst() {
unsafe {
(*Self::ptr()).icsr.write(SCB_ICSR_PENDSTSET);
}
}

/// Check if PENDSTSET bit in the ICSR register is set meaning SysTick interrupt is pending
#[inline]
pub fn is_pendst_pending() -> bool {
unsafe { (*Self::ptr()).icsr.read() & SCB_ICSR_PENDSTSET == SCB_ICSR_PENDSTSET }
}

/// Set the PENDSTCLR bit in the ICSR register which will clear a pending SysTick interrupt
#[inline]
pub fn clear_pendst() {
unsafe {
(*Self::ptr()).icsr.write(SCB_ICSR_PENDSTCLR);
}
}
}

0 comments on commit e3b7357

Please # to comment.