diff --git a/bsp/nuvoton_m05x/Libraries/CMSIS/Nuvoton/M051Series/Source/ARM/startup_M051Series.s b/bsp/nuvoton_m05x/Libraries/CMSIS/Nuvoton/M051Series/Source/ARM/startup_M051Series.s index 7cc01d3ec1..b8e08d5bcd 100644 --- a/bsp/nuvoton_m05x/Libraries/CMSIS/Nuvoton/M051Series/Source/ARM/startup_M051Series.s +++ b/bsp/nuvoton_m05x/Libraries/CMSIS/Nuvoton/M051Series/Source/ARM/startup_M051Series.s @@ -10,7 +10,7 @@ ; * ; ******************************************************************************/ -Stack_Size EQU 0x00000200 +Stack_Size EQU 0x00000100 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size diff --git a/bsp/nuvoton_m05x/applications/application.c b/bsp/nuvoton_m05x/applications/application.c index bf48aeb4a3..652c12a1a0 100644 --- a/bsp/nuvoton_m05x/applications/application.c +++ b/bsp/nuvoton_m05x/applications/application.c @@ -56,7 +56,7 @@ static void rt_init_thread_entry(void* parameter) /* Create led thread */ led_thread = rt_thread_create("led", led_thread_entry, RT_NULL, - 256, 20, 20); + 128, 20, 20); if(led_thread != RT_NULL) rt_thread_startup(led_thread); } diff --git a/bsp/nuvoton_m05x/drivers/board.c b/bsp/nuvoton_m05x/drivers/board.c index 8c9bd8ea76..15beaa6d85 100644 --- a/bsp/nuvoton_m05x/drivers/board.c +++ b/bsp/nuvoton_m05x/drivers/board.c @@ -14,9 +14,8 @@ #include <rthw.h> #include <rtthread.h> - #include "board.h" - +#include "usart.h" /* RT_USING_COMPONENTS_INIT */ #ifdef RT_USING_COMPONENTS_INIT #include <components.h> @@ -44,7 +43,7 @@ void NVIC_Configuration(void) * @param nCount: specifies the delay time length. * @retval None */ -static void Delay(__IO uint32_t nCount) +static void delay(__IO uint32_t nCount) { /* Decrement nCount value */ while (nCount != 0) @@ -53,6 +52,30 @@ static void Delay(__IO uint32_t nCount) } } +static void rt_hw_system_init(void) +{ + /*---------------------------------------------------------------------------------------------------------*/ + /* Init System Clock */ + /*---------------------------------------------------------------------------------------------------------*/ + SYS_UnlockReg(); + /* Enable Internal RC 22.1184MHz clock */ + CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk); + + /* Waiting for Internal RC clock ready */ + CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk); + + /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */ + CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1)); + + /* Set core clock as PLL_CLOCK from PLL */ + CLK_SetCoreClock(BOARD_PLL_CLOCK); + + /* Set SysTick clock source to HCLK source divide 2 */ + CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLK_S_HCLK_DIV2); + + SYS_LockReg(); +} + /** * This is the timer interrupt service routine. * @@ -75,10 +98,13 @@ void rt_hw_board_init() /* NVIC Configuration */ NVIC_Configuration(); + /* Configure the system clock */ + rt_hw_system_init(); /* Configure the SysTick */ SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); /* Initial usart deriver, and set console device */ + rt_hw_usart_init(); #ifdef RT_USING_CONSOLE rt_console_set_device(RT_CONSOLE_DEVICE_NAME); #endif diff --git a/bsp/nuvoton_m05x/drivers/board.h b/bsp/nuvoton_m05x/drivers/board.h index e2f4ed673f..6c68944025 100644 --- a/bsp/nuvoton_m05x/drivers/board.h +++ b/bsp/nuvoton_m05x/drivers/board.h @@ -18,6 +18,8 @@ #include "M051Series.h" +#define BOARD_PLL_CLOCK 50000000 + /* board configuration */ // <o> Internal SRAM memory size[Kbytes] // <i>Default: 64 diff --git a/bsp/nuvoton_m05x/drivers/usart.c b/bsp/nuvoton_m05x/drivers/usart.c new file mode 100644 index 0000000000..91afa4130e --- /dev/null +++ b/bsp/nuvoton_m05x/drivers/usart.c @@ -0,0 +1,133 @@ +/* + * File : usart.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006-2014, 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 + * + * Change Logs: + * Date Author Notes + * 2014-11-29 Bright the first version + */ + +#include "M051Series.h" +#include <rtdevice.h> +#include "usart.h" + + +static rt_err_t m05x_configure(struct rt_serial_device *serial, struct serial_configure *cfg) +{ + UART_T* uart; + + uart = (UART_T *)serial->parent.user_data; +#if defined(RT_USING_UART0) + if (uart == UART0) { + /* Enable UART module clock */ + CLK_EnableModuleClock(UART0_MODULE); + /* Select UART module clock source */ + CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_PLL, CLK_CLKDIV_UART(1)); + + /* Set P3 multi-function pins for UART0 RXD and TXD */ + SYS->P3_MFP &= ~(SYS_MFP_P30_Msk | SYS_MFP_P31_Msk); + SYS->P3_MFP |= (SYS_MFP_P30_RXD0 | SYS_MFP_P31_TXD0); + + /* Reset IP */ + SYS_ResetModule(UART0_RST); + /* Configure UART0 and set UART0 Baudrate */ + UART_Open(UART0, cfg->baud_rate); + + /* Enable Interrupt */ + UART_EnableInt(UART0, UART_IER_RDA_IEN_Msk); + } +#endif /* RT_USING_UART0 */ + +#if defined(RT_USING_UART1) +#endif /* RT_USING_UART1 */ + return RT_EOK; +} + +static rt_err_t m05x_control(struct rt_serial_device *serial, int cmd, void *arg) +{ + UART_T* uart; + uart = (UART_T *)serial->parent.user_data; + + switch (cmd) + { + case RT_DEVICE_CTRL_CLR_INT: { + /* Disable Interrupt */ + UART_DisableInt(uart, UART_IER_RDA_IEN_Msk); + break; + } + case RT_DEVICE_CTRL_SET_INT: { + UART_EnableInt(uart, UART_IER_RDA_IEN_Msk); + break; + } + } + + return RT_EOK; +} + +static int m05x_putc(struct rt_serial_device *serial, char c) +{ + UART_T* uart; + uart = (UART_T *)serial->parent.user_data; + if (UART_IS_TX_FULL(uart)) { + UART_WAIT_TX_EMPTY(uart); + + } + UART_WRITE(uart, c); + return 1; +} + +static int m05x_getc(struct rt_serial_device *serial) +{ + int ch = -1; + UART_T* uart; + uart = (UART_T *)serial->parent.user_data; + + if (UART_IS_RX_READY(uart)) + ch = UART_READ(uart); + return ch; +} + +static const struct rt_uart_ops m05x_uart_ops = +{ + m05x_configure, + m05x_control, + m05x_putc, + m05x_getc, +}; + +#if defined(RT_USING_UART0) +struct rt_serial_device serial0; + +void UART0_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + if (UART_IS_RX_READY(UART0)) { + rt_hw_serial_isr(&serial0, RT_SERIAL_EVENT_RX_IND); + } + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif /* RT_USING_UART0 */ + +void rt_hw_usart_init(void) +{ +#ifdef RT_USING_UART0 + struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; + config.baud_rate = BAUD_RATE_115200; + serial0.ops = &m05x_uart_ops; + serial0.config = config; + + /* register UART0 device */ + rt_hw_serial_register(&serial0, "uart0", + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX, + UART0); +#endif /* RT_USING_UART0 */ + +} diff --git a/bsp/nuvoton_m05x/drivers/usart.h b/bsp/nuvoton_m05x/drivers/usart.h new file mode 100644 index 0000000000..ba66eba273 --- /dev/null +++ b/bsp/nuvoton_m05x/drivers/usart.h @@ -0,0 +1,26 @@ +/* + * File : usart.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006-2014, 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 + * + * Change Logs: + * Date Author Notes + * 2014-11-29 Bright the first version + */ + +#ifndef __USART_H__ +#define __USART_H__ + +#include <rthw.h> +#include <rtthread.h> + +#define RT_USING_UART0 +//#define RT_USING_UART1 + +void rt_hw_usart_init(void); + +#endif diff --git a/bsp/nuvoton_m05x/project.uvprojx b/bsp/nuvoton_m05x/project.uvprojx index 8972ab2de9..a1d4df386c 100644 --- a/bsp/nuvoton_m05x/project.uvprojx +++ b/bsp/nuvoton_m05x/project.uvprojx @@ -207,8 +207,8 @@ <AdsLsun>1</AdsLsun> <AdsLven>1</AdsLven> <AdsLsxf>1</AdsLsxf> - <RvctClst>1</RvctClst> - <GenPPlst>1</GenPPlst> + <RvctClst>0</RvctClst> + <GenPPlst>0</GenPPlst> <AdsCpuType>"Cortex-M0"</AdsCpuType> <RvctDeviceName></RvctDeviceName> <mOS>0</mOS> @@ -363,7 +363,7 @@ <MiscControls></MiscControls> <Define>INIT_SYSCLK_AT_BOOTING</Define> <Undefine></Undefine> - <IncludePath>.;..\..\components\drivers\include;..\..\components\init;..\..\include;..\..\libcpu\arm\common;..\..\libcpu\arm\cortex-m0;Libraries\CMSIS\Include;Libraries\CMSIS\Nuvoton\M051Series\Include;Libraries\StdDriver\inc;applications;drivers</IncludePath> + <IncludePath>.;..\..\components\drivers\include;..\..\components\finsh;..\..\components\init;..\..\include;..\..\libcpu\arm\common;..\..\libcpu\arm\cortex-m0;Libraries\CMSIS\Include;Libraries\CMSIS\Nuvoton\M051Series\Include;Libraries\StdDriver\inc;applications;drivers</IncludePath> </VariousControls> </Cads> <Aads> @@ -396,7 +396,7 @@ <ScatterFile>.\nuvoton_m05x.sct</ScatterFile> <IncludeLibs></IncludeLibs> <IncludeLibsPath></IncludeLibsPath> - <Misc> --keep __rt_init* </Misc> + <Misc> --keep __fsym_* --keep __vsym_* --keep __rt_init* </Misc> <LinkerInputFile></LinkerInputFile> <DisabledWarnings></DisabledWarnings> </LDads> @@ -431,6 +431,11 @@ <FileType>1</FileType> <FilePath>drivers\led.c</FilePath> </File> + <File> + <FileName>usart.c</FileName> + <FileType>1</FileType> + <FilePath>drivers\usart.c</FilePath> + </File> </Files> </Group> <Group> @@ -648,6 +653,76 @@ </File> </Files> </Group> + <Group> + <GroupName>finsh</GroupName> + <Files> + <File> + <FileName>shell.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\components\finsh\shell.c</FilePath> + </File> + <File> + <FileName>symbol.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\components\finsh\symbol.c</FilePath> + </File> + <File> + <FileName>cmd.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\components\finsh\cmd.c</FilePath> + </File> + <File> + <FileName>finsh_compiler.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\components\finsh\finsh_compiler.c</FilePath> + </File> + <File> + <FileName>finsh_error.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\components\finsh\finsh_error.c</FilePath> + </File> + <File> + <FileName>finsh_heap.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\components\finsh\finsh_heap.c</FilePath> + </File> + <File> + <FileName>finsh_init.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\components\finsh\finsh_init.c</FilePath> + </File> + <File> + <FileName>finsh_node.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\components\finsh\finsh_node.c</FilePath> + </File> + <File> + <FileName>finsh_ops.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\components\finsh\finsh_ops.c</FilePath> + </File> + <File> + <FileName>finsh_parser.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\components\finsh\finsh_parser.c</FilePath> + </File> + <File> + <FileName>finsh_var.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\components\finsh\finsh_var.c</FilePath> + </File> + <File> + <FileName>finsh_vm.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\components\finsh\finsh_vm.c</FilePath> + </File> + <File> + <FileName>finsh_token.c</FileName> + <FileType>1</FileType> + <FilePath>..\..\components\finsh\finsh_token.c</FilePath> + </File> + </Files> + </Group> <Group> <GroupName>Components</GroupName> <Files> diff --git a/bsp/nuvoton_m05x/rtconfig.h b/bsp/nuvoton_m05x/rtconfig.h index a8d3a48811..7face48d7b 100644 --- a/bsp/nuvoton_m05x/rtconfig.h +++ b/bsp/nuvoton_m05x/rtconfig.h @@ -10,7 +10,7 @@ /* PRIORITY_MAX */ #define RT_THREAD_PRIORITY_MAX 32 - +#define IDLE_THREAD_STACK_SIZE 128 /* Tick per Second */ #define RT_TICK_PER_SECOND 100 @@ -54,7 +54,6 @@ /* Using Small MM */ #define RT_USING_SMALL_MEM -#define RT_USING_TINY_SIZE // <bool name="RT_USING_COMPONENTS_INIT" description="Using RT-Thread components initialization" default="true" /> #define RT_USING_COMPONENTS_INIT @@ -68,19 +67,20 @@ #define RT_USING_SERIAL /* SECTION: Console options */ -//#define RT_USING_CONSOLE +#define RT_USING_CONSOLE /* the buffer size of console*/ -#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLEBUF_SIZE 64 // <string name="RT_CONSOLE_DEVICE_NAME" description="The device name for console" default="uart1" /> -#define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_CONSOLE_DEVICE_NAME "uart0" /* SECTION: finsh, a C-Express shell */ -//#define RT_USING_FINSH +#define RT_USING_FINSH /* configure finsh parameters */ #define FINSH_THREAD_PRIORITY 25 -#define FINSH_THREAD_STACK_SIZE 1024 +#define FINSH_THREAD_STACK_SIZE 512 +#define FINSH_USING_HISTORY 0 #define FINSH_HISTORY_LINES 1 /* Using symbol table */ #define FINSH_USING_SYMTAB