From 4608e1164c0bd254ff735ac41dd20a1e18a19796 Mon Sep 17 00:00:00 2001 From: chenyong <1521761801@qq.com> Date: Tue, 28 May 2019 11:35:47 +0800 Subject: [PATCH 01/30] [net][sal] Improve the sal_bind() function Signed-off-by: chenyong <1521761801@qq.com> --- components/net/sal_socket/src/sal_socket.c | 62 +++++++++++----------- 1 file changed, 30 insertions(+), 32 deletions(-) diff --git a/components/net/sal_socket/src/sal_socket.c b/components/net/sal_socket/src/sal_socket.c index 8f3149abd5..e09b2b7119 100644 --- a/components/net/sal_socket/src/sal_socket.c +++ b/components/net/sal_socket/src/sal_socket.c @@ -561,8 +561,7 @@ int sal_bind(int socket, const struct sockaddr *name, socklen_t namelen) { struct sal_socket *sock; struct sal_proto_family *pf; - struct netdev *new_netdev; - ip_addr_t local_addr; + ip_addr_t input_ipaddr; RT_ASSERT(name); @@ -570,44 +569,43 @@ int sal_bind(int socket, const struct sockaddr *name, socklen_t namelen) SAL_SOCKET_OBJ_GET(sock, socket); /* bind network interface by ip address */ - sal_sockaddr_to_ipaddr(name, &local_addr); + sal_sockaddr_to_ipaddr(name, &input_ipaddr); /* check input ipaddr is default netdev ipaddr */ - if (local_addr.addr == INADDR_ANY) + if (input_ipaddr.addr != INADDR_ANY) { - SAL_NETDEV_SOCKETOPS_VALID(sock->netdev, pf, bind); - return pf->skt_ops->bind((int) sock->user_data, name, namelen); - } + struct sal_proto_family *input_pf = RT_NULL, *local_pf = RT_NULL; + struct netdev *new_netdev = RT_NULL; - new_netdev = netdev_get_by_ipaddr(&local_addr); - if (new_netdev == RT_NULL) - { - LOG_E("Not find network interface device ipaddr(%s).", inet_ntoa(local_addr)); - return -1; - } - - /* change network interface device parameter in sal socket object */ - if (sock->netdev != new_netdev) - { - struct sal_proto_family *old_pf, *new_pf; - int new_socket = 0; - - /* close old netdev socket */ - SAL_NETDEV_SOCKETOPS_VALID(sock->netdev, old_pf, closesocket); - old_pf->skt_ops->closesocket(socket); - - /* open new netdev socket */ - SAL_NETDEV_SOCKETOPS_VALID(new_netdev, new_pf, socket); - new_socket = new_pf->skt_ops->socket(sock->domain, sock->type, sock->protocol); - if (new_socket < 0) + new_netdev = netdev_get_by_ipaddr(&input_ipaddr); + if (new_netdev == RT_NULL) { return -1; } - sock->netdev = new_netdev; - sock->user_data = (void *) new_socket; - } - /* check the network interface socket opreation */ + /* get input and local ip address proto_family */ + SAL_NETDEV_SOCKETOPS_VALID(sock->netdev, local_pf, bind); + SAL_NETDEV_SOCKETOPS_VALID(new_netdev, input_pf, bind); + + /* check the network interface protocol family type */ + if (input_pf->family != local_pf->family) + { + int new_socket = -1; + + /* protocol family is different, close old socket and create new socket by input ip address */ + local_pf->skt_ops->closesocket(socket); + + new_socket = input_pf->skt_ops->socket(input_pf->family, sock->type, sock->protocol); + if (new_socket < 0) + { + return -1; + } + sock->netdev = new_netdev; + sock->user_data = (void *) new_socket; + } + } + + /* check and get protocol families by the network interface device */ SAL_NETDEV_SOCKETOPS_VALID(sock->netdev, pf, bind); return pf->skt_ops->bind((int) sock->user_data, name, namelen); } From 1f9a668607be01db25695bdfa34f90905de3e4c3 Mon Sep 17 00:00:00 2001 From: chenyong <1521761801@qq.com> Date: Tue, 28 May 2019 11:03:36 +0800 Subject: [PATCH 02/30] [net][at] Fix socket create failed issue when default netdev mismatch. Signed-off-by: chenyong <1521761801@qq.com> --- components/net/at/at_socket/at_socket.c | 11 ++++++----- components/net/netdev/include/netdev.h | 1 + components/net/netdev/src/netdev.c | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/components/net/at/at_socket/at_socket.c b/components/net/at/at_socket/at_socket.c index a3b36a06ae..993ec33506 100644 --- a/components/net/at/at_socket/at_socket.c +++ b/components/net/at/at_socket/at_socket.c @@ -359,20 +359,21 @@ __err: return RT_NULL; } -static struct at_socket *alloc_socket(int domain) +static struct at_socket *alloc_socket(void) { extern struct netdev *netdev_default; struct netdev *netdev = RT_NULL; struct at_device *device = RT_NULL; - if (netdev_default && netdev_is_up(netdev_default)) + if (netdev_default && netdev_is_up(netdev_default) && + netdev_family_get(netdev_default) == AF_AT) { netdev = netdev_default; } else { - /* get network interface device by protocol family */ - netdev = netdev_get_by_family(domain); + /* get network interface device by protocol family AF_AT */ + netdev = netdev_get_by_family(AF_AT); if (netdev == RT_NULL) { return RT_NULL; @@ -414,7 +415,7 @@ int at_socket(int domain, int type, int protocol) } /* allocate and initialize a new AT socket */ - sock = alloc_socket(domain); + sock = alloc_socket(); if (sock == RT_NULL) { return -1; diff --git a/components/net/netdev/include/netdev.h b/components/net/netdev/include/netdev.h index e9d8e38658..0be2a2bda3 100644 --- a/components/net/netdev/include/netdev.h +++ b/components/net/netdev/include/netdev.h @@ -138,6 +138,7 @@ struct netdev *netdev_get_by_ipaddr(ip_addr_t *ip_addr); struct netdev *netdev_get_by_name(const char *name); #ifdef RT_USING_SAL struct netdev *netdev_get_by_family(int family); +int netdev_family_get(struct netdev *netdev); #endif /* RT_USING_SAL */ /* Set default network interface device in list */ diff --git a/components/net/netdev/src/netdev.c b/components/net/netdev/src/netdev.c index 71b1ec7ccd..5f49a46f17 100644 --- a/components/net/netdev/src/netdev.c +++ b/components/net/netdev/src/netdev.c @@ -294,6 +294,20 @@ struct netdev *netdev_get_by_family(int family) return RT_NULL; } +/** + * This function will get the family type from network interface device + * + * @param netdev network interface device object + * + * @return the network interface device family type + */ +int netdev_family_get(struct netdev *netdev) +{ + RT_ASSERT(netdev); + + return ((struct sal_proto_family *)netdev->sal_user_data)->family; +} + #endif /* RT_USING_SAL */ /** From 043611b98aca955e9cb511c51baf7240389fba75 Mon Sep 17 00:00:00 2001 From: shaojinchun Date: Wed, 29 May 2019 08:26:08 +0800 Subject: [PATCH 03/30] add cortex-a fpu support --- libcpu/arm/cortex-a/context_gcc.S | 24 +++++++++++ libcpu/arm/cortex-a/stack.c | 3 ++ libcpu/arm/cortex-a/start_gcc.S | 70 +++++++++++++++++++++++++++++++ libcpu/arm/cortex-a/trap.c | 33 +++++++++++++++ 4 files changed, 130 insertions(+) diff --git a/libcpu/arm/cortex-a/context_gcc.S b/libcpu/arm/cortex-a/context_gcc.S index dff7a1de68..768c5138e9 100644 --- a/libcpu/arm/cortex-a/context_gcc.S +++ b/libcpu/arm/cortex-a/context_gcc.S @@ -76,6 +76,18 @@ rt_hw_context_switch: stmfd sp, {r13, r14}^ @ push usr_sp usr_lr sub sp, #8 #endif +#ifdef RT_USING_FPU + /* fpu context */ + vmrs r6, fpexc + tst r6, #(1<<30) + beq 1f + vstmdb sp!, {d0-d15} + vstmdb sp!, {d16-d31} + vmrs r5, fpscr + stmfd sp!, {r5} +1: + stmfd sp!, {r6} +#endif str sp, [r0] @ store sp in preempted tasks TCB ldr sp, [r1] @ get new task stack pointer @@ -147,6 +159,18 @@ rt_hw_context_switch_exit: mov sp, r0 #endif #endif +#ifdef RT_USING_FPU +/* fpu context */ + ldmfd sp!, {r6} + vmsr fpexc, r6 + tst r6, #(1<<30) + beq 1f + ldmfd sp!, {r5} + vmsr fpscr, r5 + vldmia sp!, {d16-d31} + vldmia sp!, {d0-d15} +1: +#endif #ifdef RT_USING_LWP ldmfd sp, {r13, r14}^ /* usr_sp, usr_lr */ diff --git a/libcpu/arm/cortex-a/stack.c b/libcpu/arm/cortex-a/stack.c index d76b8a428a..07d795ab5b 100644 --- a/libcpu/arm/cortex-a/stack.c +++ b/libcpu/arm/cortex-a/stack.c @@ -60,6 +60,9 @@ rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, *(--stk) = 0; /* user lr */ *(--stk) = 0; /* user sp*/ #endif +#ifdef RT_USING_FPU + *(--stk) = 0; /* not use fpu*/ +#endif /* return task's current stack address */ return (rt_uint8_t *)stk; diff --git a/libcpu/arm/cortex-a/start_gcc.S b/libcpu/arm/cortex-a/start_gcc.S index 014846f3aa..91faa0e3ff 100644 --- a/libcpu/arm/cortex-a/start_gcc.S +++ b/libcpu/arm/cortex-a/start_gcc.S @@ -22,7 +22,11 @@ .equ I_Bit, 0x80 @ when I bit is set, IRQ is disabled .equ F_Bit, 0x40 @ when F bit is set, FIQ is disabled +#ifdef RT_USING_FPU +.equ UND_Stack_Size, 0x00000400 +#else .equ UND_Stack_Size, 0x00000000 +#endif .equ SVC_Stack_Size, 0x00000400 .equ ABT_Stack_Size, 0x00000000 .equ RT_FIQ_STACK_PGSZ, 0x00000000 @@ -50,6 +54,11 @@ _reset: /* set the cpu to SVC32 mode and disable interrupt */ cps #Mode_SVC +#ifdef RT_USING_FPU + mov r4, #0xfffffff + mcr p15, 0, r4, c1, c0, 2 +#endif + /* disable the data alignment check */ mrc p15, 0, r1, c1, c0, 0 bic r1, #(1<<1) @@ -176,6 +185,19 @@ vector_irq: stmfd r0, {r13, r14}^ /* usr_sp, usr_lr */ sub r0, #8 #endif +#ifdef RT_USING_FPU + /* fpu context */ + vmrs r6, fpexc + tst r6, #(1<<30) + beq 1f + vstmdb r0!, {d0-d15} + vstmdb r0!, {d16-d31} + vmrs r5, fpscr + stmfd r0!, {r5} +1: + stmfd r0!, {r6} +#endif + /* now irq stack is clean */ /* r0 is task svc_sp */ /* backup r0 -> r8 */ @@ -234,6 +256,18 @@ rt_hw_context_switch_interrupt_do: stmfd sp, {r13, r14}^ @push usr_sp, usr_lr sub sp, #8 #endif +#ifdef RT_USING_FPU + /* fpu context */ + vmrs r6, fpexc + tst r6, #(1<<30) + beq 1f + vstmdb sp!, {d0-d15} + vstmdb sp!, {d16-d31} + vmrs r5, fpscr + stmfd sp!, {r5} +1: + stmfd sp!, {r6} +#endif ldr r4, =rt_interrupt_from_thread ldr r5, [r4] @@ -243,6 +277,19 @@ rt_hw_context_switch_interrupt_do: ldr r6, [r6] ldr sp, [r6] @ get new task's stack pointer +#ifdef RT_USING_FPU +/* fpu context */ + ldmfd sp!, {r6} + vmsr fpexc, r6 + tst r6, #(1<<30) + beq 1f + ldmfd sp!, {r5} + vmsr fpscr, r5 + vldmia sp!, {d16-d31} + vldmia sp!, {d0-d15} +1: +#endif + #ifdef RT_USING_LWP ldmfd sp, {r13, r14}^ @pop usr_sp, usr_lr add sp, #8 @@ -278,7 +325,14 @@ vector_swi: .globl vector_undef vector_undef: push_svc_reg + cps #Mode_UND bl rt_hw_trap_undef +#ifdef RT_USING_FPU + ldr lr, [sp, #15*4] + ldmia sp, {r0 - r12} + add sp, sp, #17 * 4 + movs pc, lr +#endif b . .align 5 @@ -315,6 +369,12 @@ set_secondary_cpu_boot_address: .global secondary_cpu_start secondary_cpu_start: + +#ifdef RT_USING_FPU + mov r4, #0xfffffff + mcr p15, 0, r4, c1, c0, 2 +#endif + mrc p15, 0, r1, c1, c0, 1 mov r0, #(1<<6) orr r1, r0 @@ -324,6 +384,11 @@ secondary_cpu_start: bic r0, #(1<<13) mcr p15, 0, r0, c1, c0, 0 +#ifdef RT_USING_FPU + cps #Mode_UND + ldr sp, =und_stack_2_limit +#endif + cps #Mode_IRQ ldr sp, =irq_stack_2_limit @@ -349,3 +414,8 @@ irq_stack_2: .space (1 << 10) irq_stack_2_limit: +#ifdef RT_USING_FPU +und_stack_2: + .space (1 << 10) +und_stack_2_limit: +#endif diff --git a/libcpu/arm/cortex-a/trap.c b/libcpu/arm/cortex-a/trap.c index a25f6ac862..dc232a46ee 100644 --- a/libcpu/arm/cortex-a/trap.c +++ b/libcpu/arm/cortex-a/trap.c @@ -45,6 +45,39 @@ void rt_hw_show_register(struct rt_hw_exp_stack *regs) */ void rt_hw_trap_undef(struct rt_hw_exp_stack *regs) { +#ifdef RT_USING_FPU + { + uint32_t ins; + uint32_t addr; + + if (regs->cpsr & (1 << 5)) + { + /* thumb mode */ + addr = regs->pc - 2; + ins = (uint32_t)*(uint16_t*)addr; + if ((ins & (3 << 11)) != 0) + { + /* 32 bit ins */ + ins <<= 16; + ins += *(uint16_t*)(addr + 2); + } + } + else + { + addr = regs->pc - 4; + ins = *(uint32_t*)addr; + } + if ((ins & 0xe00) == 0xa00) + { + /* float ins */ + uint32_t val = (1U << 30); + + asm volatile ("vmsr fpexc, %0"::"r"(val):"memory"); + regs->pc = addr; + return; + } + } +#endif rt_kprintf("undefined instruction:\n"); rt_hw_show_register(regs); #ifdef RT_USING_FINSH From d78c574629c9e9bd278e65ec5c03a27216edd68e Mon Sep 17 00:00:00 2001 From: SummerGift Date: Wed, 29 May 2019 09:51:47 +0800 Subject: [PATCH 04/30] =?UTF-8?q?=E3=80=90=E4=BF=AE=E6=94=B9=E3=80=91407-a?= =?UTF-8?q?tk-explorer=20bsp=20=E7=9A=84=20shell=20=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=A0=88=E5=A4=A7=E5=B0=8F=E4=B8=BA=204096?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/stm32/stm32f407-atk-explorer/.config | 58 +++++++++++++++++---- bsp/stm32/stm32f407-atk-explorer/rtconfig.h | 15 ++++-- 2 files changed, 57 insertions(+), 16 deletions(-) diff --git a/bsp/stm32/stm32f407-atk-explorer/.config b/bsp/stm32/stm32f407-atk-explorer/.config index 52b162451a..5d828c032a 100644 --- a/bsp/stm32/stm32f407-atk-explorer/.config +++ b/bsp/stm32/stm32f407-atk-explorer/.config @@ -7,6 +7,7 @@ # RT-Thread Kernel # CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_ALIGN_SIZE=4 # CONFIG_RT_THREAD_PRIORITY_8 is not set @@ -63,8 +64,9 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" -CONFIG_RT_VER_NUM=0x40000 +CONFIG_RT_VER_NUM=0x40002 CONFIG_ARCH_ARM=y +CONFIG_RT_USING_CPU_FFS=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M4=y # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set @@ -93,7 +95,7 @@ CONFIG_FINSH_USING_SYMTAB=y CONFIG_FINSH_USING_DESCRIPTION=y # CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set CONFIG_FINSH_THREAD_PRIORITY=20 -CONFIG_FINSH_THREAD_STACK_SIZE=2048 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 CONFIG_FINSH_CMD_SIZE=80 # CONFIG_FINSH_USING_AUTH is not set CONFIG_FINSH_USING_MSH=y @@ -111,8 +113,10 @@ CONFIG_FINSH_ARG_MAX=10 # CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_PIPE_BUFSZ=512 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set CONFIG_RT_USING_SERIAL=y CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_HWTIMER is not set # CONFIG_RT_USING_CPUTIME is not set @@ -129,6 +133,12 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_SPI is not set # CONFIG_RT_USING_WDT is not set # CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set + +# +# Using Hardware Crypto drivers +# +# CONFIG_RT_USING_HWCRYPTO is not set # # Using WiFi @@ -156,6 +166,11 @@ CONFIG_RT_USING_PIN=y # # CONFIG_RT_USING_SAL is not set +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV is not set + # # light weight TCP/IP stack # @@ -179,16 +194,9 @@ CONFIG_RT_USING_PIN=y # # Utilities # -# CONFIG_RT_USING_LOGTRACE is not set # CONFIG_RT_USING_RYM is not set # CONFIG_RT_USING_ULOG is not set # CONFIG_RT_USING_UTEST is not set - -# -# ARM CMSIS -# -# CONFIG_RT_USING_CMSIS_OS is not set -# CONFIG_RT_USING_RTT_CMSIS is not set # CONFIG_RT_USING_LWP is not set # @@ -205,6 +213,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_WEBTERMINAL is not set # CONFIG_PKG_USING_CJSON is not set # CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LIBMODBUS is not set # CONFIG_PKG_USING_LJSON is not set # CONFIG_PKG_USING_EZXML is not set # CONFIG_PKG_USING_NANOPB is not set @@ -222,10 +231,12 @@ CONFIG_RT_USING_PIN=y # Wiced WiFi # # CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set # CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set # CONFIG_PKG_USING_WIZNET is not set # @@ -236,6 +247,11 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ALI_IOTKIT is not set # CONFIG_PKG_USING_AZURE is not set # CONFIG_PKG_USING_TENCENT_IOTKIT is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set # # security packages @@ -256,6 +272,7 @@ CONFIG_RT_USING_PIN=y # # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set # # tools packages @@ -267,6 +284,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_RDB is not set # CONFIG_PKG_USING_QRCODE is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ADBD is not set # # system packages @@ -284,21 +302,32 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_CMSIS is not set # CONFIG_PKG_USING_DFS_YAFFS is not set # CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_THREAD_POOL is not set # # peripheral libraries and drivers # +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set # CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_SHT2X is not set -# CONFIG_PKG_USING_AHT10 is not set # CONFIG_PKG_USING_AP3216C is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_U8G2 is not set # CONFIG_PKG_USING_BUTTON is not set -# CONFIG_PKG_USING_MPU6XXX is not set # CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set # # miscellaneous packages @@ -314,6 +343,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set # CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set # # samples: kernel and components samples @@ -324,6 +354,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set # CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_NNOM is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F4=y @@ -351,7 +382,12 @@ CONFIG_BSP_USING_GPIO=y CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART1=y # CONFIG_BSP_UART1_RX_USING_DMA is not set +# CONFIG_BSP_UART1_TX_USING_DMA is not set +# CONFIG_BSP_USING_UART2 is not set # CONFIG_BSP_USING_UART3 is not set +# CONFIG_BSP_USING_UART4 is not set +# CONFIG_BSP_USING_UART5 is not set +# CONFIG_BSP_USING_UART6 is not set # CONFIG_BSP_USING_TIM is not set # CONFIG_BSP_USING_PWM is not set # CONFIG_BSP_USING_ON_CHIP_FLASH is not set diff --git a/bsp/stm32/stm32f407-atk-explorer/rtconfig.h b/bsp/stm32/stm32f407-atk-explorer/rtconfig.h index ce6e3b4c2c..5b291c6de1 100644 --- a/bsp/stm32/stm32f407-atk-explorer/rtconfig.h +++ b/bsp/stm32/stm32f407-atk-explorer/rtconfig.h @@ -39,8 +39,9 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" -#define RT_VER_NUM 0x40000 +#define RT_VER_NUM 0x40002 #define ARCH_ARM +#define RT_USING_CPU_FFS #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M4 @@ -63,7 +64,7 @@ #define FINSH_USING_SYMTAB #define FINSH_USING_DESCRIPTION #define FINSH_THREAD_PRIORITY 20 -#define FINSH_THREAD_STACK_SIZE 2048 +#define FINSH_THREAD_STACK_SIZE 4096 #define FINSH_CMD_SIZE 80 #define FINSH_USING_MSH #define FINSH_USING_MSH_DEFAULT @@ -79,8 +80,12 @@ #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL #define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_PIN +/* Using Hardware Crypto drivers */ + + /* Using WiFi */ @@ -95,6 +100,9 @@ /* Socket abstraction layer */ +/* Network interface device */ + + /* light weight TCP/IP stack */ @@ -110,9 +118,6 @@ /* Utilities */ -/* ARM CMSIS */ - - /* RT-Thread online packages */ /* IoT - internet of things */ From 96f0085f45abf88dfbb62a70f2309101d2105d89 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Wed, 29 May 2019 09:59:13 +0800 Subject: [PATCH 05/30] =?UTF-8?q?=E3=80=90=E4=BF=AE=E6=94=B9=E3=80=91shell?= =?UTF-8?q?=20=E7=BA=BF=E7=A8=8B=E6=A0=88=E9=BB=98=E8=AE=A4=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=E4=B8=BA=204096?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/stm32/stm32f407-st-discovery/.config | 53 +++++++++++++---- bsp/stm32/stm32f407-st-discovery/rtconfig.h | 15 +++-- bsp/stm32/stm32f429-atk-apollo/.config | 54 ++++++++++++++---- bsp/stm32/stm32f429-atk-apollo/rtconfig.h | 15 +++-- bsp/stm32/stm32f429-fire-challenger/.config | 53 +++++++++++++---- .../stm32f429-fire-challenger/rtconfig.h | 15 +++-- bsp/stm32/stm32f767-fire-challenger/.config | 57 ++++++++++++++----- .../stm32f767-fire-challenger/rtconfig.h | 15 +++-- 8 files changed, 209 insertions(+), 68 deletions(-) diff --git a/bsp/stm32/stm32f407-st-discovery/.config b/bsp/stm32/stm32f407-st-discovery/.config index 456c95097d..c7dab36427 100644 --- a/bsp/stm32/stm32f407-st-discovery/.config +++ b/bsp/stm32/stm32f407-st-discovery/.config @@ -7,6 +7,7 @@ # RT-Thread Kernel # CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_ALIGN_SIZE=4 # CONFIG_RT_THREAD_PRIORITY_8 is not set @@ -63,8 +64,9 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" -CONFIG_RT_VER_NUM=0x40000 +CONFIG_RT_VER_NUM=0x40002 CONFIG_ARCH_ARM=y +CONFIG_RT_USING_CPU_FFS=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M4=y # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set @@ -93,7 +95,7 @@ CONFIG_FINSH_USING_SYMTAB=y CONFIG_FINSH_USING_DESCRIPTION=y # CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set CONFIG_FINSH_THREAD_PRIORITY=20 -CONFIG_FINSH_THREAD_STACK_SIZE=2048 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 CONFIG_FINSH_CMD_SIZE=80 # CONFIG_FINSH_USING_AUTH is not set CONFIG_FINSH_USING_MSH=y @@ -111,8 +113,10 @@ CONFIG_FINSH_ARG_MAX=10 # CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_PIPE_BUFSZ=512 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set CONFIG_RT_USING_SERIAL=y CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_HWTIMER is not set # CONFIG_RT_USING_CPUTIME is not set @@ -129,6 +133,12 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_SPI is not set # CONFIG_RT_USING_WDT is not set # CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set + +# +# Using Hardware Crypto drivers +# +# CONFIG_RT_USING_HWCRYPTO is not set # # Using WiFi @@ -156,6 +166,11 @@ CONFIG_RT_USING_PIN=y # # CONFIG_RT_USING_SAL is not set +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV is not set + # # light weight TCP/IP stack # @@ -179,16 +194,9 @@ CONFIG_RT_USING_PIN=y # # Utilities # -# CONFIG_RT_USING_LOGTRACE is not set # CONFIG_RT_USING_RYM is not set # CONFIG_RT_USING_ULOG is not set # CONFIG_RT_USING_UTEST is not set - -# -# ARM CMSIS -# -# CONFIG_RT_USING_CMSIS_OS is not set -# CONFIG_RT_USING_RTT_CMSIS is not set # CONFIG_RT_USING_LWP is not set # @@ -205,6 +213,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_WEBTERMINAL is not set # CONFIG_PKG_USING_CJSON is not set # CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LIBMODBUS is not set # CONFIG_PKG_USING_LJSON is not set # CONFIG_PKG_USING_EZXML is not set # CONFIG_PKG_USING_NANOPB is not set @@ -222,10 +231,12 @@ CONFIG_RT_USING_PIN=y # Wiced WiFi # # CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set # CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set # CONFIG_PKG_USING_WIZNET is not set # @@ -236,6 +247,11 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ALI_IOTKIT is not set # CONFIG_PKG_USING_AZURE is not set # CONFIG_PKG_USING_TENCENT_IOTKIT is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set # # security packages @@ -256,6 +272,7 @@ CONFIG_RT_USING_PIN=y # # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set # # tools packages @@ -267,6 +284,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_RDB is not set # CONFIG_PKG_USING_QRCODE is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ADBD is not set # # system packages @@ -284,21 +302,32 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_CMSIS is not set # CONFIG_PKG_USING_DFS_YAFFS is not set # CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_THREAD_POOL is not set # # peripheral libraries and drivers # +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set # CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_SHT2X is not set -# CONFIG_PKG_USING_AHT10 is not set # CONFIG_PKG_USING_AP3216C is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_U8G2 is not set # CONFIG_PKG_USING_BUTTON is not set -# CONFIG_PKG_USING_MPU6XXX is not set # CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set # # miscellaneous packages @@ -314,6 +343,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set # CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set # # samples: kernel and components samples @@ -324,6 +354,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set # CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_NNOM is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F4=y diff --git a/bsp/stm32/stm32f407-st-discovery/rtconfig.h b/bsp/stm32/stm32f407-st-discovery/rtconfig.h index c25a065336..3c6a25a1fb 100644 --- a/bsp/stm32/stm32f407-st-discovery/rtconfig.h +++ b/bsp/stm32/stm32f407-st-discovery/rtconfig.h @@ -39,8 +39,9 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" -#define RT_VER_NUM 0x40000 +#define RT_VER_NUM 0x40002 #define ARCH_ARM +#define RT_USING_CPU_FFS #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M4 @@ -63,7 +64,7 @@ #define FINSH_USING_SYMTAB #define FINSH_USING_DESCRIPTION #define FINSH_THREAD_PRIORITY 20 -#define FINSH_THREAD_STACK_SIZE 2048 +#define FINSH_THREAD_STACK_SIZE 4096 #define FINSH_CMD_SIZE 80 #define FINSH_USING_MSH #define FINSH_USING_MSH_DEFAULT @@ -79,8 +80,12 @@ #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL #define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_PIN +/* Using Hardware Crypto drivers */ + + /* Using WiFi */ @@ -95,6 +100,9 @@ /* Socket abstraction layer */ +/* Network interface device */ + + /* light weight TCP/IP stack */ @@ -110,9 +118,6 @@ /* Utilities */ -/* ARM CMSIS */ - - /* RT-Thread online packages */ /* IoT - internet of things */ diff --git a/bsp/stm32/stm32f429-atk-apollo/.config b/bsp/stm32/stm32f429-atk-apollo/.config index 71b42e506b..ee20670309 100644 --- a/bsp/stm32/stm32f429-atk-apollo/.config +++ b/bsp/stm32/stm32f429-atk-apollo/.config @@ -7,6 +7,7 @@ # RT-Thread Kernel # CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_ALIGN_SIZE=4 # CONFIG_RT_THREAD_PRIORITY_8 is not set @@ -63,8 +64,9 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" -CONFIG_RT_VER_NUM=0x40000 +CONFIG_RT_VER_NUM=0x40002 CONFIG_ARCH_ARM=y +CONFIG_RT_USING_CPU_FFS=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M4=y # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set @@ -93,7 +95,7 @@ CONFIG_FINSH_USING_SYMTAB=y CONFIG_FINSH_USING_DESCRIPTION=y # CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set CONFIG_FINSH_THREAD_PRIORITY=20 -CONFIG_FINSH_THREAD_STACK_SIZE=2048 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 CONFIG_FINSH_CMD_SIZE=80 # CONFIG_FINSH_USING_AUTH is not set CONFIG_FINSH_USING_MSH=y @@ -111,8 +113,10 @@ CONFIG_FINSH_ARG_MAX=10 # CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_PIPE_BUFSZ=512 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set CONFIG_RT_USING_SERIAL=y CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_HWTIMER is not set # CONFIG_RT_USING_CPUTIME is not set @@ -129,6 +133,12 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_SPI is not set # CONFIG_RT_USING_WDT is not set # CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set + +# +# Using Hardware Crypto drivers +# +# CONFIG_RT_USING_HWCRYPTO is not set # # Using WiFi @@ -156,6 +166,11 @@ CONFIG_RT_USING_PIN=y # # CONFIG_RT_USING_SAL is not set +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV is not set + # # light weight TCP/IP stack # @@ -179,16 +194,9 @@ CONFIG_RT_USING_PIN=y # # Utilities # -# CONFIG_RT_USING_LOGTRACE is not set # CONFIG_RT_USING_RYM is not set # CONFIG_RT_USING_ULOG is not set # CONFIG_RT_USING_UTEST is not set - -# -# ARM CMSIS -# -# CONFIG_RT_USING_CMSIS_OS is not set -# CONFIG_RT_USING_RTT_CMSIS is not set # CONFIG_RT_USING_LWP is not set # @@ -205,6 +213,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_WEBTERMINAL is not set # CONFIG_PKG_USING_CJSON is not set # CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LIBMODBUS is not set # CONFIG_PKG_USING_LJSON is not set # CONFIG_PKG_USING_EZXML is not set # CONFIG_PKG_USING_NANOPB is not set @@ -222,10 +231,12 @@ CONFIG_RT_USING_PIN=y # Wiced WiFi # # CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set # CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set # CONFIG_PKG_USING_WIZNET is not set # @@ -236,6 +247,11 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ALI_IOTKIT is not set # CONFIG_PKG_USING_AZURE is not set # CONFIG_PKG_USING_TENCENT_IOTKIT is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set # # security packages @@ -256,6 +272,7 @@ CONFIG_RT_USING_PIN=y # # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set # # tools packages @@ -267,6 +284,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_RDB is not set # CONFIG_PKG_USING_QRCODE is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ADBD is not set # # system packages @@ -284,21 +302,32 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_CMSIS is not set # CONFIG_PKG_USING_DFS_YAFFS is not set # CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_THREAD_POOL is not set # # peripheral libraries and drivers # +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set # CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_SHT2X is not set -# CONFIG_PKG_USING_AHT10 is not set # CONFIG_PKG_USING_AP3216C is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_U8G2 is not set # CONFIG_PKG_USING_BUTTON is not set -# CONFIG_PKG_USING_MPU6XXX is not set # CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set # # miscellaneous packages @@ -314,6 +343,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set # CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set # # samples: kernel and components samples @@ -324,6 +354,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set # CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_NNOM is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F4=y @@ -362,6 +393,7 @@ CONFIG_BSP_USING_UART1=y # CONFIG_BSP_USING_ONCHIP_RTC is not set # CONFIG_BSP_USING_WDT is not set # CONFIG_BSP_USING_SDIO is not set +# CONFIG_BSP_USING_FMC is not set # # Board extended module Drivers diff --git a/bsp/stm32/stm32f429-atk-apollo/rtconfig.h b/bsp/stm32/stm32f429-atk-apollo/rtconfig.h index 21f47999d0..6200e369ae 100644 --- a/bsp/stm32/stm32f429-atk-apollo/rtconfig.h +++ b/bsp/stm32/stm32f429-atk-apollo/rtconfig.h @@ -40,8 +40,9 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" -#define RT_VER_NUM 0x40000 +#define RT_VER_NUM 0x40002 #define ARCH_ARM +#define RT_USING_CPU_FFS #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M4 @@ -64,7 +65,7 @@ #define FINSH_USING_SYMTAB #define FINSH_USING_DESCRIPTION #define FINSH_THREAD_PRIORITY 20 -#define FINSH_THREAD_STACK_SIZE 2048 +#define FINSH_THREAD_STACK_SIZE 4096 #define FINSH_CMD_SIZE 80 #define FINSH_USING_MSH #define FINSH_USING_MSH_DEFAULT @@ -79,8 +80,12 @@ #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL #define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_PIN +/* Using Hardware Crypto drivers */ + + /* Using WiFi */ @@ -95,6 +100,9 @@ /* Socket abstraction layer */ +/* Network interface device */ + + /* light weight TCP/IP stack */ @@ -110,9 +118,6 @@ /* Utilities */ -/* ARM CMSIS */ - - /* RT-Thread online packages */ /* IoT - internet of things */ diff --git a/bsp/stm32/stm32f429-fire-challenger/.config b/bsp/stm32/stm32f429-fire-challenger/.config index 55d2ccfb56..1f7e0802b7 100644 --- a/bsp/stm32/stm32f429-fire-challenger/.config +++ b/bsp/stm32/stm32f429-fire-challenger/.config @@ -7,6 +7,7 @@ # RT-Thread Kernel # CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_ALIGN_SIZE=4 # CONFIG_RT_THREAD_PRIORITY_8 is not set @@ -63,8 +64,9 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" -CONFIG_RT_VER_NUM=0x40000 +CONFIG_RT_VER_NUM=0x40002 CONFIG_ARCH_ARM=y +CONFIG_RT_USING_CPU_FFS=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M4=y # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set @@ -93,7 +95,7 @@ CONFIG_FINSH_USING_SYMTAB=y CONFIG_FINSH_USING_DESCRIPTION=y # CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set CONFIG_FINSH_THREAD_PRIORITY=20 -CONFIG_FINSH_THREAD_STACK_SIZE=2048 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 CONFIG_FINSH_CMD_SIZE=80 # CONFIG_FINSH_USING_AUTH is not set CONFIG_FINSH_USING_MSH=y @@ -111,8 +113,10 @@ CONFIG_FINSH_ARG_MAX=10 # CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_PIPE_BUFSZ=512 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set CONFIG_RT_USING_SERIAL=y CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_SERIAL_RB_BUFSZ=64 # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_HWTIMER is not set # CONFIG_RT_USING_CPUTIME is not set @@ -129,6 +133,12 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_SPI is not set # CONFIG_RT_USING_WDT is not set # CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set + +# +# Using Hardware Crypto drivers +# +# CONFIG_RT_USING_HWCRYPTO is not set # # Using WiFi @@ -156,6 +166,11 @@ CONFIG_RT_USING_PIN=y # # CONFIG_RT_USING_SAL is not set +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV is not set + # # light weight TCP/IP stack # @@ -179,16 +194,9 @@ CONFIG_RT_USING_PIN=y # # Utilities # -# CONFIG_RT_USING_LOGTRACE is not set # CONFIG_RT_USING_RYM is not set # CONFIG_RT_USING_ULOG is not set # CONFIG_RT_USING_UTEST is not set - -# -# ARM CMSIS -# -# CONFIG_RT_USING_CMSIS_OS is not set -# CONFIG_RT_USING_RTT_CMSIS is not set # CONFIG_RT_USING_LWP is not set # @@ -205,6 +213,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_WEBTERMINAL is not set # CONFIG_PKG_USING_CJSON is not set # CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LIBMODBUS is not set # CONFIG_PKG_USING_LJSON is not set # CONFIG_PKG_USING_EZXML is not set # CONFIG_PKG_USING_NANOPB is not set @@ -222,10 +231,12 @@ CONFIG_RT_USING_PIN=y # Wiced WiFi # # CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set # CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set # CONFIG_PKG_USING_WIZNET is not set # @@ -236,6 +247,11 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ALI_IOTKIT is not set # CONFIG_PKG_USING_AZURE is not set # CONFIG_PKG_USING_TENCENT_IOTKIT is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set # # security packages @@ -256,6 +272,7 @@ CONFIG_RT_USING_PIN=y # # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set # # tools packages @@ -267,6 +284,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_RDB is not set # CONFIG_PKG_USING_QRCODE is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ADBD is not set # # system packages @@ -284,21 +302,32 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_CMSIS is not set # CONFIG_PKG_USING_DFS_YAFFS is not set # CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_THREAD_POOL is not set # # peripheral libraries and drivers # +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set # CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_SHT2X is not set -# CONFIG_PKG_USING_AHT10 is not set # CONFIG_PKG_USING_AP3216C is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_U8G2 is not set # CONFIG_PKG_USING_BUTTON is not set -# CONFIG_PKG_USING_MPU6XXX is not set # CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set # # miscellaneous packages @@ -314,6 +343,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set # CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set # # samples: kernel and components samples @@ -324,6 +354,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set # CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_NNOM is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F4=y diff --git a/bsp/stm32/stm32f429-fire-challenger/rtconfig.h b/bsp/stm32/stm32f429-fire-challenger/rtconfig.h index f411466331..325e977d76 100644 --- a/bsp/stm32/stm32f429-fire-challenger/rtconfig.h +++ b/bsp/stm32/stm32f429-fire-challenger/rtconfig.h @@ -40,8 +40,9 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" -#define RT_VER_NUM 0x40000 +#define RT_VER_NUM 0x40002 #define ARCH_ARM +#define RT_USING_CPU_FFS #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M4 @@ -64,7 +65,7 @@ #define FINSH_USING_SYMTAB #define FINSH_USING_DESCRIPTION #define FINSH_THREAD_PRIORITY 20 -#define FINSH_THREAD_STACK_SIZE 2048 +#define FINSH_THREAD_STACK_SIZE 4096 #define FINSH_CMD_SIZE 80 #define FINSH_USING_MSH #define FINSH_USING_MSH_DEFAULT @@ -80,8 +81,12 @@ #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL #define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_PIN +/* Using Hardware Crypto drivers */ + + /* Using WiFi */ @@ -96,6 +101,9 @@ /* Socket abstraction layer */ +/* Network interface device */ + + /* light weight TCP/IP stack */ @@ -111,9 +119,6 @@ /* Utilities */ -/* ARM CMSIS */ - - /* RT-Thread online packages */ /* IoT - internet of things */ diff --git a/bsp/stm32/stm32f767-fire-challenger/.config b/bsp/stm32/stm32f767-fire-challenger/.config index 4f6f6f6468..eb7dab86a1 100644 --- a/bsp/stm32/stm32f767-fire-challenger/.config +++ b/bsp/stm32/stm32f767-fire-challenger/.config @@ -7,6 +7,7 @@ # RT-Thread Kernel # CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_ALIGN_SIZE=4 # CONFIG_RT_THREAD_PRIORITY_8 is not set @@ -63,8 +64,9 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" -CONFIG_RT_VER_NUM=0x40000 +CONFIG_RT_VER_NUM=0x40002 CONFIG_ARCH_ARM=y +CONFIG_RT_USING_CPU_FFS=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M7=y # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set @@ -93,7 +95,7 @@ CONFIG_FINSH_USING_SYMTAB=y CONFIG_FINSH_USING_DESCRIPTION=y # CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set CONFIG_FINSH_THREAD_PRIORITY=20 -CONFIG_FINSH_THREAD_STACK_SIZE=2048 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 CONFIG_FINSH_CMD_SIZE=80 # CONFIG_FINSH_USING_AUTH is not set CONFIG_FINSH_USING_MSH=y @@ -105,18 +107,16 @@ CONFIG_FINSH_ARG_MAX=10 # Device virtual file system # # CONFIG_RT_USING_DFS is not set -# CONFIG_RT_DFS_ELM_USE_LFN_0 is not set -# CONFIG_RT_DFS_ELM_USE_LFN_1 is not set -# CONFIG_RT_DFS_ELM_USE_LFN_2 is not set -# CONFIG_RT_DFS_ELM_USE_LFN_3 is not set # # Device Drivers # CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_PIPE_BUFSZ=512 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set CONFIG_RT_USING_SERIAL=y # CONFIG_RT_SERIAL_USING_DMA is not set +CONFIG_RT_SERIAL_RB_BUFSZ=64 # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_HWTIMER is not set # CONFIG_RT_USING_CPUTIME is not set @@ -133,6 +133,12 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_SPI is not set # CONFIG_RT_USING_WDT is not set # CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set + +# +# Using Hardware Crypto drivers +# +# CONFIG_RT_USING_HWCRYPTO is not set # # Using WiFi @@ -160,6 +166,11 @@ CONFIG_RT_USING_PIN=y # # CONFIG_RT_USING_SAL is not set +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV is not set + # # light weight TCP/IP stack # @@ -183,16 +194,9 @@ CONFIG_RT_USING_PIN=y # # Utilities # -# CONFIG_RT_USING_LOGTRACE is not set # CONFIG_RT_USING_RYM is not set # CONFIG_RT_USING_ULOG is not set # CONFIG_RT_USING_UTEST is not set - -# -# ARM CMSIS -# -# CONFIG_RT_USING_CMSIS_OS is not set -# CONFIG_RT_USING_RTT_CMSIS is not set # CONFIG_RT_USING_LWP is not set # @@ -209,6 +213,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_WEBTERMINAL is not set # CONFIG_PKG_USING_CJSON is not set # CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LIBMODBUS is not set # CONFIG_PKG_USING_LJSON is not set # CONFIG_PKG_USING_EZXML is not set # CONFIG_PKG_USING_NANOPB is not set @@ -226,10 +231,12 @@ CONFIG_RT_USING_PIN=y # Wiced WiFi # # CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set # CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set # CONFIG_PKG_USING_WIZNET is not set # @@ -240,6 +247,11 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ALI_IOTKIT is not set # CONFIG_PKG_USING_AZURE is not set # CONFIG_PKG_USING_TENCENT_IOTKIT is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set # # security packages @@ -260,6 +272,7 @@ CONFIG_RT_USING_PIN=y # # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set # # tools packages @@ -271,6 +284,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_RDB is not set # CONFIG_PKG_USING_QRCODE is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ADBD is not set # # system packages @@ -288,21 +302,32 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_CMSIS is not set # CONFIG_PKG_USING_DFS_YAFFS is not set # CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_THREAD_POOL is not set # # peripheral libraries and drivers # +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set # CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_SHT2X is not set -# CONFIG_PKG_USING_AHT10 is not set # CONFIG_PKG_USING_AP3216C is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_U8G2 is not set # CONFIG_PKG_USING_BUTTON is not set -# CONFIG_PKG_USING_MPU6XXX is not set # CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set # # miscellaneous packages @@ -318,6 +343,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set # CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set # # samples: kernel and components samples @@ -328,6 +354,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set # CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_NNOM is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F7=y diff --git a/bsp/stm32/stm32f767-fire-challenger/rtconfig.h b/bsp/stm32/stm32f767-fire-challenger/rtconfig.h index 405e99cef1..d8c81ab979 100644 --- a/bsp/stm32/stm32f767-fire-challenger/rtconfig.h +++ b/bsp/stm32/stm32f767-fire-challenger/rtconfig.h @@ -40,8 +40,9 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" -#define RT_VER_NUM 0x40000 +#define RT_VER_NUM 0x40002 #define ARCH_ARM +#define RT_USING_CPU_FFS #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M7 @@ -64,7 +65,7 @@ #define FINSH_USING_SYMTAB #define FINSH_USING_DESCRIPTION #define FINSH_THREAD_PRIORITY 20 -#define FINSH_THREAD_STACK_SIZE 2048 +#define FINSH_THREAD_STACK_SIZE 4096 #define FINSH_CMD_SIZE 80 #define FINSH_USING_MSH #define FINSH_USING_MSH_DEFAULT @@ -79,8 +80,12 @@ #define RT_USING_DEVICE_IPC #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL +#define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_PIN +/* Using Hardware Crypto drivers */ + + /* Using WiFi */ @@ -95,6 +100,9 @@ /* Socket abstraction layer */ +/* Network interface device */ + + /* light weight TCP/IP stack */ @@ -110,9 +118,6 @@ /* Utilities */ -/* ARM CMSIS */ - - /* RT-Thread online packages */ /* IoT - internet of things */ From c25f7cbfc7c03453f650c020f9704136f5a615c1 Mon Sep 17 00:00:00 2001 From: nicedayzhu Date: Wed, 29 May 2019 11:12:05 +0800 Subject: [PATCH 06/30] bugfix [net][netdev] Update netdev->ip_addr&gw&netmask after registered. --- components/net/lwip-2.0.2/src/netif/ethernetif.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/components/net/lwip-2.0.2/src/netif/ethernetif.c b/components/net/lwip-2.0.2/src/netif/ethernetif.c index f19ec094fa..8263040484 100644 --- a/components/net/lwip-2.0.2/src/netif/ethernetif.c +++ b/components/net/lwip-2.0.2/src/netif/ethernetif.c @@ -317,7 +317,10 @@ static int netdev_add(struct netif *lwip_netif) rt_strncpy(name, lwip_netif->name, LWIP_NETIF_NAME_LEN); result = netdev_register(netdev, name, (void *)lwip_netif); - + netdev->ip_addr = lwip_netif->ip_addr; + netdev->gw = lwip_netif->gw; + netdev->netmask = lwip_netif->netmask; + #ifdef RT_LWIP_DHCP netdev_low_level_set_dhcp_status(netdev, RT_TRUE); #endif From f9a7b479551141556c2b3b9c6b5085f4bdd7c71a Mon Sep 17 00:00:00 2001 From: armink Date: Wed, 29 May 2019 11:17:46 +0800 Subject: [PATCH 07/30] [DeviceDrivers][i2c] Remove the fm24clxx driver in i2c. --- components/drivers/i2c/fm24clxx.c | 160 ------------------------------ components/drivers/i2c/fm24clxx.h | 26 ----- 2 files changed, 186 deletions(-) delete mode 100644 components/drivers/i2c/fm24clxx.c delete mode 100644 components/drivers/i2c/fm24clxx.h diff --git a/components/drivers/i2c/fm24clxx.c b/components/drivers/i2c/fm24clxx.c deleted file mode 100644 index eecf3d455a..0000000000 --- a/components/drivers/i2c/fm24clxx.c +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2017-07-14 aubr.cool 1st version - */ -#include -#include -#include "fm24clxx.h" - -struct fm24clxx_device -{ - struct rt_device parent; - struct rt_i2c_bus_device *bus; -}; - -/* RT-Thread device interface */ - -static rt_err_t fm24clxx_init(rt_device_t dev) -{ - return RT_EOK; -} -static rt_err_t fm24clxx_open(rt_device_t dev, rt_uint16_t oflag) -{ - return RT_EOK; -} - -static rt_err_t fm24clxx_close(rt_device_t dev) -{ - return RT_EOK; -} - -static rt_err_t fm24clxx_control(rt_device_t dev, int cmd, void *args) -{ - return RT_EOK; -} - -static rt_size_t fm24clxx_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) -{ - struct fm24clxx_device *fm24clxx; - const struct fm24clxx_config *cfg; - struct rt_i2c_msg msg[2]; - rt_uint8_t mem_addr[2] = {0,}; - rt_size_t ret = 0; - RT_ASSERT(dev != 0); - - fm24clxx = (struct fm24clxx_device *) dev; - - RT_ASSERT(fm24clxx->parent.user_data != 0); - cfg = (const struct fm24clxx_config *) fm24clxx->parent.user_data; - - if(pos > cfg->size) - { - return 0; - } - - if(pos + size > cfg->size) - { - size = cfg->size - pos; - } - - msg[0].addr = cfg->addr; - msg[0].flags = cfg->flags | RT_I2C_WR; - mem_addr[0] = (pos >> 8); - mem_addr[1] = (rt_uint8_t) pos; - msg[0].buf = (rt_uint8_t *) mem_addr; - msg[0].len = 2; - - msg[1].addr = cfg->addr; - msg[1].flags = cfg->flags | RT_I2C_RD; - msg[1].buf = (rt_uint8_t *) buffer; - msg[1].len = size; - - ret = rt_i2c_transfer(fm24clxx->bus, msg, 2); - return (ret == 2) ? size : 0; -} - -static rt_size_t fm24clxx_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) -{ - struct fm24clxx_device *fm24clxx; - const struct fm24clxx_config *cfg; - struct rt_i2c_msg msg[2]; - rt_uint8_t mem_addr[2] = {0,}; - rt_size_t ret = 0; - RT_ASSERT(dev != 0); - - fm24clxx = (struct fm24clxx_device *) dev; - - RT_ASSERT(fm24clxx->parent.user_data != 0); - cfg = (const struct fm24clxx_config *) fm24clxx->parent.user_data; - - if(pos > cfg->size) - { - return 0; - } - - if(pos + size > cfg->size) - { - size = cfg->size - pos; - } - - msg[0].addr = cfg->addr; - msg[0].flags = cfg->flags | RT_I2C_WR; - mem_addr[0] = (pos >> 8); - mem_addr[1] = (rt_uint8_t) pos; - msg[0].buf = (rt_uint8_t *) mem_addr; - msg[0].len = 2; - - msg[1].addr = cfg->addr; - msg[1].flags = cfg->flags | RT_I2C_WR | RT_I2C_NO_START; - msg[1].buf = (rt_uint8_t *) buffer; - msg[1].len = size; - - ret = rt_i2c_transfer(fm24clxx->bus, msg, 2); - return (ret == 2) ? size : 0; -} - -#ifdef RT_USING_DEVICE_OPS -const static struct rt_device fm24clxx_ops = -{ - fm24clxx_init, - fm24clxx_open, - fm24clxx_close, - fm24clxx_read, - fm24clxx_write, - fm24clxx_control -}; -#endif - -rt_err_t fm24clxx_register(const char *fm_device_name, const char *i2c_bus, void *user_data) -{ - static struct fm24clxx_device fm24clxx_drv; - struct rt_i2c_bus_device *bus; - - bus = rt_i2c_bus_device_find(i2c_bus); - if (bus == RT_NULL) - { - return RT_ENOSYS; - } - - fm24clxx_drv.bus = bus; - fm24clxx_drv.parent.type = RT_Device_Class_Block; -#ifdef RT_USING_DEVICE_OPS - fm24clxx_drv.parent.ops = &fm24clxx_ops; -#else - fm24clxx_drv.parent.init = fm24clxx_init; - fm24clxx_drv.parent.open = fm24clxx_open; - fm24clxx_drv.parent.close = fm24clxx_close; - fm24clxx_drv.parent.read = fm24clxx_read; - fm24clxx_drv.parent.write = fm24clxx_write; - fm24clxx_drv.parent.control = fm24clxx_control; -#endif - - fm24clxx_drv.parent.user_data = user_data; - - return rt_device_register(&fm24clxx_drv.parent, fm_device_name, RT_DEVICE_FLAG_RDWR); -} \ No newline at end of file diff --git a/components/drivers/i2c/fm24clxx.h b/components/drivers/i2c/fm24clxx.h deleted file mode 100644 index 74ee065470..0000000000 --- a/components/drivers/i2c/fm24clxx.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2017-07-14 aubr.cool 1st version - */ - -#ifndef __FM24CLXX_H__ -#define __FM24CLXX_H__ - -#include - -struct fm24clxx_config -{ - rt_uint32_t size; - rt_uint16_t addr; - rt_uint16_t flags; -}; - -extern rt_err_t fm24clxx_register(const char *e2m_device_name, - const char *i2c_bus, void *user_data); - -#endif /*__FM24CLXX_H__*/ \ No newline at end of file From 3a5a2ff5a3dc9b652e55bff27ee4f512c00e3683 Mon Sep 17 00:00:00 2001 From: guozhanxin Date: Wed, 29 May 2019 11:37:16 +0800 Subject: [PATCH 08/30] [bsp][stm32] Add usb configuration for L4 series --- .../HAL_Drivers/config/l4/usbd_fs_config.h | 15 +++++++++++++++ bsp/stm32/libraries/HAL_Drivers/drv_config.h | 1 + 2 files changed, 16 insertions(+) create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/l4/usbd_fs_config.h diff --git a/bsp/stm32/libraries/HAL_Drivers/config/l4/usbd_fs_config.h b/bsp/stm32/libraries/HAL_Drivers/config/l4/usbd_fs_config.h new file mode 100644 index 0000000000..b987356c7d --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/l4/usbd_fs_config.h @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2019-04-10 ZYH first version + */ +#ifndef __USBD_FS_CONFIG_H__ +#define __USBD_FS_CONFIG_H__ + +#define USBD_FS_IRQ_HANDLER OTG_FS_IRQHandler +#define USBD_INSTANCE USB_OTG_FS +#endif diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_config.h b/bsp/stm32/libraries/HAL_Drivers/drv_config.h index fa077a3c76..ddd0f2164f 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drv_config.h @@ -64,6 +64,7 @@ extern "C" { #include "l4/tim_config.h" #include "l4/sdio_config.h" #include "l4/pwm_config.h" +#include "l4/usbd_fs_config.h" #elif defined(SOC_SERIES_STM32G0) #include "g0/dma_config.h" #include "g0/uart_config.h" From 7d17f78a41500f57fe39dfcdfeb995ded015f116 Mon Sep 17 00:00:00 2001 From: guozhanxin Date: Wed, 29 May 2019 11:40:04 +0800 Subject: [PATCH 09/30] =?UTF-8?q?[bsp/stm32/pandora]=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=20usb=20device=20=E6=94=AF=E6=8C=81=20|=20Add=20usb=20device?= =?UTF-8?q?=20support.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/stm32/stm32l475-atk-pandora/.config | 27 ++- .../board/CubeMX_Config/.mxproject | 9 +- .../CubeMX_Config/Inc/stm32l4xx_hal_conf.h | 9 +- .../board/CubeMX_Config/Inc/stm32l4xx_it.h | 1 + .../board/CubeMX_Config/STM32L475VE.ioc | 69 +++--- .../board/CubeMX_Config/Src/main.c | 48 +++- .../CubeMX_Config/Src/stm32l4xx_hal_msp.c | 94 ++++++++ .../board/CubeMX_Config/Src/stm32l4xx_it.c | 16 +- bsp/stm32/stm32l475-atk-pandora/board/Kconfig | 5 + bsp/stm32/stm32l475-atk-pandora/board/board.c | 105 +++++---- .../stm32l475-atk-pandora/project.uvprojx | 212 +++++++++++++----- bsp/stm32/stm32l475-atk-pandora/rtconfig.h | 12 +- 12 files changed, 463 insertions(+), 144 deletions(-) diff --git a/bsp/stm32/stm32l475-atk-pandora/.config b/bsp/stm32/stm32l475-atk-pandora/.config index 0bc9f96c6e..539c62b49e 100644 --- a/bsp/stm32/stm32l475-atk-pandora/.config +++ b/bsp/stm32/stm32l475-atk-pandora/.config @@ -64,8 +64,9 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=256 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" -CONFIG_RT_VER_NUM=0x40001 +CONFIG_RT_VER_NUM=0x40002 CONFIG_ARCH_ARM=y +CONFIG_RT_USING_CPU_FFS=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M4=y # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set @@ -134,6 +135,11 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_AUDIO is not set # CONFIG_RT_USING_SENSOR is not set +# +# Using Hardware Crypto drivers +# +# CONFIG_RT_USING_HWCRYPTO is not set + # # Using WiFi # @@ -230,6 +236,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set # CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set # CONFIG_PKG_USING_WIZNET is not set # @@ -242,6 +249,9 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_TENCENT_IOTKIT is not set # CONFIG_PKG_USING_NIMBLE is not set # CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set # # security packages @@ -300,21 +310,24 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_SENSORS_DRIVERS is not set # CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_SHT2X is not set -# CONFIG_PKG_USING_AHT10 is not set # CONFIG_PKG_USING_AP3216C is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_U8G2 is not set # CONFIG_PKG_USING_BUTTON is not set -# CONFIG_PKG_USING_MPU6XXX is not set # CONFIG_PKG_USING_PCF8574 is not set # CONFIG_PKG_USING_SX12XX is not set # CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set # CONFIG_PKG_USING_WM_LIBRARIES is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set # CONFIG_PKG_USING_INFRARED is not set # CONFIG_PKG_USING_ROSSERIAL is not set # CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set # # miscellaneous packages @@ -330,6 +343,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set # CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set # # samples: kernel and components samples @@ -355,6 +369,8 @@ CONFIG_SOC_STM32L475VE=y CONFIG_BSP_USING_STLINK_TO_USART=y # CONFIG_BSP_USING_QSPI_FLASH is not set # CONFIG_BSP_USING_SDCARD is not set +# CONFIG_BSP_USING_ICM20608 is not set +# CONFIG_BSP_USING_AHT10 is not set # # On-chip Peripheral Drivers @@ -368,14 +384,13 @@ CONFIG_BSP_USING_UART1=y # CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_QSPI is not set # CONFIG_BSP_QSPI_USING_DMA is not set -# CONFIG_BSP_USING_I2C1 is not set -# CONFIG_BSP_USING_I2C2 is not set -# CONFIG_BSP_USING_I2C3 is not set +# CONFIG_BSP_USING_I2C is not set # CONFIG_BSP_USING_TIM is not set # CONFIG_BSP_USING_PWM is not set # CONFIG_BSP_USING_ADC is not set # CONFIG_BSP_USING_ONCHIP_RTC is not set # CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_USBD_FS is not set # # Board extended module Drivers diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/.mxproject index 4345d79145..1a352692b7 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/.mxproject +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/.mxproject @@ -1,13 +1,14 @@ [PreviousGenFiles] -HeaderPath=E:/rt-thread423/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc +HeaderPath=F:/rt-thread-no-save/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc HeaderFiles=stm32l4xx_it.h;stm32l4xx_hal_conf.h;main.h; -SourcePath=E:/rt-thread423/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src +SourcePath=F:/rt-thread-no-save/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src SourceFiles=stm32l4xx_it.c;stm32l4xx_hal_msp.c;main.c; [PreviousLibFiles] -LibFiles=Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_iwdg.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_qspi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_iwdg.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_qspi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l475xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/system_stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; +LibFiles=Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_iwdg.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_qspi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_usb.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_iwdg.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_qspi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pcd_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_usb.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l475xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/system_stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/tz_context.h; [PreviousUsedKeilFiles] -SourceFiles=..\Src\main.c;..\Src\stm32l4xx_it.c;..\Src\stm32l4xx_hal_msp.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;../\Src/system_stm32l4xx.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;../\Src/system_stm32l4xx.c;../Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;null; +SourceFiles=..\Src\main.c;..\Src\stm32l4xx_it.c;..\Src\stm32l4xx_hal_msp.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;../\Src/system_stm32l4xx.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;../\Src/system_stm32l4xx.c;../Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;null; HeaderPath=..\Drivers\STM32L4xx_HAL_Driver\Inc;..\Drivers\STM32L4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32L4xx\Include;..\Drivers\CMSIS\Include;..\Inc; +CDefines=USE_HAL_DRIVER;STM32L475xx; diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h index 5a4d494431..54357c5f9b 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h @@ -69,13 +69,14 @@ #define HAL_IWDG_MODULE_ENABLED /*#define HAL_LTDC_MODULE_ENABLED */ /*#define HAL_LCD_MODULE_ENABLED */ -#define HAL_LPTIM_MODULE_ENABLED +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_MMC_MODULE_ENABLED */ /*#define HAL_NAND_MODULE_ENABLED */ /*#define HAL_NOR_MODULE_ENABLED */ /*#define HAL_OPAMP_MODULE_ENABLED */ /*#define HAL_OSPI_MODULE_ENABLED */ /*#define HAL_OSPI_MODULE_ENABLED */ -/*#define HAL_PCD_MODULE_ENABLED */ +#define HAL_PCD_MODULE_ENABLED /*#define HAL_QSPI_MODULE_ENABLED */ #define HAL_QSPI_MODULE_ENABLED /*#define HAL_RNG_MODULE_ENABLED */ @@ -297,6 +298,10 @@ #include "stm32l4xx_hal_sram.h" #endif /* HAL_SRAM_MODULE_ENABLED */ +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32l4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + #ifdef HAL_NOR_MODULE_ENABLED #include "stm32l4xx_hal_nor.h" #endif /* HAL_NOR_MODULE_ENABLED */ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_it.h b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_it.h index 29156563cb..666700442b 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_it.h +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_it.h @@ -71,6 +71,7 @@ void SVC_Handler(void); void DebugMon_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); +void OTG_FS_IRQHandler(void); /* USER CODE BEGIN EFP */ /* USER CODE END EFP */ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/STM32L475VE.ioc b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/STM32L475VE.ioc index 4e3b73c54c..15e237111a 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/STM32L475VE.ioc +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/STM32L475VE.ioc @@ -17,6 +17,7 @@ Mcu.IP12=TIM16 Mcu.IP13=TIM17 Mcu.IP14=USART1 Mcu.IP15=USART2 +Mcu.IP16=USB_OTG_FS Mcu.IP2=NVIC Mcu.IP3=QUADSPI Mcu.IP4=RCC @@ -25,7 +26,7 @@ Mcu.IP6=SPI1 Mcu.IP7=SPI2 Mcu.IP8=SYS Mcu.IP9=TIM1 -Mcu.IPNb=16 +Mcu.IPNb=17 Mcu.Name=STM32L475V(C-E-G)Tx Mcu.Package=LQFP100 Mcu.Pin0=PC14-OSC32_IN (PC14) @@ -43,36 +44,39 @@ Mcu.Pin19=PB15 Mcu.Pin2=PH0-OSC_IN (PH0) Mcu.Pin20=PA9 Mcu.Pin21=PA10 -Mcu.Pin22=PA13 (JTMS-SWDIO) -Mcu.Pin23=PA14 (JTCK-SWCLK) -Mcu.Pin24=PB7 -Mcu.Pin25=PB8 -Mcu.Pin26=VP_IWDG_VS_IWDG -Mcu.Pin27=VP_RTC_VS_RTC_Activate -Mcu.Pin28=VP_SYS_VS_Systick -Mcu.Pin29=VP_TIM1_VS_ClockSourceINT +Mcu.Pin22=PA11 +Mcu.Pin23=PA12 +Mcu.Pin24=PA13 (JTMS-SWDIO) +Mcu.Pin25=PA14 (JTCK-SWCLK) +Mcu.Pin26=PB7 +Mcu.Pin27=PB8 +Mcu.Pin28=VP_IWDG_VS_IWDG +Mcu.Pin29=VP_RTC_VS_RTC_Activate Mcu.Pin3=PH1-OSC_OUT (PH1) -Mcu.Pin30=VP_TIM4_VS_ClockSourceINT -Mcu.Pin31=VP_TIM15_VS_ClockSourceINT -Mcu.Pin32=VP_TIM16_VS_ClockSourceINT -Mcu.Pin33=VP_TIM17_VS_ClockSourceINT +Mcu.Pin30=VP_SYS_VS_Systick +Mcu.Pin31=VP_TIM1_VS_ClockSourceINT +Mcu.Pin32=VP_TIM4_VS_ClockSourceINT +Mcu.Pin33=VP_TIM15_VS_ClockSourceINT +Mcu.Pin34=VP_TIM16_VS_ClockSourceINT +Mcu.Pin35=VP_TIM17_VS_ClockSourceINT Mcu.Pin4=PA2 Mcu.Pin5=PA3 Mcu.Pin6=PA5 Mcu.Pin7=PA6 Mcu.Pin8=PA7 Mcu.Pin9=PC5 -Mcu.PinsNb=34 +Mcu.PinsNb=36 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32L475VETx -MxCube.Version=5.1.0 -MxDb.Version=DB.5.0.10 +MxCube.Version=5.2.0 +MxDb.Version=DB.5.0.20 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.OTG_FS_IRQn=true\:0\:0\:false\:false\:true\:true\:true NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false @@ -80,6 +84,10 @@ NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false PA10.Mode=Asynchronous PA10.Signal=USART1_RX +PA11.Mode=Device_Only +PA11.Signal=USB_OTG_FS_DM +PA12.Mode=Device_Only +PA12.Signal=USB_OTG_FS_DP PA13\ (JTMS-SWDIO).Mode=Serial_Wire PA13\ (JTMS-SWDIO).Signal=SYS_JTMS-SWDIO PA14\ (JTCK-SWCLK).Mode=Serial_Wire @@ -121,7 +129,7 @@ PCC.PartNumber=STM32L475VETx PCC.Seq0=0 PCC.Series=STM32L4 PCC.Temperature=25 -PCC.Vdd=null +PCC.Vdd=3.0 PE10.Mode=Single Bank PE10.Signal=QUADSPI_CLK PE11.Mode=Single Bank @@ -153,7 +161,7 @@ ProjectManager.CustomerFirmwarePackage= ProjectManager.DefaultFWLocation=true ProjectManager.DeletePrevious=true ProjectManager.DeviceId=STM32L475VETx -ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.13.0 +ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.14.0 ProjectManager.FreePins=false ProjectManager.HalAssertFull=false ProjectManager.HeapSize=0x200 @@ -171,7 +179,7 @@ ProjectManager.TargetToolchain=MDK-ARM V5 ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_USART2_UART_Init-USART2-false-HAL-true,5-MX_QUADSPI_Init-QUADSPI-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true,7-MX_SPI2_Init-SPI2-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_ADC1_Init-ADC1-false-HAL-true,10-MX_IWDG_Init-IWDG-false-HAL-true,11-MX_TIM17_Init-TIM17-false-HAL-true,12-MX_TIM16_Init-TIM16-false-HAL-true,13-MX_TIM15_Init-TIM15-false-HAL-true,14-MX_TIM4_Init-TIM4-false-HAL-true,15-MX_TIM1_Init-TIM1-false-HAL-true -RCC.ADCFreq_Value=32000000 +RCC.ADCFreq_Value=48000000 RCC.AHBFreq_Value=80000000 RCC.APB1Freq_Value=80000000 RCC.APB1TimFreq_Value=80000000 @@ -187,7 +195,7 @@ RCC.HSI_VALUE=16000000 RCC.I2C1Freq_Value=80000000 RCC.I2C2Freq_Value=80000000 RCC.I2C3Freq_Value=80000000 -RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PLLSAI2RoutputFreq_Value,PLLSourceVirtual,PWRFreq_Value,RNGFreq_Value,RTCClockSelection,RTCFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value +RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1N,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PLLSAI2RoutputFreq_Value,PLLSourceVirtual,PWRFreq_Value,RNGFreq_Value,RTCClockSelection,RTCFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value RCC.LPTIM1Freq_Value=80000000 RCC.LPTIM2Freq_Value=80000000 RCC.LPUART1Freq_Value=80000000 @@ -199,19 +207,20 @@ RCC.PLLN=20 RCC.PLLPoutputFreq_Value=22857142.85714286 RCC.PLLQoutputFreq_Value=80000000 RCC.PLLRCLKFreq_Value=80000000 -RCC.PLLSAI1PoutputFreq_Value=9142857.142857144 -RCC.PLLSAI1QoutputFreq_Value=32000000 -RCC.PLLSAI1RoutputFreq_Value=32000000 +RCC.PLLSAI1N=12 +RCC.PLLSAI1PoutputFreq_Value=13714285.714285715 +RCC.PLLSAI1QoutputFreq_Value=48000000 +RCC.PLLSAI1RoutputFreq_Value=48000000 RCC.PLLSAI2PoutputFreq_Value=9142857.142857144 RCC.PLLSAI2RoutputFreq_Value=32000000 RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE RCC.PWRFreq_Value=80000000 -RCC.RNGFreq_Value=32000000 +RCC.RNGFreq_Value=48000000 RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE RCC.RTCFreq_Value=32768 -RCC.SAI1Freq_Value=9142857.142857144 -RCC.SAI2Freq_Value=9142857.142857144 -RCC.SDMMCFreq_Value=32000000 +RCC.SAI1Freq_Value=13714285.714285715 +RCC.SAI2Freq_Value=13714285.714285715 +RCC.SDMMCFreq_Value=48000000 RCC.SWPMI1Freq_Value=80000000 RCC.SYSCLKFreq_VALUE=80000000 RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK @@ -220,10 +229,10 @@ RCC.UART5Freq_Value=80000000 RCC.USART1Freq_Value=80000000 RCC.USART2Freq_Value=80000000 RCC.USART3Freq_Value=80000000 -RCC.USBFreq_Value=32000000 +RCC.USBFreq_Value=48000000 RCC.VCOInputFreq_Value=8000000 RCC.VCOOutputFreq_Value=160000000 -RCC.VCOSAI1OutputFreq_Value=64000000 +RCC.VCOSAI1OutputFreq_Value=96000000 RCC.VCOSAI2OutputFreq_Value=64000000 SH.ADCx_IN14.0=ADC1_IN14,IN14-Single-Ended SH.ADCx_IN14.ConfNb=1 @@ -252,6 +261,8 @@ USART1.IPParameters=VirtualMode-Asynchronous USART1.VirtualMode-Asynchronous=VM_ASYNC USART2.IPParameters=VirtualMode-Asynchronous USART2.VirtualMode-Asynchronous=VM_ASYNC +USB_OTG_FS.IPParameters=VirtualMode +USB_OTG_FS.VirtualMode=Device_Only VP_IWDG_VS_IWDG.Mode=IWDG_Activate VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/main.c index 0f7d3f8102..fce54d3775 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/main.c +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/main.c @@ -82,6 +82,8 @@ TIM_HandleTypeDef htim17; UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; +PCD_HandleTypeDef hpcd_USB_OTG_FS; + /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ @@ -103,6 +105,7 @@ static void MX_TIM16_Init(void); static void MX_TIM15_Init(void); static void MX_TIM4_Init(void); static void MX_TIM1_Init(void); +static void MX_USB_OTG_FS_PCD_Init(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ @@ -122,6 +125,7 @@ int main(void) /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ + /* MCU Configuration--------------------------------------------------------*/ @@ -154,6 +158,7 @@ int main(void) MX_TIM15_Init(); MX_TIM4_Init(); MX_TIM1_Init(); + MX_USB_OTG_FS_PCD_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ @@ -217,18 +222,20 @@ void SystemClock_Config(void) Error_Handler(); } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1 - |RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_ADC; + |RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_USB + |RCC_PERIPHCLK_ADC; PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLLSAI1; PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLLSAI1; PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_HSE; PeriphClkInit.PLLSAI1.PLLSAI1M = 1; - PeriphClkInit.PLLSAI1.PLLSAI1N = 8; + PeriphClkInit.PLLSAI1.PLLSAI1N = 12; PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7; PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2; PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2; - PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_ADC1CLK; + PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_48M2CLK|RCC_PLLSAI1_ADC1CLK; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); @@ -805,6 +812,41 @@ static void MX_USART2_UART_Init(void) } +/** + * @brief USB_OTG_FS Initialization Function + * @param None + * @retval None + */ +static void MX_USB_OTG_FS_PCD_Init(void) +{ + + /* USER CODE BEGIN USB_OTG_FS_Init 0 */ + + /* USER CODE END USB_OTG_FS_Init 0 */ + + /* USER CODE BEGIN USB_OTG_FS_Init 1 */ + + /* USER CODE END USB_OTG_FS_Init 1 */ + hpcd_USB_OTG_FS.Instance = USB_OTG_FS; + hpcd_USB_OTG_FS.Init.dev_endpoints = 6; + hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL; + hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED; + hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE; + hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE; + hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE; + hpcd_USB_OTG_FS.Init.battery_charging_enable = DISABLE; + hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE; + hpcd_USB_OTG_FS.Init.vbus_sensing_enable = DISABLE; + if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USB_OTG_FS_Init 2 */ + + /* USER CODE END USB_OTG_FS_Init 2 */ + +} + /** * @brief GPIO Initialization Function * @param None diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c index 06073621cf..c750459401 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c @@ -676,6 +676,100 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) } +/** +* @brief PCD MSP Initialization +* This function configures the hardware resources used in this example +* @param hpcd: PCD handle pointer +* @retval None +*/ +void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hpcd->Instance==USB_OTG_FS) + { + /* USER CODE BEGIN USB_OTG_FS_MspInit 0 */ + + /* USER CODE END USB_OTG_FS_MspInit 0 */ + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USB_OTG_FS GPIO Configuration + PA11 ------> USB_OTG_FS_DM + PA12 ------> USB_OTG_FS_DP + */ + GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* Peripheral clock enable */ + __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); + + /* Enable VDDUSB */ + if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + { + __HAL_RCC_PWR_CLK_ENABLE(); + HAL_PWREx_EnableVddUSB(); + __HAL_RCC_PWR_CLK_DISABLE(); + } + else + { + HAL_PWREx_EnableVddUSB(); + } + /* USB_OTG_FS interrupt Init */ + HAL_NVIC_SetPriority(OTG_FS_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(OTG_FS_IRQn); + /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */ + + /* USER CODE END USB_OTG_FS_MspInit 1 */ + } + +} + +/** +* @brief PCD MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hpcd: PCD handle pointer +* @retval None +*/ +void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd) +{ + if(hpcd->Instance==USB_OTG_FS) + { + /* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */ + + /* USER CODE END USB_OTG_FS_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USB_OTG_FS_CLK_DISABLE(); + + /**USB_OTG_FS GPIO Configuration + PA11 ------> USB_OTG_FS_DM + PA12 ------> USB_OTG_FS_DP + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_11|GPIO_PIN_12); + + /* Disable VDDUSB */ + if(__HAL_RCC_PWR_IS_CLK_DISABLED()) + { + __HAL_RCC_PWR_CLK_ENABLE(); + HAL_PWREx_DisableVddUSB(); + __HAL_RCC_PWR_CLK_DISABLE(); + } + else + { + HAL_PWREx_DisableVddUSB(); + } + + /* USB_OTG_FS interrupt DeInit */ + HAL_NVIC_DisableIRQ(OTG_FS_IRQn); + /* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */ + + /* USER CODE END USB_OTG_FS_MspDeInit 1 */ + } + +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_it.c b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_it.c index e13a77a0e6..2fc0793b0e 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_it.c +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_it.c @@ -71,7 +71,7 @@ /* USER CODE END 0 */ /* External variables --------------------------------------------------------*/ - +extern PCD_HandleTypeDef hpcd_USB_OTG_FS; /* USER CODE BEGIN EV */ /* USER CODE END EV */ @@ -212,6 +212,20 @@ void SysTick_Handler(void) /* please refer to the startup file (startup_stm32l4xx.s). */ /******************************************************************************/ +/** + * @brief This function handles USB OTG FS global interrupt. + */ +void OTG_FS_IRQHandler(void) +{ + /* USER CODE BEGIN OTG_FS_IRQn 0 */ + + /* USER CODE END OTG_FS_IRQn 0 */ + HAL_PCD_IRQHandler(&hpcd_USB_OTG_FS); + /* USER CODE BEGIN OTG_FS_IRQn 1 */ + + /* USER CODE END OTG_FS_IRQn 1 */ +} + /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig index f167be8b1f..ff1f4b2827 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig +++ b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig @@ -246,6 +246,11 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n + config BSP_USING_USBD_FS + bool "Enable OTGFS as USB device" + select RT_USING_USB_DEVICE + default n + endmenu menu "Board extended module Drivers" diff --git a/bsp/stm32/stm32l475-atk-pandora/board/board.c b/bsp/stm32/stm32l475-atk-pandora/board/board.c index b0cec153e7..e97c6784ae 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/board.c +++ b/bsp/stm32/stm32l475-atk-pandora/board/board.c @@ -18,51 +18,70 @@ void SystemClock_Config(void) { - RCC_OscInitTypeDef RCC_OscInitStruct = {0}; - RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; - RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; - /**Initializes the CPU, AHB and APB busses clocks - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; - RCC_OscInitStruct.HSEState = RCC_HSE_ON; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 1; - RCC_OscInitStruct.PLL.PLLN = 20; - RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; - RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; - RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; - if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) - { - Error_Handler(); - } - /**Initializes the CPU, AHB and APB busses clocks - */ - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK - | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + /** Configure LSE Drive Capability + */ + HAL_PWR_EnableBkUpAccess(); + __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE + |RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 20; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) - { - Error_Handler(); - } - PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1 | RCC_PERIPHCLK_USART2; - PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; - PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; - if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) - { - Error_Handler(); - } - /**Configure the main internal regulator output voltage - */ - if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) - { - Error_Handler(); - } + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1 + |RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_USB + |RCC_PERIPHCLK_ADC; + PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLLSAI1; + PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLLSAI1; + PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_HSE; + PeriphClkInit.PLLSAI1.PLLSAI1M = 1; + PeriphClkInit.PLLSAI1.PLLSAI1N = 12; + PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7; + PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2; + PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2; + PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_48M2CLK|RCC_PLLSAI1_ADC1CLK; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } + /** Configure the main internal regulator output voltage + */ + if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) + { + Error_Handler(); + } } #ifdef RT_USING_PM diff --git a/bsp/stm32/stm32l475-atk-pandora/project.uvprojx b/bsp/stm32/stm32l475-atk-pandora/project.uvprojx index e612ef5c1a..a2ca404522 100644 --- a/bsp/stm32/stm32l475-atk-pandora/project.uvprojx +++ b/bsp/stm32/stm32l475-atk-pandora/project.uvprojx @@ -1,10 +1,7 @@ - 2.1 -
### uVision Project, (C) Keil Software
- rt-thread @@ -19,28 +16,28 @@ Keil.STM32L4xx_DFP.2.0.0 http://www.keil.com/pack IRAM(0x20000000,0x00018000) IRAM2(0x10000000,0x00008000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.FLM)) 0 $$Device:STM32L475VETx$Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l4xx.h - - - - - - - - - + + + + + + + + + $$Device:STM32L475VETx$CMSIS\SVD\STM32L4x5.svd 0 0 - - - - - + + + + + 0 0 @@ -62,8 +59,8 @@ 0 0 - - + + 0 0 0 @@ -72,8 +69,8 @@ 0 0 - - + + 0 0 0 @@ -83,14 +80,14 @@ 1 0 fromelf --bin !L --output rtthread.bin - + 0 0 0 0 0 - + 0 @@ -104,8 +101,8 @@ 0 0 3 - - + + 1 @@ -139,10 +136,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -175,7 +172,7 @@ 0 0 "Cortex-M4" - + 0 0 0 @@ -307,7 +304,7 @@ 0x8000 - + 1 @@ -334,9 +331,9 @@ 0 0 - + USE_HAL_DRIVER, STM32L475xx - + .;..\..\..\include;.;applications;board;board\CubeMX_Config\Inc;board\ports;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m4;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Inc;..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Include;..\libraries\STM32L4xx_HAL\CMSIS\Include @@ -352,10 +349,10 @@ 0 0 - - - - + + + + @@ -367,13 +364,13 @@ 0 0x08000000 0x20000000 - + .\board\linker_scripts\link.sct - - - - - + + + + + @@ -386,71 +383,99 @@ 1 ..\..\..\src\clock.c + + components.c 1 ..\..\..\src\components.c + + cpu.c 1 ..\..\..\src\cpu.c + + device.c 1 ..\..\..\src\device.c + + idle.c 1 ..\..\..\src\idle.c + + ipc.c 1 ..\..\..\src\ipc.c + + irq.c 1 ..\..\..\src\irq.c + + kservice.c 1 ..\..\..\src\kservice.c + + mem.c 1 ..\..\..\src\mem.c + + mempool.c 1 ..\..\..\src\mempool.c + + object.c 1 ..\..\..\src\object.c + + scheduler.c 1 ..\..\..\src\scheduler.c + + signal.c 1 ..\..\..\src\signal.c + + thread.c 1 ..\..\..\src\thread.c + + timer.c 1 @@ -476,26 +501,36 @@ 1 board\board.c + + stm32l4xx_hal_msp.c 1 board\CubeMX_Config\Src\stm32l4xx_hal_msp.c + + startup_stm32l475xx.s 2 ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\arm\startup_stm32l475xx.s + + drv_gpio.c 1 ..\libraries\HAL_Drivers\drv_gpio.c + + drv_usart.c 1 ..\libraries\HAL_Drivers\drv_usart.c + + drv_common.c 1 @@ -511,21 +546,29 @@ 1 ..\..\..\libcpu\arm\common\backtrace.c + + div0.c 1 ..\..\..\libcpu\arm\common\div0.c + + showmem.c 1 ..\..\..\libcpu\arm\common\showmem.c + + cpuport.c 1 ..\..\..\libcpu\arm\cortex-m4\cpuport.c + + context_rvds.S 2 @@ -541,41 +584,57 @@ 1 ..\..\..\components\drivers\misc\pin.c + + serial.c 1 ..\..\..\components\drivers\serial\serial.c + + completion.c 1 ..\..\..\components\drivers\src\completion.c + + dataqueue.c 1 ..\..\..\components\drivers\src\dataqueue.c + + pipe.c 1 ..\..\..\components\drivers\src\pipe.c + + ringblk_buf.c 1 ..\..\..\components\drivers\src\ringblk_buf.c + + ringbuffer.c 1 ..\..\..\components\drivers\src\ringbuffer.c + + waitqueue.c 1 ..\..\..\components\drivers\src\waitqueue.c + + workqueue.c 1 @@ -591,26 +650,36 @@ 1 ..\..\..\components\finsh\shell.c + + symbol.c 1 ..\..\..\components\finsh\symbol.c + + cmd.c 1 ..\..\..\components\finsh\cmd.c + + msh.c 1 ..\..\..\components\finsh\msh.c + + msh_cmd.c 1 ..\..\..\components\finsh\msh_cmd.c + + msh_file.c 1 @@ -626,106 +695,141 @@ 1 ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c + + stm32l4xx_hal.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + + stm32l4xx_hal_comp.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_comp.c + + stm32l4xx_hal_cortex.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + + stm32l4xx_hal_crc.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc.c + + stm32l4xx_hal_crc_ex.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc_ex.c + + stm32l4xx_hal_cryp.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp.c + + stm32l4xx_hal_cryp_ex.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp_ex.c + + stm32l4xx_hal_dma.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + + stm32l4xx_hal_dma_ex.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + + stm32l4xx_hal_exti.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c + + stm32l4xx_hal_pwr.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + + stm32l4xx_hal_pwr_ex.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + + stm32l4xx_hal_rcc.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + + stm32l4xx_hal_rcc_ex.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + + stm32l4xx_hal_rng.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rng.c - - stm32l4xx_hal_sram.c - 1 - ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sram.c - + + stm32l4xx_hal_gpio.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + + stm32l4xx_hal_uart.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + + stm32l4xx_hal_uart_ex.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + + stm32l4xx_hal_usart.c 1 ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart.c + + stm32l4xx_hal_usart_ex.c 1 @@ -736,11 +840,9 @@ - - - - + + + -
diff --git a/bsp/stm32/stm32l475-atk-pandora/rtconfig.h b/bsp/stm32/stm32l475-atk-pandora/rtconfig.h index e0e0e0f9f8..2aa7a57b32 100644 --- a/bsp/stm32/stm32l475-atk-pandora/rtconfig.h +++ b/bsp/stm32/stm32l475-atk-pandora/rtconfig.h @@ -39,8 +39,9 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 256 #define RT_CONSOLE_DEVICE_NAME "uart1" -#define RT_VER_NUM 0x40001 +#define RT_VER_NUM 0x40002 #define ARCH_ARM +#define RT_USING_CPU_FFS #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M4 @@ -82,6 +83,9 @@ #define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_PIN +/* Using Hardware Crypto drivers */ + + /* Using WiFi */ @@ -153,6 +157,12 @@ /* samples: kernel and components samples */ + +/* Privated Packages of RealThread */ + + +/* Network Utilities */ + #define SOC_FAMILY_STM32 #define SOC_SERIES_STM32L4 From ff3edd0cbe8d4c8fc0a6ead15e8f1bd9b9e669ab Mon Sep 17 00:00:00 2001 From: armink Date: Wed, 29 May 2019 11:56:19 +0800 Subject: [PATCH 10/30] [bsp][qemu-vexpress-a9] Update eclipse project. --- bsp/qemu-vexpress-a9/.project | 1 + 1 file changed, 1 insertion(+) diff --git a/bsp/qemu-vexpress-a9/.project b/bsp/qemu-vexpress-a9/.project index f9f83316f2..e5f00228c0 100644 --- a/bsp/qemu-vexpress-a9/.project +++ b/bsp/qemu-vexpress-a9/.project @@ -20,6 +20,7 @@ org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.rttnature org.eclipse.cdt.managedbuilder.core.managedBuildNature org.eclipse.cdt.managedbuilder.core.ScannerConfigNature From f5cb3ac7600639b761cba3968bc6227c799e2f33 Mon Sep 17 00:00:00 2001 From: nicedayzhu Date: Wed, 29 May 2019 13:37:16 +0800 Subject: [PATCH 11/30] [Bugfix]Update netdev info after registered MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复ifconfig命令无法正确显示IP,网关,掩码的问题 --- components/net/lwip-2.0.2/src/netif/ethernetif.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/components/net/lwip-2.0.2/src/netif/ethernetif.c b/components/net/lwip-2.0.2/src/netif/ethernetif.c index 8263040484..a5a1f94c0b 100644 --- a/components/net/lwip-2.0.2/src/netif/ethernetif.c +++ b/components/net/lwip-2.0.2/src/netif/ethernetif.c @@ -303,12 +303,6 @@ static int netdev_add(struct netif *lwip_netif) return -ERR_IF; } - netdev->flags = lwip_netif->flags; - netdev->mtu = lwip_netif->mtu; - netdev->ops = &lwip_netdev_ops; - netdev->hwaddr_len = lwip_netif->hwaddr_len; - rt_memcpy(netdev->hwaddr, lwip_netif->hwaddr, lwip_netif->hwaddr_len); - #ifdef SAL_USING_LWIP extern int sal_lwip_netdev_set_pf_info(struct netdev *netdev); /* set the lwIP network interface device protocol family information */ @@ -317,6 +311,13 @@ static int netdev_add(struct netif *lwip_netif) rt_strncpy(name, lwip_netif->name, LWIP_NETIF_NAME_LEN); result = netdev_register(netdev, name, (void *)lwip_netif); + + /* Update netdev info after registered */ + netdev->flags = lwip_netif->flags; + netdev->mtu = lwip_netif->mtu; + netdev->ops = &lwip_netdev_ops; + netdev->hwaddr_len = lwip_netif->hwaddr_len; + rt_memcpy(netdev->hwaddr, lwip_netif->hwaddr, lwip_netif->hwaddr_len); netdev->ip_addr = lwip_netif->ip_addr; netdev->gw = lwip_netif->gw; netdev->netmask = lwip_netif->netmask; From 1b0a2914b02e516bb63bb8b5036f65d16348a7af Mon Sep 17 00:00:00 2001 From: armink Date: Wed, 29 May 2019 13:39:17 +0800 Subject: [PATCH 12/30] [bsp][stm32][stm32f103-dofly-M3S] Add for eclipse project support. --- bsp/stm32/stm32f103-dofly-M3S/.cproject | 155 ++++++++++++++++++ bsp/stm32/stm32f103-dofly-M3S/.project | 69 ++++++++ .../.settings/language.settings.xml | 14 ++ .../.settings/org.eclipse.core.runtime.prefs | 3 + .../stm32f103-dofly-M3S/makefile.targets | 4 + 5 files changed, 245 insertions(+) create mode 100644 bsp/stm32/stm32f103-dofly-M3S/.cproject create mode 100644 bsp/stm32/stm32f103-dofly-M3S/.project create mode 100644 bsp/stm32/stm32f103-dofly-M3S/.settings/language.settings.xml create mode 100644 bsp/stm32/stm32f103-dofly-M3S/.settings/org.eclipse.core.runtime.prefs create mode 100644 bsp/stm32/stm32f103-dofly-M3S/makefile.targets diff --git a/bsp/stm32/stm32f103-dofly-M3S/.cproject b/bsp/stm32/stm32f103-dofly-M3S/.cproject new file mode 100644 index 0000000000..87ab6e1e3d --- /dev/null +++ b/bsp/stm32/stm32f103-dofly-M3S/.cproject @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bsp/stm32/stm32f103-dofly-M3S/.project b/bsp/stm32/stm32f103-dofly-M3S/.project new file mode 100644 index 0000000000..58d408c7e6 --- /dev/null +++ b/bsp/stm32/stm32f103-dofly-M3S/.project @@ -0,0 +1,69 @@ + + + stm32f103-dofly-M3S + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.core.rttnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + rt-thread + 2 + virtual:/virtual + + + rt-thread/bsp + 2 + virtual:/virtual + + + rt-thread/components + 2 + $%7BPARENT-3-PROJECT_LOC%7D/components + + + rt-thread/include + 2 + $%7BPARENT-3-PROJECT_LOC%7D/include + + + rt-thread/libcpu + 2 + $%7BPARENT-3-PROJECT_LOC%7D/libcpu + + + rt-thread/src + 2 + $%7BPARENT-3-PROJECT_LOC%7D/src + + + rt-thread/bsp/stm32 + 2 + virtual:/virtual + + + rt-thread/bsp/stm32/libraries + 2 + $%7BPARENT-1-PROJECT_LOC%7D/libraries + + + diff --git a/bsp/stm32/stm32f103-dofly-M3S/.settings/language.settings.xml b/bsp/stm32/stm32f103-dofly-M3S/.settings/language.settings.xml new file mode 100644 index 0000000000..5d47297634 --- /dev/null +++ b/bsp/stm32/stm32f103-dofly-M3S/.settings/language.settings.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/bsp/stm32/stm32f103-dofly-M3S/.settings/org.eclipse.core.runtime.prefs b/bsp/stm32/stm32f103-dofly-M3S/.settings/org.eclipse.core.runtime.prefs new file mode 100644 index 0000000000..b36aae6fb2 --- /dev/null +++ b/bsp/stm32/stm32f103-dofly-M3S/.settings/org.eclipse.core.runtime.prefs @@ -0,0 +1,3 @@ +content-types/enabled=true +content-types/org.eclipse.cdt.core.asmSource/file-extensions=s +eclipse.preferences.version=1 diff --git a/bsp/stm32/stm32f103-dofly-M3S/makefile.targets b/bsp/stm32/stm32f103-dofly-M3S/makefile.targets new file mode 100644 index 0000000000..a00129bd90 --- /dev/null +++ b/bsp/stm32/stm32f103-dofly-M3S/makefile.targets @@ -0,0 +1,4 @@ +clean2: + -$(RM) $(CC_DEPS)$(C++_DEPS)$(C_UPPER_DEPS)$(CXX_DEPS)$(SECONDARY_FLASH)$(SECONDARY_SIZE)$(ASM_DEPS)$(S_UPPER_DEPS)$(C_DEPS)$(CPP_DEPS) + -$(RM) $(OBJS) *.elf + -@echo ' ' \ No newline at end of file From 6454fa81d817e26d8c13698bb4e3ed597d95f296 Mon Sep 17 00:00:00 2001 From: nicedayzhu Date: Wed, 29 May 2019 13:42:06 +0800 Subject: [PATCH 13/30] [Bugfix]Update netdev info after registered MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复ifconfig命令无法正确显示IP,网关,掩码的问题 --- components/net/lwip-2.1.0/src/netif/ethernetif.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/components/net/lwip-2.1.0/src/netif/ethernetif.c b/components/net/lwip-2.1.0/src/netif/ethernetif.c index db28a4a55b..5ea03a9ae8 100755 --- a/components/net/lwip-2.1.0/src/netif/ethernetif.c +++ b/components/net/lwip-2.1.0/src/netif/ethernetif.c @@ -303,11 +303,6 @@ static int netdev_add(struct netif *lwip_netif) { return -ERR_IF; } - - netdev->flags = lwip_netif->flags; - netdev->ops = &lwip_netdev_ops; - netdev->hwaddr_len = lwip_netif->hwaddr_len; - rt_memcpy(netdev->hwaddr, lwip_netif->hwaddr, lwip_netif->hwaddr_len); #ifdef SAL_USING_LWIP extern int sal_lwip_netdev_set_pf_info(struct netdev *netdev); @@ -317,6 +312,16 @@ static int netdev_add(struct netif *lwip_netif) rt_strncpy(name, lwip_netif->name, LWIP_NETIF_NAME_LEN); result = netdev_register(netdev, name, (void *)lwip_netif); + + /* Update netdev info after registered */ + netdev->flags = lwip_netif->flags; + netdev->mtu = lwip_netif->mtu; + netdev->ops = &lwip_netdev_ops; + netdev->hwaddr_len = lwip_netif->hwaddr_len; + rt_memcpy(netdev->hwaddr, lwip_netif->hwaddr, lwip_netif->hwaddr_len); + netdev->ip_addr = lwip_netif->ip_addr; + netdev->gw = lwip_netif->gw; + netdev->netmask = lwip_netif->netmask; #ifdef RT_LWIP_DHCP netdev_low_level_set_dhcp_status(netdev, RT_TRUE); From ab700d54aa2952179c94b6a4e5712fc55905349d Mon Sep 17 00:00:00 2001 From: armink Date: Wed, 29 May 2019 13:53:27 +0800 Subject: [PATCH 14/30] [DeviceDriver][SPI] Cleanup the at45db/gd25q/w25q/sst25v SPI flash driver. Please using SFUD instead of them. --- components/drivers/Kconfig | 11 +- components/drivers/spi/SConscript | 15 - components/drivers/spi/device_driver_list.txt | 10 +- components/drivers/spi/spi_flash_at45dbxx.c | 433 ------------------ components/drivers/spi/spi_flash_at45dbxx.h | 27 -- components/drivers/spi/spi_flash_gd.c | 347 -------------- components/drivers/spi/spi_flash_gd.h | 18 - components/drivers/spi/spi_flash_sst25vfxx.c | 358 --------------- components/drivers/spi/spi_flash_sst25vfxx.h | 28 -- components/drivers/spi/spi_flash_w25qxx.c | 393 ---------------- components/drivers/spi/spi_flash_w25qxx.h | 20 - components/drivers/spi/spi_flash_w25qxx_mtd.c | 336 -------------- components/drivers/spi/spi_flash_w25qxx_mtd.h | 20 - 13 files changed, 5 insertions(+), 2011 deletions(-) delete mode 100644 components/drivers/spi/spi_flash_at45dbxx.c delete mode 100644 components/drivers/spi/spi_flash_at45dbxx.h delete mode 100644 components/drivers/spi/spi_flash_gd.c delete mode 100644 components/drivers/spi/spi_flash_gd.h delete mode 100644 components/drivers/spi/spi_flash_sst25vfxx.c delete mode 100644 components/drivers/spi/spi_flash_sst25vfxx.h delete mode 100644 components/drivers/spi/spi_flash_w25qxx.c delete mode 100644 components/drivers/spi/spi_flash_w25qxx.h delete mode 100644 components/drivers/spi/spi_flash_w25qxx_mtd.c delete mode 100644 components/drivers/spi/spi_flash_w25qxx_mtd.h diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig index d83e54a8da..a100249620 100755 --- a/components/drivers/Kconfig +++ b/components/drivers/Kconfig @@ -212,6 +212,9 @@ config RT_USING_SPI config RT_USING_SFUD bool "Using Serial Flash Universal Driver" default n + help + An using JEDEC's SFDP standard serial (SPI) flash universal driver library + if RT_USING_SFUD config RT_SFUD_USING_SFDP bool "Using auto probe flash JEDEC SFDP parameter" @@ -231,14 +234,6 @@ config RT_USING_SPI default n endif - config RT_USING_W25QXX - bool "Using W25QXX SPI NorFlash" - default n - - config RT_USING_GD - bool "Using GD SPI NorFlash" - default n - config RT_USING_ENC28J60 bool "Using ENC28J60 SPI Ethernet network interface" select RT_USING_LWIP diff --git a/components/drivers/spi/SConscript b/components/drivers/spi/SConscript index b88671ebc9..e19f30861f 100644 --- a/components/drivers/spi/SConscript +++ b/components/drivers/spi/SConscript @@ -14,24 +14,9 @@ src_device = [] if GetDepend('RT_USING_SPI_WIFI'): src_device += ['spi_wifi_rw009.c'] -if GetDepend('RT_USING_W25QXX'): - src_device += ['spi_flash_w25qxx.c'] - -if GetDepend('RT_USING_W25QXX_MTD'): - src_device += ['spi_flash_w25qxx_mtd.c'] - if GetDepend('RT_USING_ENC28J60'): src_device += ['enc28j60.c'] -if GetDepend('RT_USING_AT45DBXX'): - src_device += ['spi_flash_at45dbxx.c'] - -if GetDepend('RT_USING_SST25VFXX'): - src_device += ['spi_flash_sst25vfxx.c'] - -if GetDepend('RT_USING_GD'): - src_device += ['spi_flash_gd.c'] - if GetDepend('RT_USING_SPI_MSD'): src_device += ['spi_msd.c'] diff --git a/components/drivers/spi/device_driver_list.txt b/components/drivers/spi/device_driver_list.txt index 2c9d6a16b8..939baa7531 100644 --- a/components/drivers/spi/device_driver_list.txt +++ b/components/drivers/spi/device_driver_list.txt @@ -5,11 +5,5 @@ http://www.rt-thread.com/ enc28j60.c/enc28j60.h http://www.microchip.com/ -spi_flash_at45dbxx.c/spi_flash_at45dbxx.h -http://www.atmel.com/ - -spi_flash_sst25vfxx.c/spi_flash_sst25vfxx.h -http://www.microchip.com/ - -spi_flash_w25qxx.c/spi_flash_w25qxx.h -http://www.winbond.com/ +spi_flash_sfud: Serial Flash Universal Driver +https://github.com/armink/SFUD \ No newline at end of file diff --git a/components/drivers/spi/spi_flash_at45dbxx.c b/components/drivers/spi/spi_flash_at45dbxx.c deleted file mode 100644 index 0a30f0a328..0000000000 --- a/components/drivers/spi/spi_flash_at45dbxx.c +++ /dev/null @@ -1,433 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2011-12-16 aozima the first version - */ - -#include -#include "spi_flash_at45dbxx.h" - -#define FLASH_DEBUG -#define DMA_BUFFER_SIZE 512 - -#ifdef FLASH_DEBUG -#define FLASH_TRACE rt_kprintf -#else -#define FLASH_TRACE(...) -#endif /**< #ifdef FLASH_DEBUG */ - -/* JEDEC Manufacturer’s ID */ -#define MF_ID (0x1F) /* atmel */ -#define DENSITY_CODE_011D (0x02) /* AT45DB011D Density Code : 00010 = 1-Mbit */ -#define DENSITY_CODE_021D (0x03) /* AT45DB021D Density Code : 00011 = 2-Mbit */ -#define DENSITY_CODE_041D (0x04) /* AT45DB041D Density Code : 00100 = 4-Mbit */ -#define DENSITY_CODE_081D (0x05) /* AT45DB081D Density Code : 00101 = 8-Mbit */ -#define DENSITY_CODE_161D (0x06) /* AT45DB161D Density Code : 00110 = 16-Mbit */ -#define DENSITY_CODE_321D (0x07) /* AT45DB321D Density Code : 00111 = 32-Mbit */ -#define DENSITY_CODE_642D (0x08) /* AT45DB642D Density Code : 01000 = 64-Mbit */ - -struct JEDEC_ID -{ - uint8_t manufacturer_id; /* Manufacturer ID */ - uint8_t density_code:5; /* Density Code */ - uint8_t family_code:3; /* Family Code */ - uint8_t version_code:5; /* Product Version Code */ - uint8_t mlc_code:3; /* MLC Code */ - uint8_t byte_count; /* Byte Count */ -}; - -#define AT45DB_BUFFER_1_WRITE 0x84 -#define AT45DB_BUFFER_2_WRITE 0x87 -#define AT45DB_BUFFER_1_READ 0xD4 -#define AT45DB_BUFFER_2_READ 0xD6 -#define AT45DB_B1_TO_MM_PAGE_PROG_WITH_ERASE 0x83 -#define AT45DB_B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86 -#define AT45DB_MM_PAGE_TO_B1_XFER 0x53 -#define AT45DB_MM_PAGE_TO_B2_XFER 0x55 -#define AT45DB_PAGE_ERASE 0x81 -#define AT45DB_SECTOR_ERASE 0x7C -#define AT45DB_READ_STATE_REGISTER 0xD7 -#define AT45DB_MM_PAGE_READ 0xD2 -#define AT45DB_MM_PAGE_PROG_THRU_BUFFER1 0x82 -#define AT45DB_CMD_JEDEC_ID 0x9F - -static struct spi_flash_at45dbxx spi_flash_at45dbxx; - -/*****************************************************************************/ -/*Status Register Format: */ -/* ------------------------------------------------------------------------- */ -/* | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 | */ -/* |--------|--------|--------|--------|--------|--------|--------|--------| */ -/* |RDY/BUSY| COMP | device density | X | X | */ -/* ------------------------------------------------------------------------- */ -/* 0:busy | | AT45DB041:0111 | protect|page size */ -/* 1:ready | | AT45DB161:1011 | */ -/* --------------------------------------------------------------------------*/ -/*****************************************************************************/ -static uint8_t AT45DB_StatusRegisterRead(void) -{ - return rt_spi_sendrecv8(spi_flash_at45dbxx.rt_spi_device, AT45DB_READ_STATE_REGISTER); -} - -static void wait_busy(void) -{ - uint16_t i = 0; - while (i++ < 10000) - { - if (AT45DB_StatusRegisterRead() & 0x80) - { - return; - } - } - FLASH_TRACE("\r\nSPI_FLASH timeout!!!\r\n"); -} - -/* RT-Thread Device Driver Interface */ -static rt_err_t AT45DB_flash_init(rt_device_t dev) -{ - return RT_EOK; -} - -static rt_err_t AT45DB_flash_open(rt_device_t dev, rt_uint16_t oflag) -{ - - return RT_EOK; -} - -static rt_err_t AT45DB_flash_close(rt_device_t dev) -{ - return RT_EOK; -} - -static rt_err_t AT45DB_flash_control(rt_device_t dev, int cmd, void *args) -{ - RT_ASSERT(dev != RT_NULL); - - if (cmd == RT_DEVICE_CTRL_BLK_GETGEOME) - { - struct rt_device_blk_geometry *geometry; - - geometry = (struct rt_device_blk_geometry *)args; - if (geometry == RT_NULL) return -RT_ERROR; - - geometry->bytes_per_sector = 512; - geometry->sector_count = 4096; - geometry->block_size = 4096; /* block erase: 4k */ - } - - return RT_EOK; -} - -static rt_size_t AT45DB_flash_read_page_256(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) -{ - uint32_t index, nr; - uint8_t * read_buffer = buffer; - uint32_t page = pos; - - nr = size; - - for (index = 0; index < nr; index++) - { - uint8_t send_buffer[8]; - uint32_t i; - - for(i=0; i> 7); - send_buffer[2] = (uint8_t)(page << 1); - - rt_spi_send_then_recv(spi_flash_at45dbxx.rt_spi_device, send_buffer, 8, read_buffer, 256); - read_buffer += 256; - page++; - } - - return size; -} - -static rt_size_t AT45DB_flash_read_page_512(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) -{ - uint32_t index, nr; - uint8_t * read_buffer = buffer; - uint32_t page = pos; - - nr = size; - - for (index = 0; index < nr; index++) - { - uint8_t send_buffer[8]; - uint32_t i; - - for(i=0; i> 6); - send_buffer[2] = (uint8_t)(page << 2); - - rt_spi_send_then_recv(spi_flash_at45dbxx.rt_spi_device, send_buffer, 8, read_buffer, 512); - read_buffer += 512; - page++; - } - - return size; -} - -static rt_size_t AT45DB_flash_read_page_1024(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) -{ - uint32_t index, nr; - uint8_t * read_buffer = buffer; - uint32_t page = pos; - - nr = size; - - for (index = 0; index < nr; index++) - { - uint8_t send_buffer[8]; - uint32_t i; - - for(i=0; i> 5); - send_buffer[2] = (uint8_t)(page << 3); - - rt_spi_send_then_recv(spi_flash_at45dbxx.rt_spi_device, send_buffer, 8, read_buffer, 1024); - read_buffer += 1024; - page++; - } - - return size; -} - -static rt_size_t AT45DB_flash_write_page_256(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size) -{ - rt_uint32_t index, nr; - const uint8_t * write_buffer = buffer; - uint32_t page = pos; - - nr = size; - - for (index = 0; index < nr; index++) - { - uint8_t send_buffer[4]; - - send_buffer[0] = AT45DB_MM_PAGE_PROG_THRU_BUFFER1; - send_buffer[1] = (uint8_t) (page >> 7); - send_buffer[2] = (uint8_t) (page << 1); - send_buffer[3] = 0; - - rt_spi_send_then_send(spi_flash_at45dbxx.rt_spi_device, send_buffer, 4, write_buffer, 256); - - write_buffer += 256; - page++; - - wait_busy(); - } - - return size; -} - -static rt_size_t AT45DB_flash_write_page_512(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size) -{ - rt_uint32_t index, nr; - const uint8_t * write_buffer = buffer; - uint32_t page = pos; - - nr = size; - - for (index = 0; index < nr; index++) - { - uint8_t send_buffer[4]; - - send_buffer[0] = AT45DB_MM_PAGE_PROG_THRU_BUFFER1; - send_buffer[1] = (uint8_t) (page >> 6); - send_buffer[2] = (uint8_t) (page << 2); - send_buffer[3] = 0; - - rt_spi_send_then_send(spi_flash_at45dbxx.rt_spi_device, send_buffer, 4, write_buffer, 512); - - write_buffer += 512; - page++; - - wait_busy(); - } - - return size; -} - -static rt_size_t AT45DB_flash_write_page_1024(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size) -{ - rt_uint32_t index, nr; - const uint8_t * write_buffer = buffer; - uint32_t page = pos; - - nr = size; - - for (index = 0; index < nr; index++) - { - uint8_t send_buffer[4]; - - send_buffer[0] = AT45DB_MM_PAGE_PROG_THRU_BUFFER1; - send_buffer[1] = (uint8_t) (page >> 5); - send_buffer[2] = (uint8_t) (page << 3); - send_buffer[3] = 0; - - rt_spi_send_then_send(spi_flash_at45dbxx.rt_spi_device, send_buffer, 4, write_buffer, 1024); - - write_buffer += 1024; - page++; - - wait_busy(); - } - - return size; -} - -rt_err_t at45dbxx_init(const char * flash_device_name, const char * spi_device_name) -{ - struct rt_spi_device * rt_spi_device; - struct JEDEC_ID * JEDEC_ID; - - rt_spi_device = (struct rt_spi_device *)rt_device_find(spi_device_name); - if(rt_spi_device == RT_NULL) - { - FLASH_TRACE("spi device %s not found!\r\n", spi_device_name); - return -RT_ENOSYS; - } - spi_flash_at45dbxx.rt_spi_device = rt_spi_device; - - /* config spi */ - { - struct rt_spi_configuration cfg; - cfg.data_width = 8; - cfg.mode = RT_SPI_MODE_0 | RT_SPI_MSB; /* SPI Compatible Modes 0 and 3 */ - cfg.max_hz = 66000000; /* Atmel RapidS Serial Interface: 66MHz Maximum Clock Frequency */ - rt_spi_configure(spi_flash_at45dbxx.rt_spi_device, &cfg); - } - - /* read JEDEC ID */ - { - uint8_t cmd; - uint8_t id_recv[6]; - JEDEC_ID = (struct JEDEC_ID *)id_recv; - - cmd = AT45DB_CMD_JEDEC_ID; - rt_spi_send_then_recv(spi_flash_at45dbxx.rt_spi_device, &cmd, 1, id_recv, 6); - - /**< 1FH = Atmel */ - /**< 001 = Atmel DataFlash */ - if(JEDEC_ID->manufacturer_id != 0x1F || JEDEC_ID->family_code != 0x01) - { - FLASH_TRACE("Manufacturer’s ID or Memory Type error!\r\n"); - FLASH_TRACE("JEDEC Read-ID Data : %02X %02X %02X\r\n", id_recv[0], id_recv[1], id_recv[2]); - return -RT_ENOSYS; - } - - if(JEDEC_ID->density_code == DENSITY_CODE_011D) - { - /**< AT45DB011D Density Code : 00010 = 1-Mbit */ - FLASH_TRACE("AT45DB011D detection\r\n"); - spi_flash_at45dbxx.geometry.bytes_per_sector = 256; /* Page Erase (256 Bytes) */ - spi_flash_at45dbxx.geometry.sector_count = 512; /* 1-Mbit / 8 / 256 = 512 */ - spi_flash_at45dbxx.geometry.block_size = 1024*2; /* Block Erase (2-Kbytes) */ - } - else if(JEDEC_ID->density_code == DENSITY_CODE_021D) - { - /**< AT45DB021D Density Code : 00011 = 2-Mbit */ - FLASH_TRACE("AT45DB021D detection\r\n"); - spi_flash_at45dbxx.geometry.bytes_per_sector = 256; /* Page Erase (256 Bytes) */ - spi_flash_at45dbxx.geometry.sector_count = 512*2; /* 2-Mbit / 8 / 256 = 1024 */ - spi_flash_at45dbxx.geometry.block_size = 1024*2; /* Block Erase (2-Kbytes) */ - } - else if(JEDEC_ID->density_code == DENSITY_CODE_041D) - { - /**< AT45DB041D Density Code : 00100 = 4-Mbit */ - FLASH_TRACE("AT45DB041D detection\r\n"); - spi_flash_at45dbxx.geometry.bytes_per_sector = 256; /* Page Erase (256 Bytes) */ - spi_flash_at45dbxx.geometry.sector_count = 512*4; /* 4-Mbit / 8 / 256 = 2048 */ - spi_flash_at45dbxx.geometry.block_size = 1024*2; /* Block Erase (2-Kbytes) */ - } - else if(JEDEC_ID->density_code == DENSITY_CODE_081D) - { - /**< AT45DB081D Density Code : 00101 = 8-Mbit */ - FLASH_TRACE("AT45DB081D detection\r\n"); - spi_flash_at45dbxx.geometry.bytes_per_sector = 256; /* Page Erase (256 Bytes) */ - spi_flash_at45dbxx.geometry.sector_count = 512*8; /* 8-Mbit / 8 / 256 = 4096 */ - spi_flash_at45dbxx.geometry.block_size = 1024*2; /* Block Erase (2-Kbytes) */ - } - else if(JEDEC_ID->density_code == DENSITY_CODE_161D) - { - /**< AT45DB161D Density Code : 00110 = 16-Mbit */ - FLASH_TRACE("AT45DB161D detection\r\n"); - spi_flash_at45dbxx.geometry.bytes_per_sector = 512; /* Page Erase (512 Bytes) */ - spi_flash_at45dbxx.geometry.sector_count = 256*16; /* 16-Mbit / 8 / 512 = 4096 */ - spi_flash_at45dbxx.geometry.block_size = 1024*4; /* Block Erase (4-Kbytes) */ - } - else if(JEDEC_ID->density_code == DENSITY_CODE_321D) - { - /**< AT45DB321D Density Code : 00111 = 32-Mbit */ - FLASH_TRACE("AT45DB321D detection\r\n"); - spi_flash_at45dbxx.geometry.bytes_per_sector = 512; /* Page Erase (512 Bytes) */ - spi_flash_at45dbxx.geometry.sector_count = 256*32; /* 32-Mbit / 8 / 512 = 8192 */ - spi_flash_at45dbxx.geometry.block_size = 1024*4; /* Block Erase (4-Kbytes) */ - } - else if(JEDEC_ID->density_code == DENSITY_CODE_642D) - { - /**< AT45DB642D Density Code : 01000 = 64-Mbit */ - FLASH_TRACE("AT45DB642D detection\r\n"); - spi_flash_at45dbxx.geometry.bytes_per_sector = 1024; /* Page Erase (1 Kbyte) */ - spi_flash_at45dbxx.geometry.sector_count = 128*64; /* 64-Mbit / 8 / 1024 = 8192 */ - spi_flash_at45dbxx.geometry.block_size = 1024*8; /* Block Erase (8 Kbytes) */ - } - else - { - FLASH_TRACE("Memory Capacity error!\r\n"); - return -RT_ENOSYS; - } - } - - /* register device */ - spi_flash_at45dbxx.flash_device.type = RT_Device_Class_Block; - spi_flash_at45dbxx.flash_device.init = AT45DB_flash_init; - spi_flash_at45dbxx.flash_device.open = AT45DB_flash_open; - spi_flash_at45dbxx.flash_device.close = AT45DB_flash_close; - spi_flash_at45dbxx.flash_device.control = AT45DB_flash_control; - - if(JEDEC_ID->density_code == DENSITY_CODE_642D) - { - spi_flash_at45dbxx.flash_device.read = AT45DB_flash_read_page_1024; - spi_flash_at45dbxx.flash_device.write = AT45DB_flash_write_page_1024; - } - else if(JEDEC_ID->density_code == DENSITY_CODE_161D - || JEDEC_ID->density_code == DENSITY_CODE_321D ) - { - spi_flash_at45dbxx.flash_device.read = AT45DB_flash_read_page_512; - spi_flash_at45dbxx.flash_device.write = AT45DB_flash_write_page_512; - } - else - { - spi_flash_at45dbxx.flash_device.read = AT45DB_flash_read_page_256; - spi_flash_at45dbxx.flash_device.write = AT45DB_flash_write_page_256; - } - - /* no private */ - spi_flash_at45dbxx.flash_device.user_data = RT_NULL; - - rt_device_register(&spi_flash_at45dbxx.flash_device, flash_device_name, - RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE); - - return RT_EOK; -} diff --git a/components/drivers/spi/spi_flash_at45dbxx.h b/components/drivers/spi/spi_flash_at45dbxx.h deleted file mode 100644 index d1bc1a2aeb..0000000000 --- a/components/drivers/spi/spi_flash_at45dbxx.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2011-12-16 aozima the first version - */ - -#ifndef SPI_FLASH_AT45DBXX_H_INCLUDED -#define SPI_FLASH_AT45DBXX_H_INCLUDED - -#include -#include - -struct spi_flash_at45dbxx -{ - struct rt_device flash_device; - struct rt_device_blk_geometry geometry; - struct rt_spi_device * rt_spi_device; -}; - -extern rt_err_t at45dbxx_init(const char * flash_device_name, const char * spi_device_name); - - -#endif // SPI_FLASH_AT45DBXX_H_INCLUDED diff --git a/components/drivers/spi/spi_flash_gd.c b/components/drivers/spi/spi_flash_gd.c deleted file mode 100644 index 3c52035372..0000000000 --- a/components/drivers/spi/spi_flash_gd.c +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2015-10-11 fullhan copy from winbond flash - */ - -#include -#include -#include - -#include "spi_flash.h" -#include "spi_flash_gd.h" - -#define FLASH_DEBUG - -#ifdef FLASH_DEBUG -#define FLASH_TRACE rt_kprintf -#else -#define FLASH_TRACE(...) -#endif /* #ifdef FLASH_DEBUG */ - -#define PAGE_SIZE 4096 - -/* JEDEC Manufacturer's ID */ -#define MF_ID (0xC8) -/* JEDEC Device ID: Memory type and Capacity */ -#define MTC_GD25Q128 (0x4018) - -/* command list */ -#define CMD_WRSR (0x01) /* Write Status Register */ -#define CMD_PP (0x02) /* Page Program */ -#define CMD_READ (0x03) /* Read Data */ -#define CMD_WRDI (0x04) /* Write Disable */ -#define CMD_RDSR1 (0x05) /* Read Status Register-1 */ -#define CMD_WREN (0x06) /* Write Enable */ -#define CMD_FAST_READ (0x0B) /* Fast Read */ -#define CMD_ERASE_4K (0x20) /* Sector Erase:4K */ -#define CMD_RDSR2 (0x35) /* Read Status Register-2 */ -#define CMD_ERASE_32K (0x52) /* 32KB Block Erase */ -#define CMD_JEDEC_ID (0x9F) /* Read JEDEC ID */ -#define CMD_ERASE_full (0xC7) /* Chip Erase */ -#define CMD_ERASE_64K (0xD8) /* 64KB Block Erase */ - -#define DUMMY (0xFF) - -static struct spi_flash_device spi_flash_device; - -static void flash_lock(struct spi_flash_device * flash_device) -{ - rt_mutex_take(&flash_device->lock, RT_WAITING_FOREVER); -} - -static void flash_unlock(struct spi_flash_device * flash_device) -{ - rt_mutex_release(&flash_device->lock); -} - -static uint8_t w25qxx_read_status(void) -{ - return rt_spi_sendrecv8(spi_flash_device.rt_spi_device, CMD_RDSR1); -} - -static void w25qxx_wait_busy(void) -{ - while( w25qxx_read_status() & (0x01)); -} - -/** \brief read [size] byte from [offset] to [buffer] - * - * \param offset uint32_t unit : byte - * \param buffer uint8_t* - * \param size uint32_t unit : byte - * \return uint32_t byte for read - * - */ -static uint32_t w25qxx_read(uint32_t offset, uint8_t * buffer, uint32_t size) -{ - uint8_t send_buffer[4]; - - send_buffer[0] = CMD_WRDI; - rt_spi_send(spi_flash_device.rt_spi_device, send_buffer, 1); - - send_buffer[0] = CMD_READ; - send_buffer[1] = (uint8_t)(offset>>16); - send_buffer[2] = (uint8_t)(offset>>8); - send_buffer[3] = (uint8_t)(offset); - - rt_spi_send_then_recv(spi_flash_device.rt_spi_device, - send_buffer, 4, - buffer, size); - - return size; -} - -/** \brief write N page on [page] - * - * \param page_addr uint32_t unit : byte (4096 * N,1 page = 4096byte) - * \param buffer const uint8_t* - * \return uint32_t - * - */ -static uint32_t w25qxx_page_write(uint32_t page_addr, const uint8_t* buffer) -{ - uint32_t index; - uint8_t send_buffer[4]; - - RT_ASSERT((page_addr&0xFF) == 0); /* page addr must align to 256byte. */ - - send_buffer[0] = CMD_WREN; - rt_spi_send(spi_flash_device.rt_spi_device, send_buffer, 1); - - send_buffer[0] = CMD_ERASE_4K; - send_buffer[1] = (page_addr >> 16); - send_buffer[2] = (page_addr >> 8); - send_buffer[3] = (page_addr); - rt_spi_send(spi_flash_device.rt_spi_device, send_buffer, 4); - - w25qxx_wait_busy(); // wait erase done. - - for(index=0; index < (PAGE_SIZE / 256); index++) - { - send_buffer[0] = CMD_WREN; - rt_spi_send(spi_flash_device.rt_spi_device, send_buffer, 1); - - send_buffer[0] = CMD_PP; - send_buffer[1] = (uint8_t)(page_addr >> 16); - send_buffer[2] = (uint8_t)(page_addr >> 8); - send_buffer[3] = (uint8_t)(page_addr); - - rt_spi_send_then_send(spi_flash_device.rt_spi_device, - send_buffer, - 4, - buffer, - 256); - - buffer += 256; - page_addr += 256; - w25qxx_wait_busy(); - } - - send_buffer[0] = CMD_WRDI; - rt_spi_send(spi_flash_device.rt_spi_device, send_buffer, 1); - - return PAGE_SIZE; -} - -/* RT-Thread device interface */ -static rt_err_t w25qxx_flash_init(rt_device_t dev) -{ - return RT_EOK; -} - -static rt_err_t w25qxx_flash_open(rt_device_t dev, rt_uint16_t oflag) -{ - uint8_t send_buffer[3]; - - flash_lock((struct spi_flash_device *)dev); - - send_buffer[0] = CMD_WREN; - rt_spi_send(spi_flash_device.rt_spi_device, send_buffer, 1); - - send_buffer[0] = CMD_WRSR; - send_buffer[1] = 0; - send_buffer[2] = 0; - rt_spi_send(spi_flash_device.rt_spi_device, send_buffer, 3); - - w25qxx_wait_busy(); - - flash_unlock((struct spi_flash_device *)dev); - - return RT_EOK; -} - -static rt_err_t w25qxx_flash_close(rt_device_t dev) -{ - return RT_EOK; -} - -static rt_err_t w25qxx_flash_control(rt_device_t dev, int cmd, void *args) -{ - RT_ASSERT(dev != RT_NULL); - - if (cmd == RT_DEVICE_CTRL_BLK_GETGEOME) - { - struct rt_device_blk_geometry *geometry; - - geometry = (struct rt_device_blk_geometry *)args; - if (geometry == RT_NULL) return -RT_ERROR; - - geometry->bytes_per_sector = spi_flash_device.geometry.bytes_per_sector; - geometry->sector_count = spi_flash_device.geometry.sector_count; - geometry->block_size = spi_flash_device.geometry.block_size; - } - - return RT_EOK; -} - -static rt_size_t w25qxx_flash_read(rt_device_t dev, - rt_off_t pos, - void* buffer, - rt_size_t size) -{ - flash_lock((struct spi_flash_device *)dev); - - w25qxx_read(pos*spi_flash_device.geometry.bytes_per_sector, - buffer, - size*spi_flash_device.geometry.bytes_per_sector); - - flash_unlock((struct spi_flash_device *)dev); - - return size; -} - -static rt_size_t w25qxx_flash_write(rt_device_t dev, - rt_off_t pos, - const void* buffer, - rt_size_t size) -{ - rt_size_t i = 0; - rt_size_t block = size; - const uint8_t * ptr = buffer; - - flash_lock((struct spi_flash_device *)dev); - - while(block--) - { - w25qxx_page_write((pos + i)*spi_flash_device.geometry.bytes_per_sector, - ptr); - ptr += PAGE_SIZE; - i++; - } - - flash_unlock((struct spi_flash_device *)dev); - - return size; -} - -#ifdef RT_USING_DEVICE_OPS -const static struct rt_device_ops gd_device_ops = -{ - w25qxx_flash_init, - w25qxx_flash_open, - w25qxx_flash_close, - w25qxx_flash_read, - w25qxx_flash_write, - w25qxx_flash_control -}; -#endif - -rt_err_t gd_init(const char * flash_device_name, const char * spi_device_name) -{ - struct rt_spi_device * rt_spi_device; - - /* initialize mutex */ - if (rt_mutex_init(&spi_flash_device.lock, spi_device_name, RT_IPC_FLAG_FIFO) != RT_EOK) - { - rt_kprintf("init sd lock mutex failed\n"); - return -RT_ENOSYS; - } - - rt_spi_device = (struct rt_spi_device *)rt_device_find(spi_device_name); - if(rt_spi_device == RT_NULL) - { - FLASH_TRACE("spi device %s not found!\r\n", spi_device_name); - return -RT_ENOSYS; - } - spi_flash_device.rt_spi_device = rt_spi_device; - - /* config spi */ - { - struct rt_spi_configuration cfg; - cfg.data_width = 8; - cfg.mode = RT_SPI_MODE_0 | RT_SPI_MSB; /* SPI Compatible: Mode 0 and Mode 3 */ - cfg.max_hz = 50 * 1000 * 1000; /* 50M */ - rt_spi_configure(spi_flash_device.rt_spi_device, &cfg); - } - - /* init flash */ - { - rt_uint8_t cmd; - rt_uint8_t id_recv[3]; - uint16_t memory_type_capacity; - - flash_lock(&spi_flash_device); - - cmd = 0xFF; /* reset SPI FLASH, cancel all cmd in processing. */ - rt_spi_send(spi_flash_device.rt_spi_device, &cmd, 1); - - cmd = CMD_WRDI; - rt_spi_send(spi_flash_device.rt_spi_device, &cmd, 1); - - /* read flash id */ - cmd = CMD_JEDEC_ID; - rt_spi_send_then_recv(spi_flash_device.rt_spi_device, &cmd, 1, id_recv, 3); - - flash_unlock(&spi_flash_device); - - if(id_recv[0] != MF_ID) - { - FLASH_TRACE("Manufacturers ID error!\r\n"); - FLASH_TRACE("JEDEC Read-ID Data : %02X %02X %02X\r\n", id_recv[0], id_recv[1], id_recv[2]); - return -RT_ENOSYS; - } - - spi_flash_device.geometry.bytes_per_sector = 4096; - spi_flash_device.geometry.block_size = 4096; /* block erase: 4k */ - - /* get memory type and capacity */ - memory_type_capacity = id_recv[1]; - memory_type_capacity = (memory_type_capacity << 8) | id_recv[2]; - - if(memory_type_capacity == MTC_GD25Q128) - { - FLASH_TRACE("GD128 detection\r\n"); - spi_flash_device.geometry.sector_count = 4096; - } - else - { - FLASH_TRACE("Memory Capacity error!\r\n"); - return -RT_ENOSYS; - } - } - - /* register device */ - spi_flash_device.flash_device.type = RT_Device_Class_Block; -#ifdef RT_USING_DEVICE_OPS - spi_flash_device.flash_device.ops = &gd_device_ops; -#else - spi_flash_device.flash_device.init = w25qxx_flash_init; - spi_flash_device.flash_device.open = w25qxx_flash_open; - spi_flash_device.flash_device.close = w25qxx_flash_close; - spi_flash_device.flash_device.read = w25qxx_flash_read; - spi_flash_device.flash_device.write = w25qxx_flash_write; - spi_flash_device.flash_device.control = w25qxx_flash_control; -#endif - /* no private */ - spi_flash_device.flash_device.user_data = RT_NULL; - - rt_device_register(&spi_flash_device.flash_device, flash_device_name, - RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE); - - return RT_EOK; -} diff --git a/components/drivers/spi/spi_flash_gd.h b/components/drivers/spi/spi_flash_gd.h deleted file mode 100644 index 904d976ed0..0000000000 --- a/components/drivers/spi/spi_flash_gd.h +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2015-10-11 fullhan copy from winbond flash - */ - -#ifndef SPI_FLASH_GD_H_ -#define SPI_FLASH_GD_H_ - -#include - -extern rt_err_t gd_init(const char * flash_device_name, const char * spi_device_name); - -#endif /* SPI_FLASH_GD_H_ */ diff --git a/components/drivers/spi/spi_flash_sst25vfxx.c b/components/drivers/spi/spi_flash_sst25vfxx.c deleted file mode 100644 index bd618a8e9b..0000000000 --- a/components/drivers/spi/spi_flash_sst25vfxx.c +++ /dev/null @@ -1,358 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2011-12-16 aozima the first version - */ - -#include -#include "spi_flash_sst25vfxx.h" - -#define FLASH_DEBUG - -#ifdef FLASH_DEBUG -#define FLASH_TRACE rt_kprintf -#else -#define FLASH_TRACE(...) -#endif /* #ifdef FLASH_DEBUG */ - -/* JEDEC Manufacturer’s ID */ -#define MF_ID (0xBF) -/* JEDEC Device ID : Memory Type */ -#define MT_ID (0x25) -/* JEDEC Device ID: Memory Capacity */ -#define MC_ID_SST25VF020B (0x8C) /* 2Mbit */ -#define MC_ID_SST25VF040B (0x8D) /* 4Mbit */ -#define MC_ID_SST25VF080B (0x8E) /* 8Mbit */ -#define MC_ID_SST25VF016B (0x41) /* 16Mbit */ -#define MC_ID_SST25VF032B (0x4A) /* 32Mbit */ -#define MC_ID_SST25VF064C (0x4B) /* 64Mbit */ - -/* command list */ -#define CMD_RDSR (0x05) -#define CMD_WRSR (0x01) -#define CMD_EWSR (0x50) -#define CMD_WRDI (0x04) -#define CMD_WREN (0x06) -#define CMD_READ (0x03) -#define CMD_FAST_READ (0x0B) -#define CMD_BP (0x02) -#define CMD_AAIP (0xAD) -#define CMD_ERASE_4K (0x20) -#define CMD_ERASE_32K (0x52) -#define CMD_ERASE_64K (0xD8) -#define CMD_ERASE_full (0xC7) -#define CMD_JEDEC_ID (0x9F) -#define CMD_EBSY (0x70) -#define CMD_DBSY (0x80) - -#define DUMMY (0xFF) - -static struct spi_flash_sst25vfxx spi_flash_sst25vfxx; - -static uint8_t sst25vfxx_read_status(struct spi_flash_sst25vfxx * spi_flash) -{ - return rt_spi_sendrecv8(spi_flash->rt_spi_device, CMD_RDSR); -} - -static void sst25vfxx_wait_busy(struct spi_flash_sst25vfxx * spi_flash) -{ - while( sst25vfxx_read_status(spi_flash) & (0x01)); -} - -/** \brief write N page on [page] - * - * \param page uint32_t unit : byte (4096 * N,1 page = 4096byte) - * \param buffer const uint8_t* - * \param size uint32_t unit : byte ( 4096*N ) - * \return uint32_t - * - */ -static uint32_t sst25vfxx_page_write(struct spi_flash_sst25vfxx * spi_flash, uint32_t page, const uint8_t * buffer, uint32_t size) -{ - uint32_t index; - uint32_t need_wirte = size; - uint8_t send_buffer[6]; - - page &= ~0xFFF; // page size = 4096byte - - send_buffer[0] = CMD_WREN; - rt_spi_send(spi_flash->rt_spi_device, send_buffer, 1); - - send_buffer[0] = CMD_ERASE_4K; - send_buffer[1] = (page >> 16); - send_buffer[2] = (page >> 8); - send_buffer[3] = (page); - rt_spi_send(spi_flash->rt_spi_device, send_buffer, 4); - - sst25vfxx_wait_busy(spi_flash); // wait erase done. - - send_buffer[0] = CMD_WREN; - rt_spi_send(spi_flash->rt_spi_device, send_buffer, 1); - - send_buffer[0] = CMD_AAIP; - send_buffer[1] = (uint8_t)(page >> 16); - send_buffer[2] = (uint8_t)(page >> 8); - send_buffer[3] = (uint8_t)(page); - send_buffer[4] = *buffer++; - send_buffer[5] = *buffer++; - need_wirte -= 2; - rt_spi_send(spi_flash->rt_spi_device, send_buffer, 6); - - sst25vfxx_wait_busy(spi_flash); - - for(index=0; index < need_wirte/2; index++) - { - send_buffer[0] = CMD_AAIP; - send_buffer[1] = *buffer++; - send_buffer[2] = *buffer++; - rt_spi_send(spi_flash->rt_spi_device, send_buffer, 3); - sst25vfxx_wait_busy(spi_flash); - } - - send_buffer[0] = CMD_WRDI; - rt_spi_send(spi_flash->rt_spi_device, send_buffer, 1); - - return size; -} - -/* RT-Thread device interface */ -static rt_err_t sst25vfxx_flash_init(rt_device_t dev) -{ - return RT_EOK; -} - -static rt_err_t sst25vfxx_flash_open(rt_device_t dev, rt_uint16_t oflag) -{ - rt_err_t result; - uint8_t send_buffer[2]; - struct spi_flash_sst25vfxx * spi_flash = (struct spi_flash_sst25vfxx *)dev; - - /* lock spi flash */ - result = rt_mutex_take(&(spi_flash->lock), RT_WAITING_FOREVER); - if(result != RT_EOK) - { - return result; - } - - send_buffer[0] = CMD_DBSY; - rt_spi_send(spi_flash->rt_spi_device, send_buffer, 1); - - send_buffer[0] = CMD_EWSR; - rt_spi_send(spi_flash->rt_spi_device, send_buffer, 1); - - send_buffer[0] = CMD_WRSR; - send_buffer[1] = 0; - rt_spi_send(spi_flash->rt_spi_device, send_buffer, 2); - - /* release lock */ - rt_mutex_release(&(spi_flash->lock)); - - return RT_EOK; -} - -static rt_err_t sst25vfxx_flash_close(rt_device_t dev) -{ - return RT_EOK; -} - -static rt_err_t sst25vfxx_flash_control(rt_device_t dev, int cmd, void *args) -{ - struct spi_flash_sst25vfxx * spi_flash; - - spi_flash = (struct spi_flash_sst25vfxx *)dev; - - RT_ASSERT(dev != RT_NULL); - - if (cmd == RT_DEVICE_CTRL_BLK_GETGEOME) - { - struct rt_device_blk_geometry *geometry; - - geometry = (struct rt_device_blk_geometry *)args; - if (geometry == RT_NULL) return -RT_ERROR; - - geometry->bytes_per_sector = spi_flash->geometry.bytes_per_sector; - geometry->sector_count = spi_flash->geometry.sector_count; - geometry->block_size = spi_flash->geometry.block_size; - } - - return RT_EOK; -} - -static rt_size_t sst25vfxx_flash_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size) -{ - rt_err_t result; - uint8_t send_buffer[4]; - struct spi_flash_sst25vfxx * spi_flash = (struct spi_flash_sst25vfxx *)dev; - uint32_t offset = pos * spi_flash->geometry.bytes_per_sector; - - /* lock spi flash */ - result = rt_mutex_take(&(spi_flash->lock), RT_WAITING_FOREVER); - if(result != RT_EOK) - { - return 0; - } - - send_buffer[0] = CMD_WRDI; - rt_spi_send(spi_flash->rt_spi_device, send_buffer, 1); - - send_buffer[0] = CMD_READ; - send_buffer[1] = (uint8_t)(offset>>16); - send_buffer[2] = (uint8_t)(offset>>8); - send_buffer[3] = (uint8_t)(offset); - rt_spi_send_then_recv(spi_flash->rt_spi_device, send_buffer, 4, buffer, size * spi_flash->geometry.bytes_per_sector); - - /* release lock */ - rt_mutex_release(&(spi_flash->lock)); - - return size; -} - -static rt_size_t sst25vfxx_flash_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size) -{ - uint32_t i; - rt_err_t result; - const uint8_t * write_buffer = buffer; - struct spi_flash_sst25vfxx * spi_flash = (struct spi_flash_sst25vfxx *)dev; - - /* lock spi flash */ - result = rt_mutex_take(&(spi_flash->lock), RT_WAITING_FOREVER); - if(result != RT_EOK) - { - return 0; - } - - for(i=0; igeometry.bytes_per_sector, - write_buffer, - spi_flash->geometry.bytes_per_sector); - write_buffer += spi_flash->geometry.bytes_per_sector; - } - - /* release lock */ - rt_mutex_release(&(spi_flash->lock)); - - return size; -} - -#ifdef RT_USING_DEVICE_OPS -const static struct rt_device_ops sst25vfxx_device_ops = -{ - sst25vfxx_flash_init, - sst25vfxx_flash_open, - sst25vfxx_flash_close, - sst25vfxx_flash_read, - sst25vfxx_flash_write, - sst25vfxx_flash_control -}; -#endif - -rt_err_t sst25vfxx_init(const char * flash_device_name, const char * spi_device_name) -{ - struct rt_spi_device * rt_spi_device; - struct spi_flash_sst25vfxx * spi_flash = &spi_flash_sst25vfxx; - - rt_spi_device = (struct rt_spi_device *)rt_device_find(spi_device_name); - if(rt_spi_device == RT_NULL) - { - FLASH_TRACE("spi device %s not found!\r\n", spi_device_name); - return -RT_ENOSYS; - } - spi_flash->rt_spi_device = rt_spi_device; - - /* config spi */ - { - struct rt_spi_configuration cfg; - cfg.data_width = 8; - cfg.mode = RT_SPI_MODE_0 | RT_SPI_MSB; /* SPI Compatible: Mode 0 and Mode 3 */ - cfg.max_hz = 50000000; /* 50M */ - rt_spi_configure(spi_flash->rt_spi_device, &cfg); - } - - /* init flash */ - { - rt_uint8_t cmd; - rt_uint8_t id_recv[3]; - - cmd = CMD_WRDI; - rt_spi_send(spi_flash->rt_spi_device, &cmd, 1); - - /* read flash id */ - cmd = CMD_JEDEC_ID; - rt_spi_send_then_recv(spi_flash->rt_spi_device, &cmd, 1, id_recv, 3); - - if(id_recv[0] != MF_ID || id_recv[1] != MT_ID) - { - FLASH_TRACE("Manufacturer’s ID or Memory Type error!\r\n"); - FLASH_TRACE("JEDEC Read-ID Data : %02X %02X %02X\r\n", id_recv[0], id_recv[1], id_recv[2]); - return -RT_ENOSYS; - } - - spi_flash->geometry.bytes_per_sector = 4096; - spi_flash->geometry.block_size = 4096; /* block erase: 4k */ - - if(id_recv[2] == MC_ID_SST25VF020B) - { - FLASH_TRACE("SST25VF020B detection\r\n"); - spi_flash->geometry.sector_count = 64; - } - else if(id_recv[2] == MC_ID_SST25VF040B) - { - FLASH_TRACE("SST25VF040B detection\r\n"); - spi_flash->geometry.sector_count = 128; - } - else if(id_recv[2] == MC_ID_SST25VF080B) - { - FLASH_TRACE("SST25VF080B detection\r\n"); - spi_flash->geometry.sector_count = 256; - } - else if(id_recv[2] == MC_ID_SST25VF016B) - { - FLASH_TRACE("SST25VF016B detection\r\n"); - spi_flash->geometry.sector_count = 512; - } - else if(id_recv[2] == MC_ID_SST25VF032B) - { - FLASH_TRACE("SST25VF032B detection\r\n"); - spi_flash->geometry.sector_count = 1024; - } - else if(id_recv[2] == MC_ID_SST25VF064C) - { - FLASH_TRACE("SST25VF064C detection\r\n"); - spi_flash->geometry.sector_count = 2048; - } - else - { - FLASH_TRACE("Memory Capacity error!\r\n"); - return -RT_ENOSYS; - } - } - - /* initialize mutex lock */ - rt_mutex_init(&spi_flash->lock, flash_device_name, RT_IPC_FLAG_PRIO); - - /* register device */ - spi_flash->flash_device.type = RT_Device_Class_Block; -#ifdef RT_USING_DEVICE_OPS - spi_flash->flash_device.ops = &sst25vfxx_device_ops; -#else - spi_flash->flash_device.init = sst25vfxx_flash_init; - spi_flash->flash_device.open = sst25vfxx_flash_open; - spi_flash->flash_device.close = sst25vfxx_flash_close; - spi_flash->flash_device.read = sst25vfxx_flash_read; - spi_flash->flash_device.write = sst25vfxx_flash_write; - spi_flash->flash_device.control = sst25vfxx_flash_control; -#endif - /* no private */ - spi_flash->flash_device.user_data = RT_NULL; - - rt_device_register(&spi_flash->flash_device, flash_device_name, - RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE); - - return RT_EOK; -} diff --git a/components/drivers/spi/spi_flash_sst25vfxx.h b/components/drivers/spi/spi_flash_sst25vfxx.h deleted file mode 100644 index 7a7283f753..0000000000 --- a/components/drivers/spi/spi_flash_sst25vfxx.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2011-12-16 aozima the first version - */ - -#ifndef SPI_FLASH_SST25VFXX_H_INCLUDED -#define SPI_FLASH_SST25VFXX_H_INCLUDED - -#include -#include - -struct spi_flash_sst25vfxx -{ - struct rt_device flash_device; - struct rt_device_blk_geometry geometry; - struct rt_spi_device * rt_spi_device; - struct rt_mutex lock; -}; - -extern rt_err_t sst25vfxx_init(const char * flash_device_name, const char * spi_device_name); - - -#endif // SPI_FLASH_SST25VFXX_H_INCLUDED diff --git a/components/drivers/spi/spi_flash_w25qxx.c b/components/drivers/spi/spi_flash_w25qxx.c deleted file mode 100644 index bba9c0b5cc..0000000000 --- a/components/drivers/spi/spi_flash_w25qxx.c +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2011-12-16 aozima the first version - * 2012-05-06 aozima can page write. - * 2012-08-23 aozima add flash lock. - * 2012-08-24 aozima fixed write status register BUG. - */ - -#include -#include - -#include "spi_flash.h" -#include "spi_flash_w25qxx.h" - -#define FLASH_DEBUG - -#ifdef FLASH_DEBUG -#define FLASH_TRACE rt_kprintf -#else -#define FLASH_TRACE(...) -#endif /* #ifdef FLASH_DEBUG */ - -#define PAGE_SIZE 4096 - -/* JEDEC Manufacturer ID */ -#define MF_ID (0xEF) - -/* JEDEC Device ID: Memory type and Capacity */ -#define MTC_W25Q80_BV (0x4014) /* W25Q80BV */ -#define MTC_W25Q16_BV_CL_CV (0x4015) /* W25Q16BV W25Q16CL W25Q16CV */ -#define MTC_W25Q16_DW (0x6015) /* W25Q16DW */ -#define MTC_W25Q32_BV (0x4016) /* W25Q32BV */ -#define MTC_W25Q32_DW (0x6016) /* W25Q32DW */ -#define MTC_W25Q64_BV_CV (0x4017) /* W25Q64BV W25Q64CV */ -#define MTC_W25Q64_DW (0x4017) /* W25Q64DW */ -#define MTC_W25Q128_BV (0x4018) /* W25Q128BV */ -#define MTC_W25Q256_FV (TBD) /* W25Q256FV */ - -/* command list */ -#define CMD_WRSR (0x01) /* Write Status Register */ -#define CMD_PP (0x02) /* Page Program */ -#define CMD_READ (0x03) /* Read Data */ -#define CMD_WRDI (0x04) /* Write Disable */ -#define CMD_RDSR1 (0x05) /* Read Status Register-1 */ -#define CMD_WREN (0x06) /* Write Enable */ -#define CMD_FAST_READ (0x0B) /* Fast Read */ -#define CMD_ERASE_4K (0x20) /* Sector Erase:4K */ -#define CMD_RDSR2 (0x35) /* Read Status Register-2 */ -#define CMD_ERASE_32K (0x52) /* 32KB Block Erase */ -#define CMD_JEDEC_ID (0x9F) /* Read JEDEC ID */ -#define CMD_ERASE_full (0xC7) /* Chip Erase */ -#define CMD_ERASE_64K (0xD8) /* 64KB Block Erase */ - -#define DUMMY (0xFF) - -static struct spi_flash_device spi_flash_device; - -static void flash_lock(struct spi_flash_device * flash_device) -{ - rt_mutex_take(&flash_device->lock, RT_WAITING_FOREVER); -} - -static void flash_unlock(struct spi_flash_device * flash_device) -{ - rt_mutex_release(&flash_device->lock); -} - -static uint8_t w25qxx_read_status(void) -{ - return rt_spi_sendrecv8(spi_flash_device.rt_spi_device, CMD_RDSR1); -} - -static void w25qxx_wait_busy(void) -{ - while( w25qxx_read_status() & (0x01)); -} - -/** \brief read [size] byte from [offset] to [buffer] - * - * \param offset uint32_t unit : byte - * \param buffer uint8_t* - * \param size uint32_t unit : byte - * \return uint32_t byte for read - * - */ -static uint32_t w25qxx_read(uint32_t offset, uint8_t * buffer, uint32_t size) -{ - uint8_t send_buffer[4]; - - send_buffer[0] = CMD_WRDI; - rt_spi_send(spi_flash_device.rt_spi_device, send_buffer, 1); - - send_buffer[0] = CMD_READ; - send_buffer[1] = (uint8_t)(offset>>16); - send_buffer[2] = (uint8_t)(offset>>8); - send_buffer[3] = (uint8_t)(offset); - - rt_spi_send_then_recv(spi_flash_device.rt_spi_device, - send_buffer, 4, - buffer, size); - - return size; -} - -/** \brief write N page on [page] - * - * \param page_addr uint32_t unit : byte (4096 * N,1 page = 4096byte) - * \param buffer const uint8_t* - * \return uint32_t - * - */ -uint32_t w25qxx_page_write(uint32_t page_addr, const uint8_t* buffer) -{ - uint32_t index; - uint8_t send_buffer[4]; - - RT_ASSERT((page_addr&0xFF) == 0); /* page addr must align to 256byte. */ - - send_buffer[0] = CMD_WREN; - rt_spi_send(spi_flash_device.rt_spi_device, send_buffer, 1); - - send_buffer[0] = CMD_ERASE_4K; - send_buffer[1] = (page_addr >> 16); - send_buffer[2] = (page_addr >> 8); - send_buffer[3] = (page_addr); - rt_spi_send(spi_flash_device.rt_spi_device, send_buffer, 4); - - w25qxx_wait_busy(); // wait erase done. - - for(index=0; index < (PAGE_SIZE / 256); index++) - { - send_buffer[0] = CMD_WREN; - rt_spi_send(spi_flash_device.rt_spi_device, send_buffer, 1); - - send_buffer[0] = CMD_PP; - send_buffer[1] = (uint8_t)(page_addr >> 16); - send_buffer[2] = (uint8_t)(page_addr >> 8); - send_buffer[3] = (uint8_t)(page_addr); - - rt_spi_send_then_send(spi_flash_device.rt_spi_device, - send_buffer, - 4, - buffer, - 256); - - buffer += 256; - page_addr += 256; - w25qxx_wait_busy(); - } - - send_buffer[0] = CMD_WRDI; - rt_spi_send(spi_flash_device.rt_spi_device, send_buffer, 1); - - return PAGE_SIZE; -} - -/* RT-Thread device interface */ -static rt_err_t w25qxx_flash_init(rt_device_t dev) -{ - return RT_EOK; -} - -static rt_err_t w25qxx_flash_open(rt_device_t dev, rt_uint16_t oflag) -{ - uint8_t send_buffer[3]; - - flash_lock((struct spi_flash_device *)dev); - - send_buffer[0] = CMD_WREN; - rt_spi_send(spi_flash_device.rt_spi_device, send_buffer, 1); - - send_buffer[0] = CMD_WRSR; - send_buffer[1] = 0; - send_buffer[2] = 0; - rt_spi_send(spi_flash_device.rt_spi_device, send_buffer, 3); - - w25qxx_wait_busy(); - - flash_unlock((struct spi_flash_device *)dev); - - return RT_EOK; -} - -static rt_err_t w25qxx_flash_close(rt_device_t dev) -{ - return RT_EOK; -} - -static rt_err_t w25qxx_flash_control(rt_device_t dev, int cmd, void *args) -{ - RT_ASSERT(dev != RT_NULL); - - if (cmd == RT_DEVICE_CTRL_BLK_GETGEOME) - { - struct rt_device_blk_geometry *geometry; - - geometry = (struct rt_device_blk_geometry *)args; - if (geometry == RT_NULL) return -RT_ERROR; - - geometry->bytes_per_sector = spi_flash_device.geometry.bytes_per_sector; - geometry->sector_count = spi_flash_device.geometry.sector_count; - geometry->block_size = spi_flash_device.geometry.block_size; - } - - return RT_EOK; -} - -static rt_size_t w25qxx_flash_read(rt_device_t dev, - rt_off_t pos, - void* buffer, - rt_size_t size) -{ - flash_lock((struct spi_flash_device *)dev); - - w25qxx_read(pos*spi_flash_device.geometry.bytes_per_sector, - buffer, - size*spi_flash_device.geometry.bytes_per_sector); - - flash_unlock((struct spi_flash_device *)dev); - - return size; -} - -static rt_size_t w25qxx_flash_write(rt_device_t dev, - rt_off_t pos, - const void* buffer, - rt_size_t size) -{ - rt_size_t i = 0; - rt_size_t block = size; - const uint8_t * ptr = buffer; - - flash_lock((struct spi_flash_device *)dev); - - while(block--) - { - w25qxx_page_write((pos + i)*spi_flash_device.geometry.bytes_per_sector, - ptr); - ptr += PAGE_SIZE; - i++; - } - - flash_unlock((struct spi_flash_device *)dev); - - return size; -} - -#ifdef RT_USING_DEVICE_OPS -const static struct rt_device_ops w25qxx_device_ops = -{ - w25qxx_flash_init, - w25qxx_flash_open, - w25qxx_flash_close, - w25qxx_flash_read, - w25qxx_flash_write, - w25qxx_flash_control -}; -#endif - -rt_err_t w25qxx_init(const char * flash_device_name, const char * spi_device_name) -{ - struct rt_spi_device * rt_spi_device; - - /* initialize mutex */ - if (rt_mutex_init(&spi_flash_device.lock, spi_device_name, RT_IPC_FLAG_FIFO) != RT_EOK) - { - rt_kprintf("init sd lock mutex failed\n"); - return -RT_ENOSYS; - } - - rt_spi_device = (struct rt_spi_device *)rt_device_find(spi_device_name); - if(rt_spi_device == RT_NULL) - { - FLASH_TRACE("spi device %s not found!\r\n", spi_device_name); - return -RT_ENOSYS; - } - spi_flash_device.rt_spi_device = rt_spi_device; - - /* config spi */ - { - struct rt_spi_configuration cfg; - cfg.data_width = 8; - cfg.mode = RT_SPI_MODE_0 | RT_SPI_MSB; /* SPI Compatible: Mode 0 and Mode 3 */ - cfg.max_hz = 50 * 1000 * 1000; /* 50M */ - rt_spi_configure(spi_flash_device.rt_spi_device, &cfg); - } - - /* init flash */ - { - rt_uint8_t cmd; - rt_uint8_t id_recv[3]; - uint16_t memory_type_capacity; - - flash_lock(&spi_flash_device); - - cmd = 0xFF; /* reset SPI FLASH, cancel all cmd in processing. */ - rt_spi_send(spi_flash_device.rt_spi_device, &cmd, 1); - - cmd = CMD_WRDI; - rt_spi_send(spi_flash_device.rt_spi_device, &cmd, 1); - - /* read flash id */ - cmd = CMD_JEDEC_ID; - rt_spi_send_then_recv(spi_flash_device.rt_spi_device, &cmd, 1, id_recv, 3); - - flash_unlock(&spi_flash_device); - - if(id_recv[0] != MF_ID) - { - FLASH_TRACE("Manufacturers ID error!\r\n"); - FLASH_TRACE("JEDEC Read-ID Data : %02X %02X %02X\r\n", id_recv[0], id_recv[1], id_recv[2]); - return -RT_ENOSYS; - } - - spi_flash_device.geometry.bytes_per_sector = 4096; - spi_flash_device.geometry.block_size = 4096; /* block erase: 4k */ - - /* get memory type and capacity */ - memory_type_capacity = id_recv[1]; - memory_type_capacity = (memory_type_capacity << 8) | id_recv[2]; - - if(memory_type_capacity == MTC_W25Q128_BV) - { - FLASH_TRACE("W25Q128BV detection\r\n"); - spi_flash_device.geometry.sector_count = 4096; - } - else if(memory_type_capacity == MTC_W25Q64_BV_CV) - { - FLASH_TRACE("W25Q64BV or W25Q64CV detection\r\n"); - spi_flash_device.geometry.sector_count = 2048; - } - else if(memory_type_capacity == MTC_W25Q64_DW) - { - FLASH_TRACE("W25Q64DW detection\r\n"); - spi_flash_device.geometry.sector_count = 2048; - } - else if(memory_type_capacity == MTC_W25Q32_BV) - { - FLASH_TRACE("W25Q32BV detection\r\n"); - spi_flash_device.geometry.sector_count = 1024; - } - else if(memory_type_capacity == MTC_W25Q32_DW) - { - FLASH_TRACE("W25Q32DW detection\r\n"); - spi_flash_device.geometry.sector_count = 1024; - } - else if(memory_type_capacity == MTC_W25Q16_BV_CL_CV) - { - FLASH_TRACE("W25Q16BV or W25Q16CL or W25Q16CV detection\r\n"); - spi_flash_device.geometry.sector_count = 512; - } - else if(memory_type_capacity == MTC_W25Q16_DW) - { - FLASH_TRACE("W25Q16DW detection\r\n"); - spi_flash_device.geometry.sector_count = 512; - } - else if(memory_type_capacity == MTC_W25Q80_BV) - { - FLASH_TRACE("W25Q80BV detection\r\n"); - spi_flash_device.geometry.sector_count = 256; - } - else - { - FLASH_TRACE("Memory Capacity error!\r\n"); - return -RT_ENOSYS; - } - } - - /* register device */ - spi_flash_device.flash_device.type = RT_Device_Class_Block; -#ifdef RT_USING_DEVICE_OPS - spi_flash_device.flash_device.ops = &w25qxx_device_ops; -#else - spi_flash_device.flash_device.init = w25qxx_flash_init; - spi_flash_device.flash_device.open = w25qxx_flash_open; - spi_flash_device.flash_device.close = w25qxx_flash_close; - spi_flash_device.flash_device.read = w25qxx_flash_read; - spi_flash_device.flash_device.write = w25qxx_flash_write; - spi_flash_device.flash_device.control = w25qxx_flash_control; -#endif - /* no private */ - spi_flash_device.flash_device.user_data = RT_NULL; - - rt_device_register(&spi_flash_device.flash_device, flash_device_name, - RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE); - - return RT_EOK; -} diff --git a/components/drivers/spi/spi_flash_w25qxx.h b/components/drivers/spi/spi_flash_w25qxx.h deleted file mode 100644 index 14837bc87c..0000000000 --- a/components/drivers/spi/spi_flash_w25qxx.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2011-12-16 aozima the first version - * 2012-08-23 aozima add flash lock. - */ - -#ifndef SPI_FLASH_W25QXX_H_INCLUDED -#define SPI_FLASH_W25QXX_H_INCLUDED - -#include - -extern rt_err_t w25qxx_init(const char * flash_device_name, - const char * spi_device_name); - -#endif // SPI_FLASH_W25QXX_H_INCLUDED diff --git a/components/drivers/spi/spi_flash_w25qxx_mtd.c b/components/drivers/spi/spi_flash_w25qxx_mtd.c deleted file mode 100644 index 9f1ef802f6..0000000000 --- a/components/drivers/spi/spi_flash_w25qxx_mtd.c +++ /dev/null @@ -1,336 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - */ -#include -#include - -#include "spi_flash.h" -#include "spi_flash_w25qxx_mtd.h" - -#include -#include -#include -#include - -#define FLASH_DEBUG - -#ifdef FLASH_DEBUG -#define FLASH_TRACE printf -#else -#define FLASH_TRACE(...) -#endif /* #ifdef FLASH_DEBUG */ - -/* JEDEC Manufacturer’s ID */ -#define MF_ID (0xEF) -/* JEDEC Device ID: Memory type and Capacity */ -#define MTC_W25Q80_BV (0x4014) /* W25Q80BV */ -#define MTC_W25Q16_BV_CL_CV (0x4015) /* W25Q16BV W25Q16CL W25Q16CV */ -#define MTC_W25Q16_DW (0x6015) /* W25Q16DW */ -#define MTC_W25Q32_BV (0x4016) /* W25Q32BV */ -#define MTC_W25Q32_DW (0x6016) /* W25Q32DW */ -#define MTC_W25Q64_BV_CV (0x4017) /* W25Q64BV W25Q64CV */ -#define MTC_W25Q64_DW (0x4017) /* W25Q64DW */ -#define MTC_W25Q128_BV (0x4018) /* W25Q128BV */ -#define MTC_W25Q256_FV (TBD) /* W25Q256FV */ - -#define MTC_W25X80 (0x3014) - -/* command list */ -#define CMD_WRSR (0x01) /* Write Status Register */ -#define CMD_PP (0x02) /* Page Program */ -#define CMD_READ (0x03) /* Read Data */ -#define CMD_WRDI (0x04) /* Write Disable */ -#define CMD_RDSR1 (0x05) /* Read Status Register-1 */ -#define CMD_WREN (0x06) /* Write Enable */ -#define CMD_FAST_READ (0x0B) /* Fast Read */ -#define CMD_ERASE_4K (0x20) /* Sector Erase:4K */ -#define CMD_RDSR2 (0x35) /* Read Status Register-2 */ -#define CMD_ERASE_32K (0x52) /* 32KB Block Erase */ -#define CMD_JEDEC_ID (0x9F) /* Read JEDEC ID */ -#define CMD_ERASE_full (0xC7) /* Chip Erase */ -#define CMD_ERASE_64K (0xD8) /* 64KB Block Erase */ -#define CMD_MANU_ID (0x90) - -#define DUMMY (0xFF) - -#define FLASH_ERASE_CMD CMD_ERASE_4K -#define FLASH_BLOCK_SIZE 4096 -#define FLASH_PAGE_SIZE 256 - -static void w25qxx_lock(struct rt_mtd_nor_device *device) -{ - struct spi_flash_mtd *mtd = (struct spi_flash_mtd *)device; - rt_mutex_take(&mtd->lock, RT_WAITING_FOREVER); -} - -static void w25qxx_unlock(struct rt_mtd_nor_device *device) -{ - struct spi_flash_mtd *mtd = (struct spi_flash_mtd *)device; - rt_mutex_release(&mtd->lock); -} - -static rt_uint8_t w25qxx_read_status(struct rt_mtd_nor_device *device) -{ - struct spi_flash_mtd *mtd = (struct spi_flash_mtd *)device; - return rt_spi_sendrecv8(mtd->rt_spi_device, CMD_RDSR1); -} - -static void w25qxx_wait_busy(struct rt_mtd_nor_device *device) -{ - while( w25qxx_read_status(device) & (0x01)); -} - -static rt_err_t w25qxx_read_id(struct rt_mtd_nor_device *device) -{ - rt_uint8_t cmd; - rt_uint8_t id_recv[3]; - - struct spi_flash_mtd *mtd = (struct spi_flash_mtd *)device; - - w25qxx_lock(device); - - cmd = 0xFF; /* reset SPI FLASH, cancel all cmd in processing. */ - rt_spi_send(mtd->rt_spi_device, &cmd, 1); - - cmd = CMD_WRDI; - rt_spi_send(mtd->rt_spi_device, &cmd, 1); - - /* read flash id */ - cmd = CMD_JEDEC_ID; - rt_spi_send_then_recv(mtd->rt_spi_device, &cmd, 1, id_recv, 3); - - w25qxx_unlock(device); - - return (rt_uint32_t)(id_recv[0] << 16) | (id_recv[1] << 8) | id_recv[2]; -} - -static rt_size_t w25qxx_read(struct rt_mtd_nor_device *device, rt_off_t offset, rt_uint8_t *buffer, rt_size_t length) -{ - struct spi_flash_mtd *mtd = (struct spi_flash_mtd *)device; - rt_uint8_t send_buffer[4]; - - if((offset + length) > device->block_end * FLASH_BLOCK_SIZE) - return 0; - - - w25qxx_lock(device); - - send_buffer[0] = CMD_WRDI; - rt_spi_send(mtd->rt_spi_device, send_buffer, 1); - - send_buffer[0] = CMD_READ; - send_buffer[1] = (rt_uint8_t)(offset>>16); - send_buffer[2] = (rt_uint8_t)(offset>>8); - send_buffer[3] = (rt_uint8_t)(offset); - rt_spi_send_then_recv(mtd->rt_spi_device, - send_buffer, 4, - buffer, length); - - w25qxx_unlock(device); - return length; -} - -static rt_size_t w25qxx_write(struct rt_mtd_nor_device *device, rt_off_t offset, const rt_uint8_t *buffer, rt_size_t length) -{ - struct spi_flash_mtd *mtd = (struct spi_flash_mtd *)device; - rt_uint8_t send_buffer[4]; - rt_uint8_t *write_ptr ; - rt_size_t write_size,write_total; - - if((offset + length) > device->block_end * FLASH_BLOCK_SIZE) - return 0; - - w25qxx_lock(device); - - send_buffer[0] = CMD_WREN; - rt_spi_send(mtd->rt_spi_device, send_buffer, 1); - w25qxx_wait_busy(device); // wait erase done. - - write_size = 0; - write_total = 0; - write_ptr = (rt_uint8_t *)buffer; - while(write_total < length) - { - send_buffer[0] = CMD_WREN; - rt_spi_send(mtd->rt_spi_device, send_buffer, 1); - - //write first page... - send_buffer[0] = CMD_PP; - send_buffer[1] = (rt_uint8_t)(offset >> 16); - send_buffer[2] = (rt_uint8_t)(offset >> 8); - send_buffer[3] = (rt_uint8_t)(offset); - - //address % FLASH_PAGE_SIZE + length - if(((offset & (FLASH_PAGE_SIZE - 1)) + (length - write_total)) > FLASH_PAGE_SIZE) - { - write_size = FLASH_PAGE_SIZE - (offset & (FLASH_PAGE_SIZE - 1)); - } - else - { - write_size = (length - write_total); - } - - rt_spi_send_then_send(mtd->rt_spi_device, - send_buffer, 4, - write_ptr + write_total, write_size); - w25qxx_wait_busy(device); - - - offset += write_size; - write_total += write_size; - } - - send_buffer[0] = CMD_WRDI; - rt_spi_send(mtd->rt_spi_device, send_buffer, 1); - - w25qxx_unlock(device); - - return length; -} - -static rt_err_t w25qxx_erase_block(struct rt_mtd_nor_device *device, rt_off_t offset, rt_uint32_t length) -{ - struct spi_flash_mtd *mtd = (struct spi_flash_mtd *)device; - rt_uint8_t send_buffer[4]; - rt_uint32_t erase_size = 0; - - //offset must be ALIGN_DOWN to BLOCKSIZE - if(offset != RT_ALIGN_DOWN(offset,FLASH_BLOCK_SIZE)) - return 0; - - if((offset + length) > device->block_end * FLASH_BLOCK_SIZE) - return 0; - - /* check length must align to block size */ - if(length % device->block_size != 0) - { - rt_kprintf("param length = %d ,error\n",length); - return 0; - } - - w25qxx_lock(device); - - send_buffer[0] = CMD_WREN; - rt_spi_send(mtd->rt_spi_device, send_buffer, 1); - w25qxx_wait_busy(device); // wait erase done. - while (erase_size < length) - { - send_buffer[0] = CMD_ERASE_4K; - send_buffer[1] = (rt_uint8_t) (offset >> 16); - send_buffer[2] = (rt_uint8_t) (offset >> 8); - send_buffer[3] = (rt_uint8_t) (offset); - rt_spi_send(mtd->rt_spi_device, send_buffer, 4); - w25qxx_wait_busy(device); // wait erase done. - - erase_size += 4096; - offset += 4096; - } - send_buffer[0] = CMD_WRDI; - rt_spi_send(mtd->rt_spi_device, send_buffer, 1); - - w25qxx_unlock(device); - return RT_EOK; -} - -const static struct rt_mtd_nor_driver_ops w25qxx_mtd_ops = -{ - w25qxx_read_id, - w25qxx_read, - w25qxx_write, - w25qxx_erase_block, -}; - -rt_err_t w25qxx_mtd_init(const char *mtd_name,const char * spi_device_name) -{ - rt_err_t result = RT_EOK; - rt_uint32_t id; - rt_uint8_t send_buffer[3]; - - struct rt_spi_device* rt_spi_device; - struct spi_flash_mtd* mtd = (struct spi_flash_mtd *)rt_malloc(sizeof(struct spi_flash_mtd)); - - RT_ASSERT(mtd != RT_NULL); - - /* initialize mutex */ - if (rt_mutex_init(&mtd->lock, mtd_name, RT_IPC_FLAG_FIFO) != RT_EOK) - { - FLASH_TRACE("init mtd lock mutex failed\n"); - result = -RT_ENOSYS; - - goto _error_exit; - } - - rt_spi_device = (struct rt_spi_device *)rt_device_find(spi_device_name); - if(rt_spi_device == RT_NULL) - { - FLASH_TRACE("spi device %s not found!\r\n", spi_device_name); - result = -RT_ENOSYS; - - goto _error_exit; - } - mtd->rt_spi_device = rt_spi_device; - /* config spi */ - { - struct rt_spi_configuration cfg; - cfg.data_width = 8; - cfg.mode = RT_SPI_MODE_0 | RT_SPI_MSB; /* SPI Compatible: Mode 0 and Mode 3 */ - cfg.max_hz = 20 * 1000 * 1000; /* 20 */ - rt_spi_configure(rt_spi_device, &cfg); - } - - /* Init Flash device */ - { - w25qxx_lock(&mtd->mtd_device); - - send_buffer[0] = CMD_WREN; - rt_spi_send(mtd->rt_spi_device, send_buffer, 1); - w25qxx_wait_busy(&mtd->mtd_device); - - send_buffer[0] = CMD_WRSR; - send_buffer[1] = 0; - send_buffer[2] = 0; - rt_spi_send(mtd->rt_spi_device, send_buffer, 3); - w25qxx_wait_busy(&mtd->mtd_device); - - w25qxx_unlock(&mtd->mtd_device); - } - - id = w25qxx_read_id(&mtd->mtd_device); - - mtd->mtd_device.block_size = 4096; - mtd->mtd_device.block_start = 0; - switch(id & 0xFFFF) - { - case MTC_W25Q80_BV: /* W25Q80BV */ - mtd->mtd_device.block_end = 256; - break; - case MTC_W25Q16_BV_CL_CV: /* W25Q16BV W25Q16CL W25Q16CV */ - case MTC_W25Q16_DW: /* W25Q16DW */ - mtd->mtd_device.block_end = 512; - break; - case MTC_W25Q32_BV: /* W25Q32BV */ - case MTC_W25Q32_DW: /* W25Q32DW */ - mtd->mtd_device.block_end = 1024; - break; - case MTC_W25Q64_BV_CV: /* W25Q64BV W25Q64CV */ - mtd->mtd_device.block_end = 2048; - break; - case MTC_W25Q128_BV: /* W25Q128BV */ - mtd->mtd_device.block_end = 4086; - break; - } - mtd->mtd_device.ops = &w25qxx_mtd_ops; - rt_mtd_nor_register_device(mtd_name,&mtd->mtd_device); - - return RT_EOK; - -_error_exit: - if(mtd != RT_NULL) - rt_free(mtd); - return result; -} diff --git a/components/drivers/spi/spi_flash_w25qxx_mtd.h b/components/drivers/spi/spi_flash_w25qxx_mtd.h deleted file mode 100644 index 28f6828ffb..0000000000 --- a/components/drivers/spi/spi_flash_w25qxx_mtd.h +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2006-2018, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2011-12-16 aozima the first version - * 2012-08-23 aozima add flash lock. - * 2017-02-11 urey add mtd fucntion - */ - -#ifndef SPI_FLASH_W25QXX_H_INCLUDED -#define SPI_FLASH_W25QXX_H_INCLUDED - -#include - -extern rt_err_t w25qxx_mtd_init(const char *mtd_name,const char * spi_device_name); - -#endif // SPI_FLASH_W25QXX_H_INCLUDED From 4c780b89504c425165f3df0b80e52e9ee86e1f41 Mon Sep 17 00:00:00 2001 From: armink Date: Wed, 29 May 2019 14:13:26 +0800 Subject: [PATCH 15/30] [bsp/nuvoton_m487] Remove the w25qxx driver code. --- bsp/nuvoton_m487/.config | 58 +++++++++++++++++--------- bsp/nuvoton_m487/driver/drv_spiflash.c | 16 +++---- bsp/nuvoton_m487/rtconfig.h | 17 ++++++-- 3 files changed, 57 insertions(+), 34 deletions(-) diff --git a/bsp/nuvoton_m487/.config b/bsp/nuvoton_m487/.config index 85c0c1c114..2e97e2c885 100644 --- a/bsp/nuvoton_m487/.config +++ b/bsp/nuvoton_m487/.config @@ -64,7 +64,8 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" -CONFIG_RT_VER_NUM=0x40001 +CONFIG_RT_VER_NUM=0x40002 +# CONFIG_RT_USING_CPU_FFS is not set # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set # @@ -137,6 +138,7 @@ CONFIG_RT_USING_DFS_DEVFS=y # CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_PIPE_BUFSZ=64 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set CONFIG_RT_USING_SERIAL=y CONFIG_RT_SERIAL_USING_DMA=y CONFIG_RT_SERIAL_RB_BUFSZ=64 @@ -156,15 +158,22 @@ CONFIG_RT_SERIAL_RB_BUFSZ=64 CONFIG_RT_USING_SPI=y # CONFIG_RT_USING_QSPI is not set # CONFIG_RT_USING_SPI_MSD is not set -# CONFIG_RT_USING_SFUD is not set -CONFIG_RT_USING_W25QXX=y -# CONFIG_RT_USING_GD is not set +CONFIG_RT_USING_SFUD=y +CONFIG_RT_SFUD_USING_SFDP=y +CONFIG_RT_SFUD_USING_FLASH_INFO_TABLE=y +# CONFIG_RT_SFUD_USING_QSPI is not set +# CONFIG_RT_DEBUG_SFUD is not set # CONFIG_RT_USING_ENC28J60 is not set # CONFIG_RT_USING_SPI_WIFI is not set # CONFIG_RT_USING_WDT is not set # CONFIG_RT_USING_AUDIO is not set # CONFIG_RT_USING_SENSOR is not set +# +# Using Hardware Crypto drivers +# +# CONFIG_RT_USING_HWCRYPTO is not set + # # Using WiFi # @@ -196,6 +205,12 @@ CONFIG_RT_USING_POSIX=y # # CONFIG_RT_USING_SAL is not set +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV is not set +CONFIG_NETDEV_USING_PING=y + # # light weight TCP/IP stack # @@ -240,6 +255,7 @@ CONFIG_RT_LWIP_ETHTHREAD_STACKSIZE=768 CONFIG_RT_LWIP_ETHTHREAD_MBOX_SIZE=8 # CONFIG_RT_LWIP_REASSEMBLY_FRAG is not set CONFIG_LWIP_NETIF_STATUS_CALLBACK=1 +CONFIG_LWIP_NETIF_LINK_CALLBACK=1 CONFIG_SO_REUSE=1 CONFIG_LWIP_SO_RCVTIMEO=1 CONFIG_LWIP_SO_SNDTIMEO=1 @@ -248,6 +264,7 @@ CONFIG_LWIP_SO_RCVBUF=1 CONFIG_LWIP_NETIF_LOOPBACK=0 # CONFIG_RT_LWIP_STATS is not set # CONFIG_RT_LWIP_USING_HW_CHECKSUM is not set +CONFIG_RT_LWIP_USING_PING=y # CONFIG_RT_LWIP_DEBUG is not set # @@ -269,7 +286,6 @@ CONFIG_LWIP_NETIF_LOOPBACK=0 # # Utilities # -# CONFIG_RT_USING_LOGTRACE is not set # CONFIG_RT_USING_RYM is not set # CONFIG_RT_USING_ULOG is not set # CONFIG_RT_USING_UTEST is not set @@ -311,6 +327,7 @@ CONFIG_LWIP_NETIF_LOOPBACK=0 # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set # CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set # CONFIG_PKG_USING_WIZNET is not set # @@ -323,6 +340,9 @@ CONFIG_LWIP_NETIF_LOOPBACK=0 # CONFIG_PKG_USING_TENCENT_IOTKIT is not set # CONFIG_PKG_USING_NIMBLE is not set # CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set # # security packages @@ -343,6 +363,7 @@ CONFIG_LWIP_NETIF_LOOPBACK=0 # # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set # # tools packages @@ -371,35 +392,32 @@ CONFIG_LWIP_NETIF_LOOPBACK=0 # CONFIG_PKG_USING_CMSIS is not set # CONFIG_PKG_USING_DFS_YAFFS is not set # CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_THREAD_POOL is not set # # peripheral libraries and drivers # - -# -# sensors drivers -# -# CONFIG_PKG_USING_LSM6DSL is not set -# CONFIG_PKG_USING_LPS22HB is not set -# CONFIG_PKG_USING_HTS221 is not set -# CONFIG_PKG_USING_LSM303AGR is not set -# CONFIG_PKG_USING_BME280 is not set -# CONFIG_PKG_USING_BMA400 is not set -# CONFIG_PKG_USING_BMI160_BMX160 is not set -# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set # CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_SHT2X is not set -# CONFIG_PKG_USING_AHT10 is not set # CONFIG_PKG_USING_AP3216C is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_U8G2 is not set # CONFIG_PKG_USING_BUTTON is not set -# CONFIG_PKG_USING_MPU6XXX is not set # CONFIG_PKG_USING_PCF8574 is not set # CONFIG_PKG_USING_SX12XX is not set # CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set # # miscellaneous packages @@ -415,6 +433,7 @@ CONFIG_LWIP_NETIF_LOOPBACK=0 # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set # CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set # # samples: kernel and components samples @@ -425,3 +444,4 @@ CONFIG_LWIP_NETIF_LOOPBACK=0 # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set # CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_NNOM is not set diff --git a/bsp/nuvoton_m487/driver/drv_spiflash.c b/bsp/nuvoton_m487/driver/drv_spiflash.c index 59aa650a93..488df7ba42 100644 --- a/bsp/nuvoton_m487/driver/drv_spiflash.c +++ b/bsp/nuvoton_m487/driver/drv_spiflash.c @@ -11,11 +11,9 @@ #include #ifdef RT_USING_SPI -#if defined(RT_USING_W25QXX) || defined(RT_USING_SFUD) + +#if defined(RT_USING_SFUD) static struct rt_spi_device spi_device; -#ifdef RT_USING_W25QXX - #include "spi_flash_w25qxx.h" -#elif defined(RT_USING_SFUD) #include "spi_flash.h" #include "spi_flash_sfud.h" #endif @@ -25,11 +23,7 @@ static int rt_hw_spi_flash_init(void) { rt_spi_bus_attach_device(&spi_device, "qspi01", "qspi0", RT_NULL); -#ifdef RT_USING_W25QXX - - return w25qxx_init("flash0", "qspi01"); - -#elif defined(RT_USING_SFUD) +#if defined(RT_USING_SFUD) if (rt_sfud_flash_probe("flash0", "qspi01") == RT_NULL) { @@ -40,6 +34,6 @@ static int rt_hw_spi_flash_init(void) } INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init); -#endif -#endif + +#endif /* RT_USING_SPI */ diff --git a/bsp/nuvoton_m487/rtconfig.h b/bsp/nuvoton_m487/rtconfig.h index e0b098900d..379bc4f303 100644 --- a/bsp/nuvoton_m487/rtconfig.h +++ b/bsp/nuvoton_m487/rtconfig.h @@ -37,7 +37,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart0" -#define RT_VER_NUM 0x40001 +#define RT_VER_NUM 0x40002 /* RT-Thread Components */ @@ -93,7 +93,12 @@ #define RT_SERIAL_USING_DMA #define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_SPI -#define RT_USING_W25QXX +#define RT_USING_SFUD +#define RT_SFUD_USING_SFDP +#define RT_SFUD_USING_FLASH_INFO_TABLE + +/* Using Hardware Crypto drivers */ + /* Using WiFi */ @@ -111,6 +116,10 @@ /* Socket abstraction layer */ +/* Network interface device */ + +#define NETDEV_USING_PING + /* light weight TCP/IP stack */ #define RT_USING_LWIP @@ -145,11 +154,13 @@ #define RT_LWIP_ETHTHREAD_STACKSIZE 768 #define RT_LWIP_ETHTHREAD_MBOX_SIZE 8 #define LWIP_NETIF_STATUS_CALLBACK 1 +#define LWIP_NETIF_LINK_CALLBACK 1 #define SO_REUSE 1 #define LWIP_SO_RCVTIMEO 1 #define LWIP_SO_SNDTIMEO 1 #define LWIP_SO_RCVBUF 1 #define LWIP_NETIF_LOOPBACK 0 +#define RT_LWIP_USING_PING /* Modbus master and slave stack */ @@ -196,8 +207,6 @@ /* peripheral libraries and drivers */ -/* sensors drivers */ - /* miscellaneous packages */ From c10f087d9e477b18025889b07a40199b9dee011c Mon Sep 17 00:00:00 2001 From: nicedayzhu Date: Wed, 29 May 2019 14:15:10 +0800 Subject: [PATCH 16/30] [Bugfix]Update netdev info after registered MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复ifconfig命令无法正确显示IP,网关,掩码的问题 --- .../net/lwip-1.4.1/src/netif/ethernetif.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/components/net/lwip-1.4.1/src/netif/ethernetif.c b/components/net/lwip-1.4.1/src/netif/ethernetif.c index 10bcaa0c95..df960fcde0 100644 --- a/components/net/lwip-1.4.1/src/netif/ethernetif.c +++ b/components/net/lwip-1.4.1/src/netif/ethernetif.c @@ -295,12 +295,6 @@ static int netdev_add(struct netif *lwip_netif) return -ERR_IF; } - netdev->flags = lwip_netif->flags; - netdev->mtu = lwip_netif->mtu; - netdev->ops = &lwip_netdev_ops; - netdev->hwaddr_len = lwip_netif->hwaddr_len; - rt_memcpy(netdev->hwaddr, lwip_netif->hwaddr, lwip_netif->hwaddr_len); - #ifdef SAL_USING_LWIP extern int sal_lwip_netdev_set_pf_info(struct netdev *netdev); /* set the lwIP network interface device protocol family information */ @@ -309,7 +303,17 @@ static int netdev_add(struct netif *lwip_netif) rt_strncpy(name, lwip_netif->name, LWIP_NETIF_NAME_LEN); result = netdev_register(netdev, name, (void *)lwip_netif); - + + /* Update netdev info after registered */ + netdev->flags = lwip_netif->flags; + netdev->mtu = lwip_netif->mtu; + netdev->ops = &lwip_netdev_ops; + netdev->hwaddr_len = lwip_netif->hwaddr_len; + rt_memcpy(netdev->hwaddr, lwip_netif->hwaddr, lwip_netif->hwaddr_len); + netdev->ip_addr = lwip_netif->ip_addr; + netdev->gw = lwip_netif->gw; + netdev->netmask = lwip_netif->netmask; + #ifdef RT_LWIP_DHCP netdev_low_level_set_dhcp_status(netdev, RT_TRUE); #endif From 615c5733f0a09fd9ea95eab0c26b367aad9c8576 Mon Sep 17 00:00:00 2001 From: armink Date: Wed, 29 May 2019 14:15:56 +0800 Subject: [PATCH 17/30] [bsp/allwinner_tina] Remove the w25qxx driver code. --- bsp/allwinner_tina/drivers/spi/drv_spi_flash.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/bsp/allwinner_tina/drivers/spi/drv_spi_flash.c b/bsp/allwinner_tina/drivers/spi/drv_spi_flash.c index e507859928..7aecc5411d 100644 --- a/bsp/allwinner_tina/drivers/spi/drv_spi_flash.c +++ b/bsp/allwinner_tina/drivers/spi/drv_spi_flash.c @@ -63,16 +63,6 @@ int rt_hw_spi_flash_with_sfud_init(void) } INIT_PREV_EXPORT(rt_hw_spi_flash_with_sfud_init); -#elif defined(RT_USING_W25QXX) -#include "spi_flash_w25qxx.h" - -int rt_hw_spi_flash_init(void) -{ - DEBUG_PRINTF("%s -> %d\n", __FUNCTION__, __LINE__); - return w25qxx_init(SPI_FLASH_CHIP, SPI_FLASH_DEVICE_NAME); -} -INIT_DEVICE_EXPORT(rt_hw_spi_flash_init); - #endif #endif \ No newline at end of file From 74874fea42830da9517d355169cd6aac731c5f15 Mon Sep 17 00:00:00 2001 From: armink Date: Wed, 29 May 2019 14:18:29 +0800 Subject: [PATCH 18/30] [bsp/gd32450z-eval] Remove the w25qxx driver code. --- bsp/gd32450z-eval/drivers/drv_spi_flash.c | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/bsp/gd32450z-eval/drivers/drv_spi_flash.c b/bsp/gd32450z-eval/drivers/drv_spi_flash.c index b55bb9d8ce..9b60753472 100644 --- a/bsp/gd32450z-eval/drivers/drv_spi_flash.c +++ b/bsp/gd32450z-eval/drivers/drv_spi_flash.c @@ -20,17 +20,9 @@ #include "spi_flash_sfud.h" #endif -#ifdef RT_USING_W25QXX -#include "spi_flash_w25qxx.h" -#endif - #include #include -#if defined(RT_USING_SFUD) && defined(RT_USING_W25QXX) -#error "RT_USING_SFUD and RT_USING_W25QXX only need one" -#endif - #define SPI_PERIPH SPI5 #define SPI_BUS_NAME "spi5" #define SPI_FLASH_DEVICE_NAME "spi50" @@ -95,11 +87,3 @@ static int rt_hw_spi_flash_with_sfud_init(void) } INIT_COMPONENT_EXPORT(rt_hw_spi_flash_with_sfud_init) #endif - -#ifdef RT_USING_W25QXX -static int rt_hw_spi_flash_init(void) -{ - return w25qxx_init(SPI_FLASH_CHIP, SPI_FLASH_DEVICE_NAME); -} -INIT_COMPONENT_EXPORT(rt_hw_spi_flash_init) -#endif From c8e1fbf673c9872645511d4bf4e738cadc7f0599 Mon Sep 17 00:00:00 2001 From: nicedayzhu Date: Wed, 29 May 2019 15:22:11 +0800 Subject: [PATCH 19/30] [Bugfix]Update netdev info after registered MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复ifconfig命令无法正确显示IP,网关,掩码的问题 --- components/net/lwip-2.1.0/src/netif/ethernetif.c | 1 - 1 file changed, 1 deletion(-) diff --git a/components/net/lwip-2.1.0/src/netif/ethernetif.c b/components/net/lwip-2.1.0/src/netif/ethernetif.c index 5ea03a9ae8..af9426ecdd 100755 --- a/components/net/lwip-2.1.0/src/netif/ethernetif.c +++ b/components/net/lwip-2.1.0/src/netif/ethernetif.c @@ -315,7 +315,6 @@ static int netdev_add(struct netif *lwip_netif) /* Update netdev info after registered */ netdev->flags = lwip_netif->flags; - netdev->mtu = lwip_netif->mtu; netdev->ops = &lwip_netdev_ops; netdev->hwaddr_len = lwip_netif->hwaddr_len; rt_memcpy(netdev->hwaddr, lwip_netif->hwaddr, lwip_netif->hwaddr_len); From fe3ab4605dfdbc5b514b52397c7d7e3f9b89f6d9 Mon Sep 17 00:00:00 2001 From: nicedayzhu Date: Wed, 29 May 2019 15:34:02 +0800 Subject: [PATCH 20/30] [Bugfix]Update netdev info after registered MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.修复ifconfig命令无法正确显示IP,网关,掩码的问题 2.lwip_2.1.0,增加netdev->mtu = lwip_netif->mtu; --- components/net/lwip-2.1.0/src/netif/ethernetif.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/net/lwip-2.1.0/src/netif/ethernetif.c b/components/net/lwip-2.1.0/src/netif/ethernetif.c index af9426ecdd..5ea03a9ae8 100755 --- a/components/net/lwip-2.1.0/src/netif/ethernetif.c +++ b/components/net/lwip-2.1.0/src/netif/ethernetif.c @@ -315,6 +315,7 @@ static int netdev_add(struct netif *lwip_netif) /* Update netdev info after registered */ netdev->flags = lwip_netif->flags; + netdev->mtu = lwip_netif->mtu; netdev->ops = &lwip_netdev_ops; netdev->hwaddr_len = lwip_netif->hwaddr_len; rt_memcpy(netdev->hwaddr, lwip_netif->hwaddr, lwip_netif->hwaddr_len); From b29154673e3bf5f0997e98ac20518ef9f874216e Mon Sep 17 00:00:00 2001 From: loogg <2544047213@qq.com> Date: Wed, 29 May 2019 20:14:53 +0800 Subject: [PATCH 21/30] Update shell.c --- components/finsh/shell.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/finsh/shell.c b/components/finsh/shell.c index 53dcd11c66..98a63bdbbf 100644 --- a/components/finsh/shell.c +++ b/components/finsh/shell.c @@ -309,8 +309,8 @@ static void finsh_wait_auth(void) else if (ch == '\b' && cur_pos > 0) { /* backspace */ + cur_pos--; password[cur_pos] = '\0'; - cur_pos--; rt_kprintf("\b \b"); } else if (ch == '\r' || ch == '\n') From 52d1e51e3e4e25fcf8460af0bc65532ed647321c Mon Sep 17 00:00:00 2001 From: loogg <2544047213@qq.com> Date: Wed, 29 May 2019 20:34:03 +0800 Subject: [PATCH 22/30] Update shell.c --- components/finsh/shell.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/finsh/shell.c b/components/finsh/shell.c index 98a63bdbbf..3a02e24c2e 100644 --- a/components/finsh/shell.c +++ b/components/finsh/shell.c @@ -309,7 +309,7 @@ static void finsh_wait_auth(void) else if (ch == '\b' && cur_pos > 0) { /* backspace */ - cur_pos--; + cur_pos--; password[cur_pos] = '\0'; rt_kprintf("\b \b"); } From 34e5383f9a967985bcb9512db844b5a508d0f552 Mon Sep 17 00:00:00 2001 From: guozhanxin Date: Thu, 30 May 2019 00:03:55 +0800 Subject: [PATCH 23/30] [sensor] fixed step name display abnormal. --- components/drivers/sensors/sensor.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100755 => 100644 components/drivers/sensors/sensor.c diff --git a/components/drivers/sensors/sensor.c b/components/drivers/sensors/sensor.c old mode 100755 new mode 100644 index e76ac51f12..620d3b1d0a --- a/components/drivers/sensors/sensor.c +++ b/components/drivers/sensors/sensor.c @@ -30,7 +30,7 @@ static char *const sensor_name_str[] = "hr_", /* Heart Rate */ "tvoc_", /* TVOC Level */ "noi_", /* Noise Loudness */ - "step_" /* Step sensor */ + "step_", /* Step sensor */ "forc_" /* Force sensor */ }; From 4bf3a83f4757839d38af57c855268d02cd4e7b8f Mon Sep 17 00:00:00 2001 From: lhxzui Date: Thu, 30 May 2019 18:00:03 +0800 Subject: [PATCH 24/30] 1. Add bsp stm32f072-st-nucleo --- bsp/stm32/stm32f072-st-nucleo/.config | 375 +++ bsp/stm32/stm32f072-st-nucleo/.gitignore | 42 + bsp/stm32/stm32f072-st-nucleo/Kconfig | 22 + bsp/stm32/stm32f072-st-nucleo/README.md | 103 + bsp/stm32/stm32f072-st-nucleo/SConscript | 15 + bsp/stm32/stm32f072-st-nucleo/SConstruct | 59 + .../applications/SConscript | 11 + .../stm32f072-st-nucleo/applications/main.c | 33 + .../board/CubeMX_Config/.mxproject | 17 + .../board/CubeMX_Config/CubeMX_Config.ioc | 148 + .../board/CubeMX_Config/Inc/main.h | 103 + .../CubeMX_Config/Inc/stm32f0xx_hal_conf.h | 323 ++ .../board/CubeMX_Config/Inc/stm32f0xx_it.h | 80 + .../board/CubeMX_Config/Src/main.c | 272 ++ .../CubeMX_Config/Src/stm32f0xx_hal_msp.c | 169 + .../board/CubeMX_Config/Src/stm32f0xx_it.c | 160 + .../CubeMX_Config/Src/system_stm32f0xx.c | 333 ++ bsp/stm32/stm32f072-st-nucleo/board/Kconfig | 87 + .../stm32f072-st-nucleo/board/SConscript | 35 + bsp/stm32/stm32f072-st-nucleo/board/board.c | 46 + bsp/stm32/stm32f072-st-nucleo/board/board.h | 50 + .../board/linker_scripts/link.icf | 28 + .../board/linker_scripts/link.lds | 157 + .../board/linker_scripts/link.sct | 15 + .../stm32f072-st-nucleo/figures/board.jpg | Bin 0 -> 265311 bytes bsp/stm32/stm32f072-st-nucleo/project.ewd | 2966 +++++++++++++++++ bsp/stm32/stm32f072-st-nucleo/project.ewp | 2342 +++++++++++++ bsp/stm32/stm32f072-st-nucleo/project.eww | 10 + bsp/stm32/stm32f072-st-nucleo/project.uvoptx | 1109 ++++++ bsp/stm32/stm32f072-st-nucleo/project.uvproj | 804 +++++ bsp/stm32/stm32f072-st-nucleo/project.uvprojx | 787 +++++ bsp/stm32/stm32f072-st-nucleo/rtconfig.h | 172 + bsp/stm32/stm32f072-st-nucleo/rtconfig.py | 143 + bsp/stm32/stm32f072-st-nucleo/template.ewd | 2966 +++++++++++++++++ bsp/stm32/stm32f072-st-nucleo/template.ewp | 2074 ++++++++++++ bsp/stm32/stm32f072-st-nucleo/template.eww | 10 + bsp/stm32/stm32f072-st-nucleo/template.uvoptx | 197 ++ bsp/stm32/stm32f072-st-nucleo/template.uvproj | 412 +++ .../stm32f072-st-nucleo/template.uvprojx | 395 +++ 39 files changed, 17070 insertions(+) create mode 100644 bsp/stm32/stm32f072-st-nucleo/.config create mode 100644 bsp/stm32/stm32f072-st-nucleo/.gitignore create mode 100644 bsp/stm32/stm32f072-st-nucleo/Kconfig create mode 100644 bsp/stm32/stm32f072-st-nucleo/README.md create mode 100644 bsp/stm32/stm32f072-st-nucleo/SConscript create mode 100644 bsp/stm32/stm32f072-st-nucleo/SConstruct create mode 100644 bsp/stm32/stm32f072-st-nucleo/applications/SConscript create mode 100644 bsp/stm32/stm32f072-st-nucleo/applications/main.c create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Inc/stm32f0xx_hal_conf.h create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Inc/stm32f0xx_it.h create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/stm32f0xx_hal_msp.c create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/stm32f0xx_it.c create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/system_stm32f0xx.c create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/Kconfig create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/SConscript create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/board.c create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/board.h create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32f072-st-nucleo/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32f072-st-nucleo/figures/board.jpg create mode 100644 bsp/stm32/stm32f072-st-nucleo/project.ewd create mode 100644 bsp/stm32/stm32f072-st-nucleo/project.ewp create mode 100644 bsp/stm32/stm32f072-st-nucleo/project.eww create mode 100644 bsp/stm32/stm32f072-st-nucleo/project.uvoptx create mode 100644 bsp/stm32/stm32f072-st-nucleo/project.uvproj create mode 100644 bsp/stm32/stm32f072-st-nucleo/project.uvprojx create mode 100644 bsp/stm32/stm32f072-st-nucleo/rtconfig.h create mode 100644 bsp/stm32/stm32f072-st-nucleo/rtconfig.py create mode 100644 bsp/stm32/stm32f072-st-nucleo/template.ewd create mode 100644 bsp/stm32/stm32f072-st-nucleo/template.ewp create mode 100644 bsp/stm32/stm32f072-st-nucleo/template.eww create mode 100644 bsp/stm32/stm32f072-st-nucleo/template.uvoptx create mode 100644 bsp/stm32/stm32f072-st-nucleo/template.uvproj create mode 100644 bsp/stm32/stm32f072-st-nucleo/template.uvprojx diff --git a/bsp/stm32/stm32f072-st-nucleo/.config b/bsp/stm32/stm32f072-st-nucleo/.config new file mode 100644 index 0000000000..487ada1e71 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/.config @@ -0,0 +1,375 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDEL_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set +CONFIG_RT_DEBUG=y +CONFIG_RT_DEBUG_COLOR=y +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +# CONFIG_RT_USING_MEMHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMTRACE is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart2" +CONFIG_RT_VER_NUM=0x40002 +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M0=y +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 + +# +# C++ features +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Command shell +# +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_CMD_SIZE=80 +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_USING_MSH_DEFAULT=y +# CONFIG_FINSH_USING_MSH_ONLY is not set +CONFIG_FINSH_ARG_MAX=10 + +# +# Device virtual file system +# +# CONFIG_RT_USING_DFS is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_PIPE_BUFSZ=512 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +# CONFIG_RT_SERIAL_USING_DMA is not set +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_MTD is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set + +# +# Using WiFi +# +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +# CONFIG_RT_USING_LIBC is not set +# CONFIG_RT_USING_PTHREADS is not set + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# Modbus master and slave stack +# +# CONFIG_RT_USING_MODBUS is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LIBMODBUS is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOTKIT is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_libsodium is not set +# CONFIG_PKG_USING_TINYCRYPT is not set + +# +# language packages +# +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set + +# +# multimedia packages +# +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ADBD is not set + +# +# system packages +# +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_CMSIS is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_THREAD_POOL is not set + +# +# peripheral libraries and drivers +# +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set + +# +# miscellaneous packages +# +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_NNOM is not set +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32F0=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32F072RB=y + +# +# Onboard Peripheral Drivers +# + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +# CONFIG_BSP_USING_UART1 is not set +CONFIG_BSP_USING_UART2=y +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_I2C1 is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32f072-st-nucleo/.gitignore b/bsp/stm32/stm32f072-st-nucleo/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/.gitignore @@ -0,0 +1,42 @@ +*.pyc +*.map +*.dblite +*.elf +*.bin +*.hex +*.axf +*.exe +*.pdb +*.idb +*.ilk +*.old +build +Debug +documentation/html +packages/ +*~ +*.o +*.obj +*.out +*.bak +*.dep +*.lib +*.i +*.d +.DS_Stor* +.config 3 +.config 4 +.config 5 +Midea-X1 +*.uimg +GPATH +GRTAGS +GTAGS +.vscode +JLinkLog.txt +JLinkSettings.ini +DebugConfig/ +RTE/ +settings/ +*.uvguix* +cconfig.h diff --git a/bsp/stm32/stm32f072-st-nucleo/Kconfig b/bsp/stm32/stm32f072-st-nucleo/Kconfig new file mode 100644 index 0000000000..7a400db91f --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/Kconfig @@ -0,0 +1,22 @@ +mainmenu "RT-Thread Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "../libraries/Kconfig" +source "board/Kconfig" + diff --git a/bsp/stm32/stm32f072-st-nucleo/README.md b/bsp/stm32/stm32f072-st-nucleo/README.md new file mode 100644 index 0000000000..562856b71c --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/README.md @@ -0,0 +1,103 @@ +# NUCLEO-F072RB 开发板 BSP 说明 + +## 简介 + +本文档为刘恒为 NUCLEO-F072RB 开发板的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +NUCLEO-F072RB 是 ST 官方推出的开发板,搭载 STM32F072RBT6 芯片,基于 ARM Cortex-M0 内核,最高主频 48 MHz,具有丰富的板载资源,可以充分发挥 STM32F072RBT6 的芯片性能。 + +开发板外观如下图所示: + +![board](figures/board.jpg) + +NUCLEO-F072RB 开发板常用 **板载资源** 如下: + +- MCU:STM32F072RBT6,主频 48MHz,128KB FLASH ,16KB RAM +- 常用外设 + - LED:3 个,USB communication (LD1), user LED (LD2), power LED (LD3) 。 + - 按键:2 个,USER and RESET 。 +- 常用接口:USB 转串口、Arduino Uno 和 ST morpho 两类扩展接口 +- 调试接口:板载 ST-LINK/V2-1 调试器。 + +更多相关信息资料见 ST 官网详情页:[NUCLEO_F072RB_STM32Nucleo-64开发板]https://www.stmcu.com.cn/Designresource/design_resource_detail?file_name=NUCLEO_F072RB_STM32Nucleo-64%E5%BC%80%E5%8F%91%E6%9D%BF&lang=EN&ver= + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **片上外设** | **支持情况** | **备注** | +| :------------ | :----------: | :-----------------------------------: | +| GPIO | 支持 | PA0, PA1... PH1 ---> PIN: 0, 1...63 | +| UART | 支持 | UART2 | +| LED | 支持 | LED2 | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK4、MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用 Type-A to Mini-B 线连接开发板和 PC 供电,红色 LED LD3 (PWR) 和 LD1 (COM) 会点亮。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 ST-LINK 下载程序,点击下载按钮即可下载程序到开发板。 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,红色 LD3 和 LD1 常亮、绿色 LD2 会周期性闪烁。 + +USB 虚拟 COM 端口默认连接串口 2,在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + + \ | / +- RT - Thread Operating System + / | \ 4.0.2 build May 30 2019 + 2006 - 2019 Copyright by rt-thread team +msh > + +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 串口 2 的功能,更多高级功能需要利用 env 工具对 BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk4/mdk5/iar` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32系列BSP外设驱动使用教程.md)。 + +## 注意事项 + +## 联系人信息 + +维护人: + +- [刘恒](https://github.com/lhxzui), 邮箱: \ No newline at end of file diff --git a/bsp/stm32/stm32f072-st-nucleo/SConscript b/bsp/stm32/stm32f072-st-nucleo/SConscript new file mode 100644 index 0000000000..20f7689c53 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/stm32/stm32f072-st-nucleo/SConstruct b/bsp/stm32/stm32f072-st-nucleo/SConstruct new file mode 100644 index 0000000000..7979e3a23e --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/SConstruct @@ -0,0 +1,59 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +TARGET = 'rt-thread.' + rtconfig.TARGET_EXT + +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.map') + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +stm32_library = 'STM32F0xx_HAL' +rtconfig.BSP_LIBRARY_TYPE = stm32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/stm32/stm32f072-st-nucleo/applications/SConscript b/bsp/stm32/stm32f072-st-nucleo/applications/SConscript new file mode 100644 index 0000000000..04f04dd543 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/applications/SConscript @@ -0,0 +1,11 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd, str(Dir('#'))] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/stm32/stm32f072-st-nucleo/applications/main.c b/bsp/stm32/stm32f072-st-nucleo/applications/main.c new file mode 100644 index 0000000000..81b03091e1 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/applications/main.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 zylx first version + */ + +#include +#include +#include + +/* defined the LED2 pin: PA5 */ +#define LED2_PIN GET_PIN(A, 5) + +int main(void) +{ + int count = 1; + /* set LED0 pin mode to output */ + rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT); + + while (count++) + { + rt_pin_write(LED2_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED2_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + + return RT_EOK; +} diff --git a/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..881c550bee --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/.mxproject @@ -0,0 +1,17 @@ +[PreviousGenFiles] +HeaderPath=F:/program/rt-thread/rt-thread/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Inc +HeaderFiles=stm32f1xx_it.h;stm32f1xx_hal_conf.h;main.h;stm32f0xx_it.h;stm32f0xx_hal_conf.h; +SourcePath=F:/program/rt-thread/rt-thread/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src +SourceFiles=stm32f1xx_it.c;stm32f1xx_hal_msp.c;main.c;stm32f0xx_it.c;stm32f0xx_hal_msp.c; + +[PreviousLibFiles] +LibFiles=Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tim.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tim_ex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_uart.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_uart_ex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_rcc.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_rcc_ex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_def.h;Drivers/STM32F0xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_i2c.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_i2c_ex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_gpio.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_gpio_ex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dma_ex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dma.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_cortex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_pwr.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_pwr_ex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_flash.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_flash_ex.h;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tim.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tim_ex.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_uart.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_uart_ex.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rcc.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rcc_ex.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_i2c.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_i2c_ex.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_gpio.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_dma.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_cortex.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_pwr.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_pwr_ex.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_flash.c;Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_flash_ex.c;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tim.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_tim_ex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_uart.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_uart_ex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_rcc.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_rcc_ex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_def.h;Drivers/STM32F0xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_i2c.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_i2c_ex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_gpio.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_gpio_ex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dma_ex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_dma.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_cortex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_pwr.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_pwr_ex.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_flash.h;Drivers/STM32F0xx_HAL_Driver/Inc/stm32f0xx_hal_flash_ex.h;Drivers/CMSIS/Device/ST/STM32F0xx/Include/stm32f072xb.h;Drivers/CMSIS/Device/ST/STM32F0xx/Include/stm32f0xx.h;Drivers/CMSIS/Device/ST/STM32F0xx/Include/system_stm32f0xx.h;Drivers/CMSIS/Device/ST/STM32F0xx/Source/Templates/system_stm32f0xx.c;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; + +[PreviousUsedKeilFiles] +SourceFiles=..\Src\main.c;..\Src\stm32f0xx_it.c;..\Src\stm32f0xx_hal_msp.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tim.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tim_ex.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_uart.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_uart_ex.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rcc.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rcc_ex.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_i2c.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_i2c_ex.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_gpio.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_dma.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_cortex.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_pwr.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_pwr_ex.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_flash.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_flash_ex.c;../\Src/system_stm32f0xx.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tim.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_tim_ex.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_uart.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_uart_ex.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rcc.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_rcc_ex.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_i2c.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_i2c_ex.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_gpio.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_dma.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_cortex.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_pwr.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_pwr_ex.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_flash.c;../Drivers/STM32F0xx_HAL_Driver/Src/stm32f0xx_hal_flash_ex.c;../\Src/system_stm32f0xx.c;../Drivers/CMSIS/Device/ST/STM32F0xx/Source/Templates/system_stm32f0xx.c;null; +HeaderPath=..\Drivers\STM32F0xx_HAL_Driver\Inc;..\Drivers\STM32F0xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F0xx\Include;..\Drivers\CMSIS\Include;..\Inc; +CDefines=USE_HAL_DRIVER;STM32F072xB; + +[] +SourceFiles=;; + diff --git a/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 0000000000..e62fa13da5 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,148 @@ +#MicroXplorer Configuration settings - do not modify +File.Version=6 +KeepUserPlacement=true +Mcu.Family=STM32F0 +Mcu.IP0=NVIC +Mcu.IP1=RCC +Mcu.IP2=SYS +Mcu.IP3=USART2 +Mcu.IPNb=4 +Mcu.Name=STM32F072R(8-B)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PC13 +Mcu.Pin1=PC14-OSC32_IN +Mcu.Pin10=VP_SYS_VS_Systick +Mcu.Pin2=PC15-OSC32_OUT +Mcu.Pin3=PF0-OSC_IN +Mcu.Pin4=PF1-OSC_OUT +Mcu.Pin5=PA2 +Mcu.Pin6=PA3 +Mcu.Pin7=PA5 +Mcu.Pin8=PA13 +Mcu.Pin9=PA14 +Mcu.PinsNb=11 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32F072RBTx +MxCube.Version=5.2.0 +MxDb.Version=DB.5.0.20 +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.SVC_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.SysTick_IRQn=true\:0\:0\:true\:false\:true\:true\:true +PA13.GPIOParameters=GPIO_Label +PA13.GPIO_Label=TMS +PA13.Locked=true +PA13.Mode=Serial_Wire +PA13.Signal=SYS_SWDIO +PA14.GPIOParameters=GPIO_Label +PA14.GPIO_Label=TCK +PA14.Locked=true +PA14.Mode=Serial_Wire +PA14.Signal=SYS_SWCLK +PA2.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode +PA2.GPIO_Label=USART_TX +PA2.GPIO_Mode=GPIO_MODE_AF_PP +PA2.GPIO_PuPd=GPIO_NOPULL +PA2.GPIO_Speed=GPIO_SPEED_FREQ_LOW +PA2.Locked=true +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PA3.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode +PA3.GPIO_Label=USART_RX +PA3.GPIO_Mode=GPIO_MODE_AF_PP +PA3.GPIO_PuPd=GPIO_NOPULL +PA3.GPIO_Speed=GPIO_SPEED_FREQ_LOW +PA3.Locked=true +PA3.Mode=Asynchronous +PA3.Signal=USART2_RX +PA5.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode +PA5.GPIO_Label=LD2 [Green Led] +PA5.GPIO_Mode=GPIO_MODE_OUTPUT_PP +PA5.GPIO_PuPd=GPIO_NOPULL +PA5.GPIO_Speed=GPIO_SPEED_FREQ_LOW +PA5.Locked=true +PA5.Signal=GPIO_Output +PC13.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI +PC13.GPIO_Label=B1 [Blue PushButton] +PC13.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING +PC13.Locked=true +PC13.Signal=GPXTI13 +PC14-OSC32_IN.Locked=true +PC14-OSC32_IN.Mode=LSE-External-Oscillator +PC14-OSC32_IN.Signal=RCC_OSC32_IN +PC15-OSC32_OUT.Locked=true +PC15-OSC32_OUT.Mode=LSE-External-Oscillator +PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PCC.Checker=false +PCC.Line=STM32F0x2 +PCC.MCU=STM32F072R(8-B)Tx +PCC.PartNumber=STM32F072RBTx +PCC.Seq0=0 +PCC.Series=STM32F0 +PCC.Temperature=25 +PCC.Vdd=3.6 +PF0-OSC_IN.Locked=true +PF0-OSC_IN.Signal=RCC_OSC_IN +PF1-OSC_OUT.Locked=true +PF1-OSC_OUT.Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32F072RBTx +ProjectManager.FirmwarePackage=STM32Cube FW_F0 V1.10.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=0 +ProjectManager.MainLocation=Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=CubeMX_Config.ioc +ProjectManager.ProjectName=CubeMX_Config +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=MDK-ARM V5 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART2_UART_Init-USART2-false-HAL-true +RCC.AHBFreq_Value=48000000 +RCC.APB1Freq_Value=48000000 +RCC.APB1TimFreq_Value=48000000 +RCC.CECFreq_Value=32786.88524590164 +RCC.FCLKCortexFreq_Value=48000000 +RCC.FLatency-AdvancedSettings=FLASH_LATENCY_1 +RCC.FamilyName=M +RCC.HCLKFreq_Value=48000000 +RCC.HSICECFreq_Value=32786.88524590164 +RCC.I2SFreq_Value=48000000 +RCC.IPParameters=AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,CECFreq_Value,FCLKCortexFreq_Value,FLatency-AdvancedSettings,FamilyName,HCLKFreq_Value,HSICECFreq_Value,I2SFreq_Value,MCOFreq_Value,PLLCLKFreq_Value,PLLDivider,PLLMCOFreq_Value,PLLMUL,PREFETCH_ENABLE-AdvancedSettings,SYSCLKFreq_VALUE,SYSCLKSource,TimSysFreq_Value,USART1Freq_Value,USART2Freq_Value +RCC.MCOFreq_Value=48000000 +RCC.PLLCLKFreq_Value=48000000 +RCC.PLLDivider=RCC_PREDIV_DIV2 +RCC.PLLMCOFreq_Value=48000000 +RCC.PLLMUL=RCC_PLL_MUL12 +RCC.PREFETCH_ENABLE-AdvancedSettings=1 +RCC.SYSCLKFreq_VALUE=48000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_HSI48 +RCC.TimSysFreq_Value=48000000 +RCC.USART1Freq_Value=48000000 +RCC.USART2Freq_Value=48000000 +SH.GPXTI13.0=GPIO_EXTI13 +SH.GPXTI13.ConfNb=1 +USART2.IPParameters=VirtualMode,VirtualMode-Asynchronous +USART2.VirtualMode=VM_ASYNC +USART2.VirtualMode-Asynchronous=VM_ASYNC +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=NUCLEO-F072RB +boardIOC=true diff --git a/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..7f861cde0e --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,103 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f0xx_hal.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +#define B1_Pin GPIO_PIN_13 +#define B1_GPIO_Port GPIOC +#define USART_TX_Pin GPIO_PIN_2 +#define USART_TX_GPIO_Port GPIOA +#define USART_RX_Pin GPIO_PIN_3 +#define USART_RX_GPIO_Port GPIOA +#define LD2_Pin GPIO_PIN_5 +#define LD2_GPIO_Port GPIOA +#define TMS_Pin GPIO_PIN_13 +#define TMS_GPIO_Port GPIOA +#define TCK_Pin GPIO_PIN_14 +#define TCK_GPIO_Port GPIOA +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Inc/stm32f0xx_hal_conf.h b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Inc/stm32f0xx_hal_conf.h new file mode 100644 index 0000000000..b03369da38 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Inc/stm32f0xx_hal_conf.h @@ -0,0 +1,323 @@ +/** + ****************************************************************************** + * @file stm32f0xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2019 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F0xx_HAL_CONF_H +#define __STM32F0xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED +/*#define HAL_ADC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_CAN_MODULE_ENABLED */ +/*#define HAL_CEC_MODULE_ENABLED */ +/*#define HAL_COMP_MODULE_ENABLED */ +/*#define HAL_CRC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_TSC_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +/*#define HAL_LCD_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SPI_MODULE_ENABLED */ +/*#define HAL_TIM_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SMBUS_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +/*#define HAL_EXTI_MODULE_ENABLED */ +#define HAL_CORTEX_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +/** + * @brief In the following line adjust the External High Speed oscillator (HSE) Startup + * Timeout value + */ +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)8000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief In the following line adjust the Internal High Speed oscillator (HSI) Startup + * Timeout value + */ +#if !defined (HSI_STARTUP_TIMEOUT) + #define HSI_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for HSI start up */ +#endif /* HSI_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator for ADC (HSI14) value. + */ +#if !defined (HSI14_VALUE) +#define HSI14_VALUE ((uint32_t)14000000) /*!< Value of the Internal High Speed oscillator for ADC in Hz. + The real value may vary depending on the variations + in voltage and temperature. */ +#endif /* HSI14_VALUE */ + +/** + * @brief Internal High Speed oscillator for USB (HSI48) value. + */ +#if !defined (HSI48_VALUE) +#define HSI48_VALUE ((uint32_t)48000000) /*!< Value of the Internal High Speed oscillator for USB in Hz. + The real value may vary depending on the variations + in voltage and temperature. */ +#endif /* HSI48_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)40000) +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ +/** + * @brief External Low Speed oscillator (LSI) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0) /*!< tick interrupt priority (lowest by default) */ + /* Warning: Must be set to higher priority for HAL_Delay() */ + /* and HAL_GetTick() usage under interrupt context */ +#define USE_RTOS 0 +#define PREFETCH_ENABLE 1 +#define INSTRUCTION_CACHE_ENABLE 0 +#define DATA_CACHE_ENABLE 0 +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f0xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f0xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f0xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f0xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f0xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f0xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f0xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f0xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED + #include "stm32f0xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f0xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f0xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f0xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f0xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f0xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f0xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f0xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f0xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f0xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f0xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f0xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32f0xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f0xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f0xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_TSC_MODULE_ENABLED + #include "stm32f0xx_hal_tsc.h" +#endif /* HAL_TSC_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f0xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f0xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f0xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((char *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(char* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F0xx_HAL_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Inc/stm32f0xx_it.h b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Inc/stm32f0xx_it.h new file mode 100644 index 0000000000..0c8cb46a8b --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Inc/stm32f0xx_it.h @@ -0,0 +1,80 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f0xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F0xx_IT_H +#define __STM32F0xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void SVC_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F0xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..317997715b --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/main.c @@ -0,0 +1,272 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +UART_HandleTypeDef huart2; + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART2_UART_Init(void); +/* USER CODE BEGIN PFP */ +/* Private function prototypes -----------------------------------------------*/ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART2_UART_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48; + RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI48; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief USART2 Initialization Function + * @param None + * @retval None + */ +static void MX_USART2_UART_Init(void) +{ + + /* USER CODE BEGIN USART2_Init 0 */ + + /* USER CODE END USART2_Init 0 */ + + /* USER CODE BEGIN USART2_Init 1 */ + + /* USER CODE END USART2_Init 1 */ + huart2.Instance = USART2; + huart2.Init.BaudRate = 38400; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&huart2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART2_Init 2 */ + + /* USER CODE END USART2_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + while(1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(char *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/stm32f0xx_hal_msp.c b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/stm32f0xx_hal_msp.c new file mode 100644 index 0000000000..907465857b --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/stm32f0xx_hal_msp.c @@ -0,0 +1,169 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32f0xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF1_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART2_MspInit 1 */ + + /* USER CODE END USART2_MspInit 1 */ + } + +} + +/** +* @brief UART MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOA, USART_TX_Pin|USART_RX_Pin); + + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/stm32f0xx_it.c b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/stm32f0xx_it.c new file mode 100644 index 0000000000..9167d5e9be --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/stm32f0xx_it.c @@ -0,0 +1,160 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f0xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32f0xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M0 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVC_IRQn 0 */ + + /* USER CODE END SVC_IRQn 0 */ + /* USER CODE BEGIN SVC_IRQn 1 */ + + /* USER CODE END SVC_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32F0xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32f0xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/system_stm32f0xx.c b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/system_stm32f0xx.c new file mode 100644 index 0000000000..410809c2b8 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/CubeMX_Config/Src/system_stm32f0xx.c @@ -0,0 +1,333 @@ +/** + ****************************************************************************** + * @file system_stm32f0xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M0 Device Peripheral Access Layer System Source File. + * + * 1. This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f0xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * 2. After each device reset the HSI (8 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32f0xx.s" file, to + * configure the system clock before to branch to main program. + * + * 3. This file configures the system clock as follows: + *============================================================================= + * Supported STM32F0xx device + *----------------------------------------------------------------------------- + * System Clock source | HSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 8000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 8000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f0xx_system + * @{ + */ + +/** @addtogroup STM32F0xx_System_Private_Includes + * @{ + */ + +#include "stm32f0xx.h" + +/** + * @} + */ + +/** @addtogroup STM32F0xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F0xx_System_Private_Defines + * @{ + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000) /*!< Default value of the External oscillator in Hz. + This value can be provided and adapted by the user application. */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)8000000) /*!< Default value of the Internal oscillator in Hz. + This value can be provided and adapted by the user application. */ +#endif /* HSI_VALUE */ + +#if !defined (HSI48_VALUE) +#define HSI48_VALUE ((uint32_t)48000000) /*!< Default value of the HSI48 Internal oscillator in Hz. + This value can be provided and adapted by the user application. */ +#endif /* HSI48_VALUE */ +/** + * @} + */ + +/** @addtogroup STM32F0xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F0xx_System_Private_Variables + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock there is no need to + call the 2 first functions listed above, since SystemCoreClock variable is + updated automatically. + */ +uint32_t SystemCoreClock = 8000000; + +const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + +/** + * @} + */ + +/** @addtogroup STM32F0xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F0xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * Initialize the default HSI clock source, vector table location and the PLL configuration is reset. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001U; + +#if defined (STM32F051x8) || defined (STM32F058x8) + /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE and MCOSEL[2:0] bits */ + RCC->CFGR &= (uint32_t)0xF8FFB80CU; +#else + /* Reset SW[1:0], HPRE[3:0], PPRE[2:0], ADCPRE, MCOSEL[2:0], MCOPRE[2:0] and PLLNODIV bits */ + RCC->CFGR &= (uint32_t)0x08FFB80CU; +#endif /* STM32F051x8 or STM32F058x8 */ + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFFU; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFFU; + + /* Reset PLLSRC, PLLXTPRE and PLLMUL[3:0] bits */ + RCC->CFGR &= (uint32_t)0xFFC0FFFFU; + + /* Reset PREDIV[3:0] bits */ + RCC->CFGR2 &= (uint32_t)0xFFFFFFF0U; + +#if defined (STM32F072xB) || defined (STM32F078xx) + /* Reset USART2SW[1:0], USART1SW[1:0], I2C1SW, CECSW, USBSW and ADCSW bits */ + RCC->CFGR3 &= (uint32_t)0xFFFCFE2CU; +#elif defined (STM32F071xB) + /* Reset USART2SW[1:0], USART1SW[1:0], I2C1SW, CECSW and ADCSW bits */ + RCC->CFGR3 &= (uint32_t)0xFFFFCEACU; +#elif defined (STM32F091xC) || defined (STM32F098xx) + /* Reset USART3SW[1:0], USART2SW[1:0], USART1SW[1:0], I2C1SW, CECSW and ADCSW bits */ + RCC->CFGR3 &= (uint32_t)0xFFF0FEACU; +#elif defined (STM32F030x6) || defined (STM32F030x8) || defined (STM32F031x6) || defined (STM32F038xx) || defined (STM32F030xC) + /* Reset USART1SW[1:0], I2C1SW and ADCSW bits */ + RCC->CFGR3 &= (uint32_t)0xFFFFFEECU; +#elif defined (STM32F051x8) || defined (STM32F058xx) + /* Reset USART1SW[1:0], I2C1SW, CECSW and ADCSW bits */ + RCC->CFGR3 &= (uint32_t)0xFFFFFEACU; +#elif defined (STM32F042x6) || defined (STM32F048xx) + /* Reset USART1SW[1:0], I2C1SW, CECSW, USBSW and ADCSW bits */ + RCC->CFGR3 &= (uint32_t)0xFFFFFE2CU; +#elif defined (STM32F070x6) || defined (STM32F070xB) + /* Reset USART1SW[1:0], I2C1SW, USBSW and ADCSW bits */ + RCC->CFGR3 &= (uint32_t)0xFFFFFE6CU; + /* Set default USB clock to PLLCLK, since there is no HSI48 */ + RCC->CFGR3 |= (uint32_t)0x00000080U; +#else + #warning "No target selected" +#endif + + /* Reset HSI14 bit */ + RCC->CR2 &= (uint32_t)0xFFFFFFFEU; + + /* Disable all interrupts */ + RCC->CIR = 0x00000000U; + +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f0xx_hal.h file (default value + * 8 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f0xx_hal.h file (default value + * 8 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate (void) +{ + uint32_t tmp = 0, pllmull = 0, pllsource = 0, predivfactor = 0; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case RCC_CFGR_SWS_HSI: /* HSI used as system clock */ + SystemCoreClock = HSI_VALUE; + break; + case RCC_CFGR_SWS_HSE: /* HSE used as system clock */ + SystemCoreClock = HSE_VALUE; + break; + case RCC_CFGR_SWS_PLL: /* PLL used as system clock */ + /* Get PLL clock source and multiplication factor ----------------------*/ + pllmull = RCC->CFGR & RCC_CFGR_PLLMUL; + pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + pllmull = ( pllmull >> 18) + 2; + predivfactor = (RCC->CFGR2 & RCC_CFGR2_PREDIV) + 1; + + if (pllsource == RCC_CFGR_PLLSRC_HSE_PREDIV) + { + /* HSE used as PLL clock source : SystemCoreClock = HSE/PREDIV * PLLMUL */ + SystemCoreClock = (HSE_VALUE/predivfactor) * pllmull; + } +#if defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F091xC) || defined(STM32F098xx) + else if (pllsource == RCC_CFGR_PLLSRC_HSI48_PREDIV) + { + /* HSI48 used as PLL clock source : SystemCoreClock = HSI48/PREDIV * PLLMUL */ + SystemCoreClock = (HSI48_VALUE/predivfactor) * pllmull; + } +#endif /* STM32F042x6 || STM32F048xx || STM32F072xB || STM32F078xx || STM32F091xC || STM32F098xx */ + else + { +#if defined(STM32F042x6) || defined(STM32F048xx) || defined(STM32F070x6) \ + || defined(STM32F078xx) || defined(STM32F071xB) || defined(STM32F072xB) \ + || defined(STM32F070xB) || defined(STM32F091xC) || defined(STM32F098xx) || defined(STM32F030xC) + /* HSI used as PLL clock source : SystemCoreClock = HSI/PREDIV * PLLMUL */ + SystemCoreClock = (HSI_VALUE/predivfactor) * pllmull; +#else + /* HSI used as PLL clock source : SystemCoreClock = HSI/2 * PLLMUL */ + SystemCoreClock = (HSI_VALUE >> 1) * pllmull; +#endif /* STM32F042x6 || STM32F048xx || STM32F070x6 || + STM32F071xB || STM32F072xB || STM32F078xx || STM32F070xB || + STM32F091xC || STM32F098xx || STM32F030xC */ + } + break; + default: /* HSI used as system clock */ + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK clock frequency ----------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/bsp/stm32/stm32f072-st-nucleo/board/Kconfig b/bsp/stm32/stm32f072-st-nucleo/board/Kconfig new file mode 100644 index 0000000000..ce845a3606 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/Kconfig @@ -0,0 +1,87 @@ +menu "Hardware Drivers Config" + +config SOC_STM32F072RB + bool + select SOC_SERIES_STM32F0 + default y + +menu "Onboard Peripheral Drivers" + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default n + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART2 + bool "Enable UART2" + default y + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + endif + + menuconfig BSP_USING_I2C1 + bool "Enable I2C1 BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C1 + config BSP_I2C1_SCL_PIN + int "i2c1 scl pin number" + range 1 216 + default 15 + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 1 216 + default 16 + endif + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32f072-st-nucleo/board/SConscript b/bsp/stm32/stm32f072-st-nucleo/board/SConscript new file mode 100644 index 0000000000..b1b2fc16e6 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/SConscript @@ -0,0 +1,35 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Src/stm32f0xx_hal_msp.c +''') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32F0xx_HAL/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc/startup_stm32f072xb.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32F0xx_HAL/CMSIS/Device/ST/STM32F0xx/Source/Templates/arm/startup_stm32f072xb.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32F0xx_HAL/CMSIS/Device/ST/STM32F0xx/Source/Templates/iar/startup_stm32f072xb.s'] + +# STM32F030x6 || STM32F030x8 || STM32F031x6 +# STM32F038xx || STM32F042x6 || STM32F048xx +# STM32F070x6 || STM32F051x8 || STM32F058xx +# STM32F071xB || STM32F072xB || STM32F078xx +# STM32F070xB || STM32F091xC || STM32F098xx || STM32F030xC +# You can select chips from the list above +CPPDEFINES = ['STM32F072xB'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) +Return('group') diff --git a/bsp/stm32/stm32f072-st-nucleo/board/board.c b/bsp/stm32/stm32f072-st-nucleo/board/board.c new file mode 100644 index 0000000000..8adbcd7bdd --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/board.c @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-21 zylx first version + */ + +#include "board.h" + +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48; + RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI48; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } +} diff --git a/bsp/stm32/stm32f072-st-nucleo/board/board.h b/bsp/stm32/stm32f072-st-nucleo/board/board.h new file mode 100644 index 0000000000..bfd0371048 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/board.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-5 SummerGift first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +#include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (128 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +/* Internal SRAM memory size[Kbytes] <8-64>, Default: 64*/ +#define STM32_SRAM_SIZE 16 +#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) + +#if defined(__CC_ARM) || defined(__CLANG_ARM) +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN ((void *)&__bss_end) +#endif + +#define HEAP_END STM32_SRAM_END + +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __BOARD_H__ */ diff --git a/bsp/stm32/stm32f072-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32f072-st-nucleo/board/linker_scripts/link.icf new file mode 100644 index 0000000000..63ea0d85b4 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/linker_scripts/link.icf @@ -0,0 +1,28 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20003FFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0400; +define symbol __ICFEDIT_size_heap__ = 0x0000; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, last block CSTACK}; diff --git a/bsp/stm32/stm32f072-st-nucleo/board/linker_scripts/link.lds b/bsp/stm32/stm32f072-st-nucleo/board/linker_scripts/link.lds new file mode 100644 index 0000000000..0e6568d176 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/linker_scripts/link.lds @@ -0,0 +1,157 @@ +/* + * linker script for STM32F10x with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 128k /* 128KB flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 16k /* 16K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/stm32/stm32f072-st-nucleo/board/linker_scripts/link.sct b/bsp/stm32/stm32f072-st-nucleo/board/linker_scripts/link.sct new file mode 100644 index 0000000000..adff0c5912 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00020000 { ; load region size_region + ER_IROM1 0x08000000 0x00020000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x00004000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32f072-st-nucleo/figures/board.jpg b/bsp/stm32/stm32f072-st-nucleo/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7c12bf9ffc62778b52f177606950b6624cd7eec3 GIT binary patch literal 265311 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

Gs{2rLy|Pmvi~_d3w0;RA32LTpdN&0 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%0ALyXoPK+Vg@#3;8vxkvk%xc8=vhJS$@SL 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 literal 0 HcmV?d00001 diff --git a/bsp/stm32/stm32f072-st-nucleo/project.ewd b/bsp/stm32/stm32f072-st-nucleo/project.ewd new file mode 100644 index 0000000000..ff5dc49169 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/project.ewd @@ -0,0 +1,2966 @@ + + + 3 + + rt-thread + + ARM + + 1 + + C-SPY + 2 + + 30 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 30 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/stm32/stm32f072-st-nucleo/project.ewp b/bsp/stm32/stm32f072-st-nucleo/project.ewp new file mode 100644 index 0000000000..4b456f3bff --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/project.ewp @@ -0,0 +1,2342 @@ + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\cpu.c + + + $PROJ_DIR$\..\..\..\src\device.c + + + $PROJ_DIR$\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\src\scheduler.c + + + $PROJ_DIR$\..\..\..\src\signal.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\board\CubeMX_Config\Src\stm32f0xx_hal_msp.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\CMSIS\Device\ST\STM32F0xx\Source\Templates\iar\startup_stm32f072xb.s + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_common.c + + + + cpu + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m0\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m0\context_iar.S + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\workqueue.c + + + + finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\symbol.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_file.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_compiler.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_error.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_heap.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_init.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_node.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_ops.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_parser.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_var.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_vm.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_token.c + + + + STM32_HAL + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\CMSIS\Device\ST\STM32F0xx\Source\Templates\system_stm32f0xx.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_dma.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_cortex.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_crc.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_pwr.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_rcc.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_rcc_ex.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_crc.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_dma.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_exti.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_gpio.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_pwr.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_rcc.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_utils.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_gpio.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_uart.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_uart_ex.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_usart.c + + + $PROJ_DIR$\..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_usart.c + + + diff --git a/bsp/stm32/stm32f072-st-nucleo/project.eww b/bsp/stm32/stm32f072-st-nucleo/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32f072-st-nucleo/project.uvoptx b/bsp/stm32/stm32f072-st-nucleo/project.uvoptx new file mode 100644 index 0000000000..f43b9c1137 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/project.uvoptx @@ -0,0 +1,1109 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + JL2CM3 + -U778337147 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BB11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8008 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F0xx_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F072RBTx$CMSIS\Flash\STM32F0xx_128.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F0xx_128 -FL020000 -FS08000000 -FP0($$Device:STM32F072RBTx$CMSIS\Flash\STM32F0xx_128.FLM) + + + 0 + ST-LINKIII-KEIL_SWO + -U066DFF555355755087081621 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("") -D00(00000000) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F0xx_128 -FS08000000 -FL020000 + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Kernel + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu.c + cpu.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 1 + 9 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 1 + 10 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 1 + 11 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 1 + 12 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler.c + scheduler.c + 0 + 0 + + + 1 + 13 + 1 + 0 + 0 + 0 + ..\..\..\src\signal.c + signal.c + 0 + 0 + + + 1 + 14 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 1 + 15 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Applications + 1 + 0 + 0 + 0 + + 2 + 16 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Drivers + 1 + 0 + 0 + 0 + + 3 + 17 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + board\CubeMX_Config\Src\stm32f0xx_hal_msp.c + stm32f0xx_hal_msp.c + 0 + 0 + + + 3 + 19 + 2 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\CMSIS\Device\ST\STM32F0xx\Source\Templates\arm\startup_stm32f072xb.s + startup_stm32f072xb.s + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + + + cpu + 0 + 0 + 0 + 0 + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\backtrace.c + backtrace.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m0\cpuport.c + cpuport.c + 0 + 0 + + + 4 + 27 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m0\context_rvds.S + context_rvds.S + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\completion.c + completion.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\dataqueue.c + dataqueue.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\pipe.c + pipe.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\waitqueue.c + waitqueue.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\workqueue.c + workqueue.c + 0 + 0 + + + + + finsh + 0 + 0 + 0 + 0 + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\symbol.c + symbol.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_cmd.c + msh_cmd.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_file.c + msh_file.c + 0 + 0 + + + 6 + 43 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\finsh_compiler.c + finsh_compiler.c + 0 + 0 + + + 6 + 44 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\finsh_error.c + finsh_error.c + 0 + 0 + + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\finsh_heap.c + finsh_heap.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\finsh_init.c + finsh_init.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\finsh_node.c + finsh_node.c + 0 + 0 + + + 6 + 48 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\finsh_ops.c + finsh_ops.c + 0 + 0 + + + 6 + 49 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\finsh_parser.c + finsh_parser.c + 0 + 0 + + + 6 + 50 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\finsh_var.c + finsh_var.c + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\finsh_vm.c + finsh_vm.c + 0 + 0 + + + 6 + 52 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\finsh_token.c + finsh_token.c + 0 + 0 + + + + + STM32_HAL + 1 + 0 + 0 + 0 + + 7 + 53 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\CMSIS\Device\ST\STM32F0xx\Source\Templates\system_stm32f0xx.c + system_stm32f0xx.c + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_dma.c + stm32f0xx_hal_dma.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_cortex.c + stm32f0xx_hal_cortex.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_crc.c + stm32f0xx_hal_crc.c + 0 + 0 + + + 7 + 57 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_pwr.c + stm32f0xx_hal_pwr.c + 0 + 0 + + + 7 + 58 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_rcc.c + stm32f0xx_hal_rcc.c + 0 + 0 + + + 7 + 59 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_rcc_ex.c + stm32f0xx_hal_rcc_ex.c + 0 + 0 + + + 7 + 60 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal.c + stm32f0xx_hal.c + 0 + 0 + + + 7 + 61 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_crc.c + stm32f0xx_ll_crc.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_dma.c + stm32f0xx_ll_dma.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_exti.c + stm32f0xx_ll_exti.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_gpio.c + stm32f0xx_ll_gpio.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_pwr.c + stm32f0xx_ll_pwr.c + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_rcc.c + stm32f0xx_ll_rcc.c + 0 + 0 + + + 7 + 67 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_utils.c + stm32f0xx_ll_utils.c + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_gpio.c + stm32f0xx_hal_gpio.c + 0 + 0 + + + 7 + 69 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_uart.c + stm32f0xx_hal_uart.c + 0 + 0 + + + 7 + 70 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_uart_ex.c + stm32f0xx_hal_uart_ex.c + 0 + 0 + + + 7 + 71 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_usart.c + stm32f0xx_hal_usart.c + 0 + 0 + + + 7 + 72 + 1 + 0 + 0 + 0 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_usart.c + stm32f0xx_ll_usart.c + 0 + 0 + + + + diff --git a/bsp/stm32/stm32f072-st-nucleo/project.uvproj b/bsp/stm32/stm32f072-st-nucleo/project.uvproj new file mode 100644 index 0000000000..73cbbfe7d8 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/project.uvproj @@ -0,0 +1,804 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x4 + ARM-ADS + + + STM32F072RB + STMicroelectronics + IRAM(0x20000000-0x20003FFF) IROM(0x08000000-0x0801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M0") + + "Startup\ST\STM32F0xx\startup_stm32f072.s" ("STM32F072 Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F0xx_128 -FS08000000 -FL020000) + 7471 + stm32f0xx.h + + + + + + + -DSTM32F072 + + + SFD\ST\STM32F0xx\STM32F072x.SFR + 0 + 0 + + + + ST\STM32F0xx\ + ST\STM32F0xx\ + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + + 0 + 11 + + + + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + + + STM32F072xB, USE_HAL_DRIVER + + .;..\..\..\include;applications;.;board;board\CubeMX_Config\Inc;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m0;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32F0xx_HAL\CMSIS\Device\ST\STM32F0xx\Include;..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Inc;..\libraries\STM32F0xx_HAL\CMSIS\Include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + cpu.c + 1 + ..\..\..\src\cpu.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + signal.c + 1 + ..\..\..\src\signal.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + stm32f0xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32f0xx_hal_msp.c + + + startup_stm32f072xb.s + 2 + ..\libraries\STM32F0xx_HAL\CMSIS\Device\ST\STM32F0xx\Source\Templates\arm\startup_stm32f072xb.s + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\HAL_Drivers\drv_usart.c + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + + + cpu + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m0\cpuport.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m0\context_rvds.S + + + + + DeviceDrivers + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + symbol.c + 1 + ..\..\..\components\finsh\symbol.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + msh_cmd.c + 1 + ..\..\..\components\finsh\msh_cmd.c + + + msh_file.c + 1 + ..\..\..\components\finsh\msh_file.c + + + finsh_compiler.c + 1 + ..\..\..\components\finsh\finsh_compiler.c + + + finsh_error.c + 1 + ..\..\..\components\finsh\finsh_error.c + + + finsh_heap.c + 1 + ..\..\..\components\finsh\finsh_heap.c + + + finsh_init.c + 1 + ..\..\..\components\finsh\finsh_init.c + + + finsh_node.c + 1 + ..\..\..\components\finsh\finsh_node.c + + + finsh_ops.c + 1 + ..\..\..\components\finsh\finsh_ops.c + + + finsh_parser.c + 1 + ..\..\..\components\finsh\finsh_parser.c + + + finsh_var.c + 1 + ..\..\..\components\finsh\finsh_var.c + + + finsh_vm.c + 1 + ..\..\..\components\finsh\finsh_vm.c + + + finsh_token.c + 1 + ..\..\..\components\finsh\finsh_token.c + + + + + STM32_HAL + + + system_stm32f0xx.c + 1 + ..\libraries\STM32F0xx_HAL\CMSIS\Device\ST\STM32F0xx\Source\Templates\system_stm32f0xx.c + + + stm32f0xx_hal_dma.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_dma.c + + + stm32f0xx_hal_cortex.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_cortex.c + + + stm32f0xx_hal_crc.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_crc.c + + + stm32f0xx_hal_pwr.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_pwr.c + + + stm32f0xx_hal_rcc.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_rcc.c + + + stm32f0xx_hal_rcc_ex.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_rcc_ex.c + + + stm32f0xx_hal.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal.c + + + stm32f0xx_ll_crc.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_crc.c + + + stm32f0xx_ll_dma.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_dma.c + + + stm32f0xx_ll_exti.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_exti.c + + + stm32f0xx_ll_gpio.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_gpio.c + + + stm32f0xx_ll_pwr.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_pwr.c + + + stm32f0xx_ll_rcc.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_rcc.c + + + stm32f0xx_ll_utils.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_utils.c + + + stm32f0xx_hal_gpio.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_gpio.c + + + stm32f0xx_hal_uart.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_uart.c + + + stm32f0xx_hal_uart_ex.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_uart_ex.c + + + stm32f0xx_hal_usart.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_usart.c + + + stm32f0xx_ll_usart.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_usart.c + + + + + + + +
diff --git a/bsp/stm32/stm32f072-st-nucleo/project.uvprojx b/bsp/stm32/stm32f072-st-nucleo/project.uvprojx new file mode 100644 index 0000000000..66b43f9647 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/project.uvprojx @@ -0,0 +1,787 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32F072RBTx + STMicroelectronics + Keil.STM32F0xx_DFP.2.0.0 + http://www.keil.com/pack/ + IRAM(0x20000000,0x00004000) IROM(0x08000000,0x00020000) CPUTYPE("Cortex-M0") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F0xx_128 -FS08000000 -FL020000 -FP0($$Device:STM32F072RBTx$CMSIS\Flash\STM32F0xx_128.FLM)) + 0 + $$Device:STM32F072RBTx$Drivers\CMSIS\Device\ST\STM32F0xx\Include\stm32f0xx.h + + + + + + + + + + $$Device:STM32F072RBTx$CMSIS\SVD\STM32F0x2.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + STM32F072xB, USE_HAL_DRIVER + + .;..\..\..\include;applications;.;board;board\CubeMX_Config\Inc;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m0;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32F0xx_HAL\CMSIS\Device\ST\STM32F0xx\Include;..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Inc;..\libraries\STM32F0xx_HAL\CMSIS\Include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + cpu.c + 1 + ..\..\..\src\cpu.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + signal.c + 1 + ..\..\..\src\signal.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + stm32f0xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32f0xx_hal_msp.c + + + startup_stm32f072xb.s + 2 + ..\libraries\STM32F0xx_HAL\CMSIS\Device\ST\STM32F0xx\Source\Templates\arm\startup_stm32f072xb.s + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\HAL_Drivers\drv_usart.c + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + + + cpu + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m0\cpuport.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m0\context_rvds.S + + + + + DeviceDrivers + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + symbol.c + 1 + ..\..\..\components\finsh\symbol.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + msh_cmd.c + 1 + ..\..\..\components\finsh\msh_cmd.c + + + msh_file.c + 1 + ..\..\..\components\finsh\msh_file.c + + + finsh_compiler.c + 1 + ..\..\..\components\finsh\finsh_compiler.c + + + finsh_error.c + 1 + ..\..\..\components\finsh\finsh_error.c + + + finsh_heap.c + 1 + ..\..\..\components\finsh\finsh_heap.c + + + finsh_init.c + 1 + ..\..\..\components\finsh\finsh_init.c + + + finsh_node.c + 1 + ..\..\..\components\finsh\finsh_node.c + + + finsh_ops.c + 1 + ..\..\..\components\finsh\finsh_ops.c + + + finsh_parser.c + 1 + ..\..\..\components\finsh\finsh_parser.c + + + finsh_var.c + 1 + ..\..\..\components\finsh\finsh_var.c + + + finsh_vm.c + 1 + ..\..\..\components\finsh\finsh_vm.c + + + finsh_token.c + 1 + ..\..\..\components\finsh\finsh_token.c + + + + + STM32_HAL + + + system_stm32f0xx.c + 1 + ..\libraries\STM32F0xx_HAL\CMSIS\Device\ST\STM32F0xx\Source\Templates\system_stm32f0xx.c + + + stm32f0xx_hal_dma.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_dma.c + + + stm32f0xx_hal_cortex.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_cortex.c + + + stm32f0xx_hal_crc.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_crc.c + + + stm32f0xx_hal_pwr.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_pwr.c + + + stm32f0xx_hal_rcc.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_rcc.c + + + stm32f0xx_hal_rcc_ex.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_rcc_ex.c + + + stm32f0xx_hal.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal.c + + + stm32f0xx_ll_crc.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_crc.c + + + stm32f0xx_ll_dma.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_dma.c + + + stm32f0xx_ll_exti.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_exti.c + + + stm32f0xx_ll_gpio.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_gpio.c + + + stm32f0xx_ll_pwr.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_pwr.c + + + stm32f0xx_ll_rcc.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_rcc.c + + + stm32f0xx_ll_utils.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_utils.c + + + stm32f0xx_hal_gpio.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_gpio.c + + + stm32f0xx_hal_uart.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_uart.c + + + stm32f0xx_hal_uart_ex.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_uart_ex.c + + + stm32f0xx_hal_usart.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_hal_usart.c + + + stm32f0xx_ll_usart.c + 1 + ..\libraries\STM32F0xx_HAL\STM32F0xx_HAL_Driver\Src\stm32f0xx_ll_usart.c + + + + + + + + + + + + + +
diff --git a/bsp/stm32/stm32f072-st-nucleo/rtconfig.h b/bsp/stm32/stm32f072-st-nucleo/rtconfig.h new file mode 100644 index 0000000000..1537bfbd69 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/rtconfig.h @@ -0,0 +1,172 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 4 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_USING_IDLE_HOOK +#define RT_IDEL_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_DEBUG +#define RT_DEBUG_COLOR + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart2" +#define RT_VER_NUM 0x40002 +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M0 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 + +/* C++ features */ + + +/* Command shell */ + +#define RT_USING_FINSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_USING_DESCRIPTION +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_CMD_SIZE 80 +#define FINSH_USING_MSH +#define FINSH_USING_MSH_DEFAULT +#define FINSH_ARG_MAX 10 + +/* Device virtual file system */ + + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_PIPE_BUFSZ 512 +#define RT_USING_SERIAL +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN + +/* Using WiFi */ + + +/* Using USB */ + + +/* POSIX layer and C standard library */ + + +/* Network */ + +/* Socket abstraction layer */ + + +/* Network interface device */ + + +/* light weight TCP/IP stack */ + + +/* Modbus master and slave stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + + +/* multimedia packages */ + + +/* tools packages */ + + +/* system packages */ + + +/* peripheral libraries and drivers */ + + +/* miscellaneous packages */ + + +/* samples: kernel and components samples */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32F0 + +/* Hardware Drivers Config */ + +#define SOC_STM32F072RB + +/* Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART2 + +/* Board extended module Drivers */ + + +#endif diff --git a/bsp/stm32/stm32f072-st-nucleo/rtconfig.py b/bsp/stm32/stm32f072-st-nucleo/rtconfig.py new file mode 100644 index 0000000000..bbc6a35774 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/rtconfig.py @@ -0,0 +1,143 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m0' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m0 -mthumb -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + CXX = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M0 ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M0' + CFLAGS += ' -e' + CFLAGS += ' --fpu=None' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M0' + AFLAGS += ' --fpu None' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' diff --git a/bsp/stm32/stm32f072-st-nucleo/template.ewd b/bsp/stm32/stm32f072-st-nucleo/template.ewd new file mode 100644 index 0000000000..54527cf5c8 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/template.ewd @@ -0,0 +1,2966 @@ + + + 3 + + rt-thread + + ARM + + 1 + + C-SPY + 2 + + 30 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 30 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/stm32/stm32f072-st-nucleo/template.ewp b/bsp/stm32/stm32f072-st-nucleo/template.ewp new file mode 100644 index 0000000000..75b7527146 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/template.ewp @@ -0,0 +1,2074 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + diff --git a/bsp/stm32/stm32f072-st-nucleo/template.eww b/bsp/stm32/stm32f072-st-nucleo/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32f072-st-nucleo/template.uvoptx b/bsp/stm32/stm32f072-st-nucleo/template.uvoptx new file mode 100644 index 0000000000..accd4c51d6 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/template.uvoptx @@ -0,0 +1,197 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + JL2CM3 + -U778337147 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BB11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8008 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F0xx_128.FLM -FS08000000 -FL020000 -FP0($$Device:STM32F072RBTx$CMSIS\Flash\STM32F0xx_128.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F0xx_128 -FL020000 -FS08000000 -FP0($$Device:STM32F072RBTx$CMSIS\Flash\STM32F0xx_128.FLM) + + + 0 + ST-LINKIII-KEIL_SWO + -U066DFF555355755087081621 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("") -D00(00000000) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F0xx_128 -FS08000000 -FL020000 + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/stm32/stm32f072-st-nucleo/template.uvproj b/bsp/stm32/stm32f072-st-nucleo/template.uvproj new file mode 100644 index 0000000000..09efb8d4c1 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/template.uvproj @@ -0,0 +1,412 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x4 + ARM-ADS + + + STM32F072RB + STMicroelectronics + IRAM(0x20000000-0x20003FFF) IROM(0x08000000-0x0801FFFF) CLOCK(8000000) CPUTYPE("Cortex-M0") + + "Startup\ST\STM32F0xx\startup_stm32f072.s" ("STM32F072 Startup Code") + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F0xx_128 -FS08000000 -FL020000) + 7471 + stm32f0xx.h + + + + + + + -DSTM32F072 + + + SFD\ST\STM32F0xx\STM32F072x.SFR + 0 + 0 + + + + ST\STM32F0xx\ + ST\STM32F0xx\ + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + + 0 + 11 + + + + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + +
diff --git a/bsp/stm32/stm32f072-st-nucleo/template.uvprojx b/bsp/stm32/stm32f072-st-nucleo/template.uvprojx new file mode 100644 index 0000000000..23a8289b77 --- /dev/null +++ b/bsp/stm32/stm32f072-st-nucleo/template.uvprojx @@ -0,0 +1,395 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32F072RBTx + STMicroelectronics + Keil.STM32F0xx_DFP.2.0.0 + http://www.keil.com/pack/ + IRAM(0x20000000,0x00004000) IROM(0x08000000,0x00020000) CPUTYPE("Cortex-M0") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F0xx_128 -FS08000000 -FL020000 -FP0($$Device:STM32F072RBTx$CMSIS\Flash\STM32F0xx_128.FLM)) + 0 + $$Device:STM32F072RBTx$Drivers\CMSIS\Device\ST\STM32F0xx\Include\stm32f0xx.h + + + + + + + + + + $$Device:STM32F072RBTx$CMSIS\SVD\STM32F0x2.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DARMCM1.DLL + -pCM0 + SARMCM3.DLL + + TARMCM1.DLL + -pCM0 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x4000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + + + + + + + +
From 0ef18239e0245726079bca6ae1b470049a22b156 Mon Sep 17 00:00:00 2001 From: whj4674672 Date: Wed, 5 Jun 2019 14:24:57 +0800 Subject: [PATCH 25/30] [bsp][stm32h743-atk-apollo]add rtc --- bsp/stm32/libraries/HAL_Drivers/drv_rtc.c | 4 +- bsp/stm32/stm32h743-atk-apollo/README.md | 2 +- .../board/CubeMX_Config/.mxproject | 5 +- .../board/CubeMX_Config/CubeMX_Config.ioc | 186 ++++++++++-------- .../CubeMX_Config/Inc/stm32h7xx_hal_conf.h | 147 ++++++++------ .../board/CubeMX_Config/Src/main.c | 114 +++++++++-- .../CubeMX_Config/Src/stm32h7xx_hal_msp.c | 55 +++++- bsp/stm32/stm32h743-atk-apollo/board/Kconfig | 17 ++ bsp/stm32/stm32h743-atk-apollo/board/board.c | 30 +-- 9 files changed, 371 insertions(+), 189 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_rtc.c b/bsp/stm32/libraries/HAL_Drivers/drv_rtc.c index 136ab93d62..3881fcc4e4 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_rtc.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_rtc.c @@ -84,7 +84,9 @@ static rt_err_t set_rtc_time_stamp(time_t time_stamp) static void rt_rtc_init(void) { +#ifndef SOC_SERIES_STM32H7 __HAL_RCC_PWR_CLK_ENABLE(); +#endif RCC_OscInitTypeDef RCC_OscInitStruct = {0}; #ifdef BSP_RTC_USING_LSI @@ -137,7 +139,7 @@ static rt_err_t rt_rtc_config(struct rt_device *dev) RTC_Handler.Init.OutPut = RTC_OUTPUT_DISABLE; RTC_Handler.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; RTC_Handler.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; -#elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) +#elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32H7) /* set the frequency division */ #ifdef BSP_RTC_USING_LSI diff --git a/bsp/stm32/stm32h743-atk-apollo/README.md b/bsp/stm32/stm32h743-atk-apollo/README.md index 7e1dba4237..3fed2c0652 100644 --- a/bsp/stm32/stm32h743-atk-apollo/README.md +++ b/bsp/stm32/stm32h743-atk-apollo/README.md @@ -54,7 +54,7 @@ | SPI | 暂不支持 | | | I2C | 暂不支持 | | | SDIO | 暂不支持 | | -| RTC | 暂不支持 | | +| RTC | 支持 | | | PWM | 暂不支持 | | | USB Device | 暂不支持 | | | USB Host | 暂不支持 | | diff --git a/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/.mxproject index a113b95460..f50fc731ab 100644 --- a/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/.mxproject +++ b/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/.mxproject @@ -5,9 +5,10 @@ SourcePath=D:/rt_thread_master/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Confi SourceFiles=stm32h7xx_it.c;stm32h7xx_hal_msp.c;main.c; [PreviousLibFiles] -LibFiles=Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_cortex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma2d.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_ll_fmc.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sdram.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_ltdc.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_tim.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_tim_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_uart.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_uart_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rcc.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rcc_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_flash.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_flash_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_gpio.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_gpio_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_hsem.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_mdma.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_pwr.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_pwr_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_def.h;Drivers/STM32H7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_i2c.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_i2c_ex.h;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_cortex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma2d.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_fmc.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_sdram.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_ltdc.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim_ex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart_ex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc_ex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash_ex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_gpio.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_hsem.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_mdma.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr_ex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c_ex.c;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_cortex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma2d.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_ll_fmc.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sdram.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_ltdc.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_tim.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_tim_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_uart.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_uart_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rcc.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rcc_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_flash.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_flash_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_gpio.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_gpio_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_hsem.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_mdma.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_pwr.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_pwr_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_def.h;Drivers/STM32H7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_i2c.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_i2c_ex.h;Drivers/CMSIS/Device/ST/STM32H7xx/Include/stm32h743xx.h;Drivers/CMSIS/Device/ST/STM32H7xx/Include/stm32h7xx.h;Drivers/CMSIS/Device/ST/STM32H7xx/Include/system_stm32h7xx.h;Drivers/CMSIS/Device/ST/STM32H7xx/Source/Templates/system_stm32h7xx.c;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/tz_context.h; +LibFiles=Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_cortex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma2d.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_ll_fmc.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sdram.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_ltdc.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_ltdc_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dsi.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rtc.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rtc_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_tim.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_tim_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_uart.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_uart_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rcc.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rcc_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_flash.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_flash_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_gpio.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_gpio_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_hsem.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_mdma.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_pwr.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_pwr_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_def.h;Drivers/STM32H7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_i2c.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_i2c_ex.h;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_cortex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma2d.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_fmc.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_sdram.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_ltdc.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_ltdc_ex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dsi.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rtc.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rtc_ex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim_ex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart_ex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc_ex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash_ex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_gpio.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_hsem.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_mdma.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr_ex.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c.c;Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c_ex.c;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_cortex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma2d.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_ll_fmc.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_sdram.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_ltdc.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_ltdc_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dsi.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rtc.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rtc_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_tim.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_tim_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_uart.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_uart_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rcc.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_rcc_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_flash.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_flash_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_gpio.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_gpio_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_hsem.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dma_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_mdma.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_pwr.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_pwr_ex.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_def.h;Drivers/STM32H7xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_i2c.h;Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_i2c_ex.h;Drivers/CMSIS/Device/ST/STM32H7xx/Include/stm32h743xx.h;Drivers/CMSIS/Device/ST/STM32H7xx/Include/stm32h7xx.h;Drivers/CMSIS/Device/ST/STM32H7xx/Include/system_stm32h7xx.h;Drivers/CMSIS/Device/ST/STM32H7xx/Source/Templates/system_stm32h7xx.c;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/tz_context.h; [PreviousUsedKeilFiles] -SourceFiles=..\Src\main.c;..\Src\stm32h7xx_it.c;..\Src\stm32h7xx_hal_msp.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_cortex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma2d.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_fmc.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_sdram.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_ltdc.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_gpio.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_hsem.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_mdma.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c_ex.c;../\Src/system_stm32h7xx.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_cortex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma2d.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_fmc.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_sdram.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_ltdc.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_gpio.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_hsem.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_mdma.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c_ex.c;../\Src/system_stm32h7xx.c;../Drivers/CMSIS/Device/ST/STM32H7xx/Source/Templates/system_stm32h7xx.c;null; +SourceFiles=..\Src\main.c;..\Src\stm32h7xx_it.c;..\Src\stm32h7xx_hal_msp.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_cortex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma2d.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_fmc.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_sdram.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_ltdc.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_ltdc_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dsi.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rtc.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rtc_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_gpio.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_hsem.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_mdma.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c_ex.c;../\Src/system_stm32h7xx.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_cortex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma2d.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_fmc.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_sdram.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_ltdc.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_ltdc_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dsi.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rtc.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rtc_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_tim_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_uart_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_rcc_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_flash_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_gpio.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_hsem.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_mdma.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_pwr_ex.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c.c;../Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_i2c_ex.c;../\Src/system_stm32h7xx.c;../Drivers/CMSIS/Device/ST/STM32H7xx/Source/Templates/system_stm32h7xx.c;null; HeaderPath=..\Drivers\STM32H7xx_HAL_Driver\Inc;..\Drivers\STM32H7xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32H7xx\Include;..\Drivers\CMSIS\Include;..\Inc; +CDefines=USE_HAL_DRIVER;STM32H743xx;USE_HAL_DRIVER;STM32H743xx; diff --git a/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/CubeMX_Config.ioc index 826c3dd665..b69e85574a 100644 --- a/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/CubeMX_Config.ioc +++ b/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/CubeMX_Config.ioc @@ -1,4 +1,7 @@ #MicroXplorer Configuration settings - do not modify +CORTEX_M7.CPU_DCache=Enabled +CORTEX_M7.CPU_ICache=Enabled +CORTEX_M7.IPParameters=CPU_ICache,CPU_DCache DMA2D.ColorMode=DMA2D_OUTPUT_RGB565 DMA2D.IPParameters=Mode,ColorMode DMA2D.Mode=DMA2D_R2M @@ -19,87 +22,95 @@ File.Version=6 KeepUserPlacement=false Mcu.Family=STM32H7 Mcu.IP0=CORTEX_M7 -Mcu.IP1=DMA2D -Mcu.IP2=FMC -Mcu.IP3=LTDC -Mcu.IP4=NVIC -Mcu.IP5=RCC -Mcu.IP6=SYS -Mcu.IP7=USART1 -Mcu.IPNb=8 +Mcu.IP1=DEBUG +Mcu.IP2=DMA2D +Mcu.IP3=FMC +Mcu.IP4=LTDC +Mcu.IP5=NVIC +Mcu.IP6=RCC +Mcu.IP7=RTC +Mcu.IP8=SYS +Mcu.IP9=USART1 +Mcu.IPNb=10 Mcu.Name=STM32H743IITx Mcu.Package=LQFP176 -Mcu.Pin0=PI9 -Mcu.Pin1=PI10 -Mcu.Pin10=PH1-OSC_OUT (PH1) -Mcu.Pin11=PC0 -Mcu.Pin12=PC2_C -Mcu.Pin13=PC3_C -Mcu.Pin14=PF11 -Mcu.Pin15=PF12 -Mcu.Pin16=PF13 -Mcu.Pin17=PF14 -Mcu.Pin18=PF15 -Mcu.Pin19=PG0 -Mcu.Pin2=PF0 -Mcu.Pin20=PG1 -Mcu.Pin21=PE7 -Mcu.Pin22=PE8 -Mcu.Pin23=PE9 -Mcu.Pin24=PE10 -Mcu.Pin25=PE11 -Mcu.Pin26=PE12 -Mcu.Pin27=PE13 -Mcu.Pin28=PE14 -Mcu.Pin29=PE15 -Mcu.Pin3=PF1 -Mcu.Pin30=PH9 -Mcu.Pin31=PH10 -Mcu.Pin32=PH11 -Mcu.Pin33=PH12 -Mcu.Pin34=PD8 -Mcu.Pin35=PD9 -Mcu.Pin36=PD10 -Mcu.Pin37=PD14 -Mcu.Pin38=PD15 -Mcu.Pin39=PG2 -Mcu.Pin4=PF2 -Mcu.Pin40=PG4 -Mcu.Pin41=PG5 -Mcu.Pin42=PG6 -Mcu.Pin43=PG7 -Mcu.Pin44=PG8 -Mcu.Pin45=PA9 -Mcu.Pin46=PA10 -Mcu.Pin47=PH13 -Mcu.Pin48=PH14 -Mcu.Pin49=PH15 -Mcu.Pin5=PF3 -Mcu.Pin50=PI0 -Mcu.Pin51=PI1 -Mcu.Pin52=PI2 -Mcu.Pin53=PD0 -Mcu.Pin54=PD1 -Mcu.Pin55=PG11 -Mcu.Pin56=PG15 -Mcu.Pin57=PE0 -Mcu.Pin58=PE1 -Mcu.Pin59=PI4 -Mcu.Pin6=PF4 -Mcu.Pin60=PI5 -Mcu.Pin61=PI6 -Mcu.Pin62=PI7 -Mcu.Pin63=VP_DMA2D_VS_DMA2D -Mcu.Pin64=VP_SYS_VS_Systick -Mcu.Pin7=PF5 -Mcu.Pin8=PF10 -Mcu.Pin9=PH0-OSC_IN (PH0) -Mcu.PinsNb=65 +Mcu.Pin0=PC13 +Mcu.Pin1=PC14-OSC32_IN (OSC32_IN) +Mcu.Pin10=PF5 +Mcu.Pin11=PF10 +Mcu.Pin12=PH0-OSC_IN (PH0) +Mcu.Pin13=PH1-OSC_OUT (PH1) +Mcu.Pin14=PC0 +Mcu.Pin15=PC2_C +Mcu.Pin16=PC3_C +Mcu.Pin17=PF11 +Mcu.Pin18=PF12 +Mcu.Pin19=PF13 +Mcu.Pin2=PC15-OSC32_OUT (OSC32_OUT) +Mcu.Pin20=PF14 +Mcu.Pin21=PF15 +Mcu.Pin22=PG0 +Mcu.Pin23=PG1 +Mcu.Pin24=PE7 +Mcu.Pin25=PE8 +Mcu.Pin26=PE9 +Mcu.Pin27=PE10 +Mcu.Pin28=PE11 +Mcu.Pin29=PE12 +Mcu.Pin3=PI9 +Mcu.Pin30=PE13 +Mcu.Pin31=PE14 +Mcu.Pin32=PE15 +Mcu.Pin33=PH9 +Mcu.Pin34=PH10 +Mcu.Pin35=PH11 +Mcu.Pin36=PH12 +Mcu.Pin37=PD8 +Mcu.Pin38=PD9 +Mcu.Pin39=PD10 +Mcu.Pin4=PI10 +Mcu.Pin40=PD14 +Mcu.Pin41=PD15 +Mcu.Pin42=PG2 +Mcu.Pin43=PG4 +Mcu.Pin44=PG5 +Mcu.Pin45=PG6 +Mcu.Pin46=PG7 +Mcu.Pin47=PG8 +Mcu.Pin48=PA9 +Mcu.Pin49=PA10 +Mcu.Pin5=PF0 +Mcu.Pin50=PA13 (JTMS/SWDIO) +Mcu.Pin51=PH13 +Mcu.Pin52=PH14 +Mcu.Pin53=PH15 +Mcu.Pin54=PI0 +Mcu.Pin55=PI1 +Mcu.Pin56=PI2 +Mcu.Pin57=PA14 (JTCK/SWCLK) +Mcu.Pin58=PD0 +Mcu.Pin59=PD1 +Mcu.Pin6=PF1 +Mcu.Pin60=PG11 +Mcu.Pin61=PG15 +Mcu.Pin62=PE0 +Mcu.Pin63=PE1 +Mcu.Pin64=PI4 +Mcu.Pin65=PI5 +Mcu.Pin66=PI6 +Mcu.Pin67=PI7 +Mcu.Pin68=VP_DMA2D_VS_DMA2D +Mcu.Pin69=VP_RTC_VS_RTC_Activate +Mcu.Pin7=PF2 +Mcu.Pin70=VP_SYS_VS_Systick +Mcu.Pin8=PF3 +Mcu.Pin9=PF4 +Mcu.PinsNb=71 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32H743IITx -MxCube.Version=5.2.0 -MxDb.Version=DB.5.0.20 +MxCube.Version=5.2.1 +MxDb.Version=DB.5.0.21 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false @@ -114,10 +125,20 @@ NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false PA10.Locked=true PA10.Mode=Asynchronous PA10.Signal=USART1_RX +PA13\ (JTMS/SWDIO).Mode=Serial_Wire +PA13\ (JTMS/SWDIO).Signal=DEBUG_JTMS-SWDIO +PA14\ (JTCK/SWCLK).Mode=Serial_Wire +PA14\ (JTCK/SWCLK).Signal=DEBUG_JTCK-SWCLK PA9.Locked=true PA9.Mode=Asynchronous PA9.Signal=USART1_TX PC0.Signal=FMC_SDNWE +PC13.Mode=Calibration_1Hz +PC13.Signal=RTC_OUT_CALIB +PC14-OSC32_IN\ (OSC32_IN).Mode=LSE-External-Oscillator +PC14-OSC32_IN\ (OSC32_IN).Signal=RCC_OSC32_IN +PC15-OSC32_OUT\ (OSC32_OUT).Mode=LSE-External-Oscillator +PC15-OSC32_OUT\ (OSC32_OUT).Signal=RCC_OSC32_OUT PC2_C.Mode=SdramChipSelect1_1 PC2_C.Signal=FMC_SDNE0 PC3_C.Mode=SdramChipSelect1_1 @@ -232,7 +253,7 @@ ProjectManager.CompilerOptimize=6 ProjectManager.ComputerToolchain=false ProjectManager.CoupleFile=false ProjectManager.CustomerFirmwarePackage= -ProjectManager.DefaultFWLocation=true +ProjectManager.DefaultFWLocation=false ProjectManager.DeletePrevious=true ProjectManager.DeviceId=STM32H743IITx ProjectManager.FirmwarePackage=STM32Cube FW_H7 V1.4.0 @@ -252,7 +273,7 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=MDK-ARM V5 ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_FMC_Init-FMC-false-HAL-true,6-MX_DMA2D_Init-DMA2D-false-HAL-true,7-MX_LTDC_Init-LTDC-false-HAL-true +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true,5-MX_FMC_Init-FMC-false-HAL-true,6-MX_DMA2D_Init-DMA2D-false-HAL-true,7-MX_LTDC_Init-LTDC-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true RCC.ADCFreq_Value=50390625 RCC.AHB12Freq_Value=200000000 RCC.AHB4Freq_Value=200000000 @@ -298,7 +319,7 @@ RCC.HRTIMFreq_Value=200000000 RCC.HSE_VALUE=25000000 RCC.I2C123Freq_Value=100000000 RCC.I2C4Freq_Value=100000000 -RCC.IPParameters=ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CECFreq_Value,CKPERFreq_Value,CPU2Freq_Value,CPU2SystikFreq_Value,CortexFreq_Value,CpuClockFreq_Value,D1CPREFreq_Value,D1PPRE,D2PPRE1,D2PPRE2,D3PPRE,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVM3,DIVN1,DIVN3,DIVP1Freq_Value,DIVP2Freq_Value,DIVP3Freq_Value,DIVQ1Freq_Value,DIVQ2Freq_Value,DIVQ3Freq_Value,DIVR1Freq_Value,DIVR2Freq_Value,DIVR3,DIVR3Freq_Value,FDCANFreq_Value,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HPRE,HRTIMFreq_Value,HSE_VALUE,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLLSourceVirtual,PWR_Regulator_Voltage_Scale,QSPIFreq_Value,RNGFreq_Value,RTCFreq_Value,SAI1Freq_Value,SAI23Freq_Value,SAI4AFreq_Value,SAI4BFreq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value +RCC.IPParameters=ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CECFreq_Value,CKPERFreq_Value,CPU2Freq_Value,CPU2SystikFreq_Value,CortexFreq_Value,CpuClockFreq_Value,D1CPREFreq_Value,D1PPRE,D2PPRE1,D2PPRE2,D3PPRE,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVM3,DIVN1,DIVN3,DIVP1Freq_Value,DIVP2Freq_Value,DIVP3Freq_Value,DIVQ1Freq_Value,DIVQ2Freq_Value,DIVQ3Freq_Value,DIVR1Freq_Value,DIVR2Freq_Value,DIVR3,DIVR3Freq_Value,FDCANFreq_Value,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HPRE,HRTIMFreq_Value,HSE_VALUE,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLLSourceVirtual,PWR_Regulator_Voltage_Scale,QSPIFreq_Value,RNGFreq_Value,RTCClockSelection,RTCFreq_Value,SAI1Freq_Value,SAI23Freq_Value,SAI4AFreq_Value,SAI4BFreq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value RCC.LPTIM1Freq_Value=100000000 RCC.LPTIM2Freq_Value=100000000 RCC.LPTIM345Freq_Value=100000000 @@ -310,7 +331,8 @@ RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE RCC.PWR_Regulator_Voltage_Scale=PWR_REGULATOR_VOLTAGE_SCALE1 RCC.QSPIFreq_Value=200000000 RCC.RNGFreq_Value=48000000 -RCC.RTCFreq_Value=32000 +RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE +RCC.RTCFreq_Value=32768 RCC.SAI1Freq_Value=400000000 RCC.SAI23Freq_Value=400000000 RCC.SAI4AFreq_Value=400000000 @@ -325,7 +347,7 @@ RCC.SYSCLKFreq_VALUE=400000000 RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK RCC.Tim1OutputFreq_Value=200000000 RCC.Tim2OutputFreq_Value=200000000 -RCC.TraceFreq_Value=64000000 +RCC.TraceFreq_Value=400000000 RCC.USART16Freq_Value=100000000 RCC.USART234578Freq_Value=100000000 RCC.USBFreq_Value=400000000 @@ -413,6 +435,8 @@ USART1.IPParameters=VirtualMode-Asynchronous USART1.VirtualMode-Asynchronous=VM_ASYNC VP_DMA2D_VS_DMA2D.Mode=DMA2D_Activate VP_DMA2D_VS_DMA2D.Signal=DMA2D_VS_DMA2D +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick board=custom diff --git a/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/Inc/stm32h7xx_hal_conf.h b/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/Inc/stm32h7xx_hal_conf.h index 8eac9abdd9..562bcf88a7 100644 --- a/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/Inc/stm32h7xx_hal_conf.h +++ b/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/Inc/stm32h7xx_hal_conf.h @@ -1,35 +1,18 @@ /** ****************************************************************************** - * @file stm32h7xx_hal_conf_template.h - * @brief HAL configuration template file. - * This file should be copied to the application folder and renamed - * to stm32h7xx_hal_conf.h. + * @file stm32h7xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration file. ****************************************************************************** * @attention * - *

© COPYRIGHT(c) 2019 STMicroelectronics

+ *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

* - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ @@ -51,7 +34,7 @@ */ #define HAL_MODULE_ENABLED -/* #define HAL_ADC_MODULE_ENABLED */ + /* #define HAL_ADC_MODULE_ENABLED */ /* #define HAL_FDCAN_MODULE_ENABLED */ /* #define HAL_CEC_MODULE_ENABLED */ /* #define HAL_COMP_MODULE_ENABLED */ @@ -67,7 +50,6 @@ #define HAL_SDRAM_MODULE_ENABLED /* #define HAL_HASH_MODULE_ENABLED */ /* #define HAL_HRTIM_MODULE_ENABLED */ -/* #define HAL_HSEM_MODULE_ENABLED */ /* #define HAL_JPEG_MODULE_ENABLED */ /* #define HAL_OPAMP_MODULE_ENABLED */ /* #define HAL_I2S_MODULE_ENABLED */ @@ -77,7 +59,7 @@ #define HAL_LTDC_MODULE_ENABLED /* #define HAL_QSPI_MODULE_ENABLED */ /* #define HAL_RNG_MODULE_ENABLED */ -/* #define HAL_RTC_MODULE_ENABLED */ +#define HAL_RTC_MODULE_ENABLED /* #define HAL_SAI_MODULE_ENABLED */ /* #define HAL_SD_MODULE_ENABLED */ /* #define HAL_MMC_MODULE_ENABLED */ @@ -170,6 +152,55 @@ #define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ #define USE_RTOS 0U #define USE_SD_TRANSCEIVER 1U /*!< use uSD Transceiver */ + +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ +#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ +#define USE_HAL_COMP_REGISTER_CALLBACKS 0U /* COMP register callback disabled */ +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */ +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */ +#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */ +#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */ +#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */ +#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */ +#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */ +#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U /* FDCAN register callback disabled */ +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */ +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */ +#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */ +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */ +#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */ +#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */ +#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U /* HRTIM register callback disabled */ +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */ +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */ +#define USE_HAL_JPEG_REGISTER_CALLBACKS 0U /* JPEG register callback disabled */ +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */ +#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */ +#define USE_HAL_MDIOS_REGISTER_CALLBACKS 0U /* MDIO register callback disabled */ +#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U /* MDIO register callback disabled */ +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */ +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */ +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */ +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */ +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */ +#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */ +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */ +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */ +#define USE_HAL_SWPMI_REGISTER_CALLBACKS 0U /* SWPMI register callback disabled */ +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */ +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */ + +/* ########################### Ethernet Configuration ######################### */ +#define ETH_TX_DESC_CNT 4 /* number of Ethernet Tx DMA descriptors */ +#define ETH_RX_DESC_CNT 4 /* number of Ethernet Rx DMA descriptors */ + +#define ETH_MAC_ADDR0 ((uint8_t)0x02) +#define ETH_MAC_ADDR1 ((uint8_t)0x00) +#define ETH_MAC_ADDR2 ((uint8_t)0x00) +#define ETH_MAC_ADDR3 ((uint8_t)0x00) +#define ETH_MAC_ADDR4 ((uint8_t)0x00) +#define ETH_MAC_ADDR5 ((uint8_t)0x00) + /* ########################## Assert Selection ############################## */ /** * @brief Uncomment the line below to expanse the "assert_param" macro in the @@ -177,20 +208,6 @@ */ /* #define USE_FULL_ASSERT 1U */ -/* ################## SPI peripheral configuration ########################## */ - -/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver -* Activated: CRC code is present inside driver -* Deactivated: CRC code cleaned from driver -*/ - -#define USE_SPI_CRC 0U - -/* ################## ETH peripheral configuration ########################## */ - -#define ETH_TX_DESC_CNT ((uint32_t)4U) /* Tx Descriptor Length */ -#define ETH_RX_DESC_CNT ((uint32_t)4U) /* Rx Descriptor Length */ - /* Includes ------------------------------------------------------------------*/ /** * @brief Include module's header file @@ -200,10 +217,6 @@ #include "stm32h7xx_hal_rcc.h" #endif /* HAL_RCC_MODULE_ENABLED */ -#ifdef HAL_EXTI_MODULE_ENABLED - #include "stm32h7xx_hal_exti.h" -#endif /* HAL_EXTI_MODULE_ENABLED */ - #ifdef HAL_GPIO_MODULE_ENABLED #include "stm32h7xx_hal_gpio.h" #endif /* HAL_GPIO_MODULE_ENABLED */ @@ -212,6 +225,10 @@ #include "stm32h7xx_hal_dma.h" #endif /* HAL_DMA_MODULE_ENABLED */ +#ifdef HAL_MDMA_MODULE_ENABLED + #include "stm32h7xx_hal_mdma.h" +#endif /* HAL_MDMA_MODULE_ENABLED */ + #ifdef HAL_HASH_MODULE_ENABLED #include "stm32h7xx_hal_hash.h" #endif /* HAL_HASH_MODULE_ENABLED */ @@ -224,6 +241,10 @@ #include "stm32h7xx_hal_dma2d.h" #endif /* HAL_DMA2D_MODULE_ENABLED */ +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32h7xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + #ifdef HAL_DFSDM_MODULE_ENABLED #include "stm32h7xx_hal_dfsdm.h" #endif /* HAL_DFSDM_MODULE_ENABLED */ @@ -232,6 +253,10 @@ #include "stm32h7xx_hal_eth.h" #endif /* HAL_ETH_MODULE_ENABLED */ +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32h7xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + #ifdef HAL_CORTEX_MODULE_ENABLED #include "stm32h7xx_hal_cortex.h" #endif /* HAL_CORTEX_MODULE_ENABLED */ @@ -257,7 +282,7 @@ #endif /* HAL_CRC_MODULE_ENABLED */ #ifdef HAL_CRYP_MODULE_ENABLED - #include "stm32h7xx_hal_cryp.h" + #include "stm32h7xx_hal_cryp.h" #endif /* HAL_CRYP_MODULE_ENABLED */ #ifdef HAL_DAC_MODULE_ENABLED @@ -287,7 +312,7 @@ #ifdef HAL_NAND_MODULE_ENABLED #include "stm32h7xx_hal_nand.h" #endif /* HAL_NAND_MODULE_ENABLED */ - + #ifdef HAL_I2C_MODULE_ENABLED #include "stm32h7xx_hal_i2c.h" #endif /* HAL_I2C_MODULE_ENABLED */ @@ -308,10 +333,10 @@ #include "stm32h7xx_hal_mdios.h" #endif /* HAL_MDIOS_MODULE_ENABLED */ -#ifdef HAL_MDMA_MODULE_ENABLED - #include "stm32h7xx_hal_mdma.h" -#endif /* HAL_MDMA_MODULE_ENABLED */ - +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32h7xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + #ifdef HAL_LPTIM_MODULE_ENABLED #include "stm32h7xx_hal_lptim.h" #endif /* HAL_LPTIM_MODULE_ENABLED */ @@ -323,7 +348,7 @@ #ifdef HAL_OPAMP_MODULE_ENABLED #include "stm32h7xx_hal_opamp.h" #endif /* HAL_OPAMP_MODULE_ENABLED */ - + #ifdef HAL_PWR_MODULE_ENABLED #include "stm32h7xx_hal_pwr.h" #endif /* HAL_PWR_MODULE_ENABLED */ @@ -331,7 +356,11 @@ #ifdef HAL_QSPI_MODULE_ENABLED #include "stm32h7xx_hal_qspi.h" #endif /* HAL_QSPI_MODULE_ENABLED */ - + +#ifdef HAL_RAMECC_MODULE_ENABLED + #include "stm32h7xx_hal_ramecc.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + #ifdef HAL_RNG_MODULE_ENABLED #include "stm32h7xx_hal_rng.h" #endif /* HAL_RNG_MODULE_ENABLED */ @@ -348,14 +377,10 @@ #include "stm32h7xx_hal_sd.h" #endif /* HAL_SD_MODULE_ENABLED */ -#ifdef HAL_MMC_MODULE_ENABLED - #include "stm32h7xx_hal_mmc.h" -#endif /* HAL_MMC_MODULE_ENABLED */ - #ifdef HAL_SDRAM_MODULE_ENABLED #include "stm32h7xx_hal_sdram.h" #endif /* HAL_SDRAM_MODULE_ENABLED */ - + #ifdef HAL_SPI_MODULE_ENABLED #include "stm32h7xx_hal_spi.h" #endif /* HAL_SPI_MODULE_ENABLED */ @@ -395,7 +420,7 @@ #ifdef HAL_WWDG_MODULE_ENABLED #include "stm32h7xx_hal_wwdg.h" #endif /* HAL_WWDG_MODULE_ENABLED */ - + #ifdef HAL_PCD_MODULE_ENABLED #include "stm32h7xx_hal_pcd.h" #endif /* HAL_PCD_MODULE_ENABLED */ diff --git a/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/Src/main.c index ee829f4f7a..1437778e8f 100644 --- a/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/Src/main.c +++ b/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/Src/main.c @@ -67,6 +67,8 @@ DMA2D_HandleTypeDef hdma2d; LTDC_HandleTypeDef hltdc; +RTC_HandleTypeDef hrtc; + UART_HandleTypeDef huart1; SDRAM_HandleTypeDef hsdram1; @@ -82,6 +84,7 @@ static void MX_USART1_UART_Init(void); static void MX_FMC_Init(void); static void MX_DMA2D_Init(void); static void MX_LTDC_Init(void); +static void MX_RTC_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -100,6 +103,13 @@ int main(void) /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ + + + /* Enable I-Cache---------------------------------------------------------*/ + SCB_EnableICache(); + + /* Enable D-Cache---------------------------------------------------------*/ + SCB_EnableDCache(); /* MCU Configuration--------------------------------------------------------*/ @@ -123,6 +133,7 @@ int main(void) MX_FMC_Init(); MX_DMA2D_Init(); MX_LTDC_Init(); + MX_RTC_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ @@ -148,24 +159,26 @@ void SystemClock_Config(void) RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; - /**Supply configuration update enable + /** Supply configuration update enable */ - MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0); - /**Configure the main internal regulator output voltage + HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); + /** Configure the main internal regulator output voltage */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - while ((PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY) - { - - } - /**Macro to configure the PLL clock source + while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} + /** Configure LSE Drive Capability + */ + HAL_PWR_EnableBkUpAccess(); + __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); + /** Macro to configure the PLL clock source */ __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE); - /**Initializes the CPU, AHB and APB busses clocks + /** Initializes the CPU, AHB and APB busses clocks */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 5; @@ -180,7 +193,7 @@ void SystemClock_Config(void) { Error_Handler(); } - /**Initializes the CPU, AHB and APB busses clocks + /** Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 @@ -197,8 +210,8 @@ void SystemClock_Config(void) { Error_Handler(); } - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC|RCC_PERIPHCLK_USART1 - |RCC_PERIPHCLK_FMC; + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_LTDC + |RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_FMC; PeriphClkInitStruct.PLL3.PLL3M = 5; PeriphClkInitStruct.PLL3.PLL3N = 160; PeriphClkInitStruct.PLL3.PLL3P = 2; @@ -209,6 +222,7 @@ void SystemClock_Config(void) PeriphClkInitStruct.PLL3.PLL3FRACN = 0; PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK; PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); @@ -326,6 +340,47 @@ static void MX_LTDC_Init(void) } +/** + * @brief RTC Initialization Function + * @param None + * @retval None + */ +static void MX_RTC_Init(void) +{ + + /* USER CODE BEGIN RTC_Init 0 */ + + /* USER CODE END RTC_Init 0 */ + + /* USER CODE BEGIN RTC_Init 1 */ + + /* USER CODE END RTC_Init 1 */ + /** Initialize RTC Only + */ + hrtc.Instance = RTC; + hrtc.Init.HourFormat = RTC_HOURFORMAT_24; + hrtc.Init.AsynchPrediv = 127; + hrtc.Init.SynchPrediv = 255; + hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; + hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; + hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE; + if (HAL_RTC_Init(&hrtc) != HAL_OK) + { + Error_Handler(); + } + /** Enable Calibrartion + */ + if (HAL_RTCEx_SetCalibrationOutPut(&hrtc, RTC_CALIBOUTPUT_1HZ) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN RTC_Init 2 */ + + /* USER CODE END RTC_Init 2 */ + +} + /** * @brief USART1 Initialization Function * @param None @@ -350,15 +405,24 @@ static void MX_USART1_UART_Init(void) huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; - huart1.Init.Prescaler = UART_PRESCALER_DIV1; - huart1.Init.FIFOMode = UART_FIFOMODE_DISABLE; - huart1.Init.TXFIFOThreshold = UART_TXFIFO_THRESHOLD_1_8; - huart1.Init.RXFIFOThreshold = UART_RXFIFO_THRESHOLD_1_8; + huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1; huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; if (HAL_UART_Init(&huart1) != HAL_OK) { Error_Handler(); } + if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) + { + Error_Handler(); + } /* USER CODE BEGIN USART1_Init 2 */ /* USER CODE END USART1_Init 2 */ @@ -368,7 +432,16 @@ static void MX_USART1_UART_Init(void) /* FMC initialization function */ static void MX_FMC_Init(void) { - FMC_SDRAM_TimingTypeDef SdramTiming; + + /* USER CODE BEGIN FMC_Init 0 */ + + /* USER CODE END FMC_Init 0 */ + + FMC_SDRAM_TimingTypeDef SdramTiming = {0}; + + /* USER CODE BEGIN FMC_Init 1 */ + + /* USER CODE END FMC_Init 1 */ /** Perform the SDRAM1 memory initialization sequence */ @@ -398,6 +471,9 @@ static void MX_FMC_Init(void) Error_Handler( ); } + /* USER CODE BEGIN FMC_Init 2 */ + + /* USER CODE END FMC_Init 2 */ } /** @@ -409,10 +485,10 @@ static void MX_GPIO_Init(void) { /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOI_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); diff --git a/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/Src/stm32h7xx_hal_msp.c b/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/Src/stm32h7xx_hal_msp.c index 959fb28b97..074b313e2c 100644 --- a/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/Src/stm32h7xx_hal_msp.c +++ b/bsp/stm32/stm32h743-atk-apollo/board/CubeMX_Config/Src/stm32h7xx_hal_msp.c @@ -104,7 +104,6 @@ void HAL_MspInit(void) */ void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef* hdma2d) { - if(hdma2d->Instance==DMA2D) { /* USER CODE BEGIN DMA2D_MspInit 0 */ @@ -125,10 +124,8 @@ void HAL_DMA2D_MspInit(DMA2D_HandleTypeDef* hdma2d) * @param hdma2d: DMA2D handle pointer * @retval None */ - void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef* hdma2d) { - if(hdma2d->Instance==DMA2D) { /* USER CODE BEGIN DMA2D_MspDeInit 0 */ @@ -151,7 +148,6 @@ void HAL_DMA2D_MspDeInit(DMA2D_HandleTypeDef* hdma2d) */ void HAL_LTDC_MspInit(LTDC_HandleTypeDef* hltdc) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; if(hltdc->Instance==LTDC) { @@ -231,10 +227,8 @@ void HAL_LTDC_MspInit(LTDC_HandleTypeDef* hltdc) * @param hltdc: LTDC handle pointer * @retval None */ - void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* hltdc) { - if(hltdc->Instance==LTDC) { /* USER CODE BEGIN LTDC_MspDeInit 0 */ @@ -283,6 +277,50 @@ void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* hltdc) } +/** +* @brief RTC MSP Initialization +* This function configures the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspInit 0 */ + + /* USER CODE END RTC_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_RTC_ENABLE(); + /* USER CODE BEGIN RTC_MspInit 1 */ + + /* USER CODE END RTC_MspInit 1 */ + } + +} + +/** +* @brief RTC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspDeInit 0 */ + + /* USER CODE END RTC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_RTC_DISABLE(); + /* USER CODE BEGIN RTC_MspDeInit 1 */ + + /* USER CODE END RTC_MspDeInit 1 */ + } + +} + /** * @brief UART MSP Initialization * This function configures the hardware resources used in this example @@ -291,7 +329,6 @@ void HAL_LTDC_MspDeInit(LTDC_HandleTypeDef* hltdc) */ void HAL_UART_MspInit(UART_HandleTypeDef* huart) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; if(huart->Instance==USART1) { @@ -329,10 +366,8 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) * @param huart: UART handle pointer * @retval None */ - void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) { - if(huart->Instance==USART1) { /* USER CODE BEGIN USART1_MspDeInit 0 */ @@ -362,7 +397,7 @@ static void HAL_FMC_MspInit(void){ /* USER CODE BEGIN FMC_MspInit 0 */ /* USER CODE END FMC_MspInit 0 */ - GPIO_InitTypeDef GPIO_InitStruct; + GPIO_InitTypeDef GPIO_InitStruct ={0}; if (FMC_Initialized) { return; } diff --git a/bsp/stm32/stm32h743-atk-apollo/board/Kconfig b/bsp/stm32/stm32h743-atk-apollo/board/Kconfig index 5686c4230b..f563c7492a 100644 --- a/bsp/stm32/stm32h743-atk-apollo/board/Kconfig +++ b/bsp/stm32/stm32h743-atk-apollo/board/Kconfig @@ -35,6 +35,7 @@ menu "On-chip Peripheral Drivers" config BSP_USING_UART1 bool "Enable UART1" default y + endif config BSP_USING_FMC bool @@ -44,6 +45,22 @@ menu "On-chip Peripheral Drivers" bool default n + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + select RT_USING_LIBC + default n + if BSP_USING_ONCHIP_RTC + choice + prompt "Select clock source" + default BSP_RTC_USING_LSE + + config BSP_RTC_USING_LSE + bool "RTC USING LSE" + + config BSP_RTC_USING_LSI + bool "RTC USING LSI" + endchoice endif endmenu diff --git a/bsp/stm32/stm32h743-atk-apollo/board/board.c b/bsp/stm32/stm32h743-atk-apollo/board/board.c index f7c7d805fc..5d37e83500 100644 --- a/bsp/stm32/stm32h743-atk-apollo/board/board.c +++ b/bsp/stm32/stm32h743-atk-apollo/board/board.c @@ -16,24 +16,26 @@ void SystemClock_Config(void) RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; - /**Supply configuration update enable + /** Supply configuration update enable */ - MODIFY_REG(PWR->CR3, PWR_CR3_SCUEN, 0); - /**Configure the main internal regulator output voltage + HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); + /** Configure the main internal regulator output voltage */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - while ((PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY) - { - - } - /**Macro to configure the PLL clock source + while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} + /** Configure LSE Drive Capability + */ + HAL_PWR_EnableBkUpAccess(); + __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); + /** Macro to configure the PLL clock source */ __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE); - /**Initializes the CPU, AHB and APB busses clocks + /** Initializes the CPU, AHB and APB busses clocks */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 5; @@ -48,7 +50,7 @@ void SystemClock_Config(void) { Error_Handler(); } - /**Initializes the CPU, AHB and APB busses clocks + /** Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2 @@ -65,8 +67,8 @@ void SystemClock_Config(void) { Error_Handler(); } - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC|RCC_PERIPHCLK_USART1 - |RCC_PERIPHCLK_FMC; + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_LTDC + |RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_FMC; PeriphClkInitStruct.PLL3.PLL3M = 5; PeriphClkInitStruct.PLL3.PLL3N = 160; PeriphClkInitStruct.PLL3.PLL3P = 2; @@ -77,10 +79,10 @@ void SystemClock_Config(void) PeriphClkInitStruct.PLL3.PLL3FRACN = 0; PeriphClkInitStruct.FmcClockSelection = RCC_FMCCLKSOURCE_D1HCLK; PeriphClkInitStruct.Usart16ClockSelection = RCC_USART16CLKSOURCE_D2PCLK2; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } - } From ab7c1530eaa4f5a60e67667a930eea2732867f2f Mon Sep 17 00:00:00 2001 From: tangyuxin <462747508@qq.com> Date: Wed, 5 Jun 2019 14:49:19 +0800 Subject: [PATCH 26/30] =?UTF-8?q?[components][drivers]=20=E7=A1=AC?= =?UTF-8?q?=E4=BB=B6=E5=A4=A7=E6=95=B0=E9=80=82=E5=BA=94=E6=80=A7=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/Kconfig | 2 +- components/drivers/hwcrypto/hw_bignum.c | 186 ++++++++++-------------- components/drivers/hwcrypto/hw_bignum.h | 114 ++++++--------- components/drivers/hwcrypto/hw_hash.h | 2 +- 4 files changed, 122 insertions(+), 182 deletions(-) diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig index a100249620..45494c6a6e 100755 --- a/components/drivers/Kconfig +++ b/components/drivers/Kconfig @@ -278,7 +278,7 @@ menu "Using Hardware Crypto drivers" int "IV max size" default "16" - config HWCRYPTO_KEYBIT_MAX_SIZE + config RT_HWCRYPTO_KEYBIT_MAX_SIZE int "Key max bit length" default 256 diff --git a/components/drivers/hwcrypto/hw_bignum.c b/components/drivers/hwcrypto/hw_bignum.c index 173975c70a..cfc57f8273 100644 --- a/components/drivers/hwcrypto/hw_bignum.c +++ b/components/drivers/hwcrypto/hw_bignum.c @@ -14,7 +14,7 @@ static struct rt_hwcrypto_ctx *bignum_default; -rt_inline rt_err_t rt_hwcrypto_bignum_init(void) +rt_inline rt_err_t hwcrypto_bignum_dev_is_init(void) { struct rt_hwcrypto_device *dev; @@ -55,20 +55,18 @@ rt_err_t rt_hwcrypto_bignum_default(struct rt_hwcrypto_device *device) } /** - * @brief Allocate memory for bignum - * - * @return Pointer to allocated bignum obj + * @brief Init bignum obj + * + * @param n bignum obj */ -struct hw_bignum_mpi *rt_hwcrypto_bignum_alloc(void) +void rt_hwcrypto_bignum_init(struct hw_bignum_mpi *n) { - struct hw_bignum_mpi *n; + if(n == RT_NULL) + return; - n = rt_malloc(sizeof(struct hw_bignum_mpi)); - if (n) - { - rt_memset(n, 0, sizeof(struct hw_bignum_mpi)); - } - return n; + n->sign = 1; + n->total = 0; + n->p = RT_NULL; } /** @@ -81,7 +79,9 @@ void rt_hwcrypto_bignum_free(struct hw_bignum_mpi *n) if (n) { rt_free(n->p); - rt_free(n); + n->sign = 0; + n->total = 0; + n->p = RT_NULL; } } @@ -90,7 +90,7 @@ void rt_hwcrypto_bignum_free(struct hw_bignum_mpi *n) * * @param n bignum obj * - * @return binary buffer Length + * @return binary buffer length */ int rt_hwcrypto_bignum_get_len(const struct hw_bignum_mpi *n) { @@ -111,29 +111,34 @@ int rt_hwcrypto_bignum_get_len(const struct hw_bignum_mpi *n) } /** - * @brief Get length of bignum as an unsigned binary buffer + * @brief Export n into unsigned binary data, big endian * * @param n bignum obj * @param buf Buffer for the binary number * @param len Length of the buffer * - * @return binary buffer Length + * @return export bin length */ -int rt_hwcrypto_bignum_get_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len) +int rt_hwcrypto_bignum_export_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len) { - int cp_len; + int cp_len, i, j; - if (n == RT_NULL || n->p == RT_NULL || buf == RT_NULL) + if (n == RT_NULL || buf == RT_NULL) { return 0; } + rt_memset(buf, 0, len); cp_len = n->total > len ? len : n->total; - rt_memcpy(n->p, buf, cp_len); + for(i = cp_len, j = 0; i > 0; i--, j++) + { + buf[i - 1] = n->p[j]; + } + return cp_len; } /** - * @brief Set binary buffer to unsigned bignum + * @brief Import n from unsigned binary data, big endian * * @param n bignum obj * @param buf Buffer for the binary number @@ -141,82 +146,39 @@ int rt_hwcrypto_bignum_get_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len * * @return RT_EOK on success. */ -rt_err_t rt_hwcrypto_bignum_set_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len) +rt_err_t rt_hwcrypto_bignum_import_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len) { + int cp_len, i, j; void *temp_p; - if (n == RT_NULL) + if (n == RT_NULL || buf == RT_NULL) { - return -RT_EINVAL; + return 0; } - if (n->p && n->total >= len) - { - rt_memcpy(n->p, buf, len); - return RT_EOK; - } - temp_p = rt_malloc(len); - if (temp_p == RT_NULL) - { - return -RT_ENOMEM; - } - if (n->p) + if (n->total < len) { + temp_p = rt_malloc(len); + if (temp_p == RT_NULL) + { + return 0; + } + rt_memset(temp_p, 0, len); rt_free(n->p); n->p = temp_p; - n->total = 0; + n->total = len; } - rt_memcpy(n->p, buf, len); - n->total = len; - return RT_EOK; -} + cp_len = n->total > len ? len : n->total; -/** - * @brief Unsigned comparison - * - * @param a bignum obj - * @param b bignum obj - * - * @return 0 is equal - */ -int rt_hwcrypto_bignum_cmp(const struct hw_bignum_mpi *a, - const struct hw_bignum_mpi *b) -{ - int a_len, b_len; - - if (a == RT_NULL || a->p == RT_NULL - || b == RT_NULL || b->p == RT_NULL) + for(i = cp_len, j = 0; i > 0; i--, j++) { - return -1; + n->p[j] = buf[i - 1]; } - a_len = rt_hwcrypto_bignum_get_len(a); - b_len = rt_hwcrypto_bignum_get_len(b); - if (a_len != b_len) - { - return a_len - b_len; - } - return rt_memcmp(a->p, b->p, a_len); + + return cp_len; } /** - * @brief Compare bignum to standard Unsigned integer - * - * @param a bignum obj - * @param b Unsigned integer - * - * @return 0 is equal - */ -int rt_hwcrypto_bignum_cmp_d(const struct hw_bignum_mpi *a, unsigned long b) -{ - struct hw_bignum_mpi tmp_b; - - b = b <= 0 ? -b : b; - tmp_b.total = sizeof(unsigned long); - tmp_b.p = &b; - return rt_hwcrypto_bignum_cmp(a, &tmp_b); -} - -/** - * @brief a = b + c + * @brief x = a + b * * @param a bignum obj * @param b bignum obj @@ -224,26 +186,26 @@ int rt_hwcrypto_bignum_cmp_d(const struct hw_bignum_mpi *a, unsigned long b) * * @return RT_EOK on success. */ -rt_err_t rt_hwcrypto_bignum_add(struct hw_bignum_mpi *a, - const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c) +rt_err_t rt_hwcrypto_bignum_add(struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, + const struct hw_bignum_mpi *b) { struct hwcrypto_bignum *bignum_ctx; - if (rt_hwcrypto_bignum_init() != RT_EOK) + if (hwcrypto_bignum_dev_is_init() != RT_EOK) { return -RT_ERROR; } bignum_ctx = (struct hwcrypto_bignum *)bignum_default; if (bignum_ctx->ops->add) { - return bignum_ctx->ops->add(bignum_ctx, a, b, c); + return bignum_ctx->ops->add(bignum_ctx, x, a, b); } return -RT_ERROR; } /** - * @brief a = b - c + * @brief x = a - b * * @param a bignum obj * @param b bignum obj @@ -251,26 +213,26 @@ rt_err_t rt_hwcrypto_bignum_add(struct hw_bignum_mpi *a, * * @return RT_EOK on success. */ -rt_err_t rt_hwcrypto_bignum_sub(struct hw_bignum_mpi *a, - const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c) +rt_err_t rt_hwcrypto_bignum_sub(struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, + const struct hw_bignum_mpi *b) { struct hwcrypto_bignum *bignum_ctx; - if (rt_hwcrypto_bignum_init() != RT_EOK) + if (hwcrypto_bignum_dev_is_init() != RT_EOK) { return -RT_ERROR; } bignum_ctx = (struct hwcrypto_bignum *)bignum_default; if (bignum_ctx->ops->sub) { - return bignum_ctx->ops->sub(bignum_ctx, a, b, c); + return bignum_ctx->ops->sub(bignum_ctx, x, a, b); } return -RT_ERROR; } /** - * @brief a = b * c + * @brief x = a * b * * @param a bignum obj * @param b bignum obj @@ -278,26 +240,26 @@ rt_err_t rt_hwcrypto_bignum_sub(struct hw_bignum_mpi *a, * * @return RT_EOK on success. */ -rt_err_t rt_hwcrypto_bignum_mul(struct hw_bignum_mpi *a, - const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c) +rt_err_t rt_hwcrypto_bignum_mul(struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, + const struct hw_bignum_mpi *b) { struct hwcrypto_bignum *bignum_ctx; - if (rt_hwcrypto_bignum_init() != RT_EOK) + if (hwcrypto_bignum_dev_is_init() != RT_EOK) { return -RT_ERROR; } bignum_ctx = (struct hwcrypto_bignum *)bignum_default; if (bignum_ctx->ops->mul) { - return bignum_ctx->ops->mul(bignum_ctx, a, b, c); + return bignum_ctx->ops->mul(bignum_ctx, x, a, b); } return -RT_ERROR; } /** - * @brief a = b * c (mod d) + * @brief x = a * b (mod c) * * @param a bignum obj * @param b bignum obj @@ -305,27 +267,27 @@ rt_err_t rt_hwcrypto_bignum_mul(struct hw_bignum_mpi *a, * * @return RT_EOK on success. */ -rt_err_t rt_hwcrypto_bignum_mulmod(struct hw_bignum_mpi *a, +rt_err_t rt_hwcrypto_bignum_mulmod(struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c, - const struct hw_bignum_mpi *d) + const struct hw_bignum_mpi *c) { struct hwcrypto_bignum *bignum_ctx; - if (rt_hwcrypto_bignum_init() != RT_EOK) + if (hwcrypto_bignum_dev_is_init() != RT_EOK) { return -RT_ERROR; } bignum_ctx = (struct hwcrypto_bignum *)bignum_default; if (bignum_ctx->ops->mulmod) { - return bignum_ctx->ops->mulmod(bignum_ctx, a, b, c, d); + return bignum_ctx->ops->mulmod(bignum_ctx, x, a, b, c); } return -RT_ERROR; } /** - * @brief a = b ^ c (mod d) + * @brief x = a ^ b (mod c) * * @param a bignum obj * @param b bignum obj @@ -333,21 +295,21 @@ rt_err_t rt_hwcrypto_bignum_mulmod(struct hw_bignum_mpi *a, * * @return RT_EOK on success. */ -rt_err_t bignum_exptmod(struct hw_bignum_mpi *a, - const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c, - const struct hw_bignum_mpi *d) +rt_err_t rt_hwcrypto_bignum_exptmod(struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, + const struct hw_bignum_mpi *b, + const struct hw_bignum_mpi *c) { struct hwcrypto_bignum *bignum_ctx; - if (rt_hwcrypto_bignum_init() != RT_EOK) + if (hwcrypto_bignum_dev_is_init() != RT_EOK) { return -RT_ERROR; } bignum_ctx = (struct hwcrypto_bignum *)bignum_default; if (bignum_ctx->ops->exptmod) { - return bignum_ctx->ops->exptmod(bignum_ctx, a, b, c, d); + return bignum_ctx->ops->exptmod(bignum_ctx, x, a, b, c); } return -RT_ERROR; } diff --git a/components/drivers/hwcrypto/hw_bignum.h b/components/drivers/hwcrypto/hw_bignum.h index 92bd4dd3b6..a1f567e68f 100644 --- a/components/drivers/hwcrypto/hw_bignum.h +++ b/components/drivers/hwcrypto/hw_bignum.h @@ -22,34 +22,35 @@ struct hwcrypto_bignum; /* bignum obj */ struct hw_bignum_mpi { - rt_size_t total; /**< Total length of data */ - rt_ubase_t *p; /**< pointer to data */ + int sign; /**< integer sign */ + rt_size_t total; /**< total of limbs */ + rt_uint8_t *p; /**< pointer to limbs */ }; struct hwcrypto_bignum_ops { rt_err_t (*add)(struct hwcrypto_bignum *bignum_ctx, - struct hw_bignum_mpi *a, - const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c); /**< a = b + c */ + struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, + const struct hw_bignum_mpi *b); /**< x = a + b */ rt_err_t (*sub)(struct hwcrypto_bignum *bignum_ctx, - struct hw_bignum_mpi *a, - const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c); /**< a = b - c */ + struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, + const struct hw_bignum_mpi *b); /**< x = a - b */ rt_err_t (*mul)(struct hwcrypto_bignum *bignum_ctx, - struct hw_bignum_mpi *a, - const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c); /**< a = b * c */ + struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, + const struct hw_bignum_mpi *b); /**< x = a * b */ rt_err_t (*mulmod)(struct hwcrypto_bignum *bignum_ctx, - struct hw_bignum_mpi *a, + struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c, - const struct hw_bignum_mpi *d); /**< a = b * c (mod d) */ + const struct hw_bignum_mpi *c); /**< x = a * b (mod c) */ rt_err_t (*exptmod)(struct hwcrypto_bignum *bignum_ctx, - struct hw_bignum_mpi *a, + struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c, - const struct hw_bignum_mpi *d); /**< a = b ^ c (mod d) */ + const struct hw_bignum_mpi *c); /**< x = a ^ b (mod c) */ }; /** @@ -69,11 +70,9 @@ struct hwcrypto_bignum rt_err_t rt_hwcrypto_bignum_default(struct rt_hwcrypto_device *device); /** - * @brief Allocate memory for bignum - * - * @return Pointer to allocated bignum obj + * @brief Init bignum obj */ -struct hw_bignum_mpi *rt_hwcrypto_bignum_alloc(void); +void rt_hwcrypto_bignum_init(struct hw_bignum_mpi *n); /** * @brief free a bignum obj @@ -92,18 +91,18 @@ void rt_hwcrypto_bignum_free(struct hw_bignum_mpi *n); int rt_hwcrypto_bignum_get_len(const struct hw_bignum_mpi *n); /** - * @brief Get length of bignum as an unsigned binary buffer + * @brief Export n into unsigned binary data, big endian * * @param n bignum obj * @param buf Buffer for the binary number * @param len Length of the buffer * - * @return binary buffer Length + * @return export bin length */ -int rt_hwcrypto_bignum_get_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len); +int rt_hwcrypto_bignum_export_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len); /** - * @brief Set binary buffer to unsigned bignum + * @brief Import n from unsigned binary data, big endian * * @param n bignum obj * @param buf Buffer for the binary number @@ -111,31 +110,10 @@ int rt_hwcrypto_bignum_get_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len * * @return RT_EOK on success. */ -rt_err_t rt_hwcrypto_bignum_set_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len); +rt_err_t rt_hwcrypto_bignum_import_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len); /** - * @brief Unsigned comparison - * - * @param a bignum obj - * @param b bignum obj - * - * @return 0 is equal - */ -int rt_hwcrypto_bignum_cmp(const struct hw_bignum_mpi *a, - const struct hw_bignum_mpi *b); - -/** - * @brief Compare bignum to standard Unsigned integer - * - * @param a bignum obj - * @param b Unsigned integer - * - * @return 0 is equal - */ -int rt_hwcrypto_bignum_cmp_d(const struct hw_bignum_mpi *a, unsigned long b); - -/** - * @brief a = b + c + * @brief x = a + b * * @param a bignum obj * @param b bignum obj @@ -143,12 +121,12 @@ int rt_hwcrypto_bignum_cmp_d(const struct hw_bignum_mpi *a, unsigned long b); * * @return RT_EOK on success. */ -rt_err_t rt_hwcrypto_bignum_add(struct hw_bignum_mpi *a, - const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c); +rt_err_t rt_hwcrypto_bignum_add(struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, + const struct hw_bignum_mpi *b); /** - * @brief a = b - c + * @brief x = a - b * * @param a bignum obj * @param b bignum obj @@ -156,12 +134,12 @@ rt_err_t rt_hwcrypto_bignum_add(struct hw_bignum_mpi *a, * * @return RT_EOK on success. */ -rt_err_t rt_hwcrypto_bignum_sub(struct hw_bignum_mpi *a, - const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c); +rt_err_t rt_hwcrypto_bignum_sub(struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, + const struct hw_bignum_mpi *b); /** - * @brief a = b * c + * @brief x = a * b * * @param a bignum obj * @param b bignum obj @@ -169,12 +147,12 @@ rt_err_t rt_hwcrypto_bignum_sub(struct hw_bignum_mpi *a, * * @return RT_EOK on success. */ -rt_err_t rt_hwcrypto_bignum_mul(struct hw_bignum_mpi *a, - const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c); +rt_err_t rt_hwcrypto_bignum_mul(struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, + const struct hw_bignum_mpi *b); /** - * @brief a = b * c (mod d) + * @brief x = a * b (mod c) * * @param a bignum obj * @param b bignum obj @@ -182,13 +160,13 @@ rt_err_t rt_hwcrypto_bignum_mul(struct hw_bignum_mpi *a, * * @return RT_EOK on success. */ -rt_err_t rt_hwcrypto_bignum_mulmod(struct hw_bignum_mpi *a, +rt_err_t rt_hwcrypto_bignum_mulmod(struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c, - const struct hw_bignum_mpi *d); + const struct hw_bignum_mpi *c); /** - * @brief a = b ^ c (mod d) + * @brief x = a ^ b (mod c) * * @param a bignum obj * @param b bignum obj @@ -196,10 +174,10 @@ rt_err_t rt_hwcrypto_bignum_mulmod(struct hw_bignum_mpi *a, * * @return RT_EOK on success. */ -rt_err_t bignum_exptmod(struct hw_bignum_mpi *a, - const struct hw_bignum_mpi *b, - const struct hw_bignum_mpi *c, - const struct hw_bignum_mpi *d); +rt_err_t rt_hwcrypto_bignum_exptmod(struct hw_bignum_mpi *x, + const struct hw_bignum_mpi *a, + const struct hw_bignum_mpi *b, + const struct hw_bignum_mpi *c); #ifdef __cplusplus } diff --git a/components/drivers/hwcrypto/hw_hash.h b/components/drivers/hwcrypto/hw_hash.h index b913f4ebd4..de0310e84c 100644 --- a/components/drivers/hwcrypto/hw_hash.h +++ b/components/drivers/hwcrypto/hw_hash.h @@ -101,7 +101,7 @@ void rt_hwcrypto_hash_reset(struct rt_hwcrypto_ctx *ctx); * * @return RT_EOK on success. */ -rt_err_t rt_hwcrypto_hash_type(struct rt_hwcrypto_ctx *ctx, hwcrypto_type type); +rt_err_t rt_hwcrypto_hash_set_type(struct rt_hwcrypto_ctx *ctx, hwcrypto_type type); #ifdef __cplusplus } From 7cbdf9e4a92cb767eaae595b3808fca6457d34d4 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Thu, 6 Jun 2019 07:43:17 +0800 Subject: [PATCH 27/30] Update SConscript --- bsp/stm32/stm32f072-st-nucleo/applications/SConscript | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/bsp/stm32/stm32f072-st-nucleo/applications/SConscript b/bsp/stm32/stm32f072-st-nucleo/applications/SConscript index 04f04dd543..5efd37ed23 100644 --- a/bsp/stm32/stm32f072-st-nucleo/applications/SConscript +++ b/bsp/stm32/stm32f072-st-nucleo/applications/SConscript @@ -1,10 +1,8 @@ -Import('RTT_ROOT') -Import('rtconfig') from building import * cwd = GetCurrentDir() -src = Glob('*.c') -CPPPATH = [cwd, str(Dir('#'))] +src = Glob('*.c') + Glob('*.cpp') +CPPPATH = [cwd] group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) From 8ade4fff2e9d3d2966a6312314079cbc51a87dcb Mon Sep 17 00:00:00 2001 From: guozhanxin Date: Thu, 6 Jun 2019 16:07:41 +0800 Subject: [PATCH 28/30] =?UTF-8?q?[sensor]=20Fixed=20error=20with=20mutex?= =?UTF-8?q?=5Flock=20take=20and=20release=20not=20matching.|=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E9=94=81=E7=9A=84=E8=8E=B7=E5=8F=96=E5=92=8C=E9=87=8A?= =?UTF-8?q?=E6=94=BE=E4=B8=8D=E5=AF=B9=E5=BA=94=E7=9A=84=E9=94=99=E8=AF=AF?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/sensors/sensor.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/components/drivers/sensors/sensor.c b/components/drivers/sensors/sensor.c index 620d3b1d0a..dba20f6555 100644 --- a/components/drivers/sensors/sensor.c +++ b/components/drivers/sensors/sensor.c @@ -195,6 +195,11 @@ static rt_err_t rt_sensor_open(rt_device_t dev, rt_uint16_t oflag) } else { + if (sensor->module) + { + /* release the module mutex */ + rt_mutex_release(sensor->module->lock); + } return -RT_EINVAL; } From 3463a756d9ece07266be5636a7b2cd45cadbe784 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Fri, 7 Jun 2019 22:44:24 +0800 Subject: [PATCH 29/30] [kernel] skip warning when disable debug. --- src/object.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/object.c b/src/object.c index e85737ce8f..4ee2f6a1a1 100644 --- a/src/object.c +++ b/src/object.c @@ -262,7 +262,10 @@ void rt_object_init(struct rt_object *object, struct rt_object *obj; obj = rt_list_entry(node, struct rt_object, list); - RT_ASSERT(obj != object); + if (obj) /* skip warning when disable debug */ + { + RT_ASSERT(obj != object); + } } /* leave critical */ rt_exit_critical(); From 8e5776b0133583bdd4db0a401cfb7f1ae0aaa9b1 Mon Sep 17 00:00:00 2001 From: lhxzui Date: Sat, 8 Jun 2019 13:12:34 +0800 Subject: [PATCH 30/30] 1. Add bsp stm32l452-st-nucleo. 2. Bsp stm32l452-st-nucleo has been tested with NUCLEO-L452RE board. 3. Modify the applications SConscript of bsp stm32f103-yf-ufun, using new method. 4. Modify README of bsp stm32f072-st-nucleo. --- bsp/stm32/stm32f072-st-nucleo/README.md | 2 +- .../stm32f103-yf-ufun/applications/SConscript | 6 +- bsp/stm32/stm32l452-st-nucleo/.config | 382 +++ bsp/stm32/stm32l452-st-nucleo/.gitignore | 42 + bsp/stm32/stm32l452-st-nucleo/Kconfig | 21 + bsp/stm32/stm32l452-st-nucleo/README.md | 116 + bsp/stm32/stm32l452-st-nucleo/SConscript | 15 + bsp/stm32/stm32l452-st-nucleo/SConstruct | 59 + .../applications/SConscript | 9 + .../stm32l452-st-nucleo/applications/main.c | 33 + .../board/CubeMX_Config/.mxproject | 14 + .../board/CubeMX_Config/CubeMX_Config.ioc | 188 ++ .../board/CubeMX_Config/Inc/main.h | 85 + .../CubeMX_Config/Inc/stm32l4xx_hal_conf.h | 440 +++ .../board/CubeMX_Config/Inc/stm32l4xx_it.h | 69 + .../board/CubeMX_Config/Src/main.c | 263 ++ .../CubeMX_Config/Src/stm32l4xx_hal_msp.c | 149 + .../board/CubeMX_Config/Src/stm32l4xx_it.c | 203 ++ .../CubeMX_Config/Src/system_stm32l4xx.c | 337 ++ bsp/stm32/stm32l452-st-nucleo/board/Kconfig | 87 + .../stm32l452-st-nucleo/board/SConscript | 40 + bsp/stm32/stm32l452-st-nucleo/board/board.c | 64 + bsp/stm32/stm32l452-st-nucleo/board/board.h | 52 + .../board/linker_scripts/link.icf | 29 + .../board/linker_scripts/link.lds | 156 + .../board/linker_scripts/link.sct | 15 + .../stm32l452-st-nucleo/figures/board.jpg | Bin 0 -> 280342 bytes bsp/stm32/stm32l452-st-nucleo/project.ewd | 2966 +++++++++++++++++ bsp/stm32/stm32l452-st-nucleo/project.ewp | 2315 +++++++++++++ bsp/stm32/stm32l452-st-nucleo/project.eww | 10 + bsp/stm32/stm32l452-st-nucleo/project.uvoptx | 1021 ++++++ bsp/stm32/stm32l452-st-nucleo/project.uvprojx | 742 +++++ bsp/stm32/stm32l452-st-nucleo/rtconfig.h | 177 + bsp/stm32/stm32l452-st-nucleo/rtconfig.py | 143 + bsp/stm32/stm32l452-st-nucleo/template.ewp | 2074 ++++++++++++ bsp/stm32/stm32l452-st-nucleo/template.eww | 10 + bsp/stm32/stm32l452-st-nucleo/template.uvoptx | 197 ++ .../stm32l452-st-nucleo/template.uvprojx | 395 +++ 38 files changed, 12921 insertions(+), 5 deletions(-) create mode 100644 bsp/stm32/stm32l452-st-nucleo/.config create mode 100644 bsp/stm32/stm32l452-st-nucleo/.gitignore create mode 100644 bsp/stm32/stm32l452-st-nucleo/Kconfig create mode 100644 bsp/stm32/stm32l452-st-nucleo/README.md create mode 100644 bsp/stm32/stm32l452-st-nucleo/SConscript create mode 100644 bsp/stm32/stm32l452-st-nucleo/SConstruct create mode 100644 bsp/stm32/stm32l452-st-nucleo/applications/SConscript create mode 100644 bsp/stm32/stm32l452-st-nucleo/applications/main.c create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/Kconfig create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/SConscript create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/board.c create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/board.h create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32l452-st-nucleo/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32l452-st-nucleo/figures/board.jpg create mode 100644 bsp/stm32/stm32l452-st-nucleo/project.ewd create mode 100644 bsp/stm32/stm32l452-st-nucleo/project.ewp create mode 100644 bsp/stm32/stm32l452-st-nucleo/project.eww create mode 100644 bsp/stm32/stm32l452-st-nucleo/project.uvoptx create mode 100644 bsp/stm32/stm32l452-st-nucleo/project.uvprojx create mode 100644 bsp/stm32/stm32l452-st-nucleo/rtconfig.h create mode 100644 bsp/stm32/stm32l452-st-nucleo/rtconfig.py create mode 100644 bsp/stm32/stm32l452-st-nucleo/template.ewp create mode 100644 bsp/stm32/stm32l452-st-nucleo/template.eww create mode 100644 bsp/stm32/stm32l452-st-nucleo/template.uvoptx create mode 100644 bsp/stm32/stm32l452-st-nucleo/template.uvprojx diff --git a/bsp/stm32/stm32f072-st-nucleo/README.md b/bsp/stm32/stm32f072-st-nucleo/README.md index 562856b71c..decffca99a 100644 --- a/bsp/stm32/stm32f072-st-nucleo/README.md +++ b/bsp/stm32/stm32f072-st-nucleo/README.md @@ -2,7 +2,7 @@ ## 简介 -本文档为刘恒为 NUCLEO-F072RB 开发板的 BSP (板级支持包) 说明。 +本文档为刘恒为 NUCLEO-F072RB 开发板提供的 BSP (板级支持包) 说明。 主要内容如下: diff --git a/bsp/stm32/stm32f103-yf-ufun/applications/SConscript b/bsp/stm32/stm32f103-yf-ufun/applications/SConscript index 04f04dd543..5efd37ed23 100644 --- a/bsp/stm32/stm32f103-yf-ufun/applications/SConscript +++ b/bsp/stm32/stm32f103-yf-ufun/applications/SConscript @@ -1,10 +1,8 @@ -Import('RTT_ROOT') -Import('rtconfig') from building import * cwd = GetCurrentDir() -src = Glob('*.c') -CPPPATH = [cwd, str(Dir('#'))] +src = Glob('*.c') + Glob('*.cpp') +CPPPATH = [cwd] group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) diff --git a/bsp/stm32/stm32l452-st-nucleo/.config b/bsp/stm32/stm32l452-st-nucleo/.config new file mode 100644 index 0000000000..a3516539d3 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/.config @@ -0,0 +1,382 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDEL_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set +CONFIG_RT_DEBUG=y +CONFIG_RT_DEBUG_COLOR=y +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +# CONFIG_RT_USING_MEMHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMTRACE is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=256 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart2" +CONFIG_RT_VER_NUM=0x40002 +CONFIG_ARCH_ARM=y +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M4=y +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 + +# +# C++ features +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Command shell +# +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_CMD_SIZE=80 +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_USING_MSH_DEFAULT=y +CONFIG_FINSH_USING_MSH_ONLY=y +CONFIG_FINSH_ARG_MAX=10 + +# +# Device virtual file system +# +# CONFIG_RT_USING_DFS is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_PIPE_BUFSZ=512 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +# CONFIG_RT_SERIAL_USING_DMA is not set +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_MTD is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set + +# +# Using Hardware Crypto drivers +# +# CONFIG_RT_USING_HWCRYPTO is not set + +# +# Using WiFi +# +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +# CONFIG_RT_USING_LIBC is not set +# CONFIG_RT_USING_PTHREADS is not set + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# Modbus master and slave stack +# +# CONFIG_RT_USING_MODBUS is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LIBMODBUS is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOTHUB is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_libsodium is not set +# CONFIG_PKG_USING_TINYCRYPT is not set + +# +# language packages +# +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set + +# +# multimedia packages +# +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ADBD is not set + +# +# system packages +# +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_PERSIMMON is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_CMSIS is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_THREAD_POOL is not set + +# +# peripheral libraries and drivers +# +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set + +# +# miscellaneous packages +# +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_NNOM is not set +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32L4=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32L452RE=y + +# +# Onboard Peripheral Drivers +# + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +# CONFIG_BSP_USING_UART1 is not set +CONFIG_BSP_USING_UART2=y +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_I2C1 is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32l452-st-nucleo/.gitignore b/bsp/stm32/stm32l452-st-nucleo/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/.gitignore @@ -0,0 +1,42 @@ +*.pyc +*.map +*.dblite +*.elf +*.bin +*.hex +*.axf +*.exe +*.pdb +*.idb +*.ilk +*.old +build +Debug +documentation/html +packages/ +*~ +*.o +*.obj +*.out +*.bak +*.dep +*.lib +*.i +*.d +.DS_Stor* +.config 3 +.config 4 +.config 5 +Midea-X1 +*.uimg +GPATH +GRTAGS +GTAGS +.vscode +JLinkLog.txt +JLinkSettings.ini +DebugConfig/ +RTE/ +settings/ +*.uvguix* +cconfig.h diff --git a/bsp/stm32/stm32l452-st-nucleo/Kconfig b/bsp/stm32/stm32l452-st-nucleo/Kconfig new file mode 100644 index 0000000000..8cbc7b71a8 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/Kconfig @@ -0,0 +1,21 @@ +mainmenu "RT-Thread Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "../libraries/Kconfig" +source "board/Kconfig" diff --git a/bsp/stm32/stm32l452-st-nucleo/README.md b/bsp/stm32/stm32l452-st-nucleo/README.md new file mode 100644 index 0000000000..9701eb290c --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/README.md @@ -0,0 +1,116 @@ +# NUCLEO-L452RE BSP 说明 + +## 简介 + +本文档为刘恒为 NUCLEO-L452RE 开发板提供的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +对于 NUCLEO-L452RE,内核是 Cortex-M4,这款芯片是低功耗系列,板载 ST-LINK/V2-1 调试器/编程器,迷你尺寸,MINI USB 接口,兼容 Arduino、还带有ST Zio和 ST Morpho 扩展接口,可连接微控制器的所有周边外设。 + +开发板外观如下图所示: + +![board](figures/board.jpg) + +该开发板常用 **板载资源** 如下: + +- MCU:STM32L452RE,主频 80MHz,512KB FLASH ,160KB RAM +- 常用外设 + - LED:3个,USB communication(LD1 双色),power LED(LD3 红色),user LED(LD2 绿色) + - 按键:2个,复位按键 B2,用户按键 B1。 +- 常用接口:USB 支持 3 种不同接口:虚拟 COM 端口、大容量存储和调试端口。 +- 调试接口:板载 ST-LINK/V2-1 调试器。 + +开发板更多详细信息请参考【STMicroelectronics】 [NUCLEO-L452RE](https://www.st.com/en/evaluation-tools/nucleo-l452re.html#)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :---------------: | :----------: | :-----------------------------------: | +| ST-LINK | 支持 | | +| USB 转串口 | 支持 | UART2 | +| **片上外设** | **支持情况** | **备注** | +| :---------------: | :----------: | :-----------------------------------: | +| GPIO | 支持 | PA0, PA1... PC15 ---> PIN: 0, 1...47 | +| UART | 支持 | UART2 | +| SPI | 暂不支持 | | +| I2C | 暂不支持 | | +| RTC | 暂不支持 | | +| PWM | 暂不支持 | | +| USB Device | 暂不支持 | | +| IWG | 暂不支持 | | +| **扩展模块** | **支持情况** | **备注** | +| :---------------: | :----------: | :-----------------------------------: | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,打开电源开关。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 ST-LINK 仿真器下载程序,在通过 miniUSB 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,红色 LD3 常亮、绿色 LD2 会周期性闪烁。 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + + \ | / +- RT - Thread Operating System + / | \ 4.0.2 build May 31 2019 + 2006 - 2019 Copyright by rt-thread team +msh > + +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 串口2 的功能,如果需使用更多高级功能,需要利用 ENV 工具对 BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk5/iar` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32系列BSP外设驱动使用教程.md)。 + +## 注意事项 + +1. MCU 片内 SRAM 有 SRAM1、SRAM2,分别是 128KB、32KB,共计 160KB,本 bsp 只使用 SRAM1 128KB. + +## 联系人信息 + +维护人: + +- [刘恒](https://github.com/lhxzui), 邮箱: \ No newline at end of file diff --git a/bsp/stm32/stm32l452-st-nucleo/SConscript b/bsp/stm32/stm32l452-st-nucleo/SConscript new file mode 100644 index 0000000000..20f7689c53 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/stm32/stm32l452-st-nucleo/SConstruct b/bsp/stm32/stm32l452-st-nucleo/SConstruct new file mode 100644 index 0000000000..58a36adbfc --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/SConstruct @@ -0,0 +1,59 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +TARGET = 'rt-thread.' + rtconfig.TARGET_EXT + +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.map') + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +stm32_library = 'STM32L4xx_HAL' +rtconfig.BSP_LIBRARY_TYPE = stm32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/stm32/stm32l452-st-nucleo/applications/SConscript b/bsp/stm32/stm32l452-st-nucleo/applications/SConscript new file mode 100644 index 0000000000..5efd37ed23 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/applications/SConscript @@ -0,0 +1,9 @@ +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') + Glob('*.cpp') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/stm32/stm32l452-st-nucleo/applications/main.c b/bsp/stm32/stm32l452-st-nucleo/applications/main.c new file mode 100644 index 0000000000..aad9acb9b9 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/applications/main.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + */ + +#include +#include +#include + +/* defined the LED2 pin: PA5 */ +#define LED2_PIN GET_PIN(A, 5) + +int main(void) +{ + int count = 1; + /* set LED2 pin mode to output */ + rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT); + + while (count++) + { + rt_pin_write(LED2_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED2_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + + return RT_EOK; +} diff --git a/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..1cd35f7811 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/.mxproject @@ -0,0 +1,14 @@ +[PreviousGenFiles] +HeaderPath=F:/program/rt-thread/rt-thread/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Inc +HeaderFiles=stm32l4xx_it.h;stm32l4xx_hal_conf.h;main.h; +SourcePath=F:/program/rt-thread/rt-thread/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src +SourceFiles=stm32l4xx_it.c;stm32l4xx_hal_msp.c;main.c; + +[PreviousLibFiles] +LibFiles=Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l452xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/system_stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/tz_context.h; + +[PreviousUsedKeilFiles] +SourceFiles=..\Src\main.c;..\Src\stm32l4xx_it.c;..\Src\stm32l4xx_hal_msp.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;../\Src/system_stm32l4xx.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;../\Src/system_stm32l4xx.c;../Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;null; +HeaderPath=..\Drivers\STM32L4xx_HAL_Driver\Inc;..\Drivers\STM32L4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32L4xx\Include;..\Drivers\CMSIS\Include;..\Inc; +CDefines=USE_HAL_DRIVER;STM32L452xx; + diff --git a/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 0000000000..a0365fec02 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,188 @@ +#MicroXplorer Configuration settings - do not modify +File.Version=6 +KeepUserPlacement=true +Mcu.Family=STM32L4 +Mcu.IP0=NVIC +Mcu.IP1=RCC +Mcu.IP2=SYS +Mcu.IP3=USART2 +Mcu.IPNb=4 +Mcu.Name=STM32L452R(C-E)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PC13 +Mcu.Pin1=PC14-OSC32_IN (PC14) +Mcu.Pin10=PB3 (JTDO/TRACESWO) +Mcu.Pin11=VP_SYS_VS_Systick +Mcu.Pin2=PC15-OSC32_OUT (PC15) +Mcu.Pin3=PH0-OSC_IN (PH0) +Mcu.Pin4=PH1-OSC_OUT (PH1) +Mcu.Pin5=PA2 +Mcu.Pin6=PA3 +Mcu.Pin7=PA5 +Mcu.Pin8=PA13 (JTMS/SWDIO) +Mcu.Pin9=PA14 (JTCK/SWCLK) +Mcu.PinsNb=12 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32L452RETx +MxCube.Version=5.2.0 +MxDb.Version=DB.5.0.20 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:true\:false +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:true\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:true\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:true\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:true\:false +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:true\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false +PA13\ (JTMS/SWDIO).GPIOParameters=GPIO_Label +PA13\ (JTMS/SWDIO).GPIO_Label=TMS +PA13\ (JTMS/SWDIO).Locked=true +PA13\ (JTMS/SWDIO).Mode=Serial_Wire +PA13\ (JTMS/SWDIO).Signal=SYS_JTMS-SWDIO +PA14\ (JTCK/SWCLK).GPIOParameters=GPIO_Label +PA14\ (JTCK/SWCLK).GPIO_Label=TCK +PA14\ (JTCK/SWCLK).Locked=true +PA14\ (JTCK/SWCLK).Mode=Serial_Wire +PA14\ (JTCK/SWCLK).Signal=SYS_JTCK-SWCLK +PA2.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode +PA2.GPIO_Label=USART_TX +PA2.GPIO_Mode=GPIO_MODE_AF_PP +PA2.GPIO_PuPd=GPIO_NOPULL +PA2.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PA2.Locked=true +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PA3.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode +PA3.GPIO_Label=USART_RX +PA3.GPIO_Mode=GPIO_MODE_AF_PP +PA3.GPIO_PuPd=GPIO_NOPULL +PA3.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PA3.Locked=true +PA3.Mode=Asynchronous +PA3.Signal=USART2_RX +PA5.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP +PA5.GPIO_Label=LD2 [green Led] +PA5.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP +PA5.GPIO_PuPd=GPIO_NOPULL +PA5.GPIO_Speed=GPIO_SPEED_FREQ_LOW +PA5.Locked=true +PA5.Signal=GPIO_Output +PB3\ (JTDO/TRACESWO).GPIOParameters=GPIO_Label +PB3\ (JTDO/TRACESWO).GPIO_Label=SWO +PB3\ (JTDO/TRACESWO).Locked=true +PB3\ (JTDO/TRACESWO).Signal=SYS_JTDO-SWO +PC13.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI +PC13.GPIO_Label=B1 [Blue PushButton] +PC13.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING +PC13.GPIO_PuPd=GPIO_NOPULL +PC13.Locked=true +PC13.Signal=GPXTI13 +PC14-OSC32_IN\ (PC14).Locked=true +PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator +PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN +PC15-OSC32_OUT\ (PC15).Locked=true +PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator +PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT +PCC.Checker=true +PCC.Line=STM32L4x2 +PCC.MCU=STM32L452R(C-E)Tx +PCC.PartNumber=STM32L452RETx +PCC.Seq0=0 +PCC.Series=STM32L4 +PCC.Temperature=25 +PCC.Vdd=3.0 +PH0-OSC_IN\ (PH0).Locked=true +PH0-OSC_IN\ (PH0).Signal=RCC_OSC_IN +PH1-OSC_OUT\ (PH1).Locked=true +PH1-OSC_OUT\ (PH1).Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32L452RETx +ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.14.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=0 +ProjectManager.MainLocation=Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=CubeMX_Config.ioc +ProjectManager.ProjectName=CubeMX_Config +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=MDK-ARM V5 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART2_UART_Init-USART2-false-HAL-true +RCC.ADCFreq_Value=64000000 +RCC.AHBFreq_Value=80000000 +RCC.APB1Freq_Value=80000000 +RCC.APB1TimFreq_Value=80000000 +RCC.APB2Freq_Value=80000000 +RCC.APB2TimFreq_Value=80000000 +RCC.CortexFreq_Value=80000000 +RCC.DFSDMFreq_Value=80000000 +RCC.FCLKCortexFreq_Value=80000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=80000000 +RCC.HSE_VALUE=8000000 +RCC.HSI48_VALUE=48000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=80000000 +RCC.I2C2Freq_Value=80000000 +RCC.I2C3Freq_Value=80000000 +RCC.I2C4Freq_Value=80000000 +RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSourceVirtual,PREFETCH_ENABLE,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value +RCC.LPTIM1Freq_Value=80000000 +RCC.LPTIM2Freq_Value=80000000 +RCC.LPUART1Freq_Value=80000000 +RCC.LSCOPinFreq_Value=32000 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=80000000 +RCC.MSI_VALUE=4000000 +RCC.PLLN=10 +RCC.PLLPoutputFreq_Value=22857142.85714286 +RCC.PLLQoutputFreq_Value=80000000 +RCC.PLLRCLKFreq_Value=80000000 +RCC.PLLSAI1PoutputFreq_Value=18285714.285714287 +RCC.PLLSAI1QoutputFreq_Value=64000000 +RCC.PLLSAI1RoutputFreq_Value=64000000 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSI +RCC.PREFETCH_ENABLE=1 +RCC.PWRFreq_Value=80000000 +RCC.RNGFreq_Value=64000000 +RCC.SAI1Freq_Value=18285714.285714287 +RCC.SDMMCFreq_Value=64000000 +RCC.SWPMI1Freq_Value=80000000 +RCC.SYSCLKFreq_VALUE=80000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.UART4Freq_Value=80000000 +RCC.UART5Freq_Value=80000000 +RCC.USART1Freq_Value=80000000 +RCC.USART2Freq_Value=80000000 +RCC.USART3Freq_Value=80000000 +RCC.USBFreq_Value=64000000 +RCC.VCOInputFreq_Value=16000000 +RCC.VCOOutputFreq_Value=160000000 +RCC.VCOSAI1OutputFreq_Value=128000000 +RCC.VCOSAI2OutputFreq_Value=128000000 +SH.GPXTI13.0=GPIO_EXTI13 +SH.GPXTI13.ConfNb=1 +USART2.IPParameters=VirtualMode-Asynchronous +USART2.VirtualMode-Asynchronous=VM_ASYNC +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=NUCLEO-L452RE +boardIOC=true diff --git a/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..0abccd5cc8 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,85 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l4xx_hal.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +#define B1_Pin GPIO_PIN_13 +#define B1_GPIO_Port GPIOC +#define USART_TX_Pin GPIO_PIN_2 +#define USART_TX_GPIO_Port GPIOA +#define USART_RX_Pin GPIO_PIN_3 +#define USART_RX_GPIO_Port GPIOA +#define LD2_Pin GPIO_PIN_5 +#define LD2_GPIO_Port GPIOA +#define TMS_Pin GPIO_PIN_13 +#define TMS_GPIO_Port GPIOA +#define TCK_Pin GPIO_PIN_14 +#define TCK_GPIO_Port GPIOA +#define SWO_Pin GPIO_PIN_3 +#define SWO_GPIO_Port GPIOB +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h new file mode 100644 index 0000000000..b8c0d7741b --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h @@ -0,0 +1,440 @@ +/** + ****************************************************************************** + * @file stm32l4xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2019 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32L4xx_HAL_CONF_H +#define __STM32L4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ + +#define HAL_MODULE_ENABLED +/*#define HAL_ADC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_CAN_MODULE_ENABLED */ +/*#define HAL_COMP_MODULE_ENABLED */ +/*#define HAL_CRC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +/*#define HAL_DCMI_MODULE_ENABLED */ +/*#define HAL_DMA2D_MODULE_ENABLED */ +/*#define HAL_DFSDM_MODULE_ENABLED */ +/*#define HAL_DSI_MODULE_ENABLED */ +/*#define HAL_FIREWALL_MODULE_ENABLED */ +/*#define HAL_GFXMMU_MODULE_ENABLED */ +/*#define HAL_HCD_MODULE_ENABLED */ +/*#define HAL_HASH_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +/*#define HAL_LTDC_MODULE_ENABLED */ +/*#define HAL_LCD_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_MMC_MODULE_ENABLED */ +/*#define HAL_NAND_MODULE_ENABLED */ +/*#define HAL_NOR_MODULE_ENABLED */ +/*#define HAL_OPAMP_MODULE_ENABLED */ +/*#define HAL_OSPI_MODULE_ENABLED */ +/*#define HAL_OSPI_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SAI_MODULE_ENABLED */ +/*#define HAL_SD_MODULE_ENABLED */ +/*#define HAL_SMBUS_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SPI_MODULE_ENABLED */ +/*#define HAL_SRAM_MODULE_ENABLED */ +/*#define HAL_SWPMI_MODULE_ENABLED */ +/*#define HAL_TIM_MODULE_ENABLED */ +/*#define HAL_TSC_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +/*#define HAL_EXTI_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal Multiple Speed oscillator (MSI) default value. + * This value is the default MSI range value after Reset. + */ +#if !defined (MSI_VALUE) + #define MSI_VALUE ((uint32_t)4000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* MSI_VALUE */ +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined (HSI48_VALUE) + #define HSI48_VALUE ((uint32_t)48000000U) /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz. + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ + +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for SAI1 peripheral + * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source + * frequency. + */ +#if !defined (EXTERNAL_SAI1_CLOCK_VALUE) + #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000U) /*!< Value of the SAI1 External clock source in Hz*/ +#endif /* EXTERNAL_SAI1_CLOCK_VALUE */ + +/** + * @brief External clock source for SAI2 peripheral + * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source + * frequency. + */ +#if !defined (EXTERNAL_SAI2_CLOCK_VALUE) + #define EXTERNAL_SAI2_CLOCK_VALUE ((uint32_t)48000U) /*!< Value of the SAI2 External clock source in Hz*/ +#endif /* EXTERNAL_SAI2_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ + +#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver + * Activated: CRC code is present inside driver + * Deactivated: CRC code cleaned from driver + */ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32l4xx_hal_rcc.h" + #include "stm32l4xx_hal_rcc_ex.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32l4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32l4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32l4xx_hal_dma.h" + #include "stm32l4xx_hal_dma_ex.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32l4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32l4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32l4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32l4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED + #include "stm32l4xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32l4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32l4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32l4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32l4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32l4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32l4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_FIREWALL_MODULE_ENABLED + #include "stm32l4xx_hal_firewall.h" +#endif /* HAL_FIREWALL_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32l4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32l4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32l4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32l4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32l4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32l4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32l4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32l4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LCD_MODULE_ENABLED + #include "stm32l4xx_hal_lcd.h" +#endif /* HAL_LCD_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32l4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32l4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED + #include "stm32l4xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_OSPI_MODULE_ENABLED + #include "stm32l4xx_hal_ospi.h" +#endif /* HAL_OSPI_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32l4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32l4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32l4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32l4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32l4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32l4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32l4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32l4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_SWPMI_MODULE_ENABLED + #include "stm32l4xx_hal_swpmi.h" +#endif /* HAL_SWPMI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32l4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_TSC_MODULE_ENABLED + #include "stm32l4xx_hal_tsc.h" +#endif /* HAL_TSC_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32l4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32l4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32l4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32l4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32l4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32l4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32l4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_GFXMMU_MODULE_ENABLED + #include "stm32l4xx_hal_gfxmmu.h" +#endif /* HAL_GFXMMU_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((char *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(char *file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L4xx_HAL_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h new file mode 100644 index 0000000000..54934911ff --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h @@ -0,0 +1,69 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32L4xx_IT_H +#define __STM32L4xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L4xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..bac817252b --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/main.c @@ -0,0 +1,263 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +UART_HandleTypeDef huart2; + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART2_UART_Init(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART2_UART_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 10; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } + /** Configure the main internal regulator output voltage + */ + if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief USART2 Initialization Function + * @param None + * @retval None + */ +static void MX_USART2_UART_Init(void) +{ + + /* USER CODE BEGIN USART2_Init 0 */ + + /* USER CODE END USART2_Init 0 */ + + /* USER CODE BEGIN USART2_Init 1 */ + + /* USER CODE END USART2_Init 1 */ + huart2.Instance = USART2; + huart2.Init.BaudRate = 115200; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&huart2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART2_Init 2 */ + + /* USER CODE END USART2_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(char *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c new file mode 100644 index 0000000000..1a017f9e06 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c @@ -0,0 +1,149 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32l4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART2_MspInit 1 */ + + /* USER CODE END USART2_MspInit 1 */ + } + +} + +/** +* @brief UART MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOA, USART_TX_Pin|USART_RX_Pin); + + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c new file mode 100644 index 0000000000..2c0d8a0ff2 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c @@ -0,0 +1,203 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32l4xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Prefetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32L4xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32l4xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c new file mode 100644 index 0000000000..26bd517974 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c @@ -0,0 +1,337 @@ +/** + ****************************************************************************** + * @file system_stm32l4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32l4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * After each device reset the MSI (4 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32l4xx.s" file, to + * configure the system clock before to branch to main program. + * + * This file configures the system clock as follows: + *============================================================================= + *----------------------------------------------------------------------------- + * System Clock source | MSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 4000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 4000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 1 + *----------------------------------------------------------------------------- + * PLL_M | 1 + *----------------------------------------------------------------------------- + * PLL_N | 8 + *----------------------------------------------------------------------------- + * PLL_P | 7 + *----------------------------------------------------------------------------- + * PLL_Q | 2 + *----------------------------------------------------------------------------- + * PLL_R | 2 + *----------------------------------------------------------------------------- + * PLLSAI1_P | NA + *----------------------------------------------------------------------------- + * PLLSAI1_Q | NA + *----------------------------------------------------------------------------- + * PLLSAI1_R | NA + *----------------------------------------------------------------------------- + * PLLSAI2_P | NA + *----------------------------------------------------------------------------- + * PLLSAI2_Q | NA + *----------------------------------------------------------------------------- + * PLLSAI2_R | NA + *----------------------------------------------------------------------------- + * Require 48MHz for USB OTG FS, | Disabled + * SDIO and RNG clock | + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32l4xx_system + * @{ + */ + +/** @addtogroup STM32L4xx_System_Private_Includes + * @{ + */ + +#include "stm32l4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (MSI_VALUE) + #define MSI_VALUE 4000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* MSI_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Variables + * @{ + */ + /* The SystemCoreClock variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 4000000U; + + const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; + const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; + const uint32_t MSIRangeTable[12] = {100000U, 200000U, 400000U, 800000U, 1000000U, 2000000U, \ + 4000000U, 8000000U, 16000000U, 24000000U, 32000000U, 48000000U}; +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ + +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set MSION bit */ + RCC->CR |= RCC_CR_MSION; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000U; + + /* Reset HSEON, CSSON , HSION, and PLLON bits */ + RCC->CR &= 0xEAF6FFFFU; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x00001000U; + + /* Reset HSEBYP bit */ + RCC->CR &= 0xFFFBFFFFU; + + /* Disable all interrupts */ + RCC->CIER = 0x00000000U; + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*) + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) + * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) MSI_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 4 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSI_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (***) HSE_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 8 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0U, msirange = 0U, pllvco = 0U, pllr = 2U, pllsource = 0U, pllm = 2U; + + /* Get MSI Range frequency--------------------------------------------------*/ + if((RCC->CR & RCC_CR_MSIRGSEL) == RESET) + { /* MSISRANGE from RCC_CSR applies */ + msirange = (RCC->CSR & RCC_CSR_MSISRANGE) >> 8U; + } + else + { /* MSIRANGE from RCC_CR applies */ + msirange = (RCC->CR & RCC_CR_MSIRANGE) >> 4U; + } + /*MSI frequency range in HZ*/ + msirange = MSIRangeTable[msirange]; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case 0x00: /* MSI used as system clock source */ + SystemCoreClock = msirange; + break; + + case 0x04: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + + case 0x08: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + + case 0x0C: /* PLL used as system clock source */ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4U) + 1U ; + + switch (pllsource) + { + case 0x02: /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm); + break; + + case 0x03: /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm); + break; + + default: /* MSI used as PLL clock source */ + pllvco = (msirange / pllm); + break; + } + pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8U); + pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25U) + 1U) * 2U; + SystemCoreClock = pllvco/pllr; + break; + + default: + SystemCoreClock = msirange; + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l452-st-nucleo/board/Kconfig b/bsp/stm32/stm32l452-st-nucleo/board/Kconfig new file mode 100644 index 0000000000..4a6113c652 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/Kconfig @@ -0,0 +1,87 @@ +menu "Hardware Drivers Config" + +config SOC_STM32L452RE + bool + select SOC_SERIES_STM32L4 + default y + +menu "Onboard Peripheral Drivers" + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default n + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART2 + bool "Enable UART2" + default y + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + endif + + menuconfig BSP_USING_I2C1 + bool "Enable I2C1 BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C1 + config BSP_I2C1_SCL_PIN + int "i2c1 scl pin number" + range 1 176 + default 15 + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 1 176 + default 16 + endif + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32l452-st-nucleo/board/SConscript b/bsp/stm32/stm32l452-st-nucleo/board/SConscript new file mode 100644 index 0000000000..ab57c2310a --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/SConscript @@ -0,0 +1,40 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Src/stm32l4xx_hal_msp.c +''') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/gcc/startup_stm32l452xx.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/arm/startup_stm32l452xx.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/iar/startup_stm32l452xx.s'] + +# STM32L412xx || STM32L422xx || STM32L431xx +# STM32L432xx || STM32L433xx || STM32L442xx +# STM32L443xx || STM32L451xx || STM32L452xx +# STM32L462xx || STM32L471xx || STM32L475xx +# STM32L476xx || STM32L485xx || STM32L486xx +# STM32L496xx || STM32L4A6xx || STM32L4R5xx +# STM32L4R7xx || STM32L4R9xx || STM32L4S5xx +# STM32L4S7xx || STM32L4S9xx +# You can select chips from the list above +CPPDEFINES = ['STM32L452xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') + diff --git a/bsp/stm32/stm32l452-st-nucleo/board/board.c b/bsp/stm32/stm32l452-st-nucleo/board/board.c new file mode 100644 index 0000000000..5ab9da967a --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/board.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + */ + +#include "board.h" + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 10; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } + /** Configure the main internal regulator output voltage + */ + if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) + { + Error_Handler(); + } +} diff --git a/bsp/stm32/stm32l452-st-nucleo/board/board.h b/bsp/stm32/stm32l452-st-nucleo/board/board.h new file mode 100644 index 0000000000..1ea1e6be9c --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/board.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-5 SummerGift first version + * 2019-04-24 yangjie Use the end of ZI as HEAP_BEGIN + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +#include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (512 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +#define STM32_SRAM1_SIZE (128) +#define STM32_SRAM1_START (0x20000000) +#define STM32_SRAM1_END (STM32_SRAM1_START + STM32_SRAM1_SIZE * 1024) + +#if defined(__CC_ARM) || defined(__CLANG_ARM) +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN ((void *)&__bss_end) +#endif + +#define HEAP_END STM32_SRAM1_END + +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/bsp/stm32/stm32l452-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32l452-st-nucleo/board/linker_scripts/link.icf new file mode 100644 index 0000000000..2b2e437e46 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/linker_scripts/link.icf @@ -0,0 +1,29 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; + +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0400; +define symbol __ICFEDIT_size_heap__ = 0x0000; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, last block CSTACK}; diff --git a/bsp/stm32/stm32l452-st-nucleo/board/linker_scripts/link.lds b/bsp/stm32/stm32l452-st-nucleo/board/linker_scripts/link.lds new file mode 100644 index 0000000000..63a48c0d70 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/linker_scripts/link.lds @@ -0,0 +1,156 @@ +/* + * linker script for STM32L4XX with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 512k /* 512KB flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128KB sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } > RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } > RAM + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/stm32/stm32l452-st-nucleo/board/linker_scripts/link.sct b/bsp/stm32/stm32l452-st-nucleo/board/linker_scripts/link.sct new file mode 100644 index 0000000000..5d1e3e6c00 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00080000 { ; load region size_region + ER_IROM1 0x08000000 0x00080000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x00020000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32l452-st-nucleo/figures/board.jpg b/bsp/stm32/stm32l452-st-nucleo/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f70d526cf35e8a093455a9eb36e13790caba54b GIT binary patch literal 280342 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
V?GHH)KX19gaX2uH<- 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≺* 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

x3wjHSm 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

L=O|65%QTnkRy!LdO8)>qo<}wp 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 KS_ + + 3 + + rt-thread + + ARM + + 1 + + C-SPY + 2 + + 30 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 30 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/stm32/stm32l452-st-nucleo/project.ewp b/bsp/stm32/stm32l452-st-nucleo/project.ewp new file mode 100644 index 0000000000..9a449d653f --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/project.ewp @@ -0,0 +1,2315 @@ + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\cpu.c + + + $PROJ_DIR$\..\..\..\src\device.c + + + $PROJ_DIR$\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\src\scheduler.c + + + $PROJ_DIR$\..\..\..\src\signal.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\board\CubeMX_Config\Src\stm32l4xx_hal_msp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\iar\startup_stm32l452xx.s + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_common.c + + + + cpu + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\workqueue.c + + + + finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\symbol.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_file.c + + + + STM32_HAL + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_comp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rng.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart_ex.c + + + diff --git a/bsp/stm32/stm32l452-st-nucleo/project.eww b/bsp/stm32/stm32l452-st-nucleo/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32l452-st-nucleo/project.uvoptx b/bsp/stm32/stm32l452-st-nucleo/project.uvoptx new file mode 100644 index 0000000000..de7f5969dd --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/project.uvoptx @@ -0,0 +1,1021 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + (105=-1,-1,-1,-1,0) + + + 0 + JL2CM3 + -U777479148 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8008 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L452RETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32L4xx_512 -FL080000 -FS08000000 -FP0($$Device:STM32L452RETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + 0 + ST-LINKIII-KEIL_SWO + -U066AFF323535474B43132832 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L452RETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + + + 0 + + + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Kernel + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu.c + cpu.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 1 + 9 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 1 + 10 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 1 + 11 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 1 + 12 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler.c + scheduler.c + 0 + 0 + + + 1 + 13 + 1 + 0 + 0 + 0 + ..\..\..\src\signal.c + signal.c + 0 + 0 + + + 1 + 14 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 1 + 15 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Applications + 0 + 0 + 0 + 0 + + 2 + 16 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 3 + 17 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + board\CubeMX_Config\Src\stm32l4xx_hal_msp.c + stm32l4xx_hal_msp.c + 0 + 0 + + + 3 + 19 + 2 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\arm\startup_stm32l452xx.s + startup_stm32l452xx.s + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + + + cpu + 0 + 0 + 0 + 0 + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\backtrace.c + backtrace.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + 4 + 27 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\completion.c + completion.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\dataqueue.c + dataqueue.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\pipe.c + pipe.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\waitqueue.c + waitqueue.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\workqueue.c + workqueue.c + 0 + 0 + + + + + finsh + 0 + 0 + 0 + 0 + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\symbol.c + symbol.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_cmd.c + msh_cmd.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_file.c + msh_file.c + 0 + 0 + + + + + STM32_HAL + 0 + 0 + 0 + 0 + + 7 + 43 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c + system_stm32l4xx.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + stm32l4xx_hal.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_comp.c + stm32l4xx_hal_comp.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + stm32l4xx_hal_cortex.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc.c + stm32l4xx_hal_crc.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc_ex.c + stm32l4xx_hal_crc_ex.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp.c + stm32l4xx_hal_cryp.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp_ex.c + stm32l4xx_hal_cryp_ex.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + stm32l4xx_hal_dma.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + stm32l4xx_hal_dma_ex.c + 0 + 0 + + + 7 + 53 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c + stm32l4xx_hal_exti.c + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + stm32l4xx_hal_pwr.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + stm32l4xx_hal_pwr_ex.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + stm32l4xx_hal_rcc.c + 0 + 0 + + + 7 + 57 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + stm32l4xx_hal_rcc_ex.c + 0 + 0 + + + 7 + 58 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rng.c + stm32l4xx_hal_rng.c + 0 + 0 + + + 7 + 59 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + stm32l4xx_hal_gpio.c + 0 + 0 + + + 7 + 60 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + stm32l4xx_hal_uart.c + 0 + 0 + + + 7 + 61 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + stm32l4xx_hal_uart_ex.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart.c + stm32l4xx_hal_usart.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart_ex.c + stm32l4xx_hal_usart_ex.c + 0 + 0 + + + + diff --git a/bsp/stm32/stm32l452-st-nucleo/project.uvprojx b/bsp/stm32/stm32l452-st-nucleo/project.uvprojx new file mode 100644 index 0000000000..79fa8f38d3 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/project.uvprojx @@ -0,0 +1,742 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32L452RETx + STMicroelectronics + Keil.STM32L4xx_DFP.2.2.0 + http://www.keil.com/pack + IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00008000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L452RETx$CMSIS\Flash\STM32L4xx_512.FLM)) + 0 + $$Device:STM32L452RETx$Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l4xx.h + + + + + + + + + + $$Device:STM32L452RETx$CMSIS\SVD\STM32L4x2.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 1 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x10000000 + 0x8000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + USE_HAL_DRIVER, STM32L452xx + + .;..\..\..\include;.;applications;board;board\CubeMX_Config\Inc;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m4;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Inc;..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Include;..\libraries\STM32L4xx_HAL\CMSIS\Include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + cpu.c + 1 + ..\..\..\src\cpu.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + signal.c + 1 + ..\..\..\src\signal.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + stm32l4xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32l4xx_hal_msp.c + + + startup_stm32l452xx.s + 2 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\arm\startup_stm32l452xx.s + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\HAL_Drivers\drv_usart.c + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + + + cpu + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + + + + + DeviceDrivers + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + symbol.c + 1 + ..\..\..\components\finsh\symbol.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + msh_cmd.c + 1 + ..\..\..\components\finsh\msh_cmd.c + + + msh_file.c + 1 + ..\..\..\components\finsh\msh_file.c + + + + + STM32_HAL + + + system_stm32l4xx.c + 1 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c + + + stm32l4xx_hal.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + + + stm32l4xx_hal_comp.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_comp.c + + + stm32l4xx_hal_cortex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + + + stm32l4xx_hal_crc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc.c + + + stm32l4xx_hal_crc_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc_ex.c + + + stm32l4xx_hal_cryp.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp.c + + + stm32l4xx_hal_cryp_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp_ex.c + + + stm32l4xx_hal_dma.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + + + stm32l4xx_hal_dma_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + + + stm32l4xx_hal_exti.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c + + + stm32l4xx_hal_pwr.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + + + stm32l4xx_hal_pwr_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + + + stm32l4xx_hal_rcc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + + + stm32l4xx_hal_rcc_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + + + stm32l4xx_hal_rng.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rng.c + + + stm32l4xx_hal_gpio.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + + + stm32l4xx_hal_uart.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + + + stm32l4xx_hal_uart_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + + + stm32l4xx_hal_usart.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart.c + + + stm32l4xx_hal_usart_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart_ex.c + + + + + + + + + + + + + +
diff --git a/bsp/stm32/stm32l452-st-nucleo/rtconfig.h b/bsp/stm32/stm32l452-st-nucleo/rtconfig.h new file mode 100644 index 0000000000..23251d815f --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/rtconfig.h @@ -0,0 +1,177 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 4 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_USING_IDLE_HOOK +#define RT_IDEL_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_DEBUG +#define RT_DEBUG_COLOR + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 256 +#define RT_CONSOLE_DEVICE_NAME "uart2" +#define RT_VER_NUM 0x40002 +#define ARCH_ARM +#define RT_USING_CPU_FFS +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M4 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 + +/* C++ features */ + + +/* Command shell */ + +#define RT_USING_FINSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_USING_DESCRIPTION +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_CMD_SIZE 80 +#define FINSH_USING_MSH +#define FINSH_USING_MSH_DEFAULT +#define FINSH_USING_MSH_ONLY +#define FINSH_ARG_MAX 10 + +/* Device virtual file system */ + + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_PIPE_BUFSZ 512 +#define RT_USING_SERIAL +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN + +/* Using Hardware Crypto drivers */ + + +/* Using WiFi */ + + +/* Using USB */ + + +/* POSIX layer and C standard library */ + + +/* Network */ + +/* Socket abstraction layer */ + + +/* Network interface device */ + + +/* light weight TCP/IP stack */ + + +/* Modbus master and slave stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + + +/* multimedia packages */ + + +/* tools packages */ + + +/* system packages */ + + +/* peripheral libraries and drivers */ + + +/* miscellaneous packages */ + + +/* samples: kernel and components samples */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32L4 + +/* Hardware Drivers Config */ + +#define SOC_STM32L452RE + +/* Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART2 + +/* Board extended module Drivers */ + + +#endif diff --git a/bsp/stm32/stm32l452-st-nucleo/rtconfig.py b/bsp/stm32/stm32l452-st-nucleo/rtconfig.py new file mode 100644 index 0000000000..2e022a964b --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/rtconfig.py @@ -0,0 +1,143 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + CXX = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M4.fp ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict --scatter "board\linker_scripts\link.sct"' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M4' + AFLAGS += ' --fpu VFPv4_sp' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' diff --git a/bsp/stm32/stm32l452-st-nucleo/template.ewp b/bsp/stm32/stm32l452-st-nucleo/template.ewp new file mode 100644 index 0000000000..6f4eceb87c --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/template.ewp @@ -0,0 +1,2074 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + diff --git a/bsp/stm32/stm32l452-st-nucleo/template.eww b/bsp/stm32/stm32l452-st-nucleo/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32l452-st-nucleo/template.uvoptx b/bsp/stm32/stm32l452-st-nucleo/template.uvoptx new file mode 100644 index 0000000000..7d3e246607 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/template.uvoptx @@ -0,0 +1,197 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + JL2CM3 + -U777479148 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8008 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L452RETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32L4xx_512 -FL080000 -FS08000000 -FP0($$Device:STM32L452RETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + 0 + ST-LINKIII-KEIL_SWO + -U066AFF323535474B43132832 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("") -D00(00000000) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L452RETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/stm32/stm32l452-st-nucleo/template.uvprojx b/bsp/stm32/stm32l452-st-nucleo/template.uvprojx new file mode 100644 index 0000000000..5ef9d684e7 --- /dev/null +++ b/bsp/stm32/stm32l452-st-nucleo/template.uvprojx @@ -0,0 +1,395 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32L452RETx + STMicroelectronics + Keil.STM32L4xx_DFP.2.2.0 + http://www.keil.com/pack + IRAM(0x20000000,0x00020000) IRAM2(0x10000000,0x00008000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L452RETx$CMSIS\Flash\STM32L4xx_512.FLM)) + 0 + $$Device:STM32L452RETx$Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l4xx.h + + + + + + + + + + $$Device:STM32L452RETx$CMSIS\SVD\STM32L4x2.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 1 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x10000000 + 0x8000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + + + + + + + +

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