cc2530-projects/Zigbee无线通信/A板/CC2530_lib/common/hal_mcu.c
2021-10-04 22:26:10 +08:00

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
}