diff --git a/bsp/apollo2/README.md b/bsp/apollo2/README.md index 2b265d13aa..871cad2fb5 100644 --- a/bsp/apollo2/README.md +++ b/bsp/apollo2/README.md @@ -1,5 +1,45 @@ Apollo2 MCU是基于Ambiq Micro的Apollo MCU产品系列的第二代控制器。 -Ambiq使用专利亚阈值功率优化技术(Subthreshold Power Optimized Technology, SPOT)平台来实现惊人的功耗降低,其功耗通常比性能相近的其它MCU产品降低5至10倍。 -Apollo2 MCU采用32位ARM Cortex-M4F微控制器,集成了高达1 MB的闪存和256 KB的RAM,以适应无线电和传感器开销,同时仍留有足够的应用代码空间。 +Ambiq使用专利亚阈值功率优化技术(Subthreshold Power Optimized Technology, SPOT)平台来实现惊人的功耗降低,其功耗通常比性能相近的其它MCU产品降低5至10倍。 +Apollo2 MCU采用32位ARM Cortex-M4F微控制器,集成了高达1 MB的闪存和256 KB的RAM,以适应无线电和传感器开销,同时仍留有足够的应用代码空间。该微控制器还包括串行主机和UART端口,用于与无线电和传感器通信,包括加速度计,陀螺仪和磁力计。 -board info:Apollo2 Evaluation Board(http://ambiqmicro.com/apollo-ultra-low-power-mcu/apollo2-mcu-20170703/) \ No newline at end of file +Features +Ultra-low supply current + 10 μA/MHz executing from flash at 3.3 V + 10 μA/MHz executing from RAM at 3.3 V + +High-performance ARM Cortex-M4 Processor + Up to 48 MHz clock frequency + Floating point unit + Memory protection unit + Wake-up interrupt controller with 32 interrupts + +Ultra-low power memory: + Up to 1 MB of flash memory for code/data + Up to 256 KB of low leakage RAM for code/data + 16kB 1 or 2-way Associative Cache + +Ultra-low power interface for off-chip sensors: + 14 bit, 15-channel, up to 1.2 MS/s ADC + Voltage Comparator + Temperature sensor with +/-2C accuracy + +Flexible serial peripherals: + 6x I2C/SPI master for communication with sensors,?radios, and other peripherals + 1x I2C/SPI slave for host communications + 2x UART for communication with peripherals and?legacy devices + PDM for mono and stereo audio microphone + +Rich set of clock sources: + 32.768 kHz XTAL oscillator + Low frequency RC oscillator – 1.024 kHz + High frequency RC oscillator – 48 MHz + RTC based on Ambiq’s AM08X5/18X5 families + +Wide operating range: 1.8-3.6 V, –40 to 85°C + +Compact package options: + 2.5 x 2.5 mm 49-pin CSP with 34 GPIO + 4.5 x 4.5 mm 64-pin BGA with 50 GPIO + +Board info + Apollo2 Evaluation Board(http://ambiqmicro.com/apollo-ultra-low-power-mcu/apollo2-mcu-20170703/) \ No newline at end of file diff --git a/bsp/apollo2/apollo2 evaluation board skt.jpg b/bsp/apollo2/apollo2 evaluation board skt.jpg new file mode 100644 index 0000000000..67bf9c23ff Binary files /dev/null and b/bsp/apollo2/apollo2 evaluation board skt.jpg differ diff --git a/bsp/apollo2/applications/SConscript b/bsp/apollo2/applications/SConscript index 01eb940dfb..fc2501998c 100644 --- a/bsp/apollo2/applications/SConscript +++ b/bsp/apollo2/applications/SConscript @@ -2,8 +2,8 @@ Import('RTT_ROOT') Import('rtconfig') from building import * -cwd = os.path.join(str(Dir('#')), 'applications') -src = Glob('*.c') +cwd = os.path.join(str(Dir('#')), 'applications') +src = Glob('*.c') CPPPATH = [cwd, str(Dir('#'))] group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) diff --git a/bsp/apollo2/applications/main.c b/bsp/apollo2/applications/main.c index dab3fd123f..b058fc7711 100644 --- a/bsp/apollo2/applications/main.c +++ b/bsp/apollo2/applications/main.c @@ -1,5 +1,5 @@ /* - * File : application.c + * File : main.c * This file is part of RT-Thread RTOS * COPYRIGHT (C) 2006 - 2017, RT-Thread Development Team * @@ -23,7 +23,7 @@ */ #include -#include + #ifdef RT_USING_FINSH #include #include diff --git a/bsp/apollo2/board/Sconscript b/bsp/apollo2/board/Sconscript index aa1e87d860..2f2dc9eb48 100644 --- a/bsp/apollo2/board/Sconscript +++ b/bsp/apollo2/board/Sconscript @@ -2,8 +2,8 @@ Import('RTT_ROOT') Import('rtconfig') from building import * -cwd = GetCurrentDir() -src = Glob('*.c') +cwd = GetCurrentDir() +src = Glob('*.c') CPPPATH = [cwd] #remove other no use files diff --git a/bsp/apollo2/board/board.c b/bsp/apollo2/board/board.c index 8e1c3b8e88..d9e202570b 100644 --- a/bsp/apollo2/board/board.c +++ b/bsp/apollo2/board/board.c @@ -1,11 +1,21 @@ /* * File : board.c * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2009 RT-Thread Develop Team + * COPYRIGHT (C) 2006 - 2017, RT-Thread Development 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 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * Change Logs: * Date Author Notes @@ -19,11 +29,23 @@ #include "am_mcu_apollo.h" #include "hal/am_hal_clkgen.h" #include "hal/am_hal_cachectrl.h" -#include "hw_uart.h" +#include "uart.h" +#include "led.h" + +#ifdef __CC_ARM +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define AM_SRAM_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="HEAP" +#define AM_SRAM_BEGIN (__segment_end("HEAP")) +#else +extern int __bss_end; +#define NRF_SRAM_BEGIN (&__bss_end) +#endif #define TICK_RATE_HZ RT_TICK_PER_SECOND #define SYSTICK_CLOCK_HZ ( 32768UL ) -#define WAKE_INTERVAL ( (uint32_t) ((SYSTICK_CLOCK_HZ / TICK_RATE_HZ)) ) +#define WAKE_INTERVAL ( (uint32_t) ((SYSTICK_CLOCK_HZ / TICK_RATE_HZ))) /** * This is the timer interrupt service routine. @@ -34,16 +56,16 @@ 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(); + /* enter interrupt */ + rt_interrupt_enter(); - rt_tick_increase(); + rt_tick_increase(); - /* leave interrupt */ - rt_interrupt_leave(); + /* leave interrupt */ + rt_interrupt_leave(); } } @@ -53,13 +75,10 @@ void am_stimer_cmpr0_isr(void) */ 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 */ + /* Enable the timer interrupt in the NVIC, making sure to use the appropriate priority level */ am_hal_interrupt_enable(AM_HAL_INTERRUPT_STIMER_CMPR0); /* Configure the STIMER and run */ @@ -69,15 +88,6 @@ void SysTick_Configuration(void) 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 @@ -100,7 +110,7 @@ void am_low_power_init(void) /* 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); + am_hal_clkgen_osc_stop(AM_HAL_CLKGEN_OSC_LFRC); /* Disable the RTC */ am_hal_rtc_osc_disable(); @@ -112,7 +122,11 @@ void am_low_power_init(void) */ void deep_power_save(void) { - am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP); + am_hal_interrupt_master_disable(); + + am_hal_sysctrl_sleep(AM_HAL_SYSCTRL_SLEEP_DEEP); + + am_hal_interrupt_master_enable(); } /** @@ -120,27 +134,48 @@ void deep_power_save(void) */ void rt_hw_board_init(void) { - /* Set the clock frequency */ - SysTick_Configuration(); - - /* Set the default cache configuration */ - CacheCtrl_Enable(); + /* Set the system clock to maximum frequency */ + am_hal_clkgen_sysclk_select(AM_HAL_CLKGEN_SYSCLK_MAX); + + /* Set the default cache configuration */ + am_hal_cachectrl_enable(&am_hal_cachectrl_defaults); /* Configure the board for low power operation */ - //am_low_power_init(); - -#ifdef RT_USING_IDLE_HOOK - rt_thread_idle_sethook(deep_power_save); + am_low_power_init(); + + /* Config SysTick */ + SysTick_Configuration(); + +#ifdef RT_USING_IDLE_HOOK + /* Set sleep deep mode */ + rt_thread_idle_sethook(deep_power_save); + +#ifndef NO_FPU + /* Enable the floating point module, and configure the core for lazy stacking */ + am_hal_sysctrl_fpu_enable(); + am_hal_sysctrl_fpu_stacking_enable(true); +#else + am_hal_sysctrl_fpu_disable(); #endif - + + /* Turn off unused Flash & SRAM */ + am_hal_pwrctrl_memory_enable(AM_HAL_PWRCTRL_MEMEN_FLASH512K); + am_hal_pwrctrl_memory_enable(AM_HAL_PWRCTRL_MEMEN_SRAM32K); + +#endif + #ifdef RT_USING_CONSOLE - rt_hw_uart_init(); + rt_hw_uart_init(); rt_console_set_device(RT_CONSOLE_DEVICE_NAME); #endif #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif + +#ifdef RT_USING_HEAP + rt_system_heap_init((void*)AM_SRAM_BEGIN, (void*)AM_SRAM_END); +#endif } /*@}*/ diff --git a/bsp/apollo2/board/board.h b/bsp/apollo2/board/board.h index 8bafd7dfa2..a93892c3b2 100644 --- a/bsp/apollo2/board/board.h +++ b/bsp/apollo2/board/board.h @@ -1,16 +1,45 @@ +/* + * File : board.h + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006 - 2017, RT-Thread Development Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Change Logs: + * Date Author Notes + * 2017-09-14 Haley first implementation + */ #ifndef __BOARD_H_ #define __BOARD_H_ #include // Internal SRAM memory size[Kbytes] <8-256> -// Default: 256 +// Default: 256 #define AM_SRAM_SIZE 256 #define AM_SRAM_END (0x10000000 + AM_SRAM_SIZE * 1024) /* USART driver select. */ #define RT_USING_UART0 -#define RT_USING_UART1 +//#define RT_USING_UART1 + +/* LED driver select. */ +#define RT_USING_LED0 +//#define RT_USING_LED1 +//#define RT_USING_LED2 +//#define RT_USING_LED3 void rt_hw_board_init(void); diff --git a/bsp/apollo2/board/led.c b/bsp/apollo2/board/led.c index bb8d1e1532..1cf68b5605 100644 --- a/bsp/apollo2/board/led.c +++ b/bsp/apollo2/board/led.c @@ -43,6 +43,7 @@ */ void rt_hw_led_on(rt_uint8_t LEDNum) { +#ifdef RT_USING_PIN if(LEDNum == 0) rt_pin_write(AM_GPIO_LED0, PIN_LOW); @@ -54,6 +55,7 @@ void rt_hw_led_on(rt_uint8_t LEDNum) else if(LEDNum == 3) rt_pin_write(AM_GPIO_LED3, PIN_LOW); +#endif } /** @@ -67,6 +69,7 @@ void rt_hw_led_on(rt_uint8_t LEDNum) */ void rt_hw_led_off(rt_uint8_t LEDNum) { +#ifdef RT_USING_PIN if(LEDNum == 0) rt_pin_write(AM_GPIO_LED0, PIN_HIGH); @@ -78,6 +81,7 @@ void rt_hw_led_off(rt_uint8_t LEDNum) else if(LEDNum == 3) rt_pin_write(AM_GPIO_LED3, PIN_HIGH); +#endif } /** @@ -91,6 +95,7 @@ void rt_hw_led_off(rt_uint8_t LEDNum) */ int rt_hw_led_init(void) { +#ifdef RT_USING_PIN #if defined(RT_USING_LED0) /* config led */ rt_pin_mode(AM_GPIO_LED0, PIN_MODE_OUTPUT); @@ -122,10 +127,10 @@ int rt_hw_led_init(void) /* turns off the led */ rt_hw_led_off(3); #endif /* RT_USING_LED1 */ - +#endif return 0; } -#ifdef RT_USING_PIN +#ifdef RT_USING_COMPONENTS_INIT INIT_BOARD_EXPORT(rt_hw_led_init); #endif diff --git a/bsp/apollo2/rtconfig.h b/bsp/apollo2/rtconfig.h index 759cd4078a..6126e294fa 100644 --- a/bsp/apollo2/rtconfig.h +++ b/bsp/apollo2/rtconfig.h @@ -16,14 +16,14 @@ /* SECTION: RT_DEBUG */ /* Thread Debug */ -#define RT_DEBUG +//#define RT_DEBUG //#define RT_DEBUG_INIT 1 -#define RT_USING_OVERFLOW_CHECK +//#define RT_USING_OVERFLOW_CHECK /* Using Hook */ //#define RT_USING_HOOK -//#define RT_USING_IDLE_HOOK +#define RT_USING_IDLE_HOOK #define IDLE_THREAD_STACK_SIZE 384 @@ -60,6 +60,9 @@ #define RT_USING_SMALL_MEM #define RT_USING_TINY_SIZE +/* Using USER MAIN */ +#define RT_USING_USER_MAIN + // #define RT_USING_COMPONENTS_INIT @@ -78,13 +81,16 @@ // #define RT_CONSOLE_DEVICE_NAME "uart0" +/* Using GPIO pin framework */ +#define RT_USING_PIN + // #define RT_USING_SPI /* SECTION: finsh, a C-Express shell */ #define RT_USING_FINSH /* configure finsh parameters */ #define FINSH_THREAD_PRIORITY 6 -#define FINSH_THREAD_STACK_SIZE 512 +#define FINSH_THREAD_STACK_SIZE 1024 #define FINSH_HISTORY_LINES 1 /* Using symbol table */ #define FINSH_USING_SYMTAB