/** @file scb.c
 * Module handling the System Control Block
 *
 * The module provides functions to configure miscelaneous options of the cortex
 * m3, including sleep behavior, event handler priorities, resets and fault
 * handlers
 */

//--includes--------------------------------------------------------------------

#include "scb.h"
#include "scb_regs.h"


//--local definitions-----------------------------------------------------------

//--local variables-------------------------------------------------------------

static volatile struct SCB* regs = (struct SCB*)SCB_BASE_ADDRESS;


//--public functions------------------------------------------------------------

uint16_t scb_pending_exception(void)
{
	return regs->ICSR.VECTPENDING;
}

uint16_t scb_active_exception(void)
{
	return regs->ICSR.VECTACTIVE;
}

void scb_configure_vector_table(uint32_t offset)
{
	//TODO check that last LSB is 0 (alignement restrictions)
	regs->VTOR.TABLEOFF = offset & 0x1FFFFF;
}

void scb_reset_system(void)
{
	regs->AIRCR.SYSRESETREQ = 1;
}

void scb_configure_deepsleep(bool enable)
{
	regs->SCR.SLEEPDEEP = enable;
}

void scb_configure_div0_fault(bool enable)
{
	regs->CCR.DIV_0_TRP = enable;
}

void scb_configure_unalign_fault(bool enable)
{
	regs->CCR.UNALIGN_TRP = enable;
}


//--local functions-------------------------------------------------------------

//--ISRs------------------------------------------------------------------------

