117 lines
3.7 KiB
C
117 lines
3.7 KiB
C
//-------------------------------------------------------------------
|
|
// Filename: hal_mcu.c
|
|
// Description:
|
|
//-------------------------------------------------------------------
|
|
//-------------------------------------------------------------------
|
|
// INCLUDES
|
|
//-------------------------------------------------------------------
|
|
#include "hal_defs.h"
|
|
#include "hal_clock.h"
|
|
#include "hal_mcu.h"
|
|
#include "hal_board.h"
|
|
|
|
//-------------------------------------------------------------------
|
|
// @fn halMcuInit
|
|
// @brief Set Main Clock source to XOSC
|
|
// @param none
|
|
// @return none
|
|
//-------------------------------------------------------------------
|
|
void halMcuInit(void)
|
|
{
|
|
clockSetMainSrc(CLOCK_SRC_XOSC);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// @fn halMcuWaitUs
|
|
// @brief Busy wait function. Waits the specified number of microseconds. Use
|
|
// assumptions about number of clock cycles needed for the various
|
|
// instructions. This function assumes a 32 MHz clock.
|
|
// NB! This function is highly dependent on architecture and compiler!
|
|
// @param uint16 usec - number of microseconds delays
|
|
// @return none
|
|
//-------------------------------------------------------------------
|
|
#pragma optimize=none
|
|
void halMcuWaitUs(uint16 usec)
|
|
{
|
|
usec >>= 1;
|
|
while (usec--)
|
|
{
|
|
NOP();
|
|
NOP();
|
|
NOP();
|
|
NOP();
|
|
NOP();
|
|
NOP();
|
|
NOP();
|
|
NOP();
|
|
NOP();
|
|
NOP();
|
|
NOP();
|
|
NOP();
|
|
NOP();
|
|
NOP();
|
|
NOP();
|
|
NOP();
|
|
//NOP();
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// @fn halMcuWaitMs
|
|
// @brief Busy wait function. Waits the specified number of milliseconds. Use
|
|
// assumptions about number of clock cycles needed for the various
|
|
// instructions.
|
|
// NB! This function is highly dependent on architecture and compiler!
|
|
// @param uint16 millisec - number of milliseconds delay
|
|
// @return none
|
|
//-------------------------------------------------------------------
|
|
#pragma optimize=none
|
|
void halMcuWaitMs(uint16 msec)
|
|
{
|
|
while (msec--)
|
|
{
|
|
halMcuWaitUs(1000);
|
|
}
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// @fn halMcuSetLowPowerMode
|
|
// @brief Sets the MCU in a low power mode. Will turn global interrupts on at
|
|
// the same time as entering the LPM mode. The MCU must be waken from
|
|
// an interrupt (status register on stack must be modified).
|
|
// NB! This function is highly dependent on architecture and compiler!
|
|
// @param uint8 mode - power mode
|
|
// @return none
|
|
//-------------------------------------------------------------------
|
|
void halMcuSetLowPowerMode(uint8 mode)
|
|
{
|
|
char buf[] = "LowPowerMode( )";
|
|
buf[13] = mode + '0';
|
|
// comment: not yet implemented
|
|
HAL_ASSERT(buf);
|
|
}
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
// @fn halMcuReset
|
|
// @brief
|
|
// Resets the MCU. This utilize the watchdog timer as there is no other way
|
|
// for a software reset. The reset will not occur until ~2 ms.
|
|
// NB: The function will not return! (hangs until reset)
|
|
// Parameters:
|
|
// @param void
|
|
// @return void
|
|
//-------------------------------------------------------------------
|
|
void halMcuReset(void)
|
|
{
|
|
const uint8 WDT_INTERVAL_MSEC_2 = 0x03; // after ~2 ms
|
|
|
|
WDCTL = ((WDCTL &0xFC) | (WDT_INTERVAL_MSEC_2 &0x03));
|
|
// Start watchdog
|
|
WDCTL &= ~0x04; // Select watchdog mode
|
|
WDCTL |= 0x08; // Enable timer
|
|
while (1)
|
|
;
|
|
// Halt here until reset
|
|
}
|