mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-16 18:53:29 +00:00
device/arm: add support for System Control Block (SCB) registers and SystemReset() function
Signed-off-by: Ron Evans <ron@hybridgroup.com>
This commit is contained in:
@@ -73,8 +73,32 @@ func SVCall4(num uintptr, a1, a2, a3, a4 interface{}) uintptr
|
|||||||
const (
|
const (
|
||||||
SCS_BASE = 0xE000E000
|
SCS_BASE = 0xE000E000
|
||||||
NVIC_BASE = SCS_BASE + 0x0100
|
NVIC_BASE = SCS_BASE + 0x0100
|
||||||
|
SCB_BASE = SCS_BASE + 0x0D00
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
SCB_AIRCR_VECTKEY_Pos = 16
|
||||||
|
SCB_AIRCR_SYSRESETREQ_Pos = 2
|
||||||
|
SCB_AIRCR_SYSRESETREQ_Msk = 1 << SCB_AIRCR_SYSRESETREQ_Pos
|
||||||
|
)
|
||||||
|
|
||||||
|
// System Control Block (SCB)
|
||||||
|
//
|
||||||
|
// SCB_Type provides the definitions for the System Control Block Registers.
|
||||||
|
type SCB_Type struct {
|
||||||
|
CPUID volatile.Register32 // CPUID Base Register
|
||||||
|
ICSR volatile.Register32 // Interrupt Control and State Register
|
||||||
|
VTOR volatile.Register32 // Vector Table Offset Register
|
||||||
|
AIRCR volatile.Register32 // Application Interrupt and Reset Control Register
|
||||||
|
SCR volatile.Register32 // System Control Register
|
||||||
|
CCR volatile.Register32 // Configuration Control Register
|
||||||
|
_ volatile.Register32 // RESERVED1;
|
||||||
|
SHP [2]volatile.Register32 // System Handlers Priority Registers. [0] is RESERVED
|
||||||
|
SHCSR volatile.Register32 // System Handler Control and State Register
|
||||||
|
}
|
||||||
|
|
||||||
|
var SCB = (*SCB_Type)(unsafe.Pointer(uintptr(SCB_BASE)))
|
||||||
|
|
||||||
// Nested Vectored Interrupt Controller (NVIC).
|
// Nested Vectored Interrupt Controller (NVIC).
|
||||||
//
|
//
|
||||||
// Source:
|
// Source:
|
||||||
@@ -134,3 +158,10 @@ func DisableInterrupts() uintptr {
|
|||||||
func EnableInterrupts(mask uintptr) {
|
func EnableInterrupts(mask uintptr) {
|
||||||
Asm("cpsie if")
|
Asm("cpsie if")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SystemReset performs a hard system reset.
|
||||||
|
func SystemReset() {
|
||||||
|
// SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
|
||||||
|
// SCB_AIRCR_SYSRESETREQ_Msk);
|
||||||
|
SCB.AIRCR.Set((0x5FA << SCB_AIRCR_VECTKEY_Pos) | SCB_AIRCR_SYSRESETREQ_Msk)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user