board.c 3.4 KB
Newer Older
L
lin 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
/*
 * File      : board.c
 * This file is part of RT-Thread RTOS
 * COPYRIGHT (C) 2009 RT-Thread Develop Team
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://www.rt-thread.org/license/LICENSE
 *
 * Change Logs:
 * Date           Author       Notes
 * 2017-09-14     Haley        first implementation
 */
#include "board.h"

#include <rtthread.h>
#include <rthw.h>

#include "am_mcu_apollo.h"
#include "hal/am_hal_clkgen.h"
#include "hal/am_hal_cachectrl.h"
#include "hw_uart.h"

#define TICK_RATE_HZ  RT_TICK_PER_SECOND
#define SYSTICK_CLOCK_HZ  ( 32768UL )
#define WAKE_INTERVAL ( (uint32_t) ((SYSTICK_CLOCK_HZ / TICK_RATE_HZ)) )

/**
 * This is the timer interrupt service routine.
 *
 */
void am_stimer_cmpr0_isr(void)
{
    /* Check the timer interrupt status */
    am_hal_stimer_int_clear(AM_HAL_STIMER_INT_COMPAREA);
    am_hal_stimer_compare_delta_set(0, WAKE_INTERVAL);
	
    if (rt_thread_self() != RT_NULL)
    {
    	/* enter interrupt */
    	rt_interrupt_enter();

    	rt_tick_increase();

    	/* leave interrupt */
    	rt_interrupt_leave();
    }
}

/**
 * This is the SysTick Configure.
 *
 */
void SysTick_Configuration(void)
{
		/* Set the main clk */
    am_hal_clkgen_sysclk_select(AM_HAL_CLKGEN_SYSCLK_MAX);
	
    /* Enable compare A interrupt in STIMER */
    am_hal_stimer_int_enable(AM_HAL_STIMER_INT_COMPAREA);

    /* Enable the timer interrupt in the NVIC */
    am_hal_interrupt_enable(AM_HAL_INTERRUPT_STIMER_CMPR0);

    /* Configure the STIMER and run */
    am_hal_stimer_config(AM_HAL_STIMER_CFG_CLEAR | AM_HAL_STIMER_CFG_FREEZE);
    am_hal_stimer_compare_delta_set(0, WAKE_INTERVAL);
    am_hal_stimer_config(AM_HAL_STIMER_XTAL_32KHZ |
                         AM_HAL_STIMER_CFG_COMPARE_A_ENABLE);
}

/**
 * This is the CacheCtrl Enable.
 *
 */
void CacheCtrl_Enable(void)
{
    am_hal_cachectrl_enable(&am_hal_cachectrl_defaults);
}

/**
 * This is the low power operation.
 * This function enables several power-saving features of the MCU, and
 * disables some of the less-frequently used peripherals. It also sets the
 * system clock to 24 MHz.
 */
void am_low_power_init(void)
{
    /* Enable internal buck converters */
    am_hal_pwrctrl_bucks_init();

    /* Initialize for low power in the power control block */
    am_hal_pwrctrl_low_power_init();

    /* Turn off the voltage comparator as this is enabled on reset */
    am_hal_vcomp_disable();

    /* Run the RTC off the LFRC */
    am_hal_rtc_osc_select(AM_HAL_RTC_OSC_LFRC);

    /* Stop the XT and LFRC */
    am_hal_clkgen_osc_stop(AM_HAL_CLKGEN_OSC_XT);
    // am_hal_clkgen_osc_stop(AM_HAL_CLKGEN_OSC_LFRC);

    /* Disable the RTC */
    am_hal_rtc_osc_disable();
}

/**
 * This is the deep power save.
 *
 */
void deep_power_save(void)
{
		am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP);
}

/**
 * This function will initial APOLLO2 board.
 */
void rt_hw_board_init(void)
{
		/* Set the clock frequency */
    SysTick_Configuration();
	
		/* Set the default cache configuration */
		CacheCtrl_Enable();

    /* Configure the board for low power operation */
    //am_low_power_init();
	
#ifdef RT_USING_IDLE_HOOK	
    rt_thread_idle_sethook(deep_power_save);  
#endif
	
#ifdef RT_USING_CONSOLE
		rt_hw_uart_init();
    rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif

#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif
}

/*@}*/