diff --git a/.github/workflows/action.yml b/.github/workflows/action.yml index 1184bc40f0..f98870e0d0 100644 --- a/.github/workflows/action.yml +++ b/.github/workflows/action.yml @@ -31,6 +31,7 @@ jobs: legs: - {RTT_BSP: "acm32f0x0-nucleo", RTT_TOOL_CHAIN: "sourcery-arm"} - {RTT_BSP: "CME_M7", RTT_TOOL_CHAIN: "sourcery-arm"} + - {RTT_BSP: "apm32/apm32f103xe-minibroard", RTT_TOOL_CHAIN: "sourcery-arm"} - {RTT_BSP: "apollo2", RTT_TOOL_CHAIN: "sourcery-arm"} - {RTT_BSP: "asm9260t", RTT_TOOL_CHAIN: "sourcery-arm"} - {RTT_BSP: "at91sam9260", RTT_TOOL_CHAIN: "sourcery-arm"} diff --git a/bsp/Copyright_Notice.md b/bsp/Copyright_Notice.md index ff730a9cb0..7a805d1771 100644 --- a/bsp/Copyright_Notice.md +++ b/bsp/Copyright_Notice.md @@ -20,6 +20,33 @@ Path: - bsp/acm32f0x0-nucleo/libraries +### apm32 + +bsp 列表: +- apm32f103xe-minibroard + +------ + +License: GEEHY SOFTWARE PACKAGE LICENSE + +Copyright: Copyright (C) 2020-2022 Geehy Semiconductor + +Path: + +- bsp\apm32\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver +- bsp\apm32\libraries\APM32F10x_Library\Device +- bsp\apm32\libraries\APM32F10x_Library\USB_Device_Lib + +------ + +License: bsd-new + +Copyright (c) 2009-2018 Arm Limited + +Path: + +- bsp\apm32\libraries\APM32F10x_Library\CMSIS\Include + ### apollo2 License: bsd-new diff --git a/bsp/apm32/apm32f103xe-minibroard/README.md b/bsp/apm32/apm32f103xe-minibroard/README.md index 63f3df1030..5284f30f92 100644 --- a/bsp/apm32/apm32f103xe-minibroard/README.md +++ b/bsp/apm32/apm32f103xe-minibroard/README.md @@ -17,17 +17,18 @@ APM32F103ZE MINI BOARD,采用标准JTAG/SWD调试接口,引出了全部的IO ![board](figures/APM32F103ZE.png) +- 有关开发板和芯片的详情可至极海官网查阅。[官网开发板链接 ](https://www.geehy.com/support/apm32?id=192) 该开发板常用 **板载资源** 如下: -- MCU:APM32F103C8T6,主频 96MHz,512KB FLASH ,128KB RAM +- MCU:APM32F103ZET6,主频 96MHz,512KB FLASH ,128KB RAM - 外部 RAM:无 - 外部 FLASH:无 - 常用外设 - LED:2个,(黄色,PE5/PE6) - 按键:2个,K1(兼具唤醒功能,PA0),K2(PC13) -- 常用接口:RS232转串口、、USB SLAVE +- 常用接口:RS232转串口、USB SLAVE - 调试接口:标准 JTAG/SWD @@ -42,6 +43,14 @@ APM32F103ZE MINI BOARD,采用标准JTAG/SWD调试接口,引出了全部的IO | **片上外设** | **支持情况** | **备注** | | GPIO | 支持 | PA0, PA1... PG15 ---> PIN: 0, 1...143 | | UART | 支持 | UART1/2 | +| ADC | 支持 | ADC1/2/3 | +| DAC | 支持 | DAC1 | +| RTC | 支持 | | +| TMR | 支持 | TMR1/2/3/4/5/6/7/8 | +| PWM | 支持 | TMR3 ->CH1/2 | +| I2C | 支持 | 软件I2C | +| SPI | 支持 | SPI1/2/3 | +| WDT | 支持 | IWDT | ## 使用说明 @@ -57,11 +66,28 @@ APM32F103ZE MINI BOARD,采用标准JTAG/SWD调试接口,引出了全部的IO 使用数据线连接开发板到 PC,打开电源开关。 #### 编译下载 +- 方式一:MDK -双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + 双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 > 工程默认配置使用 J-Link 仿真器下载程序,在通过 J-Link 连接开发板的基础上,点击下载按钮即可下载程序到开发板 +- 方式二:J-Flash下载 + + 通过ENV工具的scons指令或MDK编译出bin文件后,再使用J-Flash工具将bin文件下载至开发板即可,大致步骤如下: + +##### 1、建立J-Flash工程 + +![board](figures/JFlash_leader_01.png) + +##### 2、连接开发板 + +![board](figures/JFlash_leader_02.png) +##### 3、将bin文件拖至工程,起始地址设为0x8000000 +![board](figures/JFlash_leader_03.png) +##### 4、点击下载 +![board](figures/JFlash_leader_04.png) + #### 运行结果 下载程序成功之后,系统会自动运行,LED 闪烁 @@ -71,7 +97,7 @@ APM32F103ZE MINI BOARD,采用标准JTAG/SWD调试接口,引出了全部的IO ```bash \ | / - RT - Thread Operating System - / | \ 4.0.4 build Aug 20 2021 + / | \ 4.1.0 build Aug 20 2021 2006 - 2021 Copyright by rt-thread team msh > ``` @@ -81,4 +107,6 @@ msh > ## 联系人信息 --[abbbcc ](https://gitee.com/abbbcc) \ No newline at end of file +-[abbbcc ](https://gitee.com/abbbcc) + +-[stevetong459 ](https://github.com/stevetong459) diff --git a/bsp/apm32/apm32f103xe-minibroard/board/Kconfig b/bsp/apm32/apm32f103xe-minibroard/board/Kconfig index 983731fc10..2146256f92 100644 --- a/bsp/apm32/apm32f103xe-minibroard/board/Kconfig +++ b/bsp/apm32/apm32f103xe-minibroard/board/Kconfig @@ -24,6 +24,155 @@ menu "On-chip Peripheral Drivers" default y endif + + menuconfig BSP_USING_ADC + bool "Enable ADC" + default n + select RT_USING_ADC + if BSP_USING_ADC + config BSP_USING_ADC1 + bool "Enable ADC1" + default n + config BSP_USING_ADC2 + bool "Enable ADC2" + default n + config BSP_USING_ADC3 + bool "Enable ADC3" + default n + endif + + menuconfig BSP_USING_DAC + bool "Enable DAC" + default n + select RT_USING_DAC + if BSP_USING_DAC + config BSP_USING_DAC1 + bool "Enable DAC1" + default n + endif + + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + 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 + + 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 0 63 + default 22 + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 0 63 + default 23 + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1" + default n + + config BSP_USING_SPI2 + bool "Enable SPI2" + default n + + config BSP_USING_SPI3 + bool "Enable SPI3" + default n + endif + + menuconfig BSP_USING_TMR + bool "Enable Timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TMR + config BSP_USING_TMR1 + bool "Enable TMR1" + default n + + config BSP_USING_TMR2 + bool "Enable TMR2" + default n + + config BSP_USING_TMR3 + bool "Enable TMR3" + default n + + config BSP_USING_TMR4 + bool "Enable TMR4" + default n + + config BSP_USING_TMR5 + bool "Enable TMR5" + default n + + config BSP_USING_TMR6 + bool "Enable TMR6" + default n + + config BSP_USING_TMR7 + bool "Enable TMR7" + default n + + config BSP_USING_TMR8 + bool "Enable TMR8" + default n + endif + + menuconfig BSP_USING_PWM + bool "Enable PWM" + default n + select RT_USING_PWM + if BSP_USING_PWM + menuconfig BSP_USING_PWM3 + bool "Enable timer3 output pwm" + default n + if BSP_USING_PWM3 + config BSP_USING_PWM3_CH1 + bool "Enable PWM3 channel1" + default n + + config BSP_USING_PWM3_CH2 + bool "Enable PWM3 channel2" + default n + + config BSP_USING_PWM3_CH3 + bool "Enable PWM3 channel3" + default n + + config BSP_USING_PWM3_CH4 + bool "Enable PWM3 channel4" + default n + endif + endif + + config BSP_USING_WDT + bool "Enable Watchdog Timer" + select RT_USING_WDT + default n + endmenu endmenu diff --git a/bsp/apm32/apm32f103xe-minibroard/board/SConscript b/bsp/apm32/apm32f103xe-minibroard/board/SConscript index f453b68f6a..d0a821621f 100644 --- a/bsp/apm32/apm32f103xe-minibroard/board/SConscript +++ b/bsp/apm32/apm32f103xe-minibroard/board/SConscript @@ -16,9 +16,15 @@ path = [cwd] startup_path_prefix = SDK_LIB if rtconfig.CROSS_TOOL == 'keil': - src += [startup_path_prefix + '/APM32F10x_Library/Device/Geehy/APM32F10x/Source/ARM/startup_apm32f10x_hd.s'] + src += [startup_path_prefix + '/APM32F10x_Library/Device/Geehy/APM32F10x/Source/arm/startup_apm32f10x_hd.s'] + +if rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/APM32F10x_Library/Device/Geehy/APM32F10x/Source/iar/startup_apm32f10x_hd.s'] + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/APM32F10x_Library/Device/Geehy/APM32F10x/Source/gcc/startup_apm32f10x_hd.s'] # You can select chips from the list above -CPPDEFINES = ['APM32F103xE'] +CPPDEFINES = ['APM32F10X_HD'] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) Return('group') diff --git a/bsp/apm32/apm32f103xe-minibroard/board/board.c b/bsp/apm32/apm32f103xe-minibroard/board/board.c index bec2c01cde..4fb464f3c2 100644 --- a/bsp/apm32/apm32f103xe-minibroard/board/board.c +++ b/bsp/apm32/apm32f103xe-minibroard/board/board.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -13,15 +13,15 @@ void apm32_usart_init(void) { GPIO_Config_T GPIO_ConfigStruct; - + #ifdef BSP_USING_UART1 RCM_EnableAPB2PeriphClock((RCM_APB2_PERIPH_T)(RCM_APB2_PERIPH_GPIOA | RCM_APB2_PERIPH_USART1)); - + GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP; GPIO_ConfigStruct.pin = GPIO_PIN_9; GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz; GPIO_Config(GPIOA, &GPIO_ConfigStruct); - + GPIO_ConfigStruct.mode = GPIO_MODE_IN_PU; GPIO_ConfigStruct.pin = GPIO_PIN_10; GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz; @@ -31,12 +31,12 @@ void apm32_usart_init(void) #ifdef BSP_USING_UART2 RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA); RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_USART2); - + GPIO_ConfigStruct.mode = GPIO_MODE_AF_PP; GPIO_ConfigStruct.pin = GPIO_PIN_2; GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz; GPIO_Config(GPIOA, &GPIO_ConfigStruct); - + GPIO_ConfigStruct.mode = GPIO_MODE_IN_PU; GPIO_ConfigStruct.pin = GPIO_PIN_3; GPIO_ConfigStruct.speed = GPIO_SPEED_50MHz; diff --git a/bsp/apm32/apm32f103xe-minibroard/board/board.h b/bsp/apm32/apm32f103xe-minibroard/board/board.h index b2f4773b26..83840ecc87 100644 --- a/bsp/apm32/apm32f103xe-minibroard/board/board.h +++ b/bsp/apm32/apm32f103xe-minibroard/board/board.h @@ -1,11 +1,12 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: - * Date Author Notes - * 2020-08-20 Abbcc first version + * Date Author Notes + * 2020-08-20 Abbcc first version + * 2022-03-04 stevetong459 Add head file of new driver */ #ifndef __BOARD_H__ @@ -21,6 +22,27 @@ #include "apm32f10x_eint.h" #include "apm32f10x_usart.h" +#if defined(RT_USING_ADC) + #include "apm32f10x_adc.h" +#endif +#if defined(RT_USING_DAC) + #include "apm32f10x_dac.h" +#endif +#if defined(RT_USING_RTC) + #include "apm32f10x_rtc.h" + #include "apm32f10x_pmu.h" +#endif +#if defined(RT_USING_SPI) + #include "apm32f10x_spi.h" +#endif +#if defined(RT_USING_HWTIMER) || defined(RT_USING_PWM) + #include "apm32f10x_tmr.h" +#endif +#if defined(RT_USING_WDT) + #include "apm32f10x_iwdt.h" + #include "apm32f10x_wwdt.h" +#endif + #include "drv_common.h" #include "drv_gpio.h" diff --git a/bsp/apm32/apm32f103xe-minibroard/board/linker_scripts/link.icf b/bsp/apm32/apm32f103xe-minibroard/board/linker_scripts/link.icf new file mode 100644 index 0000000000..8a71ffd87c --- /dev/null +++ b/bsp/apm32/apm32f103xe-minibroard/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__ = 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/apm32/apm32f103xe-minibroard/board/linker_scripts/link.lds b/bsp/apm32/apm32f103xe-minibroard/board/linker_scripts/link.lds new file mode 100644 index 0000000000..592dad353f --- /dev/null +++ b/bsp/apm32/apm32f103xe-minibroard/board/linker_scripts/link.lds @@ -0,0 +1,141 @@ +/* + * linker script for APM32F10x with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + CODE (rx) : ORIGIN = 0x08000000, LENGTH = 512k /* 512KB flash */ + DATA (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 = .; + . = ALIGN(4); + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + . = ALIGN(4); + + . = ALIGN(4); + _etext = .; + } > CODE = 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 = .; + } > CODE + __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*) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >DATA + + .stack : + { + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >DATA + + __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) + } > DATA + __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/apm32/apm32f103xe-minibroard/figures/JFlash_Leader_01.png b/bsp/apm32/apm32f103xe-minibroard/figures/JFlash_Leader_01.png new file mode 100644 index 0000000000..5640216ae5 Binary files /dev/null and b/bsp/apm32/apm32f103xe-minibroard/figures/JFlash_Leader_01.png differ diff --git a/bsp/apm32/apm32f103xe-minibroard/figures/JFlash_Leader_02.png b/bsp/apm32/apm32f103xe-minibroard/figures/JFlash_Leader_02.png new file mode 100644 index 0000000000..93984c1a90 Binary files /dev/null and b/bsp/apm32/apm32f103xe-minibroard/figures/JFlash_Leader_02.png differ diff --git a/bsp/apm32/apm32f103xe-minibroard/figures/JFlash_Leader_03.png b/bsp/apm32/apm32f103xe-minibroard/figures/JFlash_Leader_03.png new file mode 100644 index 0000000000..6280b5d664 Binary files /dev/null and b/bsp/apm32/apm32f103xe-minibroard/figures/JFlash_Leader_03.png differ diff --git a/bsp/apm32/apm32f103xe-minibroard/figures/JFlash_Leader_04.png b/bsp/apm32/apm32f103xe-minibroard/figures/JFlash_Leader_04.png new file mode 100644 index 0000000000..b133313482 Binary files /dev/null and b/bsp/apm32/apm32f103xe-minibroard/figures/JFlash_Leader_04.png differ diff --git a/bsp/apm32/apm32f103xe-minibroard/project.ewp b/bsp/apm32/apm32f103xe-minibroard/project.ewp new file mode 100644 index 0000000000..7d5c9b980f --- /dev/null +++ b/bsp/apm32/apm32f103xe-minibroard/project.ewp @@ -0,0 +1,2346 @@ + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 1 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Compiler + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\time.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\stdlib.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscalls.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_write.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_mem.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_remove.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\environ.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_close.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_read.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_lseek.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_open.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-m3\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m3\context_iar.S + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\workqueue.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 + + + + Drivers + + $PROJ_DIR$\..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\iar\startup_apm32f10x_hd.s + + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\..\libraries\Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\Drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\Drivers\drv_common.c + + + + Finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + + Kernel + + $PROJ_DIR$\..\..\..\src\scheduler.c + + + $PROJ_DIR$\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + $PROJ_DIR$\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\src\device.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + + Libraries + + $PROJ_DIR$\..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\system_apm32f10x.c + + + $PROJ_DIR$\..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_rcm.c + + + $PROJ_DIR$\..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_misc.c + + + $PROJ_DIR$\..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_usart.c + + + $PROJ_DIR$\..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_eint.c + + + $PROJ_DIR$\..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_gpio.c + + + + POSIX + + + utestcases + + diff --git a/bsp/apm32/apm32f103xe-minibroard/project.eww b/bsp/apm32/apm32f103xe-minibroard/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/apm32/apm32f103xe-minibroard/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/apm32/apm32f103xe-minibroard/project.uvoptx b/bsp/apm32/apm32f103xe-minibroard/project.uvoptx new file mode 100644 index 0000000000..a46a77a582 --- /dev/null +++ b/bsp/apm32/apm32f103xe-minibroard/project.uvoptx @@ -0,0 +1,805 @@ + + + + 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 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + JL2CM3 + -U59701291 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0APM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:APM32F103ZE$Flash\APM32F10x_512.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0APM32F10x_512 -FS08000000 -FL080000 -FP0($$Device:APM32F103ZE$Flash\APM32F10x_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 + + + + + + + + + + + + + Applications + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Compiler + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\libc_syms.c + libc_syms.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\time.c + time.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\stdlib.c + stdlib.c + 0 + 0 + + + + + CPU + 0 + 0 + 0 + 0 + + 3 + 7 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\backtrace.c + backtrace.c + 0 + 0 + + + 3 + 8 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\cpuport.c + cpuport.c + 0 + 0 + + + 3 + 11 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + context_rvds.S + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 4 + 12 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 4 + 13 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + 4 + 14 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 4 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\waitqueue.c + waitqueue.c + 0 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\workqueue.c + workqueue.c + 0 + 0 + + + 4 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\pipe.c + pipe.c + 0 + 0 + + + 4 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\completion.c + completion.c + 0 + 0 + + + 4 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 4 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\dataqueue.c + dataqueue.c + 0 + 0 + + + + + Drivers + 1 + 0 + 0 + 0 + + 5 + 21 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 5 + 22 + 2 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\ARM\startup_apm32f10x_hd.s + startup_apm32f10x_hd.s + 0 + 0 + + + 5 + 23 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 5 + 24 + 1 + 0 + 0 + 0 + ..\libraries\Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 5 + 25 + 1 + 1 + 0 + 0 + ..\libraries\Drivers\drv_common.c + drv_common.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 6 + 26 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 27 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 7 + 29 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 7 + 30 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 7 + 31 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 7 + 32 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 7 + 33 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + 7 + 34 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 7 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 7 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 7 + 37 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler.c + scheduler.c + 0 + 0 + + + 7 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 7 + 39 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 7 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 7 + 41 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 42 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\system_apm32f10x.c + system_apm32f10x.c + 0 + 0 + + + 8 + 43 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_rcm.c + apm32f10x_rcm.c + 0 + 0 + + + 8 + 44 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_misc.c + apm32f10x_misc.c + 0 + 0 + + + 8 + 45 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_usart.c + apm32f10x_usart.c + 0 + 0 + + + 8 + 46 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_eint.c + apm32f10x_eint.c + 0 + 0 + + + 8 + 47 + 1 + 0 + 0 + 0 + ..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\src\apm32f10x_gpio.c + apm32f10x_gpio.c + 0 + 0 + + + +
diff --git a/bsp/apm32/apm32f103xe-minibroard/project.uvprojx b/bsp/apm32/apm32f103xe-minibroard/project.uvprojx index f0af5cb76c..f2f1468945 100644 --- a/bsp/apm32/apm32f103xe-minibroard/project.uvprojx +++ b/bsp/apm32/apm32f103xe-minibroard/project.uvprojx @@ -13,7 +13,7 @@ APM32F103ZE Geehy - Geehy.APM32F1xx_DFP.1.0.7 + Geehy.APM32F1xx_DFP.1.0.8 https://www.geehy.com/uploads/tool/ IRAM(0x20000000,0x00020000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE @@ -182,7 +182,6 @@ 0 0 0 - 0 0 0 8 @@ -334,9 +333,9 @@ 0 - USE_STDPERIPH_DRIVER, __RTTHREAD__, APM32F103xE, RT_USING_ARM_LIBC, __CLK_TCK=RT_TICK_PER_SECOND + USE_STDPERIPH_DRIVER, APM32F10X_HD, __RTTHREAD__, RT_USING_ARM_LIBC, __CLK_TCK=RT_TICK_PER_SECOND - applications;..\..\..\components\libc\compilers\common;..\..\..\components\libc\compilers\common\extension;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m3;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;board;..\libraries\Drivers;..\libraries\Drivers\config;..\..\..\components\finsh;.;..\..\..\include;..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Include;..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\inc;..\libraries\APM32F10x_Library\CMSIS\Include;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\posix\io\stdio;..\..\..\components\libc\posix\ipc;..\..\..\examples\utest\testcases\kernel + applications;..\..\..\components\libc\compilers\common;..\..\..\components\libc\compilers\common\nogcc;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m3;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;board;..\libraries\Drivers;..\libraries\Drivers\config;..\..\..\components\finsh;.;..\..\..\include;..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Include;..\libraries\APM32F10x_Library\APM32F10x_StdPeriphDriver\inc;..\libraries\APM32F10x_Library\CMSIS\Include;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\posix\ipc;..\..\..\examples\utest\testcases\kernel @@ -349,7 +348,7 @@ 0 0 0 - 4 + 0 @@ -391,9 +390,9 @@ Compiler - syscalls.c + libc_syms.c 1 - ..\..\..\components\libc\compilers\armlibc\syscalls.c + ..\..\..\components\libc\compilers\armlibc\libc_syms.c @@ -405,9 +404,9 @@ - stdlib.c + syscalls.c 1 - ..\..\..\components\libc\compilers\common\stdlib.c + ..\..\..\components\libc\compilers\armlibc\syscalls.c @@ -417,6 +416,13 @@ ..\..\..\components\libc\compilers\common\time.c + + + stdlib.c + 1 + ..\..\..\components\libc\compilers\common\stdlib.c + + CPU @@ -429,16 +435,16 @@ - div0.c + backtrace.c 1 - ..\..\..\libcpu\arm\common\div0.c + ..\..\..\libcpu\arm\common\backtrace.c - backtrace.c + div0.c 1 - ..\..\..\libcpu\arm\common\backtrace.c + ..\..\..\libcpu\arm\common\div0.c @@ -458,55 +464,6 @@ DeviceDrivers - - - completion.c - 1 - ..\..\..\components\drivers\ipc\completion.c - - - - - ringbuffer.c - 1 - ..\..\..\components\drivers\ipc\ringbuffer.c - - - - - waitqueue.c - 1 - ..\..\..\components\drivers\ipc\waitqueue.c - - - - - dataqueue.c - 1 - ..\..\..\components\drivers\ipc\dataqueue.c - - - - - pipe.c - 1 - ..\..\..\components\drivers\ipc\pipe.c - - - - - workqueue.c - 1 - ..\..\..\components\drivers\ipc\workqueue.c - - - - - ringblk_buf.c - 1 - ..\..\..\components\drivers\ipc\ringblk_buf.c - - pin.c @@ -521,21 +478,70 @@ ..\..\..\components\drivers\serial\serial.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + Drivers - startup_apm32f10x_hd.s - 2 - ..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\ARM\startup_apm32f10x_hd.s + board.c + 1 + board\board.c - board.c - 1 - board\board.c + startup_apm32f10x_hd.s + 2 + ..\libraries\APM32F10x_Library\Device\Geehy\APM32F10x\Source\arm\startup_apm32f10x_hd.s @@ -588,16 +594,37 @@ Kernel - clock.c + thread.c 1 - ..\..\..\src\clock.c + ..\..\..\src\thread.c - kservice.c + mempool.c 1 - ..\..\..\src\kservice.c + ..\..\..\src\mempool.c + + + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + object.c + 1 + ..\..\..\src\object.c + + + + + clock.c + 1 + ..\..\..\src\clock.c @@ -630,9 +657,16 @@ - mempool.c + kservice.c 1 - ..\..\..\src\mempool.c + ..\..\..\src\kservice.c + + + + + irq.c + 1 + ..\..\..\src\irq.c @@ -642,20 +676,6 @@ ..\..\..\src\components.c - - - thread.c - 1 - ..\..\..\src\thread.c - - - - - object.c - 1 - ..\..\..\src\object.c - - idle.c @@ -663,20 +683,6 @@ ..\..\..\src\idle.c - - - timer.c - 1 - ..\..\..\src\timer.c - - - - - irq.c - 1 - ..\..\..\src\irq.c - - Libraries diff --git a/bsp/apm32/apm32f103xe-minibroard/template.ewp b/bsp/apm32/apm32f103xe-minibroard/template.ewp new file mode 100644 index 0000000000..41627fa92c --- /dev/null +++ b/bsp/apm32/apm32f103xe-minibroard/template.ewp @@ -0,0 +1,2114 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 1 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 36 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + diff --git a/bsp/apm32/apm32f103xe-minibroard/template.eww b/bsp/apm32/apm32f103xe-minibroard/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/apm32/apm32f103xe-minibroard/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/apm32/apm32f103xe-minibroard/template.uvoptx b/bsp/apm32/apm32f103xe-minibroard/template.uvoptx new file mode 100644 index 0000000000..2b7d33fccd --- /dev/null +++ b/bsp/apm32/apm32f103xe-minibroard/template.uvoptx @@ -0,0 +1,185 @@ + + + + 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 + + + 0 + 0 + 1 + + 0 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + JL2CM3 + -U59701291 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0APM32F10x_512.FLM -FS08000000 -FL080000 -FP0($$Device:APM32F103ZE$Flash\APM32F10x_512.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0APM32F10x_512 -FS08000000 -FL080000 -FP0($$Device:APM32F103ZE$Flash\APM32F10x_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 + + + + + + + + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/apm32/apm32f103xe-minibroard/template.uvprojx b/bsp/apm32/apm32f103xe-minibroard/template.uvprojx index dee46dc63c..03ea186a2b 100644 --- a/bsp/apm32/apm32f103xe-minibroard/template.uvprojx +++ b/bsp/apm32/apm32f103xe-minibroard/template.uvprojx @@ -16,7 +16,7 @@ APM32F103ZE Geehy - Geehy.APM32F1xx_DFP.1.0.7 + Geehy.APM32F1xx_DFP.1.0.8 https://www.geehy.com/uploads/tool/ IRAM(0x20000000,0x00020000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE @@ -185,7 +185,6 @@ 0 0 0 - 0 0 0 8 @@ -352,7 +351,7 @@ 0 0 0 - 4 + 0 diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_adc.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_adc.h index 8117944933..66741681b0 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_adc.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_adc.h @@ -3,21 +3,35 @@ * * @brief This file contains all the functions prototypes for the ADC firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_ADC_H #define __APM32F10X_ADC_H -#include "apm32f10x.h" - #ifdef __cplusplus - extern "C" { +extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -62,7 +76,7 @@ typedef enum ADC_EXT_TRIG_CONV_None = ((uint32_t)0x000E0000), ADC_EXT_TRIG_CONV_TMR3_CC1 = ((uint32_t)0x00000000), - ADC_EXT_TRIG_CONV_TMR2_CC3 = ((uint32_t)0x00030000), + ADC_EXT_TRIG_CONV_TMR2_CC3 = ((uint32_t)0x00020000), ADC_EXT_TRIG_CONV_TMR8_CC1 = ((uint32_t)0x00060000), ADC_EXT_TRIG_CONV_TMR8_TRGO = ((uint32_t)0x00080000), ADC_EXT_TRIG_CONV_TMR5_CC1 = ((uint32_t)0x000A0000), @@ -110,15 +124,15 @@ typedef enum */ typedef enum { - ADC_SAMPLE_TIME_1_5 = ((uint8_t)0x00), - ADC_SAMPLE_TIME_7_5 = ((uint8_t)0x01), - ADC_SAMPLE_TIME_13_5 = ((uint8_t)0x02), - ADC_SAMPLE_TIME_28_5 = ((uint8_t)0x03), - ADC_SAMPLE_TIME_41_5 = ((uint8_t)0x04), - ADC_SAMPLE_TIME_55_5 = ((uint8_t)0x05), - ADC_SAMPLE_TIME_71_5 = ((uint8_t)0x06), - ADC_SAMPLE_TIME_239_5 = ((uint8_t)0x07) -} ADC_SAMPLE_TIME_T; + ADC_SAMPLETIME_1CYCLES5 = ((uint8_t)0x00), + ADC_SAMPLETIME_7CYCLES5 = ((uint8_t)0x01), + ADC_SAMPLETIME_13CYCLES5 = ((uint8_t)0x02), + ADC_SAMPLETIME_28CYCLES5 = ((uint8_t)0x03), + ADC_SAMPLETIME_41CYCLES5 = ((uint8_t)0x04), + ADC_SAMPLETIME_55CYCLES5 = ((uint8_t)0x05), + ADC_SAMPLETIME_71CYCLES5 = ((uint8_t)0x06), + ADC_SAMPLETIME_239CYCLES5 = ((uint8_t)0x07) +} ADC_SAMPLETIME_T; /** * @brief ADC external trigger sources for injected channels conversion @@ -246,80 +260,80 @@ typedef struct */ /** ADC reset and common configuration */ -void ADC_Reset(ADC_T* adc); -void ADC_Config(ADC_T* adc, ADC_Config_T* adcConfig); -void ADC_ConfigStructInit(ADC_Config_T* adcConfig); -void ADC_ConfigRegularChannel(ADC_T* adc, uint8_t channel,uint8_t rank, uint8_t sampleTime); -void ADC_Enable(ADC_T* adc); -void ADC_Disable(ADC_T* adc); +void ADC_Reset(ADC_T *adc); +void ADC_Config(ADC_T *adc, ADC_Config_T *adcConfig); +void ADC_ConfigStructInit(ADC_Config_T *adcConfig); +void ADC_ConfigRegularChannel(ADC_T *adc, uint8_t channel, uint8_t rank, uint8_t sampleTime); +void ADC_Enable(ADC_T *adc); +void ADC_Disable(ADC_T *adc); /** ADC for DMA */ -void ADC_EnableDMA(ADC_T* adc); -void ADC_DisableDMA(ADC_T* adc); +void ADC_EnableDMA(ADC_T *adc); +void ADC_DisableDMA(ADC_T *adc); /** ADC Calibration */ -void ADC_ResetCalibration(ADC_T* adc); -uint8_t ADC_ReadResetCalibrationStatus(ADC_T* adc); -void ADC_StartCalibration(ADC_T* adc); -uint8_t ADC_ReadCalibrationStartFlag(ADC_T* adc); +void ADC_ResetCalibration(ADC_T *adc); +uint8_t ADC_ReadResetCalibrationStatus(ADC_T *adc); +void ADC_StartCalibration(ADC_T *adc); +uint8_t ADC_ReadCalibrationStartFlag(ADC_T *adc); /** ADC software start conversion */ -void ADC_EnableSoftwareStartConv(ADC_T* adc); -void ADC_DisableSoftwareStartConv(ADC_T* adc); -uint8_t ADC_ReadSoftwareStartConvStatus(ADC_T* adc); +void ADC_EnableSoftwareStartConv(ADC_T *adc); +void ADC_DisableSoftwareStartConv(ADC_T *adc); +uint8_t ADC_ReadSoftwareStartConvStatus(ADC_T *adc); /** ADC Discontinuous mode */ -void ADC_ConfigDiscModeChannel(ADC_T* adc, uint8_t number); -void ADC_EnableDiscMode(ADC_T* adc); -void ADC_DisableDiscMode(ADC_T* adc); +void ADC_ConfigDiscMode(ADC_T *adc, uint8_t number); +void ADC_EnableDiscMode(ADC_T *adc); +void ADC_DisableDiscMode(ADC_T *adc); /** ADC External trigger conversion */ -void ADC_EnableExternalTrigConv(ADC_T* adc); -void ADC_DisableExternalTrigConv(ADC_T* adc); +void ADC_EnableExternalTrigConv(ADC_T *adc); +void ADC_DisableExternalTrigConv(ADC_T *adc); /** ADC Conversion result */ -uint16_t ADC_ReadConversionValue(ADC_T* adc); -uint32_t ADC_ReadDualModeConversionValue(ADC_T* adc); +uint16_t ADC_ReadConversionValue(ADC_T *adc); +uint32_t ADC_ReadDualModeConversionValue(ADC_T *adc); /** ADC Automatic injected group */ -void ADC_EnableInjectedConv(ADC_T* adc); -void ADC_DisableInjectedConv(ADC_T* adc); -void ADC_EnableInjectedDiscMode(ADC_T* adc); -void ADC_DisableInjectedDiscMode(ADC_T* adc); +void ADC_EnableAutoInjectedConv(ADC_T *adc); +void ADC_DisableAutoInjectedConv(ADC_T *adc); +void ADC_EnableInjectedDiscMode(ADC_T *adc); +void ADC_DisableInjectedDiscMode(ADC_T *adc); /** ADC External trigger for injected channels conversion */ -void ADC_ConfigExternalTrigInjectedConv(ADC_T* adc, ADC_EXT_TRIG_INJEC_CONV_T extTrigInjecConv); -void ADC_EnableExternalTrigInjectedConv(ADC_T* adc); -void ADC_DisableExternalTrigInjectedConv(ADC_T* adc); +void ADC_ConfigExternalTrigInjectedConv(ADC_T *adc, ADC_EXT_TRIG_INJEC_CONV_T extTrigInjecConv); +void ADC_EnableExternalTrigInjectedConv(ADC_T *adc); +void ADC_DisableExternalTrigInjectedConv(ADC_T *adc); /** ADC Start of the injected channels conversion */ -void ADC_EnableSoftwareStartInjectedConv(ADC_T* adc); -void ADC_DisableSoftwareStartInjectedConv(ADC_T* adc); -uint8_t ADC_ReadSoftwareStartInjectedConvStatus(ADC_T* adc); +void ADC_EnableSoftwareStartInjectedConv(ADC_T *adc); +void ADC_DisableSoftwareStartInjectedConv(ADC_T *adc); +uint8_t ADC_ReadSoftwareStartInjectedConvStatus(ADC_T *adc); /** ADC injected channel */ -void ADC_ConfigInjectedChannel(ADC_T* adc, uint8_t channel, uint8_t rank, uint8_t sampleTime); -void ADC_ConfigInjectedSequencerLength(ADC_T* adc, uint8_t length); -void ADC_ConfigInjectedOffset(ADC_T* adc, ADC_INJEC_CHANNEL_T channel, uint16_t offSet); -uint16_t ADC_ReadInjectedConversionValue(ADC_T* adc, ADC_INJEC_CHANNEL_T channel); +void ADC_ConfigInjectedChannel(ADC_T *adc, uint8_t channel, uint8_t rank, uint8_t sampleTime); +void ADC_ConfigInjectedSequencerLength(ADC_T *adc, uint8_t length); +void ADC_ConfigInjectedOffset(ADC_T *adc, ADC_INJEC_CHANNEL_T channel, uint16_t offSet); +uint16_t ADC_ReadInjectedConversionValue(ADC_T *adc, ADC_INJEC_CHANNEL_T channel); /** ADC analog watchdog */ -void ADC_EnableAnalogWatchdog(ADC_T* adc, uint32_t analogWatchdog); -void ADC_DisableAnalogWatchdog(ADC_T* adc); -void ADC_ConfigAnalogWatchdogThresholds(ADC_T* adc, uint16_t highThreshold, uint16_t lowThreshold); -void ADC_ConfigAnalogWatchdogSingleChannel(ADC_T* adc, uint8_t channel); +void ADC_EnableAnalogWatchdog(ADC_T *adc, uint32_t analogWatchdog); +void ADC_DisableAnalogWatchdog(ADC_T *adc); +void ADC_ConfigAnalogWatchdogThresholds(ADC_T *adc, uint16_t highThreshold, uint16_t lowThreshold); +void ADC_ConfigAnalogWatchdogSingleChannel(ADC_T *adc, uint8_t channel); /** ADC temperature sensor */ -void ADC_EnableTempSensorVrefint(ADC_T* adc); -void ADC_DisableTempSensorVrefint(ADC_T* adc); +void ADC_EnableTempSensorVrefint(ADC_T *adc); +void ADC_DisableTempSensorVrefint(ADC_T *adc); /** Interrupt and flag */ -void ADC_EnableInterrupt(ADC_T* adc, uint16_t interrupt); -void ADC_DisableInterrupt(ADC_T* adc, uint16_t interrupt); -uint8_t ADC_ReadStatusFlag(ADC_T* adc, ADC_FLAG_T flag); -void ADC_ClearStatusFlag(ADC_T* adc, uint8_t flag); -uint8_t ADC_ReadIntFlag(ADC_T* adc, ADC_INT_T interrupt); -void ADC_ClearIntFlag(ADC_T* adc, uint16_t interrupt); +void ADC_EnableInterrupt(ADC_T *adc, uint16_t interrupt); +void ADC_DisableInterrupt(ADC_T *adc, uint16_t interrupt); +uint8_t ADC_ReadStatusFlag(ADC_T *adc, ADC_FLAG_T flag); +void ADC_ClearStatusFlag(ADC_T *adc, uint8_t flag); +uint8_t ADC_ReadIntFlag(ADC_T *adc, ADC_INT_T flag); +void ADC_ClearIntFlag(ADC_T *adc, uint16_t flag); /**@} end of group ADC_Fuctions*/ /**@} end of group ADC_Driver*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_bakpr.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_bakpr.h index 84b12b4fea..ade398cee3 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_bakpr.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_bakpr.h @@ -3,21 +3,35 @@ * * @brief This file contains all the functions prototypes for the BAKPR firmware library. * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_BAKPR_H #define __APM32F10X_BAKPR_H -#include "apm32f10x.h" - #ifdef __cplusplus extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -125,7 +139,7 @@ uint8_t BAKPR_ReadIntFlag(void); void BAKPR_ClearIntFlag(void); /**@} end of group BAKPR_Fuctions*/ -/**@} end of group BAKPR_Driver */ +/**@} end of group BAKPR_Driver*/ /**@} end of group Peripherals_Library*/ #ifdef __cplusplus diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_can.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_can.h index 766d1918e4..dd49bd0773 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_can.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_can.h @@ -1,23 +1,37 @@ /*! - * @file apm32f10x_can.h + * @file apm32f10x_can.h * - * @brief This file contains all the functions prototypes for the CAN firmware library + * @brief This file contains all the functions prototypes for the CAN firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_CAN_H #define __APM32F10X_CAN_H -#include "apm32f10x.h" - #ifdef __cplusplus extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -35,10 +49,10 @@ extern "C" { */ typedef enum { - CAN_MODE_NORMAL = ((uint8_t)00), //!< normal mode - CAN_MODE_LOOPBACK = ((uint8_t)01), //!< loopback mode - CAN_MODE_SILENT = ((uint8_t)02), //!< silent mode - CAN_MODE_SILENT_LOOPBACK = ((uint8_t)03), //!< loopback combined with silent mode + CAN_MODE_NORMAL = ((uint8_t)0x00), //!< normal mode + CAN_MODE_LOOPBACK = ((uint8_t)0x01), //!< loopback mode + CAN_MODE_SILENT = ((uint8_t)0x02), //!< silent mode + CAN_MODE_SILENT_LOOPBACK = ((uint8_t)0x03) //!< loopback combined with silent mode } CAN_MODE_T; /** @@ -46,10 +60,10 @@ typedef enum */ typedef enum { - CAN_SJW_1 = ((uint8_t)00), //!< 1 time quantum - CAN_SJW_2 = ((uint8_t)01), //!< 2 time quantum - CAN_SJW_3 = ((uint8_t)02), //!< 3 time quantum - CAN_SJW_4 = ((uint8_t)03) //!< 4 time quantum + CAN_SJW_1 = ((uint8_t)0x00), //!< 1 time quantum + CAN_SJW_2 = ((uint8_t)0x01), //!< 2 time quantum + CAN_SJW_3 = ((uint8_t)0x02), //!< 3 time quantum + CAN_SJW_4 = ((uint8_t)0x03) //!< 4 time quantum } CAN_SJW_T; /** @@ -87,7 +101,7 @@ typedef enum CAN_TIME_SEGMENT2_5 = (uint8_t)0x04, //!< 5 time quanta CAN_TIME_SEGMENT2_6 = (uint8_t)0x05, //!< 6 time quanta CAN_TIME_SEGMENT2_7 = (uint8_t)0x06, //!< 7 time quanta - CAN_TIME_SEGMENT2_8 = (uint8_t)0x07, //!< 8 time quanta + CAN_TIME_SEGMENT2_8 = (uint8_t)0x07 //!< 8 time quanta } CAN_TIME_SEGMENT2_T; /** @@ -96,7 +110,7 @@ typedef enum typedef enum { CAN_FILTER_FIFO_0 = ((uint8_t)0x00), //!< filter FIFO 0 - CAN_FILTER_FIFO_1 = ((uint8_t)0x01), //!< filter FIFO 1 + CAN_FILTER_FIFO_1 = ((uint8_t)0x01) //!< filter FIFO 1 } CAN_FILTER_FIFO_T; /** @@ -104,8 +118,8 @@ typedef enum */ typedef enum { - CAN_FILTER_MODE_IDMASK = ((uint8_t)00), //!< identifier/mask mode - CAN_FILTER_MODE_IDLIST = ((uint8_t)01) //!< identifier list mode + CAN_FILTER_MODE_IDMASK = ((uint8_t)0x00),//!< identifier/mask mode + CAN_FILTER_MODE_IDLIST = ((uint8_t)0x01) //!< identifier list mode } CAN_FILTER_MODE_T; /** @@ -114,7 +128,7 @@ typedef enum typedef enum { CAN_FILTER_SCALE_16BIT = ((uint8_t)0x00), //!< Two 16-bit filters - CAN_FILTER_SCALE_32BIT = ((uint8_t)0x01), //!< One 32-bit filter + CAN_FILTER_SCALE_32BIT = ((uint8_t)0x01) //!< One 32-bit filter } CAN_FILTER_SCALE_T; /** @@ -142,7 +156,7 @@ typedef enum { CAN_TX_MAILBIX_0 = ((uint8_t)0x00), //!< Tx mailbox0 CAN_TX_MAILBIX_1 = ((uint8_t)0x01), //!< Tx mailbox1 - CAN_TX_MAILBIX_2 = ((uint8_t)0x02), //!< Tx mailbox2 + CAN_TX_MAILBIX_2 = ((uint8_t)0x02) //!< Tx mailbox2 } CAN_TX_MAILBIX_T; /** @@ -151,7 +165,7 @@ typedef enum typedef enum { CAN_RX_FIFO_0 = ((uint8_t)0x00), //!< receive FIFO 0 - CAN_RX_FIFO_1 = ((uint8_t)0x01), //!< receive FIFO 1 + CAN_RX_FIFO_1 = ((uint8_t)0x01) //!< receive FIFO 1 } CAN_RX_FIFO_T; /** @@ -159,9 +173,9 @@ typedef enum */ typedef enum { - CAN_OPERATING_MODE_INIT = ((uint8_t)00), //!< Initialization mode - CAN_OPERATING_MODE_NORMAL = ((uint8_t)01), //!< Normal mode - CAN_OPERATING_MODE_SLEEP = ((uint8_t)02), //!< sleep mode + CAN_OPERATING_MODE_INIT = ((uint8_t)0x00), //!< Initialization mode + CAN_OPERATING_MODE_NORMAL = ((uint8_t)0x01), //!< Normal mode + CAN_OPERATING_MODE_SLEEP = ((uint8_t)0x02) //!< sleep mode } CAN_OPERATING_MODE_T; /** @@ -223,7 +237,6 @@ typedef enum */ typedef struct { - uint8_t timeTrigComMode; //!< Enable or disable the time triggered communication mode. uint8_t autoBusOffManage; //!< Enable or disable the automatic bus-off management. uint8_t autoWakeUpMode; //!< Enable or disable the automatic wake-up mode. uint8_t nonAutoRetran; //!< Enable or disable the non-automatic retransmission mode. @@ -249,7 +262,7 @@ typedef struct CAN_RTXR_T remoteTxReq; uint8_t dataLengthCode;//!< Specifies the data length code. It can be 0 to 8. uint8_t data[8]; //!< Specifies the data to be transmitted. It can be 0 to 0xFF. -} CAN_TX_MESSAGE_T; +} CAN_TxMessage_T; /** * @brief CAN Rx message structure definition @@ -263,7 +276,7 @@ typedef struct uint8_t dataLengthCode; //!< Specifies the data length code. It can be 0 to 8. uint8_t data[8]; //!< Specifies the data to be transmitted. It can be 0 to 0xFF. uint8_t filterMatchIndex;//!< Specifies the filter match index. It can be 0 to 0xFF. -} CAN_RX_MESSAGE_T; +} CAN_RxMessage_T; /** * @brief CAN filter config structure definition @@ -279,7 +292,7 @@ typedef struct CAN_FILTER_FIFO_T filterFIFO; CAN_FILTER_MODE_T filterMode; CAN_FILTER_SCALE_T filterScale; -} CAN_FILTER_CONFIG_T; +} CAN_FilterConfig_T; /**@} end of group CAN_Structure*/ @@ -289,45 +302,44 @@ typedef struct */ /** CAN reset and configuration */ -void CAN_Reset(CAN_T* can); -uint8_t CAN_Config(CAN_T* can, CAN_Config_T* canConfig); -void CAN_ConfigFilter(CAN_T* can, CAN_FILTER_CONFIG_T* filterConfig); -void CAN_ConfigStructInit(CAN_Config_T* canConfig); -void CAN_EnableDBGFreeze(CAN_T* can); -void CAN_DisableDBGFreeze(CAN_T* can); -void CAN_EnableTTCComMode(CAN_T* can); -void CAN_DisableTTCComMode(CAN_T* can); +void CAN_Reset(CAN_T *can); +uint8_t CAN_Config(CAN_T *can, CAN_Config_T *canConfig); +void CAN_ConfigFilter(CAN_T *can, CAN_FilterConfig_T *filterConfig); +void CAN_ConfigStructInit(CAN_Config_T *canConfig); +void CAN_EnableDBGFreeze(CAN_T *can); +void CAN_DisableDBGFreeze(CAN_T *can); +void CAN_SlaveStartBank(CAN_T *can, uint8_t bankNum); /** CAN frames transmit */ -uint8_t CAN_TxMessage(CAN_T* can, CAN_TX_MESSAGE_T* TxMessage); -uint8_t CAN_TxMessageStatus(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox); -void CAN_CancelTxMailbox(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox); +uint8_t CAN_TxMessage(CAN_T *can, CAN_TxMessage_T *TxMessage); +uint8_t CAN_TxMessageStatus(CAN_T *can, CAN_TX_MAILBIX_T TxMailbox); +void CAN_CancelTxMailbox(CAN_T *can, CAN_TX_MAILBIX_T TxMailbox); /** CAN frames receive */ -void CAN_RxMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber, CAN_RX_MESSAGE_T* RxMessage); -void CAN_ReleaseFIFO(CAN_T* can, CAN_RX_FIFO_T FIFONumber); -uint8_t CAN_PendingMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber); +void CAN_RxMessage(CAN_T *can, CAN_RX_FIFO_T FIFONumber, CAN_RxMessage_T *RxMessage); +void CAN_ReleaseFIFO(CAN_T *can, CAN_RX_FIFO_T FIFONumber); +uint8_t CAN_PendingMessage(CAN_T *can, CAN_RX_FIFO_T FIFONumber); /** CAN operation modes */ -uint8_t CAN_OperatingMode(CAN_T* can, CAN_OPERATING_MODE_T operatingMode); -uint8_t CAN_SleepMode(CAN_T* can); -uint8_t CAN_WakeUpMode(CAN_T* can); +uint8_t CAN_OperatingMode(CAN_T *can, CAN_OPERATING_MODE_T operatingMode); +uint8_t CAN_SleepMode(CAN_T *can); +uint8_t CAN_WakeUpMode(CAN_T *can); /** CAN bus error management */ -uint8_t CAN_ReadLastErrorCode(CAN_T* can); -uint8_t CAN_ReadRxErrorCounter(CAN_T* can); -uint8_t CAN_ReadLSBTxErrorCounter(CAN_T* can); +uint8_t CAN_ReadLastErrorCode(CAN_T *can); +uint8_t CAN_ReadRxErrorCounter(CAN_T *can); +uint8_t CAN_ReadLSBTxErrorCounter(CAN_T *can); /** CAN interrupt and flag */ -void CAN_EnableInterrupt(CAN_T* can, uint32_t interrupt); -void CAN_DisableInterrupt(CAN_T* can, uint32_t interrupt); -uint8_t CAN_ReadStatusFlag(CAN_T* can, CAN_FLAG_T flag); -void CAN_ClearStatusFlag(CAN_T* can, CAN_FLAG_T flag); -uint8_t CAN_ReadIntFlag(CAN_T* can, CAN_INT_T flag); -void CAN_ClearIntFlag(CAN_T* can, CAN_INT_T flag); +void CAN_EnableInterrupt(CAN_T *can, uint32_t interrupt); +void CAN_DisableInterrupt(CAN_T *can, uint32_t interrupt); +uint8_t CAN_ReadStatusFlag(CAN_T *can, CAN_FLAG_T flag); +void CAN_ClearStatusFlag(CAN_T *can, CAN_FLAG_T flag); +uint8_t CAN_ReadIntFlag(CAN_T *can, CAN_INT_T flag); +void CAN_ClearIntFlag(CAN_T *can, CAN_INT_T flag); /**@} end of group CAN_Fuctions*/ -/**@} end of group CAN_Driver */ +/**@} end of group CAN_Driver*/ /**@} end of group Peripherals_Library*/ #ifdef __cplusplus diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_crc.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_crc.h index c3a0098aee..3c3f5272d9 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_crc.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_crc.h @@ -1,23 +1,37 @@ /*! - * @file apm32f10x_crc.h + * @file apm32f10x_crc.h * - * @brief This file contains all the functions prototypes for the CRC firmware library + * @brief This file contains all the functions prototypes for the CRC firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_CRC_H #define __APM32F10X_CRC_H -#include "apm32f10x.h" - #ifdef __cplusplus extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -41,7 +55,7 @@ void CRC_WriteIDRegister(uint8_t inData); uint8_t CRC_ReadIDRegister(void); /**@} end of group CRC_Fuctions*/ -/**@} end of group CRC_Driver */ +/**@} end of group CRC_Driver*/ /**@} end of group Peripherals_Library*/ #ifdef __cplusplus diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dac.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dac.h index 1fce07ebc1..be1adc048b 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dac.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dac.h @@ -3,21 +3,35 @@ * * @brief This file contains all the functions prototypes for the DAC firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_DAC_H #define __APM32F10X_DAC_H -#include "apm32f10x.h" - #ifdef __cplusplus - extern "C" { +extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -37,7 +51,7 @@ typedef enum { DAC_CHANNEL_1 = 0x00000000, DAC_CHANNEL_2 = 0x00000010 -}DAC_CHANNEL_T; +} DAC_CHANNEL_T; /** * @brief DAC trigger selection @@ -53,7 +67,7 @@ typedef enum DAC_TRIGGER_TMR4_TRGO = 0x0000002C, DAC_TRIGGER_EINT9 = 0x00000034, DAC_TRIGGER_SOFT = 0x0000003C -}DAC_TRIGGER_T; +} DAC_TRIGGER_T; /** * @brief DAC wave generation @@ -63,7 +77,7 @@ typedef enum DAC_WAVE_GENERATION_NONE = 0x00000000, DAC_WAVE_GENERATION_NOISE = 0x00000040, DAC_WAVE_GENERATION_TRIANGLE = 0x00000080 -}DAC_WAVE_GENERATION_T; +} DAC_WAVE_GENERATION_T; /** * @brief DAC channelx mask/amplitude selector @@ -71,31 +85,31 @@ typedef enum typedef enum { DAC_LFSR_MASK_BIT11_1 = 0x00000000, //!< Mask bit[11:1] of LFSR for noise wave generation - DAC_LFSR_MASK_BIT11_2 = 0x00001000, //!< Mask bit[11:2] of LFSR for noise wave generation - DAC_LFSR_MASK_BIT11_3 = 0x00002000, //!< Mask bit[11:3] of LFSR for noise wave generation - DAC_LFSR_MASK_BIT11_4 = 0x00003000, //!< Mask bit[11:4] of LFSR for noise wave generation - DAC_LFSR_MASK_BIT11_5 = 0x00004000, //!< Mask bit[11:5] of LFSR for noise wave generation - DAC_LFSR_MASK_BIT11_6 = 0x00005000, //!< Mask bit[11:6] of LFSR for noise wave generation - DAC_LFSR_MASK_BIT11_7 = 0x00006000, //!< Mask bit[11:7] of LFSR for noise wave generation - DAC_LFSR_MASK_BIT11_8 = 0x00007000, //!< Mask bit[11:8] of LFSR for noise wave generation - DAC_LFSR_MASK_BIT11_9 = 0x00008000, //!< Mask bit[11:9] of LFSR for noise wave generation - DAC_LFSR_MASK_BIT11_10 = 0x00009000, //!< Mask bit[11:10] of LFSR for noise wave generation - DAC_LFSR_MASK_BIT11 = 0x0000A000, //!< Mask bit11 of LFSR for noise wave generation - DAC_LFSR_MASK_NONE = 0x0000B000, //!< Mask none bit of LFSR for noise wave generation + DAC_LFSR_MASK_BIT11_2 = 0x00000100, //!< Mask bit[11:2] of LFSR for noise wave generation + DAC_LFSR_MASK_BIT11_3 = 0x00000200, //!< Mask bit[11:3] of LFSR for noise wave generation + DAC_LFSR_MASK_BIT11_4 = 0x00000300, //!< Mask bit[11:4] of LFSR for noise wave generation + DAC_LFSR_MASK_BIT11_5 = 0x00000400, //!< Mask bit[11:5] of LFSR for noise wave generation + DAC_LFSR_MASK_BIT11_6 = 0x00000500, //!< Mask bit[11:6] of LFSR for noise wave generation + DAC_LFSR_MASK_BIT11_7 = 0x00000600, //!< Mask bit[11:7] of LFSR for noise wave generation + DAC_LFSR_MASK_BIT11_8 = 0x00000700, //!< Mask bit[11:8] of LFSR for noise wave generation + DAC_LFSR_MASK_BIT11_9 = 0x00000800, //!< Mask bit[11:9] of LFSR for noise wave generation + DAC_LFSR_MASK_BIT11_10 = 0x00000900, //!< Mask bit[11:10] of LFSR for noise wave generation + DAC_LFSR_MASK_BIT11 = 0x00000A00, //!< Mask bit11 of LFSR for noise wave generation + DAC_LFSR_MASK_NONE = 0x00000B00, //!< Mask none bit of LFSR for noise wave generation DAC_TRIANGLE_AMPLITUDE_1 = 0x00000000, //!< Triangle amplitude equal to 1 - DAC_TRIANGLE_AMPLITUDE_3 = 0x00001000, //!< Triangle amplitude equal to 3 - DAC_TRIANGLE_AMPLITUDE_7 = 0x00002000, //!< Triangle amplitude equal to 7 - DAC_TRIANGLE_AMPLITUDE_15 = 0x00003000, //!< Triangle amplitude equal to 15 - DAC_TRIANGLE_AMPLITUDE_31 = 0x00004000, //!< Triangle amplitude equal to 31 - DAC_TRIANGLE_AMPLITUDE_63 = 0x00005000, //!< Triangle amplitude equal to 63 - DAC_TRIANGLE_AMPLITUDE_127 = 0x00006000, //!< Triangle amplitude equal to 127 - DAC_TRIANGLE_AMPLITUDE_255 = 0x00007000, //!< Triangle amplitude equal to 255 - DAC_TRIANGLE_AMPLITUDE_511 = 0x00008000, //!< Triangle amplitude equal to 511 - DAC_TRIANGLE_AMPLITUDE_1023 = 0x00009000, //!< Triangle amplitude equal to 1023 - DAC_TRIANGLE_AMPLITUDE_2047 = 0x0000A000, //!< Triangle amplitude equal to 2047 - DAC_TRIANGLE_AMPLITUDE_4095 = 0x0000B000 //!< Triangle amplitude equal to 4095 -}DAC_MASK_AMPLITUDE_SEL_T; + DAC_TRIANGLE_AMPLITUDE_3 = 0x00000100, //!< Triangle amplitude equal to 3 + DAC_TRIANGLE_AMPLITUDE_7 = 0x00000200, //!< Triangle amplitude equal to 7 + DAC_TRIANGLE_AMPLITUDE_15 = 0x00000300, //!< Triangle amplitude equal to 15 + DAC_TRIANGLE_AMPLITUDE_31 = 0x00000400, //!< Triangle amplitude equal to 31 + DAC_TRIANGLE_AMPLITUDE_63 = 0x00000500, //!< Triangle amplitude equal to 63 + DAC_TRIANGLE_AMPLITUDE_127 = 0x00000600, //!< Triangle amplitude equal to 127 + DAC_TRIANGLE_AMPLITUDE_255 = 0x00000700, //!< Triangle amplitude equal to 255 + DAC_TRIANGLE_AMPLITUDE_511 = 0x00000800, //!< Triangle amplitude equal to 511 + DAC_TRIANGLE_AMPLITUDE_1023 = 0x00000900, //!< Triangle amplitude equal to 1023 + DAC_TRIANGLE_AMPLITUDE_2047 = 0x00000A00, //!< Triangle amplitude equal to 2047 + DAC_TRIANGLE_AMPLITUDE_4095 = 0x00000B00 //!< Triangle amplitude equal to 4095 +} DAC_MASK_AMPLITUDE_SEL_T; /** * @brief DAC output buffer @@ -104,7 +118,7 @@ typedef enum { DAC_OUTPUT_BUFFER_ENBALE = 0x00000000, DAC_OUTPUT_BUFFER_DISABLE = 0x00000002 -}DAC_OUTPUT_BUFFER_T; +} DAC_OUTPUT_BUFFER_T; /** * @brief DAC data align @@ -114,7 +128,7 @@ typedef enum DAC_ALIGN_12BIT_R = 0x00000000, DAC_ALIGN_12BIT_L = 0x00000004, DAC_ALIGN_8BIT_R = 0x00000008 -}DAC_ALIGN_T; +} DAC_ALIGN_T; /**@} end of group DAC_Enumerations*/ @@ -132,7 +146,7 @@ typedef struct DAC_OUTPUT_BUFFER_T outputBuffer; DAC_WAVE_GENERATION_T waveGeneration; DAC_MASK_AMPLITUDE_SEL_T maskAmplitudeSelect; -}DAC_ConfigStruct_T; +} DAC_Config_T; /**@} end of group DAC_Structure*/ @@ -143,8 +157,8 @@ typedef struct /** DAC Reset and Configuration */ void DAC_Reset(void); -void DAC_Config(uint32_t channel, DAC_ConfigStruct_T* configStruct); -void DAC_ConfigStructInit(DAC_ConfigStruct_T* configStruct); +void DAC_Config(uint32_t channel, DAC_Config_T *dacConfig); +void DAC_ConfigStructInit(DAC_Config_T *dacConfig); void DAC_Enable(DAC_CHANNEL_T channel); void DAC_Disable(DAC_CHANNEL_T channel); @@ -171,7 +185,7 @@ void DAC_ConfigDualChannelData(DAC_ALIGN_T align, uint16_t data2, uint16_t data1 uint16_t DAC_ReadDataOutputValue(DAC_CHANNEL_T channel); /**@} end of group DAC_Fuctions*/ -/**@} end of group DAC_Driver */ +/**@} end of group DAC_Driver*/ /**@} end of group Peripherals_Library*/ #ifdef __cplusplus diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dbgmcu.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dbgmcu.h index 193f86ffba..9102cdabd3 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dbgmcu.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dbgmcu.h @@ -3,21 +3,35 @@ * * @brief This file contains all the functions prototypes for the DBUGMCU firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_DBGMCU_H #define __APM32F10X_DBGMCU_H -#include "apm32f10x.h" - #ifdef __cplusplus - extern "C" { +extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -73,7 +87,7 @@ void DBGMCU_Enable(uint32_t periph); void DBGMCU_Disable(uint32_t periph); /**@} end of group DBGMCU_Fuctions*/ -/**@} end of group DBGMCU_Driver */ +/**@} end of group DBGMCU_Driver*/ /**@} end of group Peripherals_Library*/ #ifdef __cplusplus diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dma.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dma.h index eb574afb73..af6335d4c7 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dma.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dma.h @@ -1,23 +1,37 @@ /*! - * @file apm32f10x_dma.h + * @file apm32f10x_dma.h * - * @brief This file contains all the functions prototypes for the DMA firmware library + * @brief This file contains all the functions prototypes for the DMA firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_DMA_H #define __APM32F10X_DMA_H -#include "apm32f10x.h" - #ifdef __cplusplus extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -173,7 +187,7 @@ typedef enum } DMA_FLAG_T; /** - * @brief DMA Flag + * @brief DMA Interrupt Flag */ typedef enum { @@ -262,8 +276,8 @@ typedef struct /** Reset and configuration */ void DMA_Reset(DMA_Channel_T *channel); -void DMA_Config(DMA_Channel_T* channel, DMA_Config_T* dmaConfig); -void DMA_ConfigStructInit( DMA_Config_T* dmaConfig); +void DMA_Config(DMA_Channel_T *channel, DMA_Config_T *dmaConfig); +void DMA_ConfigStructInit(DMA_Config_T *dmaConfig); void DMA_Enable(DMA_Channel_T *channel); void DMA_Disable(DMA_Channel_T *channel); @@ -280,7 +294,7 @@ uint8_t DMA_ReadIntFlag(DMA_INT_FLAG_T flag); void DMA_ClearIntFlag(uint32_t flag); /**@} end of group DMA_Fuctions*/ -/**@} end of group DMA_Driver */ +/**@} end of group DMA_Driver*/ /**@} end of group Peripherals_Library*/ #ifdef __cplusplus diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dmc.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dmc.h index 809e2663d7..32e3254ac6 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dmc.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_dmc.h @@ -3,20 +3,35 @@ * * @brief This file contains all the prototypes,enumeration and macros for the DMC peripheral * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ + #ifndef __APM32F10X_DMC_H #define __APM32F10X_DMC_H -#include "apm32f10x.h" - #ifdef __cplusplus - extern "C" { +extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -37,7 +52,7 @@ typedef enum { DMC_BANK_WIDTH_1, DMC_BANK_WIDTH_2 -}DMC_BANK_WIDTH_T; +} DMC_BANK_WIDTH_T; /** * @brief Row Address Width @@ -50,7 +65,7 @@ typedef enum DMC_ROW_WIDTH_14, DMC_ROW_WIDTH_15, DMC_ROW_WIDTH_16 -}DMC_ROW_WIDTH_T; +} DMC_ROW_WIDTH_T; /** * @brief Column Address Width @@ -65,7 +80,7 @@ typedef enum DMC_COL_WIDTH_13, DMC_COL_WIDTH_14, DMC_COL_WIDTH_15 -}DMC_COL_WIDTH_T; +} DMC_COL_WIDTH_T; /** * @brief CAS Latency Select @@ -76,7 +91,7 @@ typedef enum DMC_CAS_LATENCY_2, DMC_CAS_LATENCY_3, DMC_CAS_LATENCY_4 -}DMC_CAS_LATENCY_T; +} DMC_CAS_LATENCY_T; /** * @brief RAS Minimun Time Select @@ -99,7 +114,7 @@ typedef enum DMC_RAS_MINIMUM_14, DMC_RAS_MINIMUM_15, DMC_RAS_MINIMUM_16 -}DMC_RAS_MINIMUM_T; +} DMC_RAS_MINIMUM_T; /** * @brief RAS To CAS Delay Time Select @@ -114,7 +129,7 @@ typedef enum DMC_DELAY_TIME_6, DMC_DELAY_TIME_7, DMC_DELAY_TIME_8 -}DMC_DELAY_TIME_T; +} DMC_DELAY_TIME_T; /** * @brief Precharge Period Select @@ -129,10 +144,10 @@ typedef enum DMC_PRECHARGE_6, DMC_PRECHARGE_7, DMC_PRECHARGE_8 -}DMC_PRECHARGE_T; +} DMC_PRECHARGE_T; /** - * @brief Last Data Next Precharge For Write Time Select + * @brief Last Data Next Precharge For Write Time Select */ typedef enum { @@ -140,7 +155,7 @@ typedef enum DMC_NEXT_PRECHARGE_2, DMC_NEXT_PRECHARGE_3, DMC_NEXT_PRECHARGE_4 -}DMC_NEXT_PRECHARGE_T; +} DMC_NEXT_PRECHARGE_T; /** * @brief Auto-Refresh Period Select @@ -163,7 +178,7 @@ typedef enum DMC_AUTO_REFRESH_14, DMC_AUTO_REFRESH_15, DMC_AUTO_REFRESH_16, -}DMC_AUTO_REFRESH_T; +} DMC_AUTO_REFRESH_T; /** * @brief Active-to-active Command Period Select @@ -186,7 +201,7 @@ typedef enum DMC_ATA_CMD_14, DMC_ATA_CMD_15, DMC_ATA_CMD_16, -}DMC_ATA_CMD_T; +} DMC_ATA_CMD_T; /** * @brief Clock PHASE @@ -195,7 +210,7 @@ typedef enum { DMC_CLK_PHASE_NORMAL, DMC_CLK_PHASE_REVERSE -}DMC_CLK_PHASE_T; +} DMC_CLK_PHASE_T; /** * @brief DMC Memory Size @@ -216,10 +231,10 @@ typedef enum DMC_MEMORY_SIZE_64MB, DMC_MEMORY_SIZE_128MB, DMC_MEMORY_SIZE_256MB, -}DMC_MEMORY_SIZE_T; +} DMC_MEMORY_SIZE_T; /** - * @brief Open Banks Of Number + * @brief Open Banks Of Number */ typedef enum { @@ -239,7 +254,7 @@ typedef enum DMC_BANK_NUMBER_14, DMC_BANK_NUMBER_15, DMC_BANK_NUMBER_16, -}DMC_BANK_NUMBER_T; +} DMC_BANK_NUMBER_T; /** * @brief Full refresh type @@ -248,7 +263,7 @@ typedef enum { DMC_REFRESH_ROW_ONE, //!< Refresh one row DMC_REFRESH_ROW_ALL, //!< Refresh all row -}DMC_REFRESH_T; +} DMC_REFRESH_T; /** * @brief Precharge type @@ -257,8 +272,16 @@ typedef enum { DMC_PRECHARGE_IM, //!< Immediate precharge DMC_PRECHARGE_DELAY, //!< Delayed precharge -}DMC_PRECHARE_T; +} DMC_PRECHARE_T; +/** + * @brief WRAP Burst Type + */ +typedef enum +{ + DMC_WRAPB_4, + DMC_WRAPB_8, +} DMC_WRPB_T; /**@} end of group DMC_Enumerations*/ @@ -281,7 +304,7 @@ typedef struct uint32_t tCMD : 4; //!< DMC_ATA_CMD_T uint32_t tXSR : 9; //!< auto-refresh commands, can be 0x000 to 0x1FF uint16_t tRFP : 16; //!< Refresh period, can be 0x0000 to 0xFFFF -}DMC_TimingConfig_T; +} DMC_TimingConfig_T; /** * @brief Config struct definition @@ -294,7 +317,7 @@ typedef struct DMC_COL_WIDTH_T colWidth; //!< Number of col address bits DMC_CLK_PHASE_T clkPhase; //!< Clock phase DMC_TimingConfig_T timing; //!< Timing -}DMC_Config_T; +} DMC_Config_T; /**@} end of group DMC_Structure*/ @@ -303,7 +326,7 @@ typedef struct @{ */ - /** Enable / Disable */ +/** Enable / Disable */ void DMC_Enable(void); void DMC_Disable(void); void DMC_EnableInit(void); @@ -327,6 +350,10 @@ void DMC_ConfigRefreshPeriod(uint16_t period); void DMC_EixtSlefRefreshMode(void); void DMC_EnterSlefRefreshMode(void); +/** Accelerate Module */ +void DMC_EnableAccelerateModule(void); +void DMC_DisableAccelerateModule(void); + /** Config */ void DMC_ConfigOpenBank(DMC_BANK_NUMBER_T num); void DMC_EnableUpdateMode(void); @@ -336,6 +363,7 @@ void DMC_ConfigFullRefreshAfterSR(DMC_REFRESH_T refresh); void DMC_ConfigPrechargeType(DMC_PRECHARE_T precharge); void DMC_ConfigMemorySize(DMC_MEMORY_SIZE_T memorySize); void DMC_ConfigClockPhase(DMC_CLK_PHASE_T clkPhase); +void DMC_ConfigWRAPB(DMC_WRPB_T burst); /** read flag */ uint8_t DMC_ReadSelfRefreshStatus(void); diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_eint.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_eint.h index 23bedc9b02..9594405210 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_eint.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_eint.h @@ -1,23 +1,37 @@ /*! - * @file apm32f10x_eint.h + * @file apm32f10x_eint.h * - * @brief This file contains all the functions prototypes for the EINT firmware library + * @brief This file contains all the functions prototypes for the EINT firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_EINT_H #define __APM32F10X_EINT_H -#include "apm32f10x.h" - #ifdef __cplusplus extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -51,6 +65,7 @@ typedef enum typedef enum { + EINT_LINENONE = 0x00000, //! EINT_LINE_0 = 0x00001, //!< External interrupt line 0 EINT_LINE_1 = 0x00002, //!< External interrupt line 1 EINT_LINE_2 = 0x00004, //!< External interrupt line 2 @@ -99,7 +114,8 @@ typedef struct /** Reset and configuration */ void EINT_Reset(void); -void EINT_Config( EINT_Config_T* eintConfig); +void EINT_Config(EINT_Config_T *eintConfig); +void EINT_ConfigStructInit(EINT_Config_T *eintConfig); /** Interrupt and flag */ void EINT_SelectSWInterrupt(uint32_t line); @@ -109,11 +125,11 @@ uint8_t EINT_ReadIntFlag(EINT_LINE_T line); void EINT_ClearIntFlag(uint32_t line); /**@} end of group EINT_Fuctions*/ -/**@} end of group EINT_Driver */ +/**@} end of group EINT_Driver*/ /**@} end of group Peripherals_Library*/ -#ifdef __APM32F10X_cplusplus +#ifdef __cplusplus } #endif -#endif /* __EINT_H */ +#endif /* __APM32F10XEINT_H */ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_emmc.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_emmc.h index 5b5c82e727..1c6d7ecc18 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_emmc.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_emmc.h @@ -1,23 +1,37 @@ /*! - * @file apm32f10x_emmc.h + * @file apm32f10x_emmc.h * - * @brief This file contains all the functions prototypes for the EMMC firmware library + * @brief This file contains all the functions prototypes for the EMMC firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_EMMC_H #define __APM32F10X_EMMC_H -#include "apm32f10x.h" - #ifdef __cplusplus extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -66,7 +80,7 @@ typedef enum typedef enum { EMMC_MEMORY_TYPE_SRAM = 0x00000000, - EMMC_MEMORY_TYPE_PARAM = 0x00000004, + EMMC_MEMORY_TYPE_PSRAM = 0x00000004, EMMC_MEMORY_TYPE_NOR = 0x00000008 } EMMC_MEMORY_TYPE_T; @@ -262,8 +276,8 @@ typedef struct EMMC_WAITE_SIGNAL_T waiteSignal; EMMC_EXTENDEN_MODE_T extendedMode; EMMC_WRITE_BURST_T writeBurst; - EMMC_NORSRAMTimingConfig_T* readWriteTimingStruct; - EMMC_NORSRAMTimingConfig_T* writeTimingStruct; + EMMC_NORSRAMTimingConfig_T *readWriteTimingStruct; + EMMC_NORSRAMTimingConfig_T *writeTimingStruct; } EMMC_NORSRAMConfig_T; /** @@ -289,8 +303,8 @@ typedef struct EMMC_ECC_PAGE_SIZE_BYTE_T ECCPageSize; uint32_t TCLRSetupTime; uint32_t TARSetupTime; - EMMC_NAND_PCCARDTimingConfig_T* commonSpaceTimingStruct; - EMMC_NAND_PCCARDTimingConfig_T* attributeSpaceTimingStruct; + EMMC_NAND_PCCARDTimingConfig_T *commonSpaceTimingStruct; + EMMC_NAND_PCCARDTimingConfig_T *attributeSpaceTimingStruct; } EMMC_NANDConfig_T; /** @@ -301,9 +315,9 @@ typedef struct EMMC_WAIT_FEATURE_T waitFeature; uint32_t TCLRSetupTime; uint32_t TARSetupTime; - EMMC_NAND_PCCARDTimingConfig_T* commonSpaceTimingStruct; - EMMC_NAND_PCCARDTimingConfig_T* attributeSpaceTimingStruct; - EMMC_NAND_PCCARDTimingConfig_T* IOSpaceTimingStruct; + EMMC_NAND_PCCARDTimingConfig_T *commonSpaceTimingStruct; + EMMC_NAND_PCCARDTimingConfig_T *attributeSpaceTimingStruct; + EMMC_NAND_PCCARDTimingConfig_T *IOSpaceTimingStruct; } EMMC_PCCARDConfig_T; /**@} end of group EMMC_Structure*/ @@ -318,12 +332,12 @@ void EMMC_ResetNAND(EMMC_BANK_NAND_T bank); void EMMC_ResetPCCard(void); /** EMMC Configuration */ -void EMMC_ConfigNORSRAM(EMMC_NORSRAMConfig_T* emmcNORSRAMConfig); -void EMMC_ConfigNAND(EMMC_NANDConfig_T* emmcNANDConfig); -void EMMC_ConfigPCCard(EMMC_PCCARDConfig_T* emmcPCCardConfig); -void EMMC_ConfigNORSRAMStructInit(EMMC_NORSRAMConfig_T* emmcNORSRAMConfig); -void EMMC_ConfigNANDStructInit(EMMC_NANDConfig_T* emmcNANDConfig); -void EMMC_ConfigPCCardStructInit(EMMC_PCCARDConfig_T* emmcPCCardConfig); +void EMMC_ConfigNORSRAM(EMMC_NORSRAMConfig_T *emmcNORSRAMConfig); +void EMMC_ConfigNAND(EMMC_NANDConfig_T *emmcNANDConfig); +void EMMC_ConfigPCCard(EMMC_PCCARDConfig_T *emmcPCCardConfig); +void EMMC_ConfigNORSRAMStructInit(EMMC_NORSRAMConfig_T *emmcNORSRAMConfig); +void EMMC_ConfigNANDStructInit(EMMC_NANDConfig_T *emmcNANDConfig); +void EMMC_ConfigPCCardStructInit(EMMC_PCCARDConfig_T *emmcPCCardConfig); /** EMMC bank control */ void EMMC_EnableNORSRAM(EMMC_BANK1_NORSRAM_T bank); @@ -345,7 +359,7 @@ uint8_t EMMC_ReadIntFlag(EMMC_BANK_NAND_T bank, EMMC_INT_T flag); void EMMC_ClearIntFlag(EMMC_BANK_NAND_T bank, uint32_t flag); /**@} end of group EMMC_Fuctions*/ -/**@} end of group EMMC_Driver */ +/**@} end of group EMMC_Driver*/ /**@} end of group Peripherals_Library*/ #ifdef __cplusplus diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_fmc.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_fmc.h index 5915185f6f..0043073ad6 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_fmc.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_fmc.h @@ -1,23 +1,37 @@ /*! - * @file apm32f10x_fmc.h + * @file apm32f10x_fmc.h * - * @brief This file contains all the functions prototypes for the FMC firmware library + * @brief This file contains all the functions prototypes for the FMC firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_FMC_H #define __APM32F10X_FMC_H -#include "apm32f10x.h" - #ifdef __cplusplus extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -224,7 +238,7 @@ FMC_STATUS_T FMC_ProgramOptionByteData(uint32_t address, uint8_t data); FMC_STATUS_T FMC_EnableWriteProtection(uint32_t page); FMC_STATUS_T FMC_EnableReadOutProtection(void); FMC_STATUS_T FMC_DisableReadOutProtection(void); -FMC_STATUS_T FMC_ConfigUserOptionByte(FMC_UserConfig_T* userConfig); +FMC_STATUS_T FMC_ConfigUserOptionByte(FMC_UserConfig_T *userConfig); uint32_t FMC_ReadUserOptionByte(void); uint32_t FMC_ReadOptionByteWriteProtection(void); uint8_t FMC_GetReadProtectionStatus(void); @@ -234,7 +248,7 @@ uint8_t FMC_ReadPrefetchBufferStatus(void); void FMC_EnableInterrupt(FMC_INT_T interrupt); void FMC_DisableInterrupt(FMC_INT_T interrupt); uint8_t FMC_ReadStatusFlag(FMC_FLAG_T flag); -void FMC_ClearStatusFlag(FMC_FLAG_T flag); +void FMC_ClearStatusFlag(uint32_t flag); /** Status management */ FMC_STATUS_T FMC_ReadStatus(void); diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_gpio.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_gpio.h index e78ac91b01..3c66a798e2 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_gpio.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_gpio.h @@ -1,23 +1,37 @@ /*! - * @file apm32f10x_gpio.h + * @file apm32f10x_gpio.h * - * @brief This file contains all the functions prototypes for the GPIO firmware library + * @brief This file contains all the functions prototypes for the GPIO firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_GPIO_H #define __APM32F10X_GPIO_H -#include "apm32f10x.h" - #ifdef __cplusplus - extern "C" { +extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -35,10 +49,10 @@ */ typedef enum { - GPIO_SPEED_10MHz = 1, - GPIO_SPEED_2MHz, - GPIO_SPEED_50MHz -}GPIO_SPEED_T; + GPIO_SPEED_10MHz = 1, + GPIO_SPEED_20MHz, + GPIO_SPEED_50MHz +} GPIO_SPEED_T; /** * @brief Configuration Mode enumeration @@ -53,7 +67,7 @@ typedef enum GPIO_MODE_OUT_OD = 0x84, //!< General purpose output Open-drain GPIO_MODE_AF_PP = 0x88, //!< Alternate function output Push-pull GPIO_MODE_AF_OD = 0x8C, //!< Alternate function output Open-drain -}GPIO_MODE_T; +} GPIO_MODE_T; /** * @brief Definition of the GPIO pins @@ -84,108 +98,108 @@ typedef enum */ typedef enum { - GPIO_NO_REMAP_SPI1 = 0x00000010, - GPIO_REMAP_SPI1 = 0x00000011, + GPIO_NO_REMAP_SPI1 = 0x00000010, + GPIO_REMAP_SPI1 = 0x00000011, - GPIO_NO_REMAP_I2C1 = 0x00000110, - GPIO_REMAP_I2C1 = 0x00000111, + GPIO_NO_REMAP_I2C1 = 0x00000110, + GPIO_REMAP_I2C1 = 0x00000111, - GPIO_NO_REMAP_USART1 = 0x00000210, - GPIO_REMAP_USART1 = 0x00000211, + GPIO_NO_REMAP_USART1 = 0x00000210, + GPIO_REMAP_USART1 = 0x00000211, - GPIO_NO_REMAP_USART2 = 0x00000310, - GPIO_REMAP_USART2 = 0x00000311, + GPIO_NO_REMAP_USART2 = 0x00000310, + GPIO_REMAP_USART2 = 0x00000311, - GPIO_NO_REMAP_USART3 = 0x00000430, - GPIO_PARTIAL_REMAP_USART3 = 0x00000431, - GPIO_FULL_REMAP_USART3 = 0x00000433, + GPIO_NO_REMAP_USART3 = 0x00000430, + GPIO_PARTIAL_REMAP_USART3 = 0x00000431, + GPIO_FULL_REMAP_USART3 = 0x00000433, - GPIO_NO_REMAP_TMR1 = 0x00000630, - GPIO_PARTIAL_REMAP_TMR1 = 0x00000631, - GPIO_FULL_REMAP_TMR1 = 0x00000633, + GPIO_NO_REMAP_TMR1 = 0x00000630, + GPIO_PARTIAL_REMAP_TMR1 = 0x00000631, + GPIO_FULL_REMAP_TMR1 = 0x00000633, - GPIO_NO_REMAP_TMR2 = 0x00000830, - GPIO_PARTIAL_REMAP1_TMR2 = 0x00000831, - GPIO_PARTIAL_REMAP2_TMR2 = 0x00000832, - GPIO_FULL_REMAP_TMR2 = 0x00000833, + GPIO_NO_REMAP_TMR2 = 0x00000830, + GPIO_PARTIAL_REMAP1_TMR2 = 0x00000831, + GPIO_PARTIAL_REMAP2_TMR2 = 0x00000832, + GPIO_FULL_REMAP_TMR2 = 0x00000833, - GPIO_NO_REMAP_TMR3 = 0x00000A30, - GPIO_PARTIAL_REMAP_TMR3 = 0x00000A32, - GPIO_FULL_REMAP_TMR3 = 0x00000A33, + GPIO_NO_REMAP_TMR3 = 0x00000A30, + GPIO_PARTIAL_REMAP_TMR3 = 0x00000A32, + GPIO_FULL_REMAP_TMR3 = 0x00000A33, - GPIO_NO_REMAP_TMR4 = 0x00000C10, - GPIO_REMAP_TMR4 = 0x00000C11, + GPIO_NO_REMAP_TMR4 = 0x00000C10, + GPIO_REMAP_TMR4 = 0x00000C11, - GPIO_NO_REMAP_CAN1 = 0x00000D30, - GPIO_REMAP1_CAN1 = 0x00000D32, - GPIO_REMAP2_CAN1 = 0x00000D33, + GPIO_NO_REMAP_CAN1 = 0x00000D30, + GPIO_REMAP1_CAN1 = 0x00000D32, + GPIO_REMAP2_CAN1 = 0x00000D33, - GPIO_NO_REMAP_PD01 = 0x00000F10, - GPIO_REMAP_PD01 = 0x00000F11, + GPIO_NO_REMAP_PD01 = 0x00000F10, + GPIO_REMAP_PD01 = 0x00000F11, - GPIO_NO_REMAP_TMR5CH4_LSI = 0x00001010, - GPIO_REMAP_TMR5CH4_LSI = 0x00001011, + GPIO_NO_REMAP_TMR5CH4_LSI = 0x00001010, + GPIO_REMAP_TMR5CH4_LSI = 0x00001011, - GPIO_NO_REMAP_ADC1_ETRGINJ = 0x00001110, - GPIO_REMAP_ADC1_ETRGINJ = 0x00001111, + GPIO_NO_REMAP_ADC1_ETRGINJ = 0x00001110, + GPIO_REMAP_ADC1_ETRGINJ = 0x00001111, - GPIO_NO_REMAP_ADC1_ETRGREG = 0x00001210, - GPIO_REMAP_ADC1_ETRGREG = 0x00001211, + GPIO_NO_REMAP_ADC1_ETRGREG = 0x00001210, + GPIO_REMAP_ADC1_ETRGREG = 0x00001211, - GPIO_NO_REMAP_ADC2_ETRGINJ = 0x00001310, - GPIO_REMAP_ADC2_ETRGINJ = 0x00001311, + GPIO_NO_REMAP_ADC2_ETRGINJ = 0x00001310, + GPIO_REMAP_ADC2_ETRGINJ = 0x00001311, - GPIO_NO_REMAP_ADC2_ETRGREG = 0x00001410, - GPIO_REMAP_ADC2_ETRGREG = 0x00001411, + GPIO_NO_REMAP_ADC2_ETRGREG = 0x00001410, + GPIO_REMAP_ADC2_ETRGREG = 0x00001411, - GPIO_NO_REMAP_CAN2 = 0x00001610, - GPIO_REMAP_CAN2 = 0x00001611, + GPIO_NO_REMAP_CAN2 = 0x00001610, + GPIO_REMAP_CAN2 = 0x00001611, - GPIO_NO_REMAP_SWJ = 0x00001870, - GPIO_REMAP_SWJ_NOJTRST = 0x00001871, - GPIO_REMAP_SWJ_JTAGDISABLE = 0x00001872, - GPIO_REMAP_SWJ_DISABLE = 0x00001874, + GPIO_NO_REMAP_SWJ = 0x00001870, + GPIO_REMAP_SWJ_NOJTRST = 0x00001871, + GPIO_REMAP_SWJ_JTAGDISABLE = 0x00001872, + GPIO_REMAP_SWJ_DISABLE = 0x00001874, - GPIO_NO_REMAP_EMMC_NADV = 0x00010A10, - GPIO_REMAP_EMMC_NADV = 0x00010A11, -}GPIO_REMAP_T; + GPIO_NO_REMAP_EMMC_NADV = 0x00010A10, + GPIO_REMAP_EMMC_NADV = 0x00010A11, +} GPIO_REMAP_T; /** * @brief gpio port source define */ typedef enum { - GPIO_PORT_SOURCE_A, - GPIO_PORT_SOURCE_B, - GPIO_PORT_SOURCE_C, - GPIO_PORT_SOURCE_D, - GPIO_PORT_SOURCE_E, - GPIO_PORT_SOURCE_F, - GPIO_PORT_SOURCE_G, -}GPIO_PORT_SOURCE_T; + GPIO_PORT_SOURCE_A, + GPIO_PORT_SOURCE_B, + GPIO_PORT_SOURCE_C, + GPIO_PORT_SOURCE_D, + GPIO_PORT_SOURCE_E, + GPIO_PORT_SOURCE_F, + GPIO_PORT_SOURCE_G, +} GPIO_PORT_SOURCE_T; /** * @brief gpio pin source define */ typedef enum { - GPIO_PIN_SOURCE_0, - GPIO_PIN_SOURCE_1, - GPIO_PIN_SOURCE_2, - GPIO_PIN_SOURCE_3, - GPIO_PIN_SOURCE_4, - GPIO_PIN_SOURCE_5, - GPIO_PIN_SOURCE_6, - GPIO_PIN_SOURCE_7, - GPIO_PIN_SOURCE_8, - GPIO_PIN_SOURCE_9, - GPIO_PIN_SOURCE_10, - GPIO_PIN_SOURCE_11, - GPIO_PIN_SOURCE_12, - GPIO_PIN_SOURCE_13, - GPIO_PIN_SOURCE_14, - GPIO_PIN_SOURCE_15, -}GPIO_PIN_SOURCE_T; + GPIO_PIN_SOURCE_0, + GPIO_PIN_SOURCE_1, + GPIO_PIN_SOURCE_2, + GPIO_PIN_SOURCE_3, + GPIO_PIN_SOURCE_4, + GPIO_PIN_SOURCE_5, + GPIO_PIN_SOURCE_6, + GPIO_PIN_SOURCE_7, + GPIO_PIN_SOURCE_8, + GPIO_PIN_SOURCE_9, + GPIO_PIN_SOURCE_10, + GPIO_PIN_SOURCE_11, + GPIO_PIN_SOURCE_12, + GPIO_PIN_SOURCE_13, + GPIO_PIN_SOURCE_14, + GPIO_PIN_SOURCE_15, +} GPIO_PIN_SOURCE_T; /**@} end of group GPIO_Enumerations*/ @@ -199,10 +213,10 @@ typedef enum */ typedef struct { - uint16_t pin; - GPIO_SPEED_T speed; - GPIO_MODE_T mode; -}GPIO_Config_T; + uint16_t pin; + GPIO_SPEED_T speed; + GPIO_MODE_T mode; +} GPIO_Config_T; /**@} end of group GPIO_Structure*/ @@ -211,25 +225,25 @@ typedef struct */ /** Reset and common Configuration */ -void GPIO_Reset(GPIO_T* port); +void GPIO_Reset(GPIO_T *port); void GPIO_AFIOReset(void); -void GPIO_Config(GPIO_T* port, GPIO_Config_T* gpioConfig); -void GPIO_StructInit(GPIO_Config_T* gpioConfig); +void GPIO_Config(GPIO_T *port, GPIO_Config_T *gpioConfig); +void GPIO_ConfigStructInit(GPIO_Config_T *gpioConfig); /** Read */ -uint8_t GPIO_ReadInputBit(GPIO_T* port, uint16_t pin); -uint16_t GPIO_ReadInputPort(GPIO_T* port); -uint8_t GPIO_ReadOutputBit(GPIO_T* port, uint16_t pin); -uint16_t GPIO_ReadOutputPort(GPIO_T* port); +uint8_t GPIO_ReadInputBit(GPIO_T *port, uint16_t pin); +uint16_t GPIO_ReadInputPort(GPIO_T *port); +uint8_t GPIO_ReadOutputBit(GPIO_T *port, uint16_t pin); +uint16_t GPIO_ReadOutputPort(GPIO_T *port); /** Write */ -void GPIO_SetBits(GPIO_T* port, uint16_t pin); -void GPIO_ResetBits(GPIO_T* port, uint16_t pin); -void GPIO_WriteOutputPort(GPIO_T* port, uint16_t portValue); -void GPIO_WriteBitValue(GPIO_T* port, uint16_t pin, uint8_t bitVal); +void GPIO_SetBit(GPIO_T *port, uint16_t pin); +void GPIO_ResetBit(GPIO_T *port, uint16_t pin); +void GPIO_WriteOutputPort(GPIO_T *port, uint16_t portValue); +void GPIO_WriteBitValue(GPIO_T *port, uint16_t pin, uint8_t bitVal); /** GPIO Configuration */ -void GPIO_ConfigPinLock(GPIO_T* port, uint16_t pin); +void GPIO_ConfigPinLock(GPIO_T *port, uint16_t pin); void GPIO_ConfigEventOutput(GPIO_PORT_SOURCE_T portSource, GPIO_PIN_SOURCE_T pinSource); void GPIO_EnableEventOutput(void); void GPIO_DisableEventOutput(void); @@ -237,7 +251,7 @@ void GPIO_ConfigPinRemap(GPIO_REMAP_T remap); void GPIO_ConfigEINTLine(GPIO_PORT_SOURCE_T portSource, GPIO_PIN_SOURCE_T pinSource); /**@} end of group GPIO_Fuctions*/ -/**@} end of group GPIO_Driver */ +/**@} end of group GPIO_Driver*/ /**@} end of group Peripherals_Library*/ #ifdef __cplusplus diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_i2c.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_i2c.h index 49c6537e11..aef9810509 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_i2c.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_i2c.h @@ -1,23 +1,37 @@ /*! - * @file apm32f10x_i2c.h + * @file apm32f10x_i2c.h * - * @brief This file contains all the functions prototypes for the I2C firmware library + * @brief This file contains all the functions prototypes for the I2C firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_I2C_H #define __APM32F10X_I2C_H -#include "apm32f10x.h" - #ifdef __cplusplus extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -269,59 +283,59 @@ typedef struct */ /** I2C reset and configuration */ -void I2C_Reset(I2C_T* i2c); -void I2C_Config(I2C_T* i2c, I2C_Config_T* i2cConfig); -void I2C_ConfigStructInit(I2C_Config_T* i2cConfig); -void I2C_Enable(I2C_T* i2c); -void I2C_Disable(I2C_T* i2c); -void I2C_EnableGenerateStart(I2C_T* i2c); -void I2C_DisableGenerateStart(I2C_T* i2c); -void I2C_EnableGenerateStop(I2C_T* i2c); -void I2C_DisableGenerateStop(I2C_T* i2c); -void I2C_EnableAcknowledge(I2C_T* i2c); -void I2C_DisableAcknowledge(I2C_T* i2c); -void I2C_ConfigOwnAddress2(I2C_T* i2c, uint8_t address); -void I2C_EnableDualAddress(I2C_T* i2c); -void I2C_DisableDualAddress(I2C_T* i2c); -void I2C_EnableGeneralCall(I2C_T* i2c); -void I2C_DisableGeneralCall(I2C_T* i2c); +void I2C_Reset(I2C_T *i2c); +void I2C_Config(I2C_T *i2c, I2C_Config_T *i2cConfig); +void I2C_ConfigStructInit(I2C_Config_T *i2cConfig); +void I2C_Enable(I2C_T *i2c); +void I2C_Disable(I2C_T *i2c); +void I2C_EnableGenerateStart(I2C_T *i2c); +void I2C_DisableGenerateStart(I2C_T *i2c); +void I2C_EnableGenerateStop(I2C_T *i2c); +void I2C_DisableGenerateStop(I2C_T *i2c); +void I2C_EnableAcknowledge(I2C_T *i2c); +void I2C_DisableAcknowledge(I2C_T *i2c); +void I2C_ConfigOwnAddress2(I2C_T *i2c, uint8_t address); +void I2C_EnableDualAddress(I2C_T *i2c); +void I2C_DisableDualAddress(I2C_T *i2c); +void I2C_EnableGeneralCall(I2C_T *i2c); +void I2C_DisableGeneralCall(I2C_T *i2c); /** Transmit Configuration */ -void I2C_TxData(I2C_T* i2c, uint8_t data); -uint8_t I2C_RxData(I2C_T* i2c); -void I2C_Tx7BitAddress(I2C_T* i2c, uint8_t address, I2C_DIRECTION_T direction); -uint16_t I2C_ReadRegister(I2C_T* i2c, I2C_REGISTER_T i2cRegister); -void I2C_EnableSoftwareReset(I2C_T* i2c); -void I2C_DisableSoftwareReset(I2C_T* i2c); -void I2C_ConfigNACKPosition(I2C_T* i2c, I2C_NACK_POSITION_T NACKPosition); -void I2C_ConfigSMBusAlert(I2C_T* i2c, I2C_SMBUSALER_T SMBusState); -void I2C_EnablePECTransmit(I2C_T* i2c); -void I2C_DisablePECTransmit(I2C_T* i2c); -void I2C_ConfigPECPosition(I2C_T* i2c, I2C_PEC_POSITION_T PECPosition); -void I2C_EnablePEC(I2C_T* i2c); -void I2C_DisablePEC(I2C_T* i2c); -uint8_t I2C_ReadPEC(I2C_T* i2c); -void I2C_EnableARP(I2C_T* i2c); -void I2C_DisableARP(I2C_T* i2c); -void I2C_EnableStretchClock(I2C_T* i2c); -void I2C_DisableStretchClock(I2C_T* i2c); -void I2C_ConfigFastModeDutyCycle(I2C_T* i2c, I2C_DUTYCYCLE_T dutyCycle); +void I2C_TxData(I2C_T *i2c, uint8_t data); +uint8_t I2C_RxData(I2C_T *i2c); +void I2C_Tx7BitAddress(I2C_T *i2c, uint8_t address, I2C_DIRECTION_T direction); +uint16_t I2C_ReadRegister(I2C_T *i2c, I2C_REGISTER_T i2cRegister); +void I2C_EnableSoftwareReset(I2C_T *i2c); +void I2C_DisableSoftwareReset(I2C_T *i2c); +void I2C_ConfigNACKPosition(I2C_T *i2c, I2C_NACK_POSITION_T NACKPosition); +void I2C_ConfigSMBusAlert(I2C_T *i2c, I2C_SMBUSALER_T SMBusState); +void I2C_EnablePECTransmit(I2C_T *i2c); +void I2C_DisablePECTransmit(I2C_T *i2c); +void I2C_ConfigPECPosition(I2C_T *i2c, I2C_PEC_POSITION_T PECPosition); +void I2C_EnablePEC(I2C_T *i2c); +void I2C_DisablePEC(I2C_T *i2c); +uint8_t I2C_ReadPEC(I2C_T *i2c); +void I2C_EnableARP(I2C_T *i2c); +void I2C_DisableARP(I2C_T *i2c); +void I2C_EnableStretchClock(I2C_T *i2c); +void I2C_DisableStretchClock(I2C_T *i2c); +void I2C_ConfigFastModeDutyCycle(I2C_T *i2c, I2C_DUTYCYCLE_T dutyCycle); /** DMA */ -void I2C_EnableDMA(I2C_T* i2c); -void I2C_DisableDMA(I2C_T* i2c); -void I2C_EnableDMALastTransfer(I2C_T* i2c); -void I2C_DisableDMALastTransfer(I2C_T* i2c); +void I2C_EnableDMA(I2C_T *i2c); +void I2C_DisableDMA(I2C_T *i2c); +void I2C_EnableDMALastTransfer(I2C_T *i2c); +void I2C_DisableDMALastTransfer(I2C_T *i2c); /** Interrupts and flags */ -void I2C_EnableInterrupt(I2C_T* i2c, uint16_t interrupt); -void I2C_DisableInterrupt(I2C_T* i2c, uint16_t interrupt); -uint8_t I2C_ReadEventStatus(I2C_T* i2c, I2C_EVENT_T i2cEvent); -uint32_t I2C_ReadLastEvent(I2C_T* i2c); -uint8_t I2C_ReadStatusFlag(I2C_T* i2c, I2C_FLAG_T flag); -void I2C_ClearStatusFlag(I2C_T* i2c, I2C_FLAG_T flag); -uint8_t I2C_ReadIntFlag(I2C_T* i2c, I2C_INT_FLAG_T flag); -void I2C_ClearIntFlag(I2C_T* i2c, I2C_INT_FLAG_T flag); +void I2C_EnableInterrupt(I2C_T *i2c, uint16_t interrupt); +void I2C_DisableInterrupt(I2C_T *i2c, uint16_t interrupt); +uint8_t I2C_ReadEventStatus(I2C_T *i2c, I2C_EVENT_T i2cEvent); +uint32_t I2C_ReadLastEvent(I2C_T *i2c); +uint8_t I2C_ReadStatusFlag(I2C_T *i2c, I2C_FLAG_T flag); +void I2C_ClearStatusFlag(I2C_T *i2c, I2C_FLAG_T flag); +uint8_t I2C_ReadIntFlag(I2C_T *i2c, I2C_INT_FLAG_T flag); +void I2C_ClearIntFlag(I2C_T *i2c, uint32_t flag); /**@} end of group I2C_Fuctions*/ /**@} end of group I2C_Driver*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_iwdt.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_iwdt.h index 45c2c34c4d..b169681d02 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_iwdt.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_iwdt.h @@ -3,21 +3,35 @@ * * @brief This file contains all the functions prototypes for the IWDT firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_IWDT_H #define __APM32F10X_IWDT_H -#include "apm32f10x.h" - #ifdef __cplusplus - extern "C" { +extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -37,7 +51,7 @@ typedef enum { IWDT_KEYWORD_RELOAD = 0xAAAA, IWDT_KEYWORD_ENABLE = 0xCCCC -}IWDT_KEYWORD_T; +} IWDT_KEYWORD_T; /** * @brief IWDT Write Access define @@ -46,7 +60,7 @@ typedef enum { IWDT_WRITEACCESS_ENABLE = 0x5555, IWDT_WRITEACCESS_DISABLE = 0x0000 -}IWDT_WRITEACCESS_T; +} IWDT_WRITEACCESS_T; /** * @brief IWDT Divider @@ -60,7 +74,7 @@ typedef enum IWDT_DIVIDER_64 = 0x04, IWDT_DIVIDER_128 = 0x05, IWDT_DIVIDER_256 = 0x06 -}IWDT_DIVIDER_T; +} IWDT_DIVIDER_T; /** * @brief IWDT Flag @@ -69,7 +83,7 @@ typedef enum { IWDT_FLAG_PSCU = BIT0, IWDT_FLAG_CNTU = BIT1 -}IWDT_FLAG_T; +} IWDT_FLAG_T; /**@} end of group IWDT_Enumerations*/ @@ -98,7 +112,7 @@ void IWDT_DisableWriteAccess(void); uint8_t IWDT_ReadStatusFlag(uint16_t flag); /**@} end of group IWDT_Fuctions*/ -/**@} end of group IWDT_Driver */ +/**@} end of group IWDT_Driver*/ /**@} end of group Peripherals_Library*/ #ifdef __cplusplus diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_misc.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_misc.h index fbc8171da0..3ef1cdea11 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_misc.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_misc.h @@ -1,24 +1,38 @@ /*! - * @file apm32f10x_misc.h + * @file apm32f10x_misc.h * - * @brief This file provides all the miscellaneous firmware functions. + * @brief This file provides all the miscellaneous firmware functions. * Include NVIC,SystemTick and Power management. * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_MISC_H #define __APM32F10X_MISC_H -#include "apm32f10x.h" - #ifdef __cplusplus - extern "C" { +extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -36,19 +50,19 @@ */ typedef enum { - NVIC_VECT_TAB_RAM = 0x20000000, - NVIC_VECT_TAB_FLASH = 0x08000000, -}NVIC_VECT_TAB_T; + NVIC_VECT_TAB_RAM = 0x20000000, + NVIC_VECT_TAB_FLASH = 0x08000000, +} NVIC_VECT_TAB_T; /** * @brief system low power mode */ typedef enum { - NVIC_LOWPOWER_SEVONPEND = 0x10, - NVIC_LOWPOWER_SLEEPDEEP = 0x04, - NVIC_LOWPOWER_SLEEPONEXIT = 0x02 -}NVIC_LOWPOWER_T; + NVIC_LOWPOWER_SEVONPEND = 0x10, + NVIC_LOWPOWER_SLEEPDEEP = 0x04, + NVIC_LOWPOWER_SLEEPONEXIT = 0x02 +} NVIC_LOWPOWER_T; /** * @brief nvic priority group @@ -60,16 +74,16 @@ typedef enum NVIC_PRIORITY_GROUP_2 = 0x500, //!< 2 bits for pre-emption priority,2 bits for subpriority NVIC_PRIORITY_GROUP_3 = 0x400, //!< 3 bits for pre-emption priority,1 bits for subpriority NVIC_PRIORITY_GROUP_4 = 0x300 //!< 4 bits for pre-emption priority,0 bits for subpriority -}NVIC_PRIORITY_GROUP_T; +} NVIC_PRIORITY_GROUP_T; /** * @brief SysTick Clock source */ typedef enum { - SYSTICK_CLK_SOURCE_HCLK_DIV8 = 0x00, - SYSTICK_CLK_SOURCE_HCLK = 0x01 -}SYSTICK_CLK_SOURCE_T; + SYSTICK_CLK_SOURCE_HCLK_DIV8 = 0x00, + SYSTICK_CLK_SOURCE_HCLK = 0x01 +} SYSTICK_CLK_SOURCE_T; /**@} end of group MISC_Enumerations*/ @@ -93,6 +107,10 @@ void NVIC_ResetystemLowPower(NVIC_LOWPOWER_T lowPowerMode); /** Systick */ void SysTick_ConfigCLKSource(SYSTICK_CLK_SOURCE_T clkSource); +/**@} end of group MISC_Fuctions*/ +/**@} end of group MISC_Driver*/ +/**@} end of group Peripherals_Library*/ + #ifdef __cplusplus } #endif diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_pmu.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_pmu.h index 873686a220..204bdafaf0 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_pmu.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_pmu.h @@ -1,23 +1,37 @@ /*! - * @file apm32f10x_pmu.h + * @file apm32f10x_pmu.h * - * @brief This file contains all the functions prototypes for the PMU firmware library. + * @brief This file contains all the functions prototypes for the PMU firmware library. * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_PMU_H #define __APM32F10X_PMU_H -#include "apm32f10x.h" - #ifdef __cplusplus extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -30,6 +44,9 @@ extern "C" { @{ */ +/** + * @brief PMU PVD detection level + */ typedef enum { PMU_PVD_LEVEL_2V2 = 0x00, //!< PVD detection level set to 2.2V @@ -42,18 +59,27 @@ typedef enum PMU_PVD_LEVEL_2V9 = 0x07, //!< PVD detection level set to 2.9V } PMU_PVD_LEVEL_T; +/** + * @brief PMU Regulator state in STOP mode + */ typedef enum { PMU_REGULATOR_ON = 0x00, PMU_REGULATOR_LOWPOWER = 0x01 } PMU_REGULATOR_T; +/** + * @brief PMU STOP mode entry + */ typedef enum { PMU_STOP_ENTRY_WFI = 0x01, PMU_STOP_ENTRY_WFE = 0x02 } PMU_STOP_ENTRY_T; +/** + * @brief PMU Flag + */ typedef enum { PMU_FLAG_WUE, @@ -87,7 +113,7 @@ uint8_t PMU_ReadStatusFlag(PMU_FLAG_T flag); void PMU_ClearStatusFlag(PMU_FLAG_T flag); /**@} end of group PMU_Fuctions*/ -/**@} end of group PMU_Driver */ +/**@} end of group PMU_Driver*/ /**@} end of group Peripherals_Library*/ #ifdef __cplusplus diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_qspi.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_qspi.h index 8a373eb326..592cfcbd63 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_qspi.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_qspi.h @@ -3,21 +3,35 @@ * * @brief This file contains all the prototypes,enumeration and macros for the QSPI peripheral * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ - + #ifndef __APM32F10X_QSPI_H #define __APM32F10X_QSPI_H -#include "apm32f10x.h" - #ifdef __cplusplus - extern "C" { +extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -38,7 +52,7 @@ typedef enum QSPI_FRF_STANDARD, //!< Standard mode QSPI_FRF_DUAL, //!< Dual SPI QSPI_FRF_QUAD //!< QUAD SPI -}QSPI_FRF_T; +} QSPI_FRF_T; /** * @brief Transmission mode @@ -48,8 +62,8 @@ typedef enum QSPI_TRANS_MODE_TX_RX, //!< TX and RX mode QSPI_TRANS_MODE_TX, //!< TX mode only QSPI_TRANS_MODE_RX, //!< RX mode only - QSPI_TRANS_MODE_EEPROM_READ, //!< EEPROM read mode -}QSPI_TRANS_MODE_T; + QSPI_TRANS_MODE_EEPROM_READ //!< EEPROM read mode +} QSPI_TRANS_MODE_T; /** * @brief Clock polarity @@ -57,8 +71,8 @@ typedef enum typedef enum { QSPI_CLKPOL_LOW, - QSPI_CLKPOL_HIGH, -}QSPI_CLKPOL_T; + QSPI_CLKPOL_HIGH +} QSPI_CLKPOL_T; /** * @brief Clock phase @@ -67,7 +81,7 @@ typedef enum { QSPI_CLKPHA_1EDGE, QSPI_CLKPHA_2EDGE -}QSPI_CLKPHA_T; +} QSPI_CLKPHA_T; /** * @brief Data format size @@ -102,8 +116,8 @@ typedef enum QSPI_DFS_29BIT, QSPI_DFS_30BIT, QSPI_DFS_31BIT, - QSPI_DFS_32BIT, -}QSPI_DFS_T; + QSPI_DFS_32BIT +} QSPI_DFS_T; /** * @brief QSPI flag @@ -116,7 +130,7 @@ typedef enum QSPI_FLAG_RFNE = BIT3, //!< RX FIFO not empty flag QSPI_FLAG_RFF = BIT4, //!< RX FIFO full flag QSPI_FLAG_DCE = BIT6 //!< Data collision error -}QSPI_FLAG_T; +} QSPI_FLAG_T; /** * @brief QSPI interrupt source @@ -128,8 +142,8 @@ typedef enum QSPI_INT_RFU = BIT2, //!< RX FIFO underflow interrupt QSPI_INT_RFO = BIT3, //!< RX FIFO overflow interrupt QSPI_INT_RFF = BIT4, //!< RX FIFO full interrupt - QSPI_INT_MST = BIT5, //!< Master interrupt -}QSPI_INT_T; + QSPI_INT_MST = BIT5 //!< Master interrupt +} QSPI_INT_T; /** * @brief QSPI interrupt flag @@ -141,8 +155,8 @@ typedef enum QSPI_INT_FLAG_RFU = BIT2, //!< RX FIFO underflow interrupt flag QSPI_INT_FLAG_RFO = BIT3, //!< RX FIFO overflow interrupt flag QSPI_INT_FLAG_RFF = BIT4, //!< RX FIFO full interrupt flag - QSPI_INT_FLAG_MST = BIT5, //!< Master interrupt flag -}QSPI_INT_FLAG_T; + QSPI_INT_FLAG_MST = BIT5 //!< Master interrupt flag +} QSPI_INT_FLAG_T; /** * @brief Reception sample edge @@ -151,7 +165,7 @@ typedef enum { QSPI_RSE_RISING, QSPI_RSE_FALLING -}QSPI_RSE_T; +} QSPI_RSE_T; /** * @brief Instruction length @@ -161,8 +175,8 @@ typedef enum QSPI_INST_LEN_0, QSPI_INST_LEN_4BIT, QSPI_INST_LEN_8BIT, - QSPI_INST_LEN_16BIT, -}QSPI_INST_LEN_T; + QSPI_INST_LEN_16BIT +} QSPI_INST_LEN_T; /** * @brief QSPI address length @@ -184,8 +198,8 @@ typedef enum QSPI_ADDR_LEN_48BIT, QSPI_ADDR_LEN_52BIT, QSPI_ADDR_LEN_56BIT, - QSPI_ADDR_LEN_60BIT, -}QSPI_ADDR_LEN_T; + QSPI_ADDR_LEN_60BIT +} QSPI_ADDR_LEN_T; /** * @brief Instruction and address transmission mode @@ -194,8 +208,8 @@ typedef enum { QSPI_INST_ADDR_TYPE_STANDARD, QSPI_INST_TYPE_STANDARD, - QSPI_INST_ADDR_TYPE_FRF, -}QSPI_INST_ADDR_TYPE_T; + QSPI_INST_ADDR_TYPE_FRF +} QSPI_INST_ADDR_TYPE_T; /** * @brief Slave Select Toggle @@ -203,8 +217,8 @@ typedef enum typedef enum { QSPI_SST_DISABLE, - QSPI_SST_ENABLE, -}QSPI_SST_T; + QSPI_SST_ENABLE +} QSPI_SST_T; /**@} end of group QSPI_Enumerations*/ @@ -255,7 +269,7 @@ typedef struct QSPI_CLKPOL_T clockPolarity; //!< Clock polarity QSPI_CLKPHA_T clockPhase; //!< Clock phase QSPI_DFS_T dataFrameSize; //!< Data frame size -}QSPI_Config_T; +} QSPI_Config_T; /**@} end of group QSPI_Structure*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_rcm.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_rcm.h index 0d4ba102fa..10651ba794 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_rcm.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_rcm.h @@ -1,23 +1,37 @@ /*! - * @file apm32f10x_rcm.h + * @file apm32f10x_rcm.h * - * @brief This file contains all the functions prototypes for the RCM firmware library + * @brief This file contains all the functions prototypes for the RCM firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_RCM_H #define __APM32F10X_RCM_H -#include "apm32f10x.h" - #ifdef __cplusplus extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -35,9 +49,9 @@ extern "C" { */ typedef enum { - RCM_HSE_CLOSE, //!< CLOSE HSE - RCM_HSE_OPEN, //!< OPEN HSE - RCM_HSE_BYPASS, //!< HSE BYPASS + RCM_HSE_CLOSE, + RCM_HSE_OPEN, + RCM_HSE_BYPASS } RCM_HSE_T; /** @@ -59,7 +73,7 @@ typedef enum RCM_PLLMF_13, RCM_PLLMF_14, RCM_PLLMF_15, - RCM_PLLMF_16, + RCM_PLLMF_16 } RCM_PLLMF_T; /** @@ -85,7 +99,7 @@ typedef enum RCM_AHB_DIV_64, RCM_AHB_DIV_128, RCM_AHB_DIV_256, - RCM_AHB_DIV_512, + RCM_AHB_DIV_512 } RCM_AHB_DIV_T; /** @@ -117,7 +131,7 @@ typedef enum typedef enum { RCM_FPU_DIV_1, - RCM_FPU_DIV_2, + RCM_FPU_DIV_2 } RCM_FPU_DIV_T; /** @@ -128,7 +142,7 @@ typedef enum RCM_PCLK2_DIV_2, RCM_PCLK2_DIV_4, RCM_PCLK2_DIV_6, - RCM_PCLK2_DIV_8, + RCM_PCLK2_DIV_8 } RCM_PCLK2_DIV_T; /** @@ -160,7 +174,7 @@ typedef enum RCM_MCOCLK_SYSCLK, RCM_MCOCLK_HSI, RCM_MCOCLK_HSE, - RCM_MCOCLK_PLLCLK_DIV_2, + RCM_MCOCLK_PLLCLK_DIV_2 } RCM_MCOCLK_T; /** @@ -199,7 +213,7 @@ typedef enum RCM_AHB_PERIPH_QSPI = BIT5, RCM_AHB_PERIPH_CRC = BIT6, RCM_AHB_PERIPH_EMMC = BIT8, - RCM_AHB_PERIPH_SDIO = BIT10, + RCM_AHB_PERIPH_SDIO = BIT10 } RCM_AHB_PERIPH_T; /** @@ -221,7 +235,7 @@ typedef enum RCM_APB2_PERIPH_SPI1 = BIT12, RCM_APB2_PERIPH_TMR8 = BIT13, RCM_APB2_PERIPH_USART1 = BIT14, - RCM_APB2_PERIPH_ADC3 = BIT15, + RCM_APB2_PERIPH_ADC3 = BIT15 } RCM_APB2_PERIPH_T; /** @@ -249,7 +263,7 @@ typedef enum RCM_APB1_PERIPH_CAN2 = BIT26, RCM_APB1_PERIPH_BAKR = BIT27, RCM_APB1_PERIPH_PMU = BIT28, - RCM_APB1_PERIPH_DAC = BIT29, + RCM_APB1_PERIPH_DAC = BIT29 } RCM_APB1_PERIPH_T; /** @@ -267,7 +281,7 @@ typedef enum RCM_FLAG_SWRST = 0x21C, //!< Software reset flag RCM_FLAG_IWDTRST = 0x21D, //!< Independent watchdog reset flag RCM_FLAG_WWDTRST = 0x21E, //!< Window watchdog reset flag - RCM_FLAG_LPRRST = 0x21F, //!< Low-power reset flag + RCM_FLAG_LPRRST = 0x21F //!< Low-power reset flag } RCM_FLAG_T; /**@} end of group RCM_Enumerations*/ @@ -287,7 +301,7 @@ void RCM_ConfigHSE(RCM_HSE_T state); uint8_t RCM_WaitHSEReady(void); /** HSI clock */ -void RCM_SetHSITrim(uint8_t HSITrim); +void RCM_ConfigHSITrim(uint8_t HSITrim); void RCM_EnableHSI(void); void RCM_DisableHSI(void); @@ -325,7 +339,7 @@ void RCM_DisableRTCCLK(void); /** Reads the clock frequency */ uint32_t RCM_ReadSYSCLKFreq(void); uint32_t RCM_ReadHCLKFreq(void); -void RCM_ReadPCLKFreq(uint32_t* PCLK1, uint32_t* PCLK2); +void RCM_ReadPCLKFreq(uint32_t *PCLK1, uint32_t *PCLK2); uint32_t RCM_ReadADCCLKFreq(void); /** Enable or disable Periph Clock */ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_rtc.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_rtc.h index 5e243794f6..6b5c37cf60 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_rtc.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_rtc.h @@ -1,23 +1,37 @@ /*! - * @file apm32f10x_rtc.h + * @file apm32f10x_rtc.h * - * @brief This file contains all the functions prototypes for the RTC firmware library + * @brief This file contains all the functions prototypes for the RTC firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_RTC_H #define __APM32F10X_RTC_H -#include "apm32f10x.h" - #ifdef __cplusplus extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_sci2c.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_sci2c.h index fe6e1a6138..f4fa60f3ed 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_sci2c.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_sci2c.h @@ -3,21 +3,35 @@ * * @brief This file contains all the prototypes,enumeration and macros for the SCI2C(I2C3, I2C4) peripheral * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_SCI2C_H #define __APM32F10X_SCI2C_H -#include "apm32f10x.h" - #ifdef __cplusplus - extern "C" { +extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -38,7 +52,7 @@ typedef enum SCI2C_SPEED_STANDARD = 1, SCI2C_SPEED_FAST, SCI2C_SPEED_HIGH -}SCI2C_SPEED_T; +} SCI2C_SPEED_T; /** * @brief Address mode @@ -47,7 +61,7 @@ typedef enum { SCI2C_ADDR_MODE_7BIT, SCI2C_ADDR_MODE_10BIT -}SCI2C_ADDR_MODE_T; +} SCI2C_ADDR_MODE_T; /** * @brief SCI2C mode enumeration @@ -56,7 +70,7 @@ typedef enum { SCI2C_MODE_MASTER, SCI2C_MODE_SLAVE -}SCI2C_MODE_T; +} SCI2C_MODE_T; /** * @brief Restart enable or disable @@ -65,7 +79,7 @@ typedef enum { SCI2C_RESTART_DISABLE, SCI2C_RESTART_ENABLE -}SCI2C_RESTART_T; +} SCI2C_RESTART_T; /** * @brief Enable or disable generate stop condition @@ -74,7 +88,7 @@ typedef enum { SCI2C_STOP_DISABLE, SCI2C_STOP_ENABLE -}SCI2C_STOP_T; +} SCI2C_STOP_T; /** * @brief Data direction */ @@ -82,7 +96,7 @@ typedef enum { SCI2C_DATA_DIR_WRITE, SCI2C_DATA_DIR_READ, -}SCI2C_DATA_DIR_T; +} SCI2C_DATA_DIR_T; /** * @brief SCI2C interrupt @@ -104,7 +118,7 @@ typedef enum SCI2C_INT_RSTAD = BIT12, //!< Restart detect interrupt SCI2C_INT_MOH = BIT13, //!< Master on hold interrupt SCI2C_INT_ALL = BIT15 //!< All interrupt -}SCI2C_INT_T; +} SCI2C_INT_T; /** * @brief Flag enumeration @@ -121,7 +135,7 @@ typedef enum SCI2C_FLAG_I2CEN = BIT8 | BIT0, //!< I2C enable flag SCI2C_FLAG_SDWB = BIT8 | BIT1, //!< Slave disable while busy flag SCI2C_FLAG_SRDL = BIT8 | BIT2 //!< Slave receive data lost flag -}SCI2C_FLAG_T; +} SCI2C_FLAG_T; /** * @brief Tx abort source @@ -144,7 +158,7 @@ typedef enum SCI2C_TAS_SRI = BIT13, //!< Slave read done SCI2C_TAS_USRARB = BIT14, //!< User abort SCI2C_TAS_FLUCNT = BIT15 //!< Tx flush counter -}SCI2C_TAS_T; +} SCI2C_TAS_T; /** * @brief DMA Enable @@ -153,7 +167,7 @@ typedef enum { SCI2C_DMA_RX = BIT0, SCI2C_DMA_TX = BIT1, -}SCI2C_DMA_T; +} SCI2C_DMA_T; /**@} end of group SCI2C_Enumerations*/ @@ -213,7 +227,7 @@ typedef struct uint8_t txFifoThreshold; //!< Tx FIFO threshold SCI2C_RESTART_T restart; //!< Enable or disable restart SCI2C_ADDR_MODE_T addrMode; //!< Address mode. 7-bit or 10-bit mode. -}SCI2C_Config_T; +} SCI2C_Config_T; /**@} end of group SCI2C_Structure*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_sdio.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_sdio.h index cc29cc3c8f..98b83aa94c 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_sdio.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_sdio.h @@ -3,21 +3,35 @@ * * @brief This file contains all the functions prototypes for the SDIO firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_SDIO_H #define __APM32F10X_SDIO_H -#include "apm32f10x.h" - #ifdef __cplusplus - extern "C" { +extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -37,7 +51,7 @@ typedef enum { SDIO_CLOCK_EDGE_RISING = 0x00000000, SDIO_CLOCK_EDGE_FALLING = 0x00002000 -}SDIO_CLOCK_EDGE_T; +} SDIO_CLOCK_EDGE_T; /** * @brief SDIO clock bypass @@ -46,7 +60,7 @@ typedef enum { SDIO_CLOCK_BYPASS_DISABLE = 0x00000000, SDIO_CLOCK_BYPASS_ENABLE = 0x00000400 -}SDIO_CLOCK_BYPASS_T; +} SDIO_CLOCK_BYPASS_T; /** * @brief SDIO clock power save @@ -55,17 +69,17 @@ typedef enum { SDIO_CLOCK_POWER_SAVE_DISABLE = 0x00000000, SDIO_CLOCK_POWER_SAVE_ENABLE = 0x00000200 -}SDIO_CLOCK_POWER_SAVE_T; +} SDIO_CLOCK_POWER_SAVE_T; /** * @brief SDIO bus wide */ typedef enum { - SDIO_BUSWIDE_1B = 0x00000000, - SDIO_BUSWIDE_4B = 0x00000800, - SDIO_BUSWIDE_8B = 0x00001000 -}SDIO_BUSWIDE_T; + SDIO_BUS_WIDE_1B = 0x00000000, + SDIO_BUS_WIDE_4B = 0x00000800, + SDIO_BUS_WIDE_8B = 0x00001000 +} SDIO_BUS_WIDE_T; /** * @brief SDIO hardware flow control @@ -74,7 +88,7 @@ typedef enum { SDIO_HARDWARE_FLOW_CONTROL_DISABLE = 0x00000000, SDIO_HARDWARE_FLOW_CONTROL_ENABLE = 0x00004000 -}SDIO_HARDWARE_FLOW_CONTROL_T; +} SDIO_HARDWARE_FLOW_CONTROL_T; /** * @brief SDIO power state @@ -83,7 +97,7 @@ typedef enum { SDIO_POWER_STATE_OFF = 0x00000000, SDIO_POWER_STATE_ON = 0x00000003 -}SDIO_POWER_STATE_T; +} SDIO_POWER_STATE_T; /** * @brief SDIO interrupt sources @@ -114,7 +128,7 @@ typedef enum SDIO_INT_RXDA = 0x00200000, SDIO_INT_SDIOINT = 0x00400000, SDIO_INT_ATAEND = 0x00800000 -}SDIO_INT_T; +} SDIO_INT_T; /** * @brief SDIO response @@ -124,7 +138,7 @@ typedef enum SDIO_RESPONSE_NO = 0x00000000, SDIO_RESPONSE_SHORT = 0x00000040, SDIO_RESPONSE_LONG = 0x000000C0 -}SDIO_RESPONSE_T; +} SDIO_RESPONSE_T; /** * @brief SDIO wait interrupt state @@ -134,7 +148,7 @@ typedef enum SDIO_WAIT_NO = 0x00000000, SDIO_WAIT_INT = 0x00000100, SDIO_WAIT_PEND = 0x00000200 -}SDIO_WAIT_T; +} SDIO_WAIT_T; /** * @brief SDIO CPSM state @@ -143,7 +157,7 @@ typedef enum { SDIO_CPSM_DISABLE = 0x00000000, SDIO_CPSM_ENABLE = 0x00000400 -}SDIO_CPSM_T; +} SDIO_CPSM_T; /** * @brief SDIO response registers @@ -154,7 +168,7 @@ typedef enum SDIO_RES2 = 0x00000004, SDIO_RES3 = 0x00000008, SDIO_RES4 = 0x0000000C -}SDIO_RES_T; +} SDIO_RES_T; /** * @brief SDIO data block size @@ -176,16 +190,16 @@ typedef enum SDIO_DATA_BLOCKSIZE_496B = 0x000000C0, SDIO_DATA_BLOCKSIZE_8192B = 0x000000D0, SDIO_DATA_BLOCKSIZE_16384B = 0x000000E0 -}SDIO_DATA_BLOCKSIZE_T; +} SDIO_DATA_BLOCKSIZE_T; /** * @brief SDIO transfer direction */ typedef enum { - SDIO_TRANSFER_DIR_TOCARD = 0x00000000, - SDIO_TRANSFER_DIR_TOSDIO = 0x00000002 -}SDIO_TRANSFER_DIR_T; + SDIO_TRANSFER_DIR_TO_CARD = 0x00000000, + SDIO_TRANSFER_DIR_TO_SDIO = 0x00000002 +} SDIO_TRANSFER_DIR_T; /** * @brief SDIO transfer type @@ -194,7 +208,7 @@ typedef enum { SDIO_TRANSFER_MODE_BLOCK = 0x00000000, SDIO_TRANSFER_MODE_STREAM = 0x00000004 -}SDIO_TRANSFER_MODE_T; +} SDIO_TRANSFER_MODE_T; /** * @brief SDIO DPSM state @@ -203,7 +217,7 @@ typedef enum { SDIO_DPSM_DISABLE = 0x00000000, SDIO_DPSM_ENABLE = 0x00000001 -}SDIO_DPSM_T; +} SDIO_DPSM_T; /** * @brief SDIO flag @@ -234,7 +248,7 @@ typedef enum SDIO_FLAG_RXDA = 0x00200000, SDIO_FLAG_SDIOINT = 0x00400000, SDIO_FLAG_ATAEND = 0x00800000 -}SDIO_FLAG_T; +} SDIO_FLAG_T; /** * @brief SDIO read wait mode @@ -243,7 +257,7 @@ typedef enum { SDIO_READ_WAIT_MODE_CLK = 0x00000001, SDIO_READ_WAIT_MODE_DATA2 = 0x00000000 -}SDIO_READ_WAIT_MODE_T; +} SDIO_READ_WAIT_MODE_T; /**@} end of group SDIO_Enumerations*/ @@ -255,52 +269,52 @@ typedef enum /** ------------ SDIO registers bit address in the alias region ----------- */ #define SDIO_OFFSET (SDIO_BASE - PERIPH_BASE) -/* --- CLKCTRL Register ---*/ +/** --- CLKCTRL Register ---*/ -/* Alias word address of CLKEN bit */ +/** Alias word address of CLKEN bit */ #define CLKCTRL_OFFSET (SDIO_OFFSET + 0x04) #define CLKEN_BitNumber 0x08 #define CLKCTRL_CLKEN_BB (PERIPH_BB_BASE + (CLKCTRL_OFFSET * 32) + (CLKEN_BitNumber * 4)) -/* --- CMD Register ---*/ +/** --- CMD Register ---*/ -/* Alias word address of SDIOSC bit */ +/** Alias word address of SDIOSC bit */ #define CMD_OFFSET (SDIO_OFFSET + 0x0C) #define SDIOSC_BitNumber 0x0B #define CMD_SDIOSC_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (SDIOSC_BitNumber * 4)) -/* Alias word address of CMDCPEN bit */ +/** Alias word address of CMDCPEN bit */ #define CMDCPEN_BitNumber 0x0C #define CMD_CMDCPEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (CMDCPEN_BitNumber * 4)) -/* Alias word address of INTEN bit */ +/** Alias word address of INTEN bit */ #define INTEN_BitNumber 0x0D #define CMD_INTEN_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (INTEN_BitNumber * 4)) -/* Alias word address of ATACMD bit */ +/** Alias word address of ATACMD bit */ #define ATACMD_BitNumber 0x0E #define CMD_ATACMD_BB (PERIPH_BB_BASE + (CMD_OFFSET * 32) + (ATACMD_BitNumber * 4)) -/* --- DCTRL Register ---*/ +/** --- DCTRL Register ---*/ -/* Alias word address of DMAEN bit */ +/** Alias word address of DMAEN bit */ #define DCTRL_OFFSET (SDIO_OFFSET + 0x2C) #define DMAEN_BitNumber 0x03 #define DCTRL_DMAEN_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (DMAEN_BitNumber * 4)) -/* Alias word address of RWSTR bit */ +/** Alias word address of RWSTR bit */ #define RWSTR_BitNumber 0x08 #define DCTRL_RWSTR_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTR_BitNumber * 4)) -/* Alias word address of RWSTOP bit */ +/** Alias word address of RWSTOP bit */ #define RWSTOP_BitNumber 0x09 #define DCTRL_RWSTOP_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RWSTOP_BitNumber * 4)) -/* Alias word address of RDWAIT bit */ +/** Alias word address of RDWAIT bit */ #define RDWAIT_BitNumber 0x0A #define DCTRL_RDWAIT_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (RDWAIT_BitNumber * 4)) -/* Alias word address of SDIOF bit */ +/** Alias word address of SDIOF bit */ #define SDIOF_BitNumber 0x0B #define DCTRL_SDIOF_BB (PERIPH_BB_BASE + (DCTRL_OFFSET * 32) + (SDIOF_BitNumber * 4)) @@ -318,10 +332,10 @@ typedef struct SDIO_CLOCK_EDGE_T clockEdge; SDIO_CLOCK_BYPASS_T clockBypass; SDIO_CLOCK_POWER_SAVE_T clockPowerSave; - SDIO_BUSWIDE_T busWide; + SDIO_BUS_WIDE_T busWide; SDIO_HARDWARE_FLOW_CONTROL_T hardwareFlowControl; uint8_t clockDiv; -}SDIO_Config_T; +} SDIO_Config_T; /** * @brief SDIO CMD Config structure definition @@ -333,7 +347,7 @@ typedef struct SDIO_RESPONSE_T response; SDIO_WAIT_T wait; SDIO_CPSM_T CPSM; -}SDIO_CMDConfig_T; +} SDIO_CmdConfig_T; /** * @brief SDIO Data Config structure definition @@ -346,7 +360,7 @@ typedef struct SDIO_TRANSFER_DIR_T transferDir; SDIO_TRANSFER_MODE_T transferMode; SDIO_DPSM_T DPSM; -}SDIO_DataConfig_T; +} SDIO_DataConfig_T; /**@} end of group SDIO_Structure*/ @@ -357,8 +371,8 @@ typedef struct /** SDIO reset and configuration */ void SDIO_Reset(void); -void SDIO_Config(SDIO_Config_T* sdioConfig); -void SDIO_ConfigStructInit(SDIO_Config_T* sdioConfig); +void SDIO_Config(SDIO_Config_T *sdioConfig); +void SDIO_ConfigStructInit(SDIO_Config_T *sdioConfig); void SDIO_EnableClock(void); void SDIO_DisableClock(void); void SDIO_ConfigPowerState(SDIO_POWER_STATE_T powerState); @@ -369,14 +383,14 @@ void SDIO_EnableDMA(void); void SDIO_DisableDMA(void); /** Command */ -void SDIO_TxCommand(SDIO_CMDConfig_T *cmdConfig); -void SDIO_TxCommandStructInit(SDIO_CMDConfig_T* cmdconfig); +void SDIO_TxCommand(SDIO_CmdConfig_T *cmdConfig); +void SDIO_TxCommandStructInit(SDIO_CmdConfig_T *cmdconfig); uint8_t SDIO_ReadCommandResponse(void); uint32_t SDIO_ReadResponse(SDIO_RES_T res); /** SDIO data configuration */ -void SDIO_ConfigData(SDIO_DataConfig_T* dataConfig); -void SDIO_ConfigDataStructInit(SDIO_DataConfig_T* dataConfig); +void SDIO_ConfigData(SDIO_DataConfig_T *dataConfig); +void SDIO_ConfigDataStructInit(SDIO_DataConfig_T *dataConfig); uint32_t SDIO_ReadDataCounter(void); void SDIO_WriteData(uint32_t data); uint32_t SDIO_ReadData(void); diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_spi.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_spi.h index 40e4afe7c0..2f2fbab65f 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_spi.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_spi.h @@ -3,21 +3,35 @@ * * @brief This file contains all the functions prototypes for the SPI firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_SPI_H #define __APM32F10X_SPI_H -#include "apm32f10x.h" - #ifdef __cplusplus - extern "C" { +extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -39,7 +53,7 @@ typedef enum SPI_DIRECTION_2LINES_RXONLY = 0x0400, SPI_DIRECTION_1LINE_RX = 0x8000, SPI_DIRECTION_1LINE_TX = 0xC000 -}SPI_DIRECTION_T; +} SPI_DIRECTION_T; /** * @brief SPI mode @@ -48,7 +62,7 @@ typedef enum { SPI_MODE_MASTER = 0x0104, SPI_MODE_SLAVE = 0x0000 -}SPI_MODE_T; +} SPI_MODE_T; /** * @brief SPI Data length @@ -57,7 +71,7 @@ typedef enum { SPI_DATA_LENGTH_16B = 0x0800, SPI_DATA_LENGTH_8B = 0x0000 -}SPI_DATA_LENGTH_T; +} SPI_DATA_LENGTH_T; /** * @brief SPI Clock Polarity @@ -66,7 +80,7 @@ typedef enum { SPI_CLKPOL_LOW = 0x0000, SPI_CLKPOL_HIGH = 0x0002 -}SPI_CLKPOL_T; +} SPI_CLKPOL_T; /** * @brief SPI Clock Phase @@ -75,7 +89,7 @@ typedef enum { SPI_CLKPHA_1EDGE = 0x0000, SPI_CLKPHA_2EDGE = 0x0001 -}SPI_CLKPHA_T; +} SPI_CLKPHA_T; /** * @brief SPI Slave Select management @@ -84,7 +98,7 @@ typedef enum { SPI_NSS_SOFT = 0x0200, SPI_NSS_HARD = 0x0000 -}SPI_NSS_T; +} SPI_NSS_T; /** * @brief SPI BaudRate Prescaler @@ -99,7 +113,7 @@ typedef enum SPI_BAUDRATE_DIV_64 = 0x0028, SPI_BAUDRATE_DIV_128 = 0x0030, SPI_BAUDRATE_DIV_256 = 0x0038, -}SPI_BAUDRATE_DIV_T; +} SPI_BAUDRATE_DIV_T; /** * @brief SPI MSB LSB transmission @@ -108,7 +122,7 @@ typedef enum { SPI_FIRSTBIT_MSB = 0x0000, SPI_FIRSTBIT_LSB = 0x0080 -}SPI_FIRSTBIT_T; +} SPI_FIRSTBIT_T; /** * @brief I2S Mode @@ -119,7 +133,7 @@ typedef enum I2S_MODE_SLAVE_RX = 0x0100, I2S_MODE_MASTER_TX = 0x0200, I2S_MODE_MASTER_RX = 0x0300 -}I2S_MODE_T; +} I2S_MODE_T; /** * @brief I2S Standard @@ -131,7 +145,7 @@ typedef enum I2S_STANDARD_LSB = 0x0020, I2S_STANDARD_PCMSHORT = 0x0030, I2S_STANDARD_PCMLONG = 0x00B0 -}I2S_STANDARD_T; +} I2S_STANDARD_T; /** * @brief I2S data length @@ -151,7 +165,7 @@ typedef enum { I2S_MCLK_OUTPUT_DISABLE = 0x0000, I2S_MCLK_OUTPUT_ENABLE = 0x0200, -}I2S_MCLK_OUTPUT_T; +} I2S_MCLK_OUTPUT_T; /** * @brief I2S Audio divider @@ -168,7 +182,7 @@ typedef enum I2S_AUDIO_DIV_11K = 11025, I2S_AUDIO_DIV_8K = 8000, I2S_AUDIO_DIV_DEFAULT = 2 -}I2S_AUDIO_DIV_T; +} I2S_AUDIO_DIV_T; /** * @brief I2S Clock Polarity @@ -177,7 +191,7 @@ typedef enum { I2S_CLKPOL_LOW = 0x0000, I2S_CLKPOL_HIGH = 0x0008 -}I2S_CLKPOL_T; +} I2S_CLKPOL_T; /** * @brief SPI Direction select @@ -186,7 +200,7 @@ typedef enum { SPI_DIRECTION_RX = 0xBFFF, SPI_DIRECTION_TX = 0x4000 -}SPI_DIRECTION_SELECT_T; +} SPI_DIRECTION_SELECT_T; /** * @brief SPI interrupts definition @@ -200,7 +214,7 @@ typedef enum SPI_INT_CRCE = 0x2010, SPI_INT_ME = 0x2020, I2S_INT_UDR = 0x2008 -}SPI_I2S_INT_T; +} SPI_I2S_INT_T; /** * @brief SPI flags definition @@ -215,7 +229,7 @@ typedef enum SPI_FLAG_ME = 0x0020, SPI_FLAG_OVR = 0x0040, SPI_FLAG_BSY = 0x0080 -}SPI_FLAG_T; +} SPI_FLAG_T; /** * @brief SPI I2S DMA requests @@ -224,7 +238,7 @@ typedef enum { SPI_I2S_DMA_REQ_TX = 0x0002, SPI_I2S_DMA_REQ_RX = 0x0001 -}SPI_I2S_DMA_REQ_T; +} SPI_I2S_DMA_REQ_T; /**@} end of group SPI_Enumerations*/ @@ -247,7 +261,7 @@ typedef struct SPI_DIRECTION_T direction; SPI_BAUDRATE_DIV_T baudrateDiv; uint16_t crcPolynomial; -}SPI_Config_T; +} SPI_Config_T; /** * @brief I2S Config structure definition @@ -260,7 +274,7 @@ typedef struct I2S_MCLK_OUTPUT_T MCLKOutput; I2S_AUDIO_DIV_T audioDiv; I2S_CLKPOL_T polarity; -}I2S_Config_T; +} I2S_Config_T; /**@} end of group SPI_Structure*/ @@ -269,44 +283,44 @@ typedef struct */ /** Reset and Configuration */ -void SPI_I2S_Reset(SPI_T* spi); -void SPI_Config(SPI_T* spi, SPI_Config_T* spiConfig); -void I2S_Config(SPI_T* spi, I2S_Config_T* i2sConfig); -void SPI_ConfigStructInit(SPI_Config_T* spiConfig); -void I2S_ConfigStructInit(I2S_Config_T* i2sConfig); -void SPI_Enable(SPI_T* spi); -void SPI_Disable(SPI_T* spi); -void I2S_Enable(SPI_T* spi); -void I2S_Disable(SPI_T* spi); +void SPI_I2S_Reset(SPI_T *spi); +void SPI_Config(SPI_T *spi, SPI_Config_T *spiConfig); +void I2S_Config(SPI_T *spi, I2S_Config_T *i2sConfig); +void SPI_ConfigStructInit(SPI_Config_T *spiConfig); +void I2S_ConfigStructInit(I2S_Config_T *i2sConfig); +void SPI_Enable(SPI_T *spi); +void SPI_Disable(SPI_T *spi); +void I2S_Enable(SPI_T *spi); +void I2S_Disable(SPI_T *spi); -void SPI_I2S_TxData(SPI_T* spi, uint16_t data); -uint16_t SPI_I2S_RxData(SPI_T* spi); -void SPI_SetSoftwareNSS(SPI_T* spi); -void SPI_ResetSoftwareNSS(SPI_T* spi); -void SPI_EnableSSOutput(SPI_T* spi); -void SPI_DisableSSOutput(SPI_T* spi); -void SPI_ConfigDataSize(SPI_T* spi, uint16_t dataSize); +void SPI_I2S_TxData(SPI_T *spi, uint16_t data); +uint16_t SPI_I2S_RxData(SPI_T *spi); +void SPI_SetSoftwareNSS(SPI_T *spi); +void SPI_ResetSoftwareNSS(SPI_T *spi); +void SPI_EnableSSOutput(SPI_T *spi); +void SPI_DisableSSOutput(SPI_T *spi); +void SPI_ConfigDataSize(SPI_T *spi, SPI_DATA_LENGTH_T length); /** DMA */ -void SPI_I2S_EnableDMA(SPI_T* spi, SPI_I2S_DMA_REQ_T dmaReq); -void SPI_I2S_DisableDMA(SPI_T* spi, SPI_I2S_DMA_REQ_T dmaReq); +void SPI_I2S_EnableDMA(SPI_T *spi, SPI_I2S_DMA_REQ_T dmaReq); +void SPI_I2S_DisableDMA(SPI_T *spi, SPI_I2S_DMA_REQ_T dmaReq); /** CRC */ -void SPI_TxCRC(SPI_T* spi); -void SPI_EnableCRC(SPI_T* spi); -void SPI_DisableCRC(SPI_T* spi); -uint16_t SPI_ReadTxCRC(SPI_T* spi); -uint16_t SPI_ReadRxCRC(SPI_T* spi); -uint16_t SPI_ReadCRCPolynomial(SPI_T* spi); -void SPI_ConfigBiDirectionalLine(SPI_T* spi, SPI_DIRECTION_SELECT_T direction); +void SPI_TxCRC(SPI_T *spi); +void SPI_EnableCRC(SPI_T *spi); +void SPI_DisableCRC(SPI_T *spi); +uint16_t SPI_ReadTxCRC(SPI_T *spi); +uint16_t SPI_ReadRxCRC(SPI_T *spi); +uint16_t SPI_ReadCRCPolynomial(SPI_T *spi); +void SPI_ConfigBiDirectionalLine(SPI_T *spi, SPI_DIRECTION_SELECT_T direction); /** Interrupts and flag */ -void SPI_I2S_EnableInterrupt(SPI_T* spi, SPI_I2S_INT_T interrupt); -void SPI_I2S_DisableInterrupt(SPI_T* spi, SPI_I2S_INT_T interrupt); -uint8_t SPI_I2S_ReadStatusFlag(SPI_T* spi, SPI_FLAG_T flag); -void SPI_I2S_ClearStatusFlag(SPI_T* spi, SPI_FLAG_T flag); -uint8_t SPI_I2S_ReadIntFlag(SPI_T* spi, SPI_I2S_INT_T flag); -void SPI_I2S_ClearIntFlag(SPI_T* spi, SPI_I2S_INT_T flag); +void SPI_I2S_EnableInterrupt(SPI_T *spi, SPI_I2S_INT_T interrupt); +void SPI_I2S_DisableInterrupt(SPI_T *spi, SPI_I2S_INT_T interrupt); +uint8_t SPI_I2S_ReadStatusFlag(SPI_T *spi, SPI_FLAG_T flag); +void SPI_I2S_ClearStatusFlag(SPI_T *spi, SPI_FLAG_T flag); +uint8_t SPI_I2S_ReadIntFlag(SPI_T *spi, SPI_I2S_INT_T flag); +void SPI_I2S_ClearIntFlag(SPI_T *spi, SPI_I2S_INT_T flag); /**@} end of group SPI_Fuctions*/ /**@} end of group SPI_Driver*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_tmr.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_tmr.h index 50313d7e08..292b9bc5ad 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_tmr.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_tmr.h @@ -1,22 +1,36 @@ /*! - * @file apm32f10x_tmr.h + * @file apm32f10x_tmr.h * - * @brief This file contains all the functions prototypes for the TMR firmware library. + * @brief This file contains all the functions prototypes for the TMR firmware library. * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_TMR_H #define __APM32F10X_TMR_H -#include "apm32f10x.h" - #ifdef __cplusplus extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -63,7 +77,7 @@ typedef enum TMR_OC_MODE_LOWLEVEL = 0x04, TMR_OC_MODE_HIGHLEVEL = 0x05, TMR_OC_MODE_PWM1 = 0x06, - TMR_OC_MODE_PWM2 = 0x07, + TMR_OC_MODE_PWM2 = 0x07 } TMR_OC_MODE_T; /** @@ -353,9 +367,9 @@ typedef enum */ typedef enum { - TMR_PRESCALER_RELOAD_UPDATA, - TMR_PRESCALER_RELOAD_IMMEDIATE -} TMR_PRESCALER_RELOAD_T; + TMR_PSC_RELOAD_UPDATE, + TMR_PSC_RELOAD_IMMEDIATE +} TMR_PSC_RELOAD_T; /** * @brief TMR Encoder Mode @@ -444,7 +458,7 @@ typedef enum TMR_SLAVE_MODE_RESET = 0x04, TMR_SLAVE_MODE_GATED = 0x05, TMR_SLAVE_MODE_TRIGGER = 0x06, - TMR_SLAVE_MODE_EXTERNALL = 0x07 + TMR_SLAVE_MODE_EXTERNAL1 = 0x07 } TMR_SLAVE_MODE_T; /** @@ -532,124 +546,124 @@ typedef struct */ /** Reset and Configuration */ -void TMR_Reset(TMR_T* tmr); -void TMR_ConfigTimeBase(TMR_T* tmr, TMR_BaseConfig_T *baseConfig); -void TMR_ConfigOC1(TMR_T* tmr, TMR_OCConfig_T *OC1Config); -void TMR_ConfigOC2(TMR_T* tmr, TMR_OCConfig_T *OC2Config); -void TMR_ConfigOC3(TMR_T* tmr, TMR_OCConfig_T *OC3Config); -void TMR_ConfigOC4(TMR_T* tmr, TMR_OCConfig_T *OC4Config); -void TMR_ConfigIC(TMR_T* tmr, TMR_ICConfig_T *ICConfig); -void TMR_ConfigBDT(TMR_T* tmr, TMR_BDTConfig_T *BDTConfig); +void TMR_Reset(TMR_T *tmr); +void TMR_ConfigTimeBase(TMR_T *tmr, TMR_BaseConfig_T *baseConfig); +void TMR_ConfigOC1(TMR_T *tmr, TMR_OCConfig_T *OCConfig); +void TMR_ConfigOC2(TMR_T *tmr, TMR_OCConfig_T *OCConfig); +void TMR_ConfigOC3(TMR_T *tmr, TMR_OCConfig_T *OCConfig); +void TMR_ConfigOC4(TMR_T *tmr, TMR_OCConfig_T *OCConfig); +void TMR_ConfigIC(TMR_T *tmr, TMR_ICConfig_T *ICConfig); +void TMR_ConfigBDT(TMR_T *tmr, TMR_BDTConfig_T *BDTConfig); void TMR_ConfigTimeBaseStructInit(TMR_BaseConfig_T *baseConfig); void TMR_ConfigOCStructInit(TMR_OCConfig_T *OCConfig); void TMR_ConfigICStructInit(TMR_ICConfig_T *ICConfig); -void TMR_ConfigBDTStructInit( TMR_BDTConfig_T *BDTConfig); -void TMR_Enable(TMR_T* tmr); -void TMR_Disable(TMR_T* tmr); +void TMR_ConfigBDTStructInit(TMR_BDTConfig_T *BDTConfig); +void TMR_ConfigSinglePulseMode(TMR_T *tmr, TMR_SPM_T singlePulseMode); +void TMR_ConfigClockDivision(TMR_T *tmr, TMR_CLOCK_DIV_T clockDivision); +void TMR_Enable(TMR_T *tmr); +void TMR_Disable(TMR_T *tmr); -/* PWM Configuration */ -void TMR_ConfigPWM(TMR_T* tmr, TMR_ICConfig_T *PWMConfig); -void TMR_EnablePWMOutputs(TMR_T* tmr); -void TMR_DisablePWMOutputs(TMR_T* tmr); +/** PWM Configuration */ +void TMR_ConfigPWM(TMR_T *tmr, TMR_ICConfig_T *PWMConfig); +void TMR_EnablePWMOutputs(TMR_T *tmr); +void TMR_DisablePWMOutputs(TMR_T *tmr); /** DMA */ -void TMR_ConfigDMA(TMR_T* tmr, TMR_DMA_BASE_T baseAddress, TMR_DMA_BURSTLENGTH_T burstLength); -void TMR_EnableDMASoure(TMR_T* tmr, uint16_t dmaSource); -void TMR_DisableDMASoure(TMR_T* tmr, uint16_t dmaSource); +void TMR_ConfigDMA(TMR_T *tmr, TMR_DMA_BASE_T baseAddress, TMR_DMA_BURSTLENGTH_T burstLength); +void TMR_EnableDMASoure(TMR_T *tmr, uint16_t dmaSource); +void TMR_DisableDMASoure(TMR_T *tmr, uint16_t dmaSource); /** Configuration */ -void TMR_ConfigInternalClock(TMR_T* tmr); -void TMR_ConfigIntTrigExternalClock(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource); -void TMR_ConfigTrigExternalClock(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource, - TMR_IC_POLARITY_T ICpolarity, uint16_t ICfilter); -void TMR_ConfigETRClockMode1(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, +void TMR_ConfigInternalClock(TMR_T *tmr); +void TMR_ConfigIntTrigExternalClock(TMR_T *tmr, TMR_TRIGGER_SOURCE_T triggerSource); +void TMR_ConfigTrigExternalClock(TMR_T *tmr, TMR_TRIGGER_SOURCE_T triggerSource, + TMR_IC_POLARITY_T ICpolarity, uint16_t ICfilter); +void TMR_ConfigETRClockMode1(TMR_T *tmr, TMR_EXTTRG_PSC_T prescaler, TMR_EXTTRG_POL_T polarity, uint16_t filter); -void TMR_ConfigETRClockMode2(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, +void TMR_ConfigETRClockMode2(TMR_T *tmr, TMR_EXTTRG_PSC_T prescaler, TMR_EXTTRG_POL_T polarity, uint16_t filter); -void TMR_ConfigETR(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, +void TMR_ConfigETR(TMR_T *tmr, TMR_EXTTRG_PSC_T prescaler, TMR_EXTTRG_POL_T polarity, uint16_t filter); -void TMR_ConfigPrescaler(TMR_T* tmr, uint16_t prescaler, TMR_PRESCALER_RELOAD_T pscReloadMode); -void TMR_ConfigCounterMode(TMR_T* tmr, TMR_COUNTER_MODE_T countMode); -void TMR_SelectInputTrigger(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSouce); -void TMR_ConfigEncodeInterface(TMR_T* tmr, TMR_ENCODER_MODE_T encodeMode, TMR_IC_POLARITY_T IC1Polarity, +void TMR_ConfigPrescaler(TMR_T *tmr, uint16_t prescaler, TMR_PSC_RELOAD_T pscReloadMode); +void TMR_ConfigCounterMode(TMR_T *tmr, TMR_COUNTER_MODE_T countMode); +void TMR_SelectInputTrigger(TMR_T *tmr, TMR_TRIGGER_SOURCE_T triggerSouce); +void TMR_ConfigEncodeInterface(TMR_T *tmr, TMR_ENCODER_MODE_T encodeMode, TMR_IC_POLARITY_T IC1Polarity, TMR_IC_POLARITY_T IC2Polarity); -void TMR_ConfigForcedOC1(TMR_T* tmr,TMR_FORCED_ACTION_T forcesAction); -void TMR_ConfigForcedOC2(TMR_T* tmr,TMR_FORCED_ACTION_T forcesAction); -void TMR_ConfigForcedOC3(TMR_T* tmr,TMR_FORCED_ACTION_T forcesAction); -void TMR_ConfigForcedOC4(TMR_T* tmr,TMR_FORCED_ACTION_T forcesAction); -void TMR_EnableAUTOReload(TMR_T* tmr); -void TMR_DisableAUTOReload(TMR_T* tmr); -void TMR_EnableSelectCOM(TMR_T* tmr); -void TMR_DisableSelectCOM(TMR_T* tmr); -void TMR_EnableCCDMA(TMR_T* tmr); -void TMR_DisableCCDMA(TMR_T* tmr); -void TMR_EnableCCPreload(TMR_T* tmr); -void TMR_DisableCCPreload(TMR_T* tmr); -void TMR_ConfigOC1Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload); -void TMR_ConfigOC2Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload); -void TMR_ConfigOC3Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload); -void TMR_ConfigOC4Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload); -void TMR_ConfigOC1Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast); -void TMR_ConfigOC2Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast); -void TMR_ConfigOC3Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast); -void TMR_ConfigOC4Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast); -void TMR_ClearOC1Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear); -void TMR_ClearOC2Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear); -void TMR_ClearOC3Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear); -void TMR_ClearOC4Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear); -void TMR_ConfigOC1Polarity(TMR_T* tmr, TMR_OC_POLARITY_T OCPolarity); -void TMR_ConfigOC1NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T OCNPolarity); -void TMR_ConfigOC2Polarity(TMR_T* tmr, TMR_OC_POLARITY_T OCPolarity); -void TMR_ConfigOC2NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T OCNPolarity); -void TMR_ConfigOC3Polarity(TMR_T* tmr, TMR_OC_POLARITY_T OCPolarity); -void TMR_ConfigOC3NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T OCNPolarity); -void TMR_ConfigOC4Polarity(TMR_T* tmr, TMR_OC_POLARITY_T OCPolarity); -void TMR_EnableCCxChannel(TMR_T* tmr,TMR_CHANNEL_T channel); -void TMR_DisableCCxChannel(TMR_T* tmr,TMR_CHANNEL_T channel); -void TMR_EnableCCxNChannel(TMR_T* tmr,TMR_CHANNEL_T channel); -void TMR_DisableCCxNChannel(TMR_T* tmr,TMR_CHANNEL_T channel); -void TMR_SelectOCxMode(TMR_T* tmr, TMR_CHANNEL_T channel, TMR_OC_MODE_T OCMode); -void TMR_EnableNoUpdate(TMR_T* tmr); -void TMR_DisableNoUpdate(TMR_T* tmr); -void TMR_ConfigUPdateRequest(TMR_T* tmr, TMR_UPDATE_SOURCE_T updateSource); -void TMR_EnableHallSensor(TMR_T* tmr); -void TMR_DisableHallSensor(TMR_T* tmr); -void TMR_SelectSinglePulseMode(TMR_T* tmr, TMR_SPM_T singlePulseMode); -void TMR_SelectOutputTrigger(TMR_T* tmr, TMR_TRGO_SOURCE_T TRGOSource); -void TMR_SelectSlaveMode(TMR_T* tmr, TMR_SLAVE_MODE_T slaveMode); -void TMR_EnableMasterSlaveMode(TMR_T* tmr); -void TMR_DisableMasterSlaveMode(TMR_T* tmr); -void TMR_ConfigCounter(TMR_T* tmr, uint16_t counter); -void TMR_ConfigAutoreload(TMR_T* tmr, uint16_t autoReload); -void TMR_ConfigCompare1(TMR_T* tmr, uint16_t compare1); -void TMR_ConfigCompare2(TMR_T* tmr, uint16_t compare2); -void TMR_ConfigCompare3(TMR_T* tmr, uint16_t compare3); -void TMR_ConfigCompare4(TMR_T* tmr, uint16_t compare4); -void TMR_ConfigIC1Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler); -void TMR_ConfigIC2Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler); -void TMR_ConfigIC3Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler); -void TMR_ConfigIC4Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler); -void TMR_ConfigClockDivision(TMR_T* tmr, TMR_CLOCK_DIV_T clockDivision); -uint16_t TMR_ReadCaputer1(TMR_T* tmr); -uint16_t TMR_ReadCaputer2(TMR_T* tmr); -uint16_t TMR_ReadCaputer3(TMR_T* tmr); -uint16_t TMR_ReadCaputer4(TMR_T* tmr); -uint16_t TMR_ReadCounter(TMR_T* tmr); -uint16_t TMR_ReadPrescaler(TMR_T* tmr); +void TMR_ConfigForcedOC1(TMR_T *tmr, TMR_FORCED_ACTION_T forcesAction); +void TMR_ConfigForcedOC2(TMR_T *tmr, TMR_FORCED_ACTION_T forcesAction); +void TMR_ConfigForcedOC3(TMR_T *tmr, TMR_FORCED_ACTION_T forcesAction); +void TMR_ConfigForcedOC4(TMR_T *tmr, TMR_FORCED_ACTION_T forcesAction); +void TMR_EnableAutoReload(TMR_T *tmr); +void TMR_DisableAutoReload(TMR_T *tmr); +void TMR_EnableSelectCOM(TMR_T *tmr); +void TMR_DisableSelectCOM(TMR_T *tmr); +void TMR_EnableCCDMA(TMR_T *tmr); +void TMR_DisableCCDMA(TMR_T *tmr); +void TMR_EnableCCPreload(TMR_T *tmr); +void TMR_DisableCCPreload(TMR_T *tmr); +void TMR_ConfigOC1Preload(TMR_T *tmr, TMR_OC_PRELOAD_T OCPreload); +void TMR_ConfigOC2Preload(TMR_T *tmr, TMR_OC_PRELOAD_T OCPreload); +void TMR_ConfigOC3Preload(TMR_T *tmr, TMR_OC_PRELOAD_T OCPreload); +void TMR_ConfigOC4Preload(TMR_T *tmr, TMR_OC_PRELOAD_T OCPreload); +void TMR_ConfigOC1Fast(TMR_T *tmr, TMR_OC_FAST_T OCFast); +void TMR_ConfigOC2Fast(TMR_T *tmr, TMR_OC_FAST_T OCFast); +void TMR_ConfigOC3Fast(TMR_T *tmr, TMR_OC_FAST_T OCFast); +void TMR_ConfigOC4Fast(TMR_T *tmr, TMR_OC_FAST_T OCFast); +void TMR_ClearOC1Ref(TMR_T *tmr, TMR_OC_CLEAR_T OCClear); +void TMR_ClearOC2Ref(TMR_T *tmr, TMR_OC_CLEAR_T OCClear); +void TMR_ClearOC3Ref(TMR_T *tmr, TMR_OC_CLEAR_T OCClear); +void TMR_ClearOC4Ref(TMR_T *tmr, TMR_OC_CLEAR_T OCClear); +void TMR_ConfigOC1Polarity(TMR_T *tmr, TMR_OC_POLARITY_T OCPolarity); +void TMR_ConfigOC1NPolarity(TMR_T *tmr, TMR_OC_NPOLARITY_T OCNPolarity); +void TMR_ConfigOC2Polarity(TMR_T *tmr, TMR_OC_POLARITY_T OCPolarity); +void TMR_ConfigOC2NPolarity(TMR_T *tmr, TMR_OC_NPOLARITY_T OCNPolarity); +void TMR_ConfigOC3Polarity(TMR_T *tmr, TMR_OC_POLARITY_T OCPolarity); +void TMR_ConfigOC3NPolarity(TMR_T *tmr, TMR_OC_NPOLARITY_T OCNPolarity); +void TMR_ConfigOC4Polarity(TMR_T *tmr, TMR_OC_POLARITY_T OCPolarity); +void TMR_EnableCCxChannel(TMR_T *tmr, TMR_CHANNEL_T channel); +void TMR_DisableCCxChannel(TMR_T *tmr, TMR_CHANNEL_T channel); +void TMR_EnableCCxNChannel(TMR_T *tmr, TMR_CHANNEL_T channel); +void TMR_DisableCCxNChannel(TMR_T *tmr, TMR_CHANNEL_T channel); +void TMR_SelectOCxMode(TMR_T *tmr, TMR_CHANNEL_T channel, TMR_OC_MODE_T OCMode); +void TMR_EnableUpdate(TMR_T *tmr); +void TMR_DisableUpdate(TMR_T *tmr); +void TMR_ConfigUpdateRequest(TMR_T *tmr, TMR_UPDATE_SOURCE_T updateSource); +void TMR_EnableHallSensor(TMR_T *tmr); +void TMR_DisableHallSensor(TMR_T *tmr); +void TMR_SelectOutputTrigger(TMR_T *tmr, TMR_TRGO_SOURCE_T TRGOSource); +void TMR_SelectSlaveMode(TMR_T *tmr, TMR_SLAVE_MODE_T slaveMode); +void TMR_EnableMasterSlaveMode(TMR_T *tmr); +void TMR_DisableMasterSlaveMode(TMR_T *tmr); +void TMR_ConfigCounter(TMR_T *tmr, uint16_t counter); +void TMR_ConfigAutoreload(TMR_T *tmr, uint16_t autoReload); +void TMR_ConfigCompare1(TMR_T *tmr, uint16_t compare1); +void TMR_ConfigCompare2(TMR_T *tmr, uint16_t compare2); +void TMR_ConfigCompare3(TMR_T *tmr, uint16_t compare3); +void TMR_ConfigCompare4(TMR_T *tmr, uint16_t compare4); +void TMR_ConfigIC1Prescal(TMR_T *tmr, TMR_IC_PSC_T prescaler); +void TMR_ConfigIC2Prescal(TMR_T *tmr, TMR_IC_PSC_T prescaler); +void TMR_ConfigIC3Prescal(TMR_T *tmr, TMR_IC_PSC_T prescaler); +void TMR_ConfigIC4Prescal(TMR_T *tmr, TMR_IC_PSC_T prescaler); +uint16_t TMR_ReadCaputer1(TMR_T *tmr); +uint16_t TMR_ReadCaputer2(TMR_T *tmr); +uint16_t TMR_ReadCaputer3(TMR_T *tmr); +uint16_t TMR_ReadCaputer4(TMR_T *tmr); +uint16_t TMR_ReadCounter(TMR_T *tmr); +uint16_t TMR_ReadPrescaler(TMR_T *tmr); /** Interrupts and Event */ -void TMR_EnableInterrupt(TMR_T* tmr, uint16_t interrupt); -void TMR_DisableInterrupt(TMR_T* tmr, uint16_t interrupt); -void TMR_GenerateEvent(TMR_T* tmr,uint16_t eventSources); +void TMR_EnableInterrupt(TMR_T *tmr, uint16_t interrupt); +void TMR_DisableInterrupt(TMR_T *tmr, uint16_t interrupt); +void TMR_GenerateEvent(TMR_T *tmr, uint16_t eventSources); /** flags */ -uint16_t TMR_ReadStatusFlag(TMR_T* tmr, TMR_FLAG_T flag); -void TMR_ClearStatusFlag(TMR_T* tmr, uint16_t flag); -uint16_t TMR_ReadIntFlag(TMR_T* tmr, TMR_INT_T flag); -void TMR_ClearIntFlag(TMR_T* tmr, uint16_t flag); +uint16_t TMR_ReadStatusFlag(TMR_T *tmr, TMR_FLAG_T flag); +void TMR_ClearStatusFlag(TMR_T *tmr, uint16_t flag); +uint16_t TMR_ReadIntFlag(TMR_T *tmr, TMR_INT_T flag); +void TMR_ClearIntFlag(TMR_T *tmr, uint16_t flag); /**@} end of group TMR_Fuctions*/ -/**@} end of group TMR_Driver */ +/**@} end of group TMR_Driver*/ /**@} end of group Peripherals_Library*/ #ifdef __cplusplus diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_usart.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_usart.h index fb7880c1ee..1a4e6f8eed 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_usart.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_usart.h @@ -1,23 +1,37 @@ /*! - * @file apm32f10x_usart.h + * @file apm32f10x_usart.h * - * @brief This file contains all the functions prototypes for the USART firmware library + * @brief This file contains all the functions prototypes for the USART firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_USART_H #define __APM32F10X_USART_H -#include "apm32f10x.h" - #ifdef __cplusplus extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -226,64 +240,64 @@ typedef struct */ /** USART Reset and Configuration */ -void USART_Reset(USART_T* usart); -void USART_Config(USART_T* uart, USART_Config_T* usartConfig); -void USART_ConfigStructInit(USART_Config_T* usartConfig); -void USART_Address(USART_T* usart, uint8_t address); -void USART_Enable(USART_T* usart); -void USART_Disable(USART_T* usart); +void USART_Reset(USART_T *usart); +void USART_Config(USART_T *uart, USART_Config_T *usartConfig); +void USART_ConfigStructInit(USART_Config_T *usartConfig); +void USART_Address(USART_T *usart, uint8_t address); +void USART_Enable(USART_T *usart); +void USART_Disable(USART_T *usart); /** Clock communication */ -void USART_ConfigClock(USART_T* usart, USART_ClockConfig_T* clockConfig); -void USART_ConfigClockStructInit(USART_ClockConfig_T* clockConfig); +void USART_ConfigClock(USART_T *usart, USART_ClockConfig_T *clockConfig); +void USART_ConfigClockStructInit(USART_ClockConfig_T *clockConfig); /** DMA mode */ -void USART_EnableDMA(USART_T* usart, USART_DMA_T dmaReq); -void USART_DisableDMA(USART_T* usart, USART_DMA_T dmaReq); +void USART_EnableDMA(USART_T *usart, USART_DMA_T dmaReq); +void USART_DisableDMA(USART_T *usart, USART_DMA_T dmaReq); /** Mute mode */ -void USART_ConfigWakeUp(USART_T* usart, USART_WAKEUP_T wakeup); -void USART_EnableMuteMode(USART_T* usart); -void USART_DisableMuteMode(USART_T* usart); +void USART_ConfigWakeUp(USART_T *usart, USART_WAKEUP_T wakeup); +void USART_EnableMuteMode(USART_T *usart); +void USART_DisableMuteMode(USART_T *usart); /** LIN mode */ -void USART_ConfigLINBreakDetectLength(USART_T* usart, USART_LBDL_T length); -void USART_EnableLIN(USART_T* usart); -void USART_DisableLIN(USART_T* usart); +void USART_ConfigLINBreakDetectLength(USART_T *usart, USART_LBDL_T length); +void USART_EnableLIN(USART_T *usart); +void USART_DisableLIN(USART_T *usart); /** Transmit and receive */ -void USART_EnableTx(USART_T* usart); -void USART_DisableTx(USART_T* usart); -void USART_EnableRx(USART_T* usart); -void USART_DisableRx(USART_T* usart); -void USART_TxData(USART_T* usart, uint16_t data); -uint16_t USART_RxData(USART_T* usart); -void USART_TxBreak(USART_T* usart); +void USART_EnableTx(USART_T *usart); +void USART_DisableTx(USART_T *usart); +void USART_EnableRx(USART_T *usart); +void USART_DisableRx(USART_T *usart); +void USART_TxData(USART_T *usart, uint16_t data); +uint16_t USART_RxData(USART_T *usart); +void USART_TxBreak(USART_T *usart); /** Smartcard mode */ -void USART_ConfigGuardTime(USART_T* usart, uint8_t guardTime); -void USART_ConfigPrescaler(USART_T* usart, uint8_t div); -void USART_EnableSmartCard(USART_T* usart); -void USART_DisableSmartCard(USART_T* usart); -void USART_EnableSmartCardNACK(USART_T* usart); -void USART_DisableSmartCardNACK(USART_T* usart); +void USART_ConfigGuardTime(USART_T *usart, uint8_t guardTime); +void USART_ConfigPrescaler(USART_T *usart, uint8_t div); +void USART_EnableSmartCard(USART_T *usart); +void USART_DisableSmartCard(USART_T *usart); +void USART_EnableSmartCardNACK(USART_T *usart); +void USART_DisableSmartCardNACK(USART_T *usart); /** Half-duplex mode */ -void USART_EnableHalfDuplex(USART_T* usart); -void USART_DisableHalfDuplex(USART_T* usart); +void USART_EnableHalfDuplex(USART_T *usart); +void USART_DisableHalfDuplex(USART_T *usart); /** IrDA mode */ -void USART_ConfigIrDA(USART_T* usart, USART_IRDALP_T IrDAMode); -void USART_EnableIrDA(USART_T* usart); -void USART_DisableIrDA(USART_T* usart); +void USART_ConfigIrDA(USART_T *usart, USART_IRDALP_T IrDAMode); +void USART_EnableIrDA(USART_T *usart); +void USART_DisableIrDA(USART_T *usart); /** Interrupt and flag */ -void USART_EnableInterrupt(USART_T* usart, USART_INT_T interrupt); -void USART_DisableInterrupt(USART_T* usart, USART_INT_T interrupt); -uint8_t USART_ReadStatusFlag(USART_T* usart, USART_FLAG_T flag); -void USART_ClearStatusFlag(USART_T* usart, USART_FLAG_T flag); -uint8_t USART_ReadIntFlag(USART_T* usart, USART_INT_T flag); -void USART_ClearIntFlag(USART_T* usart, USART_INT_T flag); +void USART_EnableInterrupt(USART_T *usart, USART_INT_T interrupt); +void USART_DisableInterrupt(USART_T *usart, USART_INT_T interrupt); +uint8_t USART_ReadStatusFlag(USART_T *usart, USART_FLAG_T flag); +void USART_ClearStatusFlag(USART_T *usart, USART_FLAG_T flag); +uint8_t USART_ReadIntFlag(USART_T *usart, USART_INT_T flag); +void USART_ClearIntFlag(USART_T *usart, USART_INT_T flag); /**@} end of group USART_Fuctions*/ /**@} end of group USART_Driver*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_wwdt.h b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_wwdt.h index cb958d3dcb..842edc6007 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_wwdt.h +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_wwdt.h @@ -3,21 +3,35 @@ * * @brief This file contains all the functions prototypes for the WWDT firmware library * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __APM32F10X_WWDT_H #define __APM32F10X_WWDT_H -#include "apm32f10x.h" - #ifdef __cplusplus - extern "C" { +extern "C" { #endif +#include "apm32f10x.h" + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -39,7 +53,7 @@ typedef enum WWDT_TIME_BASE_2 = 0x00000080, WWDT_TIME_BASE_4 = 0x00000100, WWDT_TIME_BASE_8 = 0x00000180 -}WWDT_TIME_BASE_T; +} WWDT_TIME_BASE_T; /**@} end of group WWDT_Enumerations*/ @@ -68,7 +82,7 @@ uint8_t WWDT_ReadFlag(void); void WWDT_ClearFlag(void); /**@} end of group WWDT_Fuctions*/ -/**@} end of group WWDT_Driver */ +/**@} end of group WWDT_Driver*/ /**@} end of group Peripherals_Library*/ #ifdef __cplusplus diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_adc.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_adc.c index c061ca94d4..0f7ef97b8b 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_adc.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_adc.c @@ -3,10 +3,24 @@ * * @brief This file provides all the ADC firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_adc.h" @@ -25,22 +39,22 @@ */ /*! - * @brief Reset ADC peripheral registers to their default reset values. + * @brief Reset ADC peripheral registers to their default reset values. * - * @param adc: Select ADC peripheral. + * @param adc: Select ADC peripheral. * - * @retval None + * @retval None * - * @note adc can be ADC1, ADC2 or ADC3. + * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_Reset(ADC_T* adc) +void ADC_Reset(ADC_T *adc) { - if(adc == ADC1) + if (adc == ADC1) { RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_ADC1); RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_ADC1); } - else if(adc == ADC2) + else if (adc == ADC2) { RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_ADC2); RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_ADC2); @@ -63,7 +77,7 @@ void ADC_Reset(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_Config(ADC_T* adc, ADC_Config_T* adcConfig) +void ADC_Config(ADC_T *adc, ADC_Config_T *adcConfig) { uint32_t reg; @@ -74,8 +88,10 @@ void ADC_Config(ADC_T* adc, ADC_Config_T* adcConfig) reg = adc->CTRL2; reg &= 0xFFF1F7FD; - reg |= (uint32_t)(adcConfig->dataAlign | adcConfig->externalTrigConv | - ((uint32_t)adcConfig->continuosConvMode << 1)); + reg |= (uint32_t)adcConfig->dataAlign | \ + (uint32_t)adcConfig->externalTrigConv | \ + ((uint32_t)adcConfig->continuosConvMode << 1); + adc->CTRL2 = reg; reg = adc->REGSEQ1; @@ -91,7 +107,7 @@ void ADC_Config(ADC_T* adc, ADC_Config_T* adcConfig) * * @retval None */ -void ADC_ConfigStructInit(ADC_Config_T* adcConfig) +void ADC_ConfigStructInit(ADC_Config_T *adcConfig) { adcConfig->mode = ADC_MODE_INDEPENDENT; adcConfig->scanConvMode = DISABLE; @@ -110,7 +126,7 @@ void ADC_ConfigStructInit(ADC_Config_T* adcConfig) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_Enable(ADC_T* adc) +void ADC_Enable(ADC_T *adc) { adc->CTRL2_B.ADCEN = BIT_SET; } @@ -124,7 +140,7 @@ void ADC_Enable(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_Disable(ADC_T* adc) +void ADC_Disable(ADC_T *adc) { adc->CTRL2_B.ADCEN = BIT_RESET; } @@ -138,7 +154,7 @@ void ADC_Disable(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_EnableDMA(ADC_T* adc) +void ADC_EnableDMA(ADC_T *adc) { adc->CTRL2_B.DMAEN = BIT_SET; } @@ -152,7 +168,7 @@ void ADC_EnableDMA(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_DisableDMA(ADC_T* adc) +void ADC_DisableDMA(ADC_T *adc) { adc->CTRL2_B.DMAEN = BIT_RESET; } @@ -166,7 +182,7 @@ void ADC_DisableDMA(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_ResetCalibration(ADC_T* adc) +void ADC_ResetCalibration(ADC_T *adc) { adc->CTRL2_B.CALRST = BIT_SET; } @@ -180,7 +196,7 @@ void ADC_ResetCalibration(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -uint8_t ADC_ReadResetCalibrationStatus(ADC_T* adc) +uint8_t ADC_ReadResetCalibrationStatus(ADC_T *adc) { uint8_t ret; ret = (adc->CTRL2_B.CALRST) ? BIT_SET : BIT_RESET; @@ -196,7 +212,7 @@ uint8_t ADC_ReadResetCalibrationStatus(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_StartCalibration(ADC_T* adc) +void ADC_StartCalibration(ADC_T *adc) { adc->CTRL2_B.CAL = BIT_SET; } @@ -210,7 +226,7 @@ void ADC_StartCalibration(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -uint8_t ADC_ReadCalibrationStartFlag(ADC_T* adc) +uint8_t ADC_ReadCalibrationStartFlag(ADC_T *adc) { uint8_t ret; ret = (adc->CTRL2_B.CAL) ? BIT_SET : BIT_RESET; @@ -226,7 +242,7 @@ uint8_t ADC_ReadCalibrationStartFlag(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_EnableSoftwareStartConv(ADC_T* adc) +void ADC_EnableSoftwareStartConv(ADC_T *adc) { adc->CTRL2 |= 0x00500000; } @@ -240,7 +256,7 @@ void ADC_EnableSoftwareStartConv(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_DisableSoftwareStartConv(ADC_T* adc) +void ADC_DisableSoftwareStartConv(ADC_T *adc) { adc->CTRL2 &= 0xFFAFFFFF; } @@ -254,7 +270,7 @@ void ADC_DisableSoftwareStartConv(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -uint8_t ADC_ReadSoftwareStartConvStatus(ADC_T* adc) +uint8_t ADC_ReadSoftwareStartConvStatus(ADC_T *adc) { uint8_t ret; ret = (adc->CTRL2_B.REGSWSC) ? BIT_SET : BIT_RESET; @@ -273,7 +289,7 @@ uint8_t ADC_ReadSoftwareStartConvStatus(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_ConfigDiscModeChannel(ADC_T* adc, uint8_t number) +void ADC_ConfigDiscMode(ADC_T *adc, uint8_t number) { adc->CTRL1_B.DISCNUMCFG |= number - 1; } @@ -287,7 +303,7 @@ void ADC_ConfigDiscModeChannel(ADC_T* adc, uint8_t number) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_EnableDiscMode(ADC_T* adc) +void ADC_EnableDiscMode(ADC_T *adc) { adc->CTRL1_B.REGDISCEN = BIT_SET; } @@ -301,7 +317,7 @@ void ADC_EnableDiscMode(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_DisableDiscMode(ADC_T* adc) +void ADC_DisableDiscMode(ADC_T *adc) { adc->CTRL1_B.REGDISCEN = BIT_RESET; } @@ -337,24 +353,24 @@ void ADC_DisableDiscMode(ADC_T* adc) * * @param sampleTime: the specified ADC channel SampleTime * The parameter can be one of following values: - * @arg ADC_SAMPLE_TIME_1_5: ADC 1.5 clock cycles - * @arg ADC_SAMPLE_TIME_7_5: ADC 7.5 clock cycles - * @arg ADC_SAMPLE_TIME_13_5: ADC 13.5 clock cycles - * @arg ADC_SAMPLE_TIME_28_5: ADC 28.5 clock cycles - * @arg ADC_SAMPLE_TIME_41_5: ADC 41.5 clock cycles - * @arg ADC_SAMPLE_TIME_55_5: ADC 55.5 clock cycles - * @arg ADC_SAMPLE_TIME_71_5: ADC 71.5 clock cycles - * @arg ADC_SAMPLE_TIME_239_5: ADC 239.5 clock cycles + * @arg ADC_SAMPLETIME_1CYCLES5: ADC 1.5 clock cycles + * @arg ADC_SAMPLETIME_7CYCLES5: ADC 7.5 clock cycles + * @arg ADC_SAMPLETIME_13CYCLES5: ADC 13.5 clock cycles + * @arg ADC_SAMPLETIME_28CYCLES5: ADC 28.5 clock cycles + * @arg ADC_SAMPLETIME_41CYCLES5: ADC 41.5 clock cycles + * @arg ADC_SAMPLETIME_55CYCLES5: ADC 55.5 clock cycles + * @arg ADC_SAMPLETIME_71CYCLES5: ADC 71.5 clock cycles + * @arg ADC_SAMPLETIME_239CYCLES5: ADC 239.5 clock cycles * * @retval None * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_ConfigRegularChannel(ADC_T* adc, uint8_t channel,uint8_t rank, uint8_t sampleTime) +void ADC_ConfigRegularChannel(ADC_T *adc, uint8_t channel, uint8_t rank, uint8_t sampleTime) { uint32_t temp1 = 0; uint32_t temp2 = 0; - if(channel > ADC_CHANNEL_9) + if (channel > ADC_CHANNEL_9) { temp1 = adc->SMPTIM1; temp2 = SMPCYCCFG_SET_SMPTIM1 << (3 * (channel - 10)); @@ -373,7 +389,7 @@ void ADC_ConfigRegularChannel(ADC_T* adc, uint8_t channel,uint8_t rank, uint8_t adc->SMPTIM2 = temp1; } - if(rank < 7) + if (rank < 7) { temp1 = adc->REGSEQ3; temp2 = REGSEQC_SET_REGSEQ3 << (5 * (rank - 1)); @@ -382,7 +398,7 @@ void ADC_ConfigRegularChannel(ADC_T* adc, uint8_t channel,uint8_t rank, uint8_t temp1 |= temp2; adc->REGSEQ3 = temp1; } - else if(rank < 13) + else if (rank < 13) { temp1 = adc->REGSEQ2; temp2 = REGSEQC_SET_REGSEQ2 << (5 * (rank - 7)); @@ -411,7 +427,7 @@ void ADC_ConfigRegularChannel(ADC_T* adc, uint8_t channel,uint8_t rank, uint8_t * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_EnableExternalTrigConv(ADC_T* adc) +void ADC_EnableExternalTrigConv(ADC_T *adc) { adc->CTRL2_B.REGEXTTRGEN = BIT_SET; } @@ -425,7 +441,7 @@ void ADC_EnableExternalTrigConv(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_DisableExternalTrigConv(ADC_T* adc) +void ADC_DisableExternalTrigConv(ADC_T *adc) { adc->CTRL2_B.REGEXTTRGEN = BIT_RESET; } @@ -439,7 +455,7 @@ void ADC_DisableExternalTrigConv(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -uint16_t ADC_ReadConversionValue(ADC_T* adc) +uint16_t ADC_ReadConversionValue(ADC_T *adc) { return (uint16_t) adc->REGDATA; } @@ -453,9 +469,9 @@ uint16_t ADC_ReadConversionValue(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -uint32_t ADC_ReadDualModeConversionValue(ADC_T* adc) +uint32_t ADC_ReadDualModeConversionValue(ADC_T *adc) { - return (*(__IOM uint32_t *) RDG_ADDRESS); + return (*(__IOM uint32_t *) RDG_ADDRESS); } /*! @@ -467,7 +483,7 @@ uint32_t ADC_ReadDualModeConversionValue(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_EnableInjectedConv(ADC_T* adc) +void ADC_EnableAutoInjectedConv(ADC_T *adc) { adc->CTRL1_B.INJGACEN = BIT_SET; } @@ -481,7 +497,7 @@ void ADC_EnableInjectedConv(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_DisableInjectedConv(ADC_T* adc) +void ADC_DisableAutoInjectedConv(ADC_T *adc) { adc->CTRL1_B.INJGACEN = BIT_RESET; } @@ -495,7 +511,7 @@ void ADC_DisableInjectedConv(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_EnableInjectedDiscMode(ADC_T* adc) +void ADC_EnableInjectedDiscMode(ADC_T *adc) { adc->CTRL1_B.INJDISCEN = BIT_SET; } @@ -509,7 +525,7 @@ void ADC_EnableInjectedDiscMode(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_DisableInjectedDiscMode(ADC_T* adc) +void ADC_DisableInjectedDiscMode(ADC_T *adc) { adc->CTRL1_B.INJDISCEN = BIT_RESET; } @@ -542,7 +558,7 @@ void ADC_DisableInjectedDiscMode(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_ConfigExternalTrigInjectedConv(ADC_T* adc, ADC_EXT_TRIG_INJEC_CONV_T extTrigInjecConv) +void ADC_ConfigExternalTrigInjectedConv(ADC_T *adc, ADC_EXT_TRIG_INJEC_CONV_T extTrigInjecConv) { adc->CTRL2_B.INJGEXTTRGSEL = RESET; adc->CTRL2_B.INJGEXTTRGSEL |= extTrigInjecConv; @@ -557,7 +573,7 @@ void ADC_ConfigExternalTrigInjectedConv(ADC_T* adc, ADC_EXT_TRIG_INJEC_CONV_T ex * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_EnableExternalTrigInjectedConv(ADC_T* adc) +void ADC_EnableExternalTrigInjectedConv(ADC_T *adc) { adc->CTRL2_B.INJEXTTRGEN = BIT_SET; } @@ -571,7 +587,7 @@ void ADC_EnableExternalTrigInjectedConv(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_DisableExternalTrigInjectedConv(ADC_T* adc) +void ADC_DisableExternalTrigInjectedConv(ADC_T *adc) { adc->CTRL2_B.INJEXTTRGEN = BIT_RESET; } @@ -585,7 +601,7 @@ void ADC_DisableExternalTrigInjectedConv(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_EnableSoftwareStartInjectedConv(ADC_T* adc) +void ADC_EnableSoftwareStartInjectedConv(ADC_T *adc) { adc->CTRL2_B.INJEXTTRGEN = BIT_SET; adc->CTRL2_B.INJSWSC = BIT_SET; @@ -600,7 +616,7 @@ void ADC_EnableSoftwareStartInjectedConv(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_DisableSoftwareStartInjectedConv(ADC_T* adc) +void ADC_DisableSoftwareStartInjectedConv(ADC_T *adc) { adc->CTRL2_B.INJEXTTRGEN = BIT_RESET; adc->CTRL2_B.INJSWSC = BIT_RESET; @@ -615,7 +631,7 @@ void ADC_DisableSoftwareStartInjectedConv(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -uint8_t ADC_ReadSoftwareStartInjectedConvStatus(ADC_T* adc) +uint8_t ADC_ReadSoftwareStartInjectedConvStatus(ADC_T *adc) { uint8_t ret; ret = (adc->CTRL2_B.INJSWSC) ? BIT_SET : BIT_RESET; @@ -653,20 +669,20 @@ uint8_t ADC_ReadSoftwareStartInjectedConvStatus(ADC_T* adc) * * @param sampleTime: the specified ADC channel SampleTime * The parameter can be one of following values: - * @arg ADC_SAMPLE_TIME_1_5: ADC 1.5 clock cycles - * @arg ADC_SAMPLE_TIME_7_5: ADC 7.5 clock cycles - * @arg ADC_SAMPLE_TIME_13_5: ADC 13.5 clock cycles - * @arg ADC_SAMPLE_TIME_28_5: ADC 28.5 clock cycles - * @arg ADC_SAMPLE_TIME_41_5: ADC 41.5 clock cycles - * @arg ADC_SAMPLE_TIME_55_5: ADC 55.5 clock cycles - * @arg ADC_SAMPLE_TIME_71_5: ADC 71.5 clock cycles - * @arg ADC_SAMPLE_TIME_239_5: ADC 239.5 clock cycles + * @arg ADC_SAMPLETIME_1CYCLES5: ADC 1.5 clock cycles + * @arg ADC_SAMPLETIME_7CYCLES5: ADC 7.5 clock cycles + * @arg ADC_SAMPLETIME_13CYCLES5: ADC 13.5 clock cycles + * @arg ADC_SAMPLETIME_28CYCLES5: ADC 28.5 clock cycles + * @arg ADC_SAMPLETIME_41CYCLES5: ADC 41.5 clock cycles + * @arg ADC_SAMPLETIME_55CYCLES5: ADC 55.5 clock cycles + * @arg ADC_SAMPLETIME_71CYCLES5: ADC 71.5 clock cycles + * @arg ADC_SAMPLETIME_239CYCLES5: ADC 239.5 clock cycles * * @retval None * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_ConfigInjectedChannel(ADC_T* adc, uint8_t channel, uint8_t rank, uint8_t sampleTime) +void ADC_ConfigInjectedChannel(ADC_T *adc, uint8_t channel, uint8_t rank, uint8_t sampleTime) { uint32_t temp1 = 0; uint32_t temp2 = 0; @@ -674,9 +690,9 @@ void ADC_ConfigInjectedChannel(ADC_T* adc, uint8_t channel, uint8_t rank, uint8_ if (channel > ADC_CHANNEL_9) { temp1 = adc->SMPTIM1; - temp2 = SMPCYCCFG_SET_SMPTIM1 << (3*(channel - 10)); + temp2 = SMPCYCCFG_SET_SMPTIM1 << (3 * (channel - 10)); temp1 &= ~temp2; - temp2 = (uint32_t)sampleTime << (3*(channel - 10)); + temp2 = (uint32_t)sampleTime << (3 * (channel - 10)); temp1 |= temp2; adc->SMPTIM1 = temp1; } @@ -690,7 +706,7 @@ void ADC_ConfigInjectedChannel(ADC_T* adc, uint8_t channel, uint8_t rank, uint8_ adc->SMPTIM2 = temp1; } temp1 = adc->INJSEQ; - temp3 = (temp1 & INJSEQ_SET_INJSEQLEN)>> 20; + temp3 = (temp1 & INJSEQ_SET_INJSEQLEN) >> 20; temp2 = INJSEQ_SET_INJSEQC << (5 * (uint8_t)((rank + 3) - (temp3 + 1))); temp1 &= ~temp2; temp2 = (uint32_t)channel << (5 * (uint8_t)((rank + 3) - (temp3 + 1))); @@ -710,7 +726,7 @@ void ADC_ConfigInjectedChannel(ADC_T* adc, uint8_t channel, uint8_t rank, uint8_ * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_ConfigInjectedSequencerLength(ADC_T* adc, uint8_t length) +void ADC_ConfigInjectedSequencerLength(ADC_T *adc, uint8_t length) { adc->INJSEQ_B.INJSEQLEN = RESET; adc->INJSEQ_B.INJSEQLEN |= length - 1; @@ -735,7 +751,7 @@ void ADC_ConfigInjectedSequencerLength(ADC_T* adc, uint8_t length) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_ConfigInjectedOffset(ADC_T* adc, ADC_INJEC_CHANNEL_T channel, uint16_t offSet) +void ADC_ConfigInjectedOffset(ADC_T *adc, ADC_INJEC_CHANNEL_T channel, uint16_t offSet) { __IOM uint32_t tmp = 0; @@ -761,14 +777,14 @@ void ADC_ConfigInjectedOffset(ADC_T* adc, ADC_INJEC_CHANNEL_T channel, uint16_t * * @note adc can be ADC1, ADC2 or ADC3. */ -uint16_t ADC_ReadInjectedConversionValue(ADC_T* adc, ADC_INJEC_CHANNEL_T channel) +uint16_t ADC_ReadInjectedConversionValue(ADC_T *adc, ADC_INJEC_CHANNEL_T channel) { - __IOM uint32_t temp = 0; + __IOM uint32_t temp = 0; - temp = (uint32_t)adc; - temp += channel + INJDATA_OFFSET; + temp = (uint32_t)adc; + temp += channel + INJDATA_OFFSET; - return (uint16_t) (*(__IOM uint32_t*) temp); + return (uint16_t)(*(__IOM uint32_t *) temp); } /*! @@ -790,7 +806,7 @@ uint16_t ADC_ReadInjectedConversionValue(ADC_T* adc, ADC_INJEC_CHANNEL_T channel * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_EnableAnalogWatchdog(ADC_T* adc, uint32_t analogWatchdog) +void ADC_EnableAnalogWatchdog(ADC_T *adc, uint32_t analogWatchdog) { adc->CTRL1 &= 0xFF3FFDFF; adc->CTRL1 |= analogWatchdog; @@ -805,7 +821,7 @@ void ADC_EnableAnalogWatchdog(ADC_T* adc, uint32_t analogWatchdog) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_DisableAnalogWatchdog(ADC_T* adc) +void ADC_DisableAnalogWatchdog(ADC_T *adc) { adc->CTRL1 &= 0xFF3FFDFF; } @@ -825,7 +841,7 @@ void ADC_DisableAnalogWatchdog(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_ConfigAnalogWatchdogThresholds(ADC_T* adc, uint16_t highThreshold, uint16_t lowThreshold) +void ADC_ConfigAnalogWatchdogThresholds(ADC_T *adc, uint16_t highThreshold, uint16_t lowThreshold) { adc->AWDHT = highThreshold; adc->AWDLT = lowThreshold; @@ -861,7 +877,7 @@ void ADC_ConfigAnalogWatchdogThresholds(ADC_T* adc, uint16_t highThreshold, uint * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_ConfigAnalogWatchdogSingleChannel(ADC_T* adc, uint8_t channel) +void ADC_ConfigAnalogWatchdogSingleChannel(ADC_T *adc, uint8_t channel) { adc->CTRL1_B.AWDCHSEL = BIT_RESET; adc->CTRL1 |= channel; @@ -876,7 +892,7 @@ void ADC_ConfigAnalogWatchdogSingleChannel(ADC_T* adc, uint8_t channel) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_EnableTempSensorVrefint(ADC_T* adc) +void ADC_EnableTempSensorVrefint(ADC_T *adc) { adc->CTRL2_B.TSVREFEN = BIT_SET; } @@ -890,7 +906,7 @@ void ADC_EnableTempSensorVrefint(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_DisableTempSensorVrefint(ADC_T* adc) +void ADC_DisableTempSensorVrefint(ADC_T *adc) { adc->CTRL2_B.TSVREFEN = BIT_RESET; } @@ -910,7 +926,7 @@ void ADC_DisableTempSensorVrefint(ADC_T* adc) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_EnableInterrupt(ADC_T* adc, uint16_t interrupt) +void ADC_EnableInterrupt(ADC_T *adc, uint16_t interrupt) { uint8_t mask; @@ -933,7 +949,7 @@ void ADC_EnableInterrupt(ADC_T* adc, uint16_t interrupt) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_DisableInterrupt(ADC_T* adc, uint16_t interrupt) +void ADC_DisableInterrupt(ADC_T *adc, uint16_t interrupt) { uint8_t mask; @@ -958,19 +974,9 @@ void ADC_DisableInterrupt(ADC_T* adc, uint16_t interrupt) * * @note adc can be ADC1, ADC2 or ADC3. */ -uint8_t ADC_ReadStatusFlag(ADC_T* adc, ADC_FLAG_T flag) +uint8_t ADC_ReadStatusFlag(ADC_T *adc, ADC_FLAG_T flag) { - uint8_t status = RESET; - - if ((adc->STS & flag) != (uint8_t)RESET) - { - status = SET; - } - else - { - status = RESET; - } - return status; + return (adc->STS & flag) ? SET : RESET; } /*! @@ -990,7 +996,7 @@ uint8_t ADC_ReadStatusFlag(ADC_T* adc, ADC_FLAG_T flag) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_ClearStatusFlag(ADC_T* adc, uint8_t flag) +void ADC_ClearStatusFlag(ADC_T *adc, uint8_t flag) { adc->STS = ~(uint32_t)flag; } @@ -1010,14 +1016,14 @@ void ADC_ClearStatusFlag(ADC_T* adc, uint8_t flag) * * @note adc can be ADC1, ADC2 or ADC3. */ -uint8_t ADC_ReadIntFlag(ADC_T* adc, ADC_INT_T interrupt) +uint8_t ADC_ReadIntFlag(ADC_T *adc, ADC_INT_T flag) { uint8_t bitStatus = RESET; uint32_t itmask = 0; uint32_t enableStatus = 0; - itmask = interrupt >> 8; - enableStatus = (adc->CTRL1 & (uint8_t)interrupt); + itmask = flag >> 8; + enableStatus = (adc->CTRL1 & (uint8_t)flag); if (((adc->STS & itmask) != (uint32_t)RESET) && enableStatus) { @@ -1045,12 +1051,12 @@ uint8_t ADC_ReadIntFlag(ADC_T* adc, ADC_INT_T interrupt) * * @note adc can be ADC1, ADC2 or ADC3. */ -void ADC_ClearIntFlag(ADC_T* adc, uint16_t interrupt) +void ADC_ClearIntFlag(ADC_T *adc, uint16_t flag) { - uint8_t mask = 0; + uint8_t mask = 0; - mask = (uint8_t)(interrupt >> 8); - adc->STS = ~(uint32_t)mask; + mask = (uint8_t)(flag >> 8); + adc->STS = ~(uint32_t)mask; } /**@} end of group ADC_Fuctions*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_bakpr.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_bakpr.c index a7bfad2fdb..d5c19a0e08 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_bakpr.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_bakpr.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_bakpr.c + * @file apm32f10x_bakpr.c * - * @brief This file provides all the BAKPR firmware functions. + * @brief This file provides all the BAKPR firmware functions. * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_bakpr.h" @@ -114,16 +128,19 @@ void BAKPR_DisableInterrupt(void) */ void BAKPR_ConfigRTCOutput(BAKPR_RTC_OUTPUT_SOURCE_T soure) { - if(soure == BAKPR_RTC_OUTPUT_SOURCE_NONE) + if (soure == BAKPR_RTC_OUTPUT_SOURCE_NONE) { BAKPR->CLKCAL = RESET; - } else if(soure == BAKPR_RTC_OUTPUT_SOURCE_CALIBRATION_CLOCK) + } + else if (soure == BAKPR_RTC_OUTPUT_SOURCE_CALIBRATION_CLOCK) { BAKPR->CLKCAL_B.CALCOEN = BIT_SET; - } else if(soure == BAKPR_RTC_OUTPUT_SOURCE_ALARM) + } + else if (soure == BAKPR_RTC_OUTPUT_SOURCE_ALARM) { BAKPR->CLKCAL_B.ASPOEN = BIT_SET; - } else if(soure == BAKPR_RTC_OUTPUT_SOURCE_SECOND) + } + else if (soure == BAKPR_RTC_OUTPUT_SOURCE_SECOND) { BAKPR->CLKCAL_B.ASPOSEL = BIT_SET; } diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_can.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_can.c index 7efff90f9d..ed0ef63b81 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_can.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_can.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_can.c + * @file apm32f10x_can.c * - * @brief This file provides all the CAN firmware functions + * @brief This file provides all the CAN firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_can.h" @@ -33,7 +47,7 @@ * * @note CAN2 applies only to APM32F103xC device. */ -void CAN_Reset(CAN_T* can) +void CAN_Reset(CAN_T *can) { if (can == CAN1) { @@ -58,7 +72,7 @@ void CAN_Reset(CAN_T* can) * * @note CAN2 applies only to APM32F103xC device. */ -uint8_t CAN_Config(CAN_T* can, CAN_Config_T* canConfig) +uint8_t CAN_Config(CAN_T *can, CAN_Config_T *canConfig) { uint8_t initStatus = ERROR; uint32_t wait_ack = 0x00000000; @@ -69,27 +83,18 @@ uint8_t CAN_Config(CAN_T* can, CAN_Config_T* canConfig) can->MCTRL_B.INITREQ = BIT_SET; /** Wait the acknowledge */ - while(((can->MSTS_B.INITFLG) != BIT_SET) && (wait_ack != 0x0000FFFF)) + while (((can->MSTS_B.INITFLG) != BIT_SET) && (wait_ack != 0x0000FFFF)) { wait_ack++; } /** Check acknowledge */ - if(((can->MSTS_B.INITFLG) != BIT_SET)) + if (((can->MSTS_B.INITFLG) != BIT_SET)) { initStatus = ERROR; } else { - if(canConfig->timeTrigComMode == ENABLE) - { - can->MCTRL_B.TTCM = BIT_SET; - } - else - { - can->MCTRL_B.TTCM = BIT_RESET; - } - - if(canConfig->autoBusOffManage == ENABLE) + if (canConfig->autoBusOffManage == ENABLE) { can->MCTRL_B.ALBOFFM = BIT_SET; } @@ -98,7 +103,7 @@ uint8_t CAN_Config(CAN_T* can, CAN_Config_T* canConfig) can->MCTRL_B.ALBOFFM = BIT_RESET; } - if(canConfig->autoWakeUpMode == ENABLE) + if (canConfig->autoWakeUpMode == ENABLE) { can->MCTRL_B.AWUPCFG = BIT_SET; } @@ -107,7 +112,7 @@ uint8_t CAN_Config(CAN_T* can, CAN_Config_T* canConfig) can->MCTRL_B.AWUPCFG = BIT_RESET; } - if(canConfig->nonAutoRetran == ENABLE) + if (canConfig->nonAutoRetran == ENABLE) { can->MCTRL_B.ARTXMD = BIT_SET; } @@ -116,7 +121,7 @@ uint8_t CAN_Config(CAN_T* can, CAN_Config_T* canConfig) can->MCTRL_B.ARTXMD = BIT_RESET; } - if(canConfig->rxFIFOLockMode == ENABLE) + if (canConfig->rxFIFOLockMode == ENABLE) { can->MCTRL_B.RXFLOCK = BIT_SET; } @@ -125,7 +130,7 @@ uint8_t CAN_Config(CAN_T* can, CAN_Config_T* canConfig) can->MCTRL_B.RXFLOCK = BIT_RESET; } - if(canConfig->txFIFOPriority == ENABLE) + if (canConfig->txFIFOPriority == ENABLE) { can->MCTRL_B.TXFPCFG = BIT_SET; } @@ -147,12 +152,12 @@ uint8_t CAN_Config(CAN_T* can, CAN_Config_T* canConfig) wait_ack = 0; /** Wait the acknowledge */ - while(((can->MSTS_B.INITFLG) != BIT_RESET) && (wait_ack != 0x0000FFFF)) + while (((can->MSTS_B.INITFLG) != BIT_RESET) && (wait_ack != 0x0000FFFF)) { wait_ack++; } /** Check acknowledge */ - if(((can->MSTS_B.INITFLG) != BIT_RESET)) + if (((can->MSTS_B.INITFLG) != BIT_RESET)) { initStatus = ERROR; } @@ -169,20 +174,20 @@ uint8_t CAN_Config(CAN_T* can, CAN_Config_T* canConfig) * * @param can: Select the CAN peripheral which can be CAN1 or CAN2. * - * @param filterConfig :Point to a CAN_FILTER_CONFIG_T structure. + * @param filterConfig :Point to a CAN_FilterConfig_T structure. * * @retval None * * @note CAN2 applies only to APM32F103xC device. */ -void CAN_ConfigFilter(CAN_T* can, CAN_FILTER_CONFIG_T* filterConfig) +void CAN_ConfigFilter(CAN_T *can, CAN_FilterConfig_T *filterConfig) { can->FCTRL_B.FINITEN = BIT_SET; can->FACT &= ~(1 << filterConfig->filterNumber); /** Filter Scale */ - if(filterConfig->filterScale == CAN_FILTER_SCALE_16BIT) + if (filterConfig->filterScale == CAN_FILTER_SCALE_16BIT) { /** 16-bit scale for the filter */ can->FSCFG &= ~(1 << filterConfig->filterNumber); @@ -196,7 +201,7 @@ void CAN_ConfigFilter(CAN_T* can, CAN_FILTER_CONFIG_T* filterConfig) (0x0000FFFF & filterConfig->filterIdHigh); } - if(filterConfig->filterScale == CAN_FILTER_SCALE_32BIT) + if (filterConfig->filterScale == CAN_FILTER_SCALE_32BIT) { can->FSCFG |= (1 << filterConfig->filterNumber); @@ -210,7 +215,7 @@ void CAN_ConfigFilter(CAN_T* can, CAN_FILTER_CONFIG_T* filterConfig) } /** Filter Mode */ - if(filterConfig->filterMode == CAN_FILTER_MODE_IDMASK) + if (filterConfig->filterMode == CAN_FILTER_MODE_IDMASK) { can->FMCFG &= ~(1 << filterConfig->filterNumber); } @@ -220,17 +225,17 @@ void CAN_ConfigFilter(CAN_T* can, CAN_FILTER_CONFIG_T* filterConfig) } /** Filter FIFO assignment */ - if(filterConfig->filterFIFO == CAN_FILTER_FIFO_0) + if (filterConfig->filterFIFO == CAN_FILTER_FIFO_0) { can->FFASS &= ~(1 << filterConfig->filterNumber); } - if(filterConfig->filterFIFO == CAN_FILTER_FIFO_1) + if (filterConfig->filterFIFO == CAN_FILTER_FIFO_1) { can->FFASS |= (1 << filterConfig->filterNumber); } /** Filter activation */ - if(filterConfig->filterActivation == ENABLE) + if (filterConfig->filterActivation == ENABLE) { can->FACT |= (1 << filterConfig->filterNumber); } @@ -246,9 +251,8 @@ void CAN_ConfigFilter(CAN_T* can, CAN_FILTER_CONFIG_T* filterConfig) * * @note CAN2 applies only to APM32F103xC device. */ -void CAN_ConfigStructInit(CAN_Config_T* canConfig) +void CAN_ConfigStructInit(CAN_Config_T *canConfig) { - canConfig->timeTrigComMode = DISABLE; canConfig->autoBusOffManage = DISABLE; canConfig->autoWakeUpMode = DISABLE; canConfig->nonAutoRetran = DISABLE; @@ -270,7 +274,7 @@ void CAN_ConfigStructInit(CAN_Config_T* canConfig) * * @note CAN2 applies only to APM32F103xC device. */ -void CAN_EnableDBGFreeze(CAN_T* can) +void CAN_EnableDBGFreeze(CAN_T *can) { can->MCTRL_B.DBGFRZE = ENABLE; } @@ -284,45 +288,23 @@ void CAN_EnableDBGFreeze(CAN_T* can) * * @note CAN2 applies only to APM32F103xC device. */ -void CAN_DisableDBGFreeze(CAN_T* can) +void CAN_DisableDBGFreeze(CAN_T *can) { can->MCTRL_B.DBGFRZE = DISABLE; } /*! - * @brief Enables the CAN Time TriggerOperation communication mode. + * @brief Select the start bank filter for slave CAN. * - * @param can: Select the CAN peripheral. + * @param bankNum: the start slave bank filter from 1..27. * * @retval None - * - * @note CAN2 applies only to APM32F103xC device. */ -void CAN_EnableTTCComMode(CAN_T* can) +void CAN_SlaveStartBank(CAN_T *can, uint8_t bankNum) { - can->MCTRL_B.TTCM = ENABLE; - - can->sTxMailBox[0].TXDLEN_B.TXTS = BIT_SET; - can->sTxMailBox[1].TXDLEN_B.TXTS = BIT_SET; - can->sTxMailBox[2].TXDLEN_B.TXTS = BIT_SET; -} - -/*! - * @brief Disable the CAN Time TriggerOperation communication mode. - * - * @param can: Select the CAN peripheral. - * - * @retval None - * - * @note CAN2 applies only to APM32F103xC device. - */ -void CAN_DisableTTCComMode(CAN_T* can) -{ - can->MCTRL_B.TTCM = DISABLE; - - can->sTxMailBox[0].TXDLEN_B.TXTS = BIT_RESET; - can->sTxMailBox[1].TXDLEN_B.TXTS = BIT_RESET; - can->sTxMailBox[2].TXDLEN_B.TXTS = BIT_RESET; + can->FCTRL_B.FINITEN = SET; + can->FCTRL_B.CAN2BN = bankNum; + can->FCTRL_B.FINITEN = RESET; } /*! @@ -330,39 +312,41 @@ void CAN_DisableTTCComMode(CAN_T* can) * * @param can: Select the CAN peripheral. * - * @param TxMessage: pointer to a CAN_TX_MESSAGE_T structure. + * @param TxMessage: pointer to a CAN_TxMessage_T structure. * * @retval The number of the mailbox which is used for transmission or 3 if No mailbox is empty. * * @note CAN2 applies only to APM32F103xC device. */ -uint8_t CAN_TxMessage(CAN_T* can, CAN_TX_MESSAGE_T* TxMessage) +uint8_t CAN_TxMessage(CAN_T *can, CAN_TxMessage_T *TxMessage) { uint8_t transmit_milbox = 0; /** Select one empty transmit mailbox */ - if((can->TXSTS & 0x04000000) == 0x04000000) + if ((can->TXSTS & 0x04000000) == 0x04000000) { transmit_milbox = 0; } - else if((can->TXSTS & 0x08000000) == 0x08000000) + else if ((can->TXSTS & 0x08000000) == 0x08000000) { transmit_milbox = 1; } - else if((can->TXSTS & 0x10000000) == 0x10000000) + else if ((can->TXSTS & 0x10000000) == 0x10000000) { transmit_milbox = 2; - } else + } + else { return 3; //!< No mailbox is empty } /** Set up the Id */ can->sTxMailBox[transmit_milbox].TXMID &= 0x00000001; - if(TxMessage->typeID == CAN_TYPEID_STD) + if (TxMessage->typeID == CAN_TYPEID_STD) { can->sTxMailBox[transmit_milbox].TXMID |= (TxMessage->stdID << 21) | (TxMessage->remoteTxReq); - } else + } + else { can->sTxMailBox[transmit_milbox].TXMID |= (TxMessage->extID << 3) | (TxMessage->typeID) | (TxMessage->remoteTxReq); } @@ -396,45 +380,53 @@ uint8_t CAN_TxMessage(CAN_T* can, CAN_TX_MESSAGE_T* TxMessage) * * @note CAN2 applies only to APM32F103xC device. */ -uint8_t CAN_TxMessageStatus(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox) +uint8_t CAN_TxMessageStatus(CAN_T *can, CAN_TX_MAILBIX_T TxMailbox) { uint32_t state = 0; switch (TxMailbox) { - case (CAN_TX_MAILBIX_0): - state = can->TXSTS & (0x00000001 | 0x00000002 | 0x04000000); + case (CAN_TX_MAILBIX_0): + state = can->TXSTS & (0x00000001 | 0x00000002 | 0x04000000); break; - case (CAN_TX_MAILBIX_1): - state = can->TXSTS & (0x00000100 | 0x00000200 | 0x08000000); + case (CAN_TX_MAILBIX_1): + state = can->TXSTS & (0x00000100 | 0x00000200 | 0x08000000); break; - case (CAN_TX_MAILBIX_2): - state = can->TXSTS & (0x00010000 | 0x00020000 | 0x10000000); + case (CAN_TX_MAILBIX_2): + state = can->TXSTS & (0x00010000 | 0x00020000 | 0x10000000); break; - default: - state = 0; + default: + state = 0; break; } switch (state) { - /** transmit pending */ - case (0x0): state = 2; + /** Transmit pending */ + case (0x0): + state = 2; break; - /* transmit failed */ - case (0x00000001 | 0x04000000): state = 0; + /** Transmit failed */ + case (0x00000001 | 0x04000000): + state = 0; break; - case (0x00000100 | 0x08000000): state = 0; + case (0x00000100 | 0x08000000): + state = 0; break; - case (0x00010000 | 0x10000000): state = 0; + case (0x00010000 | 0x10000000): + state = 0; break; - /* transmit succeeded */ - case (0x00000001 | 0x00000002 | 0x04000000):state = 1; + /** Transmit succeeded */ + case (0x00000001 | 0x00000002 | 0x04000000): + state = 1; break; - case (0x00000100 | 0x00000200 | 0x08000000):state = 1; + case (0x00000100 | 0x00000200 | 0x08000000): + state = 1; break; - case (0x00010000 | 0x00020000 | 0x10000000):state = 1; + case (0x00010000 | 0x00020000 | 0x10000000): + state = 1; break; - default: state = 0; + default: + state = 0; break; } return (uint8_t) state; @@ -455,7 +447,7 @@ uint8_t CAN_TxMessageStatus(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox) * * @note CAN2 applies only to APM32F103xC device. */ -void CAN_CancelTxMailbox(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox) +void CAN_CancelTxMailbox(CAN_T *can, CAN_TX_MAILBIX_T TxMailbox) { switch (TxMailbox) { @@ -474,7 +466,7 @@ void CAN_CancelTxMailbox(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox) } /*! - * @brief Receives a message and save to a CAN_RX_MESSAGE_T structure. + * @brief Receives a message and save to a CAN_RxMessage_T structure. * * @param can: Select the CAN peripheral. * @@ -489,11 +481,11 @@ void CAN_CancelTxMailbox(CAN_T* can, CAN_TX_MAILBIX_T TxMailbox) * * @note CAN2 applies only to APM32F103xC device. */ -void CAN_RxMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber, CAN_RX_MESSAGE_T* RxMessage) +void CAN_RxMessage(CAN_T *can, CAN_RX_FIFO_T FIFONumber, CAN_RxMessage_T *RxMessage) { - /* Get the Id */ + /** Get the Id */ RxMessage->typeID = ((uint8_t)0x04 & (can->sRxMailBox[FIFONumber].RXMID)); - if(RxMessage->typeID == CAN_TYPEID_STD) + if (RxMessage->typeID == CAN_TYPEID_STD) { RxMessage->stdID = (can->sRxMailBox[FIFONumber].RXMID >> 21) & 0x000007FF; } @@ -506,16 +498,16 @@ void CAN_RxMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber, CAN_RX_MESSAGE_T* RxMes RxMessage->dataLengthCode = can->sRxMailBox[FIFONumber].RXDLEN_B.DLCODE; RxMessage->filterMatchIndex = can->sRxMailBox[FIFONumber].RXDLEN_B.FMIDX; /** Get the data field */ - RxMessage->data[0] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE1; - RxMessage->data[1] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE2; - RxMessage->data[2] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE3; - RxMessage->data[3] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE4; - RxMessage->data[4] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE5; - RxMessage->data[5] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE6; - RxMessage->data[6] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE7; - RxMessage->data[7] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE8; + RxMessage->data[0] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE0; + RxMessage->data[1] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE1; + RxMessage->data[2] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE2; + RxMessage->data[3] = can->sRxMailBox[FIFONumber].RXMDL_B.DATABYTE3; + RxMessage->data[4] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE4; + RxMessage->data[5] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE5; + RxMessage->data[6] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE6; + RxMessage->data[7] = can->sRxMailBox[FIFONumber].RXMDH_B.DATABYTE7; - if(FIFONumber == CAN_RX_FIFO_0) + if (FIFONumber == CAN_RX_FIFO_0) { can->RXF0_B.RFOM0 = BIT_SET; } @@ -539,9 +531,9 @@ void CAN_RxMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber, CAN_RX_MESSAGE_T* RxMes * * @note CAN2 applies only to APM32F103xC device. */ -void CAN_ReleaseFIFO(CAN_T* can, CAN_RX_FIFO_T FIFONumber) +void CAN_ReleaseFIFO(CAN_T *can, CAN_RX_FIFO_T FIFONumber) { - if(FIFONumber == CAN_RX_FIFO_0) + if (FIFONumber == CAN_RX_FIFO_0) { can->RXF0_B.RFOM0 = BIT_SET; } @@ -565,9 +557,9 @@ void CAN_ReleaseFIFO(CAN_T* can, CAN_RX_FIFO_T FIFONumber) * * @note CAN2 applies only to APM32F103xC device. */ -uint8_t CAN_PendingMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber) +uint8_t CAN_PendingMessage(CAN_T *can, CAN_RX_FIFO_T FIFONumber) { - if(FIFONumber == CAN_RX_FIFO_0) + if (FIFONumber == CAN_RX_FIFO_0) { return can->RXF0 & 0x03; } @@ -594,53 +586,53 @@ uint8_t CAN_PendingMessage(CAN_T* can, CAN_RX_FIFO_T FIFONumber) * * @note CAN2 applies only to APM32F103xC device. */ -uint8_t CAN_OperatingMode(CAN_T* can, CAN_OPERATING_MODE_T operatingMode) +uint8_t CAN_OperatingMode(CAN_T *can, CAN_OPERATING_MODE_T operatingMode) { uint8_t states = 0; uint32_t time_out = 0x0000FFFF; - if(operatingMode == CAN_OPERATING_MODE_INIT) + if (operatingMode == CAN_OPERATING_MODE_INIT) { can->MCTRL_B.SLEEPREQ = BIT_RESET; can->MCTRL_B.INITREQ = BIT_SET; - while((can->MSTS_B.INITFLG != BIT_SET && can->MSTS_B.SLEEPFLG != BIT_RESET) && (time_out != 0)) + while ((can->MSTS_B.INITFLG != BIT_SET && can->MSTS_B.SLEEPFLG != BIT_RESET) && (time_out != 0)) { time_out --; } - if((can->MSTS_B.INITFLG == BIT_SET && can->MSTS_B.SLEEPFLG == BIT_RESET)) + if ((can->MSTS_B.INITFLG == BIT_SET && can->MSTS_B.SLEEPFLG == BIT_RESET)) { states = 1; } } - else if(operatingMode == CAN_OPERATING_MODE_NORMAL) + else if (operatingMode == CAN_OPERATING_MODE_NORMAL) { can->MCTRL_B.SLEEPREQ = BIT_RESET; can->MCTRL_B.INITREQ = BIT_RESET; time_out = 0x0000FFFF; - while((can->MSTS_B.INITFLG != BIT_RESET || can->MSTS_B.SLEEPFLG != BIT_RESET) && (time_out != 0)) + while ((can->MSTS_B.INITFLG != BIT_RESET || can->MSTS_B.SLEEPFLG != BIT_RESET) && (time_out != 0)) { time_out --; } - if((can->MSTS_B.INITFLG == BIT_RESET || can->MSTS_B.SLEEPFLG == BIT_RESET)) + if ((can->MSTS_B.INITFLG == BIT_RESET || can->MSTS_B.SLEEPFLG == BIT_RESET)) { states = 1; } } - else if(operatingMode == CAN_OPERATING_MODE_SLEEP) + else if (operatingMode == CAN_OPERATING_MODE_SLEEP) { can->MCTRL_B.SLEEPREQ = BIT_SET; can->MCTRL_B.INITREQ = BIT_RESET; time_out = 0x0000FFFF; - while((can->MSTS_B.INITFLG != BIT_RESET && can->MSTS_B.SLEEPFLG != BIT_SET) && (time_out != 0)) + while ((can->MSTS_B.INITFLG != BIT_RESET && can->MSTS_B.SLEEPFLG != BIT_SET) && (time_out != 0)) { time_out --; } - if((can->MSTS_B.INITFLG == BIT_RESET && can->MSTS_B.SLEEPFLG == BIT_SET)) + if ((can->MSTS_B.INITFLG == BIT_RESET && can->MSTS_B.SLEEPFLG == BIT_SET)) { states = 1; } @@ -659,12 +651,12 @@ uint8_t CAN_OperatingMode(CAN_T* can, CAN_OPERATING_MODE_T operatingMode) * * @note CAN2 applies only to APM32F103xC device. */ -uint8_t CAN_SleepMode(CAN_T* can) +uint8_t CAN_SleepMode(CAN_T *can) { can->MCTRL_B.SLEEPREQ = BIT_SET; can->MCTRL_B.INITREQ = BIT_RESET; - if((can->MSTS_B.INITFLG == BIT_RESET && can->MSTS_B.SLEEPFLG == BIT_SET)) + if ((can->MSTS_B.INITFLG == BIT_RESET && can->MSTS_B.SLEEPFLG == BIT_SET)) { return 1; } @@ -682,16 +674,16 @@ uint8_t CAN_SleepMode(CAN_T* can) * * @note CAN2 applies only to APM32F103xC device. */ -uint8_t CAN_WakeUpMode(CAN_T* can) +uint8_t CAN_WakeUpMode(CAN_T *can) { uint32_t time_out = 0x0000FFFF; can->MCTRL_B.SLEEPREQ = BIT_RESET; - while((can->MSTS_B.SLEEPFLG != BIT_RESET) && (time_out != 0)) + while ((can->MSTS_B.SLEEPFLG != BIT_RESET) && (time_out != 0)) { time_out --; } - if(can->MSTS_B.SLEEPFLG == BIT_RESET) + if (can->MSTS_B.SLEEPFLG == BIT_RESET) { return 1; } @@ -707,7 +699,7 @@ uint8_t CAN_WakeUpMode(CAN_T* can) * * @note CAN2 applies only to APM32F103xC device. */ -uint8_t CAN_ReadLastErrorCode(CAN_T* can) +uint8_t CAN_ReadLastErrorCode(CAN_T *can) { return can->ERRSTS_B.LERRC; } @@ -721,7 +713,7 @@ uint8_t CAN_ReadLastErrorCode(CAN_T* can) * * @note CAN2 applies only to APM32F103xC device. */ -uint8_t CAN_ReadRxErrorCounter(CAN_T* can) +uint8_t CAN_ReadRxErrorCounter(CAN_T *can) { return can->ERRSTS_B.RXERRCNT; } @@ -735,7 +727,7 @@ uint8_t CAN_ReadRxErrorCounter(CAN_T* can) * * @note CAN2 applies only to APM32F103xC device. */ -uint8_t CAN_ReadLSBTxErrorCounter(CAN_T* can) +uint8_t CAN_ReadLSBTxErrorCounter(CAN_T *can) { return can->ERRSTS_B.TXERRCNT; } @@ -766,7 +758,7 @@ uint8_t CAN_ReadLSBTxErrorCounter(CAN_T* can) * * @note CAN2 applies only to APM32F103xC device. */ -void CAN_EnableInterrupt(CAN_T* can, uint32_t interrupts) +void CAN_EnableInterrupt(CAN_T *can, uint32_t interrupts) { can->INTEN |= interrupts; } @@ -797,7 +789,7 @@ void CAN_EnableInterrupt(CAN_T* can, uint32_t interrupts) * * @note CAN2 applies only to APM32F103xC device. */ -void CAN_DisableInterrupt(CAN_T* can, uint32_t interrupts) +void CAN_DisableInterrupt(CAN_T *can, uint32_t interrupts) { can->INTEN &= ~interrupts; } @@ -829,13 +821,13 @@ void CAN_DisableInterrupt(CAN_T* can, uint32_t interrupts) * * @note CAN2 applies only to APM32F103xC device. */ -uint8_t CAN_ReadStatusFlag(CAN_T* can, CAN_FLAG_T flag) +uint8_t CAN_ReadStatusFlag(CAN_T *can, CAN_FLAG_T flag) { uint8_t status = 0; - if((flag & 0x00F00000) != RESET ) + if ((flag & 0x00F00000) != RESET) { - if((can->ERRSTS & (flag & 0x000FFFFF)) != RESET) + if ((can->ERRSTS & (flag & 0x000FFFFF)) != RESET) { status = SET; } @@ -844,9 +836,9 @@ uint8_t CAN_ReadStatusFlag(CAN_T* can, CAN_FLAG_T flag) status = RESET; } } - else if((flag & 0x01000000) != RESET ) + else if ((flag & 0x01000000) != RESET) { - if((can->MSTS & (flag & 0x000FFFFF)) != RESET ) + if ((can->MSTS & (flag & 0x000FFFFF)) != RESET) { status = SET; } @@ -855,9 +847,9 @@ uint8_t CAN_ReadStatusFlag(CAN_T* can, CAN_FLAG_T flag) status = RESET ; } } - else if((flag & 0x08000000) != RESET ) + else if ((flag & 0x08000000) != RESET) { - if((can->TXSTS & (flag & 0x000FFFFF)) != RESET ) + if ((can->TXSTS & (flag & 0x000FFFFF)) != RESET) { status = SET; } @@ -866,9 +858,9 @@ uint8_t CAN_ReadStatusFlag(CAN_T* can, CAN_FLAG_T flag) status = RESET; } } - else if((flag & 0x02000000) != RESET ) + else if ((flag & 0x02000000) != RESET) { - if((can->RXF0 & (flag & 0x000FFFFF)) != RESET ) + if ((can->RXF0 & (flag & 0x000FFFFF)) != RESET) { status = SET; } @@ -879,7 +871,7 @@ uint8_t CAN_ReadStatusFlag(CAN_T* can, CAN_FLAG_T flag) } else { - if((can->RXF1 & (flag & 0x000FFFFF)) != RESET) + if ((can->RXF1 & (flag & 0x000FFFFF)) != RESET) { status = SET; } @@ -913,27 +905,27 @@ uint8_t CAN_ReadStatusFlag(CAN_T* can, CAN_FLAG_T flag) * * @note CAN2 applies only to APM32F103xC device. */ -void CAN_ClearStatusFlag(CAN_T* can, CAN_FLAG_T flag) +void CAN_ClearStatusFlag(CAN_T *can, CAN_FLAG_T flag) { uint32_t flagtmp = 0; /** ERRSTS register */ - if(flag == 0x30F00070) + if (flag == 0x30F00070) { can->ERRSTS = RESET; } else { flagtmp = flag & 0x000FFFFF; - if((flag & 0x02000000) != RESET) + if ((flag & 0x02000000) != RESET) { can->RXF0 = flagtmp; } - else if((flag & 0x04000000) != RESET) + else if ((flag & 0x04000000) != RESET) { can->RXF1 = flagtmp; } - else if((flag & 0x08000000) != RESET) + else if ((flag & 0x08000000) != RESET) { can->TXSTS = flagtmp; } @@ -970,16 +962,18 @@ void CAN_ClearStatusFlag(CAN_T* can, CAN_FLAG_T flag) * * @note CAN2 applies only to APM32F103xC device. */ -uint8_t CAN_ReadIntFlag(CAN_T* can, CAN_INT_T flag) +uint8_t CAN_ReadIntFlag(CAN_T *can, CAN_INT_T flag) { uint8_t status = 0; - if((can->INTEN & flag) != RESET) + if ((can->INTEN & flag) != RESET) { switch (flag) { case CAN_INT_TXME: - status = can->TXSTS_B.REQCFLG0 | can->TXSTS_B.REQCFLG1 | can->TXSTS_B.REQCFLG2; + status = can->TXSTS_B.REQCFLG0; + status |= can->TXSTS_B.REQCFLG1; + status |= can->TXSTS_B.REQCFLG2; break; case CAN_INT_F0MP: status = can->RXF0_B.FMNUM0; @@ -1056,7 +1050,7 @@ uint8_t CAN_ReadIntFlag(CAN_T* can, CAN_INT_T flag) * * @note CAN2 applies only to APM32F103xC device. */ -void CAN_ClearIntFlag(CAN_T* can, CAN_INT_T flag) +void CAN_ClearIntFlag(CAN_T *can, CAN_INT_T flag) { switch (flag) { diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_crc.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_crc.c index fd0d7b28a6..fe208b5678 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_crc.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_crc.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_crc.c + * @file apm32f10x_crc.c * - * @brief This file provides all the CRC firmware functions + * @brief This file provides all the CRC firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_crc.h" @@ -29,8 +43,6 @@ * @param None * * @retval None - * - * @note */ void CRC_ResetDATA(void) { @@ -63,7 +75,7 @@ uint32_t CRC_CalculateCRC(uint32_t data) */ uint32_t CRC_CalculateBlockCRC(uint32_t *buf, uint32_t bufLen) { - while(bufLen--) + while (bufLen--) { CRC->DATA = *buf++; } diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dac.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dac.c index e66cd77463..fac9e9f135 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dac.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dac.c @@ -3,10 +3,24 @@ * * @brief This file provides all the DAC firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_dac.h" @@ -38,18 +52,18 @@ void DAC_Reset(void) } /*! - * @brief Config the DAC peripheral according to the specified parameters in the configStruct + * @brief Config the DAC peripheral according to the specified parameters in the dacConfig * * @param channel: Select the DAC channel. * This parameter can be one of the following values: * @arg DAC_CHANNEL_1 : DAC channel 1 * @arg DAC_CHANNEL_2 : DAC channel 2 * - * @param configStruct: pointer to a DAC_ConfigStruct_T structure + * @param dacConfig: pointer to a DAC_Config_T structure * * @retval None */ -void DAC_Config(uint32_t channel, DAC_ConfigStruct_T* configStruct) +void DAC_Config(uint32_t channel, DAC_Config_T *dacConfig) { uint32_t tmp1 = 0, tmp2 = 0; @@ -57,29 +71,33 @@ void DAC_Config(uint32_t channel, DAC_ConfigStruct_T* configStruct) tmp1 &= ~(((uint32_t)0x00000FFE) << channel); - tmp2 = (configStruct->trigger | configStruct->waveGeneration | configStruct->maskAmplitudeSelect | configStruct->outputBuffer); + tmp2 = ((uint32_t)dacConfig->trigger | \ + (uint32_t)dacConfig->waveGeneration | \ + (uint32_t)dacConfig->maskAmplitudeSelect | \ + (uint32_t)dacConfig->outputBuffer); + tmp1 |= tmp2 << channel; DAC->CTRL = tmp1; } /*! - * @brief Fills each DAC_ConfigStruct_T member with its default value + * @brief Fills each DAC_Config_T member with its default value * - * @param configStruct: pointer to a DAC_ConfigStruct_T structure which will be initialized + * @param dacConfig: pointer to a DAC_Config_T structure which will be initialized * * @retval None */ -void DAC_ConfigStructInit(DAC_ConfigStruct_T* configStruct) +void DAC_ConfigStructInit(DAC_Config_T *dacConfig) { - /* Initialize the DAC_Trigger member */ - configStruct->trigger = DAC_TRIGGER_NONE; - /* Initialize the DAC_WaveGeneration member */ - configStruct->waveGeneration = DAC_WAVE_GENERATION_NONE; - /* Initialize the DAC_LFSRUnmask_TriangleAmplitude member */ - configStruct->maskAmplitudeSelect = DAC_LFSR_MASK_BIT11_1; - /* Initialize the DAC_OutputBuffer member */ - configStruct->outputBuffer = DAC_OUTPUT_BUFFER_ENBALE; + /** Initialize the DAC_Trigger member */ + dacConfig->trigger = DAC_TRIGGER_NONE; + /** Initialize the DAC_WaveGeneration member */ + dacConfig->waveGeneration = DAC_WAVE_GENERATION_NONE; + /** Initialize the DAC_LFSRUnmask_TriangleAmplitude member */ + dacConfig->maskAmplitudeSelect = DAC_LFSR_MASK_BIT11_1; + /** Initialize the DAC_OutputBuffer member */ + dacConfig->outputBuffer = DAC_OUTPUT_BUFFER_ENBALE; } /*! @@ -303,7 +321,7 @@ void DAC_ConfigChannel1Data(DAC_ALIGN_T align, uint16_t data) tmp = (uint32_t)DAC_BASE; tmp += 0x00000008 + align; - /* Set the DAC channel1 selected data holding register */ + /** Set the DAC channel1 selected data holding register */ *(__IO uint32_t *) tmp = data; } @@ -327,7 +345,7 @@ void DAC_ConfigChannel2Data(DAC_ALIGN_T align, uint16_t data) tmp = (uint32_t)DAC_BASE; tmp += 0x00000014 + align; - /* Set the DAC channel1 selected data holding register */ + /** Set the DAC channel1 selected data holding register */ *(__IO uint32_t *) tmp = data; } @@ -350,7 +368,7 @@ void DAC_ConfigDualChannelData(DAC_ALIGN_T align, uint16_t data2, uint16_t data1 { uint32_t data = 0, tmp = 0; - /* Calculate and set dual DAC data holding register value */ + /** Calculate and set dual DAC data holding register value */ if (align == DAC_ALIGN_8BIT_R) { data = ((uint32_t)data2 << 8) | data1; @@ -363,7 +381,7 @@ void DAC_ConfigDualChannelData(DAC_ALIGN_T align, uint16_t data2, uint16_t data1 tmp = (uint32_t)DAC_BASE; tmp += 0x00000020 + align; - /* Set the dual DAC selected data holding register */ + /** Set the dual DAC selected data holding register */ *(__IO uint32_t *)tmp = data; } @@ -384,8 +402,8 @@ uint16_t DAC_ReadDataOutputValue(DAC_CHANNEL_T channel) tmp = (uint32_t) DAC_BASE ; tmp += 0x0000002C + ((uint32_t)channel >> 2); - /* Returns the DAC channel data output register value */ - return (uint16_t) (*(__IO uint32_t*) tmp); + /** Returns the DAC channel data output register value */ + return (uint16_t)(*(__IO uint32_t *) tmp); } /**@} end of group DAC_Fuctions*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dbgmcu.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dbgmcu.c index 985f9f215d..3486aa8cfe 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dbgmcu.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dbgmcu.c @@ -3,10 +3,24 @@ * * @brief This file provides all the DEBUG firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_dbgmcu.h" @@ -32,7 +46,7 @@ */ uint32_t DBGMCU_ReadDEVID(void) { - return(DBGMCU->IDCODE_B.EQR); + return (DBGMCU->IDCODE_B.EQR); } /*! @@ -44,7 +58,7 @@ uint32_t DBGMCU_ReadDEVID(void) */ uint32_t DBGMCU_ReadREVID(void) { - return(DBGMCU->IDCODE_B.WVR); + return (DBGMCU->IDCODE_B.WVR); } /*! @@ -128,5 +142,5 @@ void DBGMCU_Disable(uint32_t periph) } /**@} end of group DBGMCU_Fuctions*/ -/**@} end of group DBGMCU_Driver */ +/**@} end of group DBGMCU_Driver*/ /**@} end of group Peripherals_Library*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dma.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dma.c index 0df9c93fa7..fc302ad9a4 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dma.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dma.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_dma.c + * @file apm32f10x_dma.c * - * @brief This file provides all the DMA firmware functions + * @brief This file provides all the DMA firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_dma.h" @@ -40,51 +54,51 @@ void DMA_Reset(DMA_Channel_T *channel) channel->CHMADDR = 0; channel->CHPADDR = 0; - if(channel == DMA1_Channel1) + if (channel == DMA1_Channel1) { DMA1->INTFCLR |= 0xFFFFFFF0; } - else if(channel == DMA1_Channel2) + else if (channel == DMA1_Channel2) { DMA1->INTFCLR |= 0xFFFFFF0F; } - else if(channel == DMA1_Channel3) + else if (channel == DMA1_Channel3) { DMA1->INTFCLR |= 0xFFFFF0FF; } - else if(channel == DMA1_Channel4) + else if (channel == DMA1_Channel4) { DMA1->INTFCLR |= 0xFFFF0FFF; } - else if(channel == DMA1_Channel5) + else if (channel == DMA1_Channel5) { DMA1->INTFCLR |= 0xFFF0FFFF; } - else if(channel == DMA1_Channel6) + else if (channel == DMA1_Channel6) { DMA1->INTFCLR |= 0xFF0FFFFF; } - else if(channel == DMA1_Channel7) + else if (channel == DMA1_Channel7) { DMA1->INTFCLR |= 0xF0FFFFFF; } - else if(channel == DMA2_Channel1) + else if (channel == DMA2_Channel1) { DMA2->INTFCLR |= 0xFFFFFFF0; } - else if(channel == DMA2_Channel2) + else if (channel == DMA2_Channel2) { DMA2->INTFCLR |= 0xFFFFFF0F; } - else if(channel == DMA2_Channel3) + else if (channel == DMA2_Channel3) { DMA2->INTFCLR |= 0xFFFFF0FF; } - else if(channel == DMA2_Channel4) + else if (channel == DMA2_Channel4) { DMA2->INTFCLR |= 0xFFFF0FFF; } - else if(channel == DMA2_Channel5) + else if (channel == DMA2_Channel5) { DMA2->INTFCLR |= 0xFFF0FFFF; } @@ -101,7 +115,7 @@ void DMA_Reset(DMA_Channel_T *channel) * * @note DMA2 Channel only for APM32 High density devices. */ -void DMA_Config(DMA_Channel_T* channel, DMA_Config_T* dmaConfig) +void DMA_Config(DMA_Channel_T *channel, DMA_Config_T *dmaConfig) { channel->CHCFG_B.DIRCFG = dmaConfig->dir; channel->CHCFG_B.CIRMODE = dmaConfig->loopMode; @@ -124,7 +138,7 @@ void DMA_Config(DMA_Channel_T* channel, DMA_Config_T* dmaConfig) * * @retval None */ -void DMA_ConfigStructInit( DMA_Config_T* dmaConfig) +void DMA_ConfigStructInit(DMA_Config_T *dmaConfig) { dmaConfig->peripheralBaseAddr = 0; dmaConfig->memoryBaseAddr = 0; @@ -298,22 +312,24 @@ void DMA_DisableInterrupt(DMA_Channel_T *channel, uint32_t interrupt) */ uint8_t DMA_ReadStatusFlag(DMA_FLAG_T flag) { - if((flag & 0x10000000) != RESET ) + if ((flag & 0x10000000) != RESET) { - if((DMA2->INTSTS & flag ) != RESET ) + if ((DMA2->INTSTS & flag) != RESET) { return SET ; - } else + } + else { return RESET ; } } else { - if((DMA1->INTSTS & flag ) != RESET ) + if ((DMA1->INTSTS & flag) != RESET) { return SET ; - } else + } + else { return RESET ; } @@ -381,10 +397,11 @@ uint8_t DMA_ReadStatusFlag(DMA_FLAG_T flag) */ void DMA_ClearStatusFlag(uint32_t flag) { - if((flag & 0x10000000) != RESET) + if ((flag & 0x10000000) != RESET) { DMA2->INTFCLR = flag; - } else + } + else { DMA1->INTFCLR = flag; } @@ -451,21 +468,24 @@ void DMA_ClearStatusFlag(uint32_t flag) */ uint8_t DMA_ReadIntFlag(DMA_INT_FLAG_T flag) { - if((flag & 0x10000000) != RESET ) + if ((flag & 0x10000000) != RESET) { - if((DMA2->INTSTS & flag ) != RESET ) + if ((DMA2->INTSTS & flag) != RESET) { return SET ; - } else + } + else { return RESET ; } - } else + } + else { - if((DMA1->INTSTS & flag ) != RESET ) + if ((DMA1->INTSTS & flag) != RESET) { return SET ; - } else + } + else { return RESET ; } @@ -532,10 +552,11 @@ uint8_t DMA_ReadIntFlag(DMA_INT_FLAG_T flag) */ void DMA_ClearIntFlag(uint32_t flag) { - if((flag & 0x10000000) != RESET) + if ((flag & 0x10000000) != RESET) { DMA2->INTFCLR = flag; - } else + } + else { DMA1->INTFCLR = flag; } diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dmc.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dmc.c index 619550794f..290ab8d697 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dmc.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_dmc.c @@ -3,11 +3,27 @@ * * @brief This file contains all the functions for the DMC controler peripheral * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ + +#ifdef APM32F10X_HD #include "apm32f10x_dmc.h" /** @addtogroup Peripherals_Library Standard Peripheral Library @@ -29,10 +45,10 @@ * * @retval None */ -void DMC_Config(DMC_Config_T * dmcConfig) +void DMC_Config(DMC_Config_T *dmcConfig) { DMC->SW_B.MCSW = 1; - while(!DMC->CTRL1_B.INIT); + while (!DMC->CTRL1_B.INIT); DMC->CFG_B.BAWCFG = dmcConfig->bankWidth; DMC->CFG_B.RAWCFG = dmcConfig->rowWidth; @@ -44,7 +60,7 @@ void DMC_Config(DMC_Config_T * dmcConfig) DMC_ConfigTiming(&dmcConfig->timing); DMC->CTRL1_B.MODESET = 1; - while(!DMC->CTRL1_B.MODESET); + while (!DMC->CTRL1_B.MODESET); DMC->CTRL2_B.RDDEN = 1; DMC->CTRL2_B.RDDCFG = 7; @@ -57,7 +73,7 @@ void DMC_Config(DMC_Config_T * dmcConfig) * * @retval None */ -void DMC_ConfigStructInit(DMC_Config_T * dmcConfig) +void DMC_ConfigStructInit(DMC_Config_T *dmcConfig) { dmcConfig->bankWidth = DMC_BANK_WIDTH_2; dmcConfig->clkPhase = DMC_CLK_PHASE_REVERSE; @@ -75,7 +91,7 @@ void DMC_ConfigStructInit(DMC_Config_T * dmcConfig) * * @retval None */ -void DMC_ConfigTiming(DMC_TimingConfig_T * timingConfig) +void DMC_ConfigTiming(DMC_TimingConfig_T *timingConfig) { DMC->TIM0_B.RASMINTSEL = timingConfig->tRAS; DMC->TIM0_B.DTIMSEL = timingConfig->tRCD; @@ -100,7 +116,7 @@ void DMC_ConfigTiming(DMC_TimingConfig_T * timingConfig) * * @retval None */ -void DMC_ConfigTimingStructInit(DMC_TimingConfig_T * timingConfig) +void DMC_ConfigTimingStructInit(DMC_TimingConfig_T *timingConfig) { timingConfig->latencyCAS = DMC_CAS_LATENCY_3; timingConfig->tARP = DMC_AUTO_REFRESH_10; @@ -267,6 +283,30 @@ void DMC_EnterSlefRefreshMode(void) DMC->CTRL1_B.SRMEN = 1; } +/*! + * @brief Enable Accelerate Module + * + * @param None + * + * @retval None + */ +void DMC_EnableAccelerateModule(void) +{ + DMC->CTRL2_B.BUFFEN = BIT_SET; +} + +/*! + * @brief Disable Accelerate Module + * + * @param None + * + * @retval None + */ +void DMC_DisableAccelerateModule(void) +{ + DMC->CTRL2_B.BUFFEN = BIT_RESET; +} + /*! * @brief Init DMC * @@ -396,14 +436,29 @@ void DMC_Disable(void) * @arg DMC_CLK_PHASE_REVERSE: Clock phase is reverse * * @retval None - * */ void DMC_ConfigClockPhase(DMC_CLK_PHASE_T clkPhase) { DMC->CTRL2_B.CPHACFG = clkPhase; } -/**@} end of group DMC_Fuctions*/ -/**@} end of group DMC_Driver */ -/**@} end of group Peripherals_Library*/ +/*! + * @brief Set DMC WRAP burst + * + * @param burst: WRAP burst Type Selection + * The parameter can be one of following values: + * @arg DMC_WRAPB_4: wrap4 burst transfer + * @arg DMC_WRAPB_8: wrap8 burst transfer + * + * @retval None + */ +void DMC_ConfigWRAPB(DMC_WRPB_T burst) +{ + DMC->CTRL2_B.WRPBSEL = burst; +} +#endif //defined APM32F10X_HD + +/**@} end of group DMC_Fuctions*/ +/**@} end of group DMC_Driver*/ +/**@} end of group Peripherals_Library*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_eint.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_eint.c index cc0eafe579..9b4c63aeac 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_eint.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_eint.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_eint.c + * @file apm32f10x_eint.c * - * @brief This file provides all the EINT firmware functions + * @brief This file provides all the EINT firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_eint.h" @@ -46,12 +60,12 @@ void EINT_Reset(void) * * @retval None */ -void EINT_Config(EINT_Config_T* eintConfig) +void EINT_Config(EINT_Config_T *eintConfig) { uint32_t temp = 0; temp = (uint32_t)EINT_BASE; - if(eintConfig->lineCmd != DISABLE) + if (eintConfig->lineCmd != DISABLE) { EINT->IMASK &= ~eintConfig->line; EINT->EMASK &= ~eintConfig->line; @@ -83,6 +97,21 @@ void EINT_Config(EINT_Config_T* eintConfig) } } +/*! + * @brief Fills each EINT_Config_T member with its reset value. + * + * @param eintConfig: pointer to a EINT_Config_T structure + * + * @retval None + */ +void EINT_ConfigStructInit(EINT_Config_T *eintConfig) +{ + eintConfig->line = EINT_LINENONE; + eintConfig->mode = EINT_MODE_INTERRUPT; + eintConfig->trigger = EINT_TRIGGER_FALLING; + eintConfig->lineCmd = DISABLE; +} + /*! * @brief Select Software interrupt on EINT line * @@ -108,7 +137,7 @@ uint8_t EINT_ReadStatusFlag(EINT_LINE_T line) { uint8_t status = RESET; - if((EINT->IPEND & line) != (uint32_t)RESET) + if ((EINT->IPEND & line) != (uint32_t)RESET) { status = SET; } @@ -147,7 +176,7 @@ uint8_t EINT_ReadIntFlag(EINT_LINE_T line) enablestatus = EINT->IMASK & line; - if((EINT->IPEND & line) != ((uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) + if ((EINT->IPEND & line) != ((uint32_t)RESET) && (enablestatus != (uint32_t)RESET)) { status = SET; } @@ -172,5 +201,5 @@ void EINT_ClearIntFlag(uint32_t line) } /**@} end of group EINT_Fuctions*/ -/**@} end of group EINT_Driver */ +/**@} end of group EINT_Driver*/ /**@} end of group Peripherals_Library*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_emmc.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_emmc.c index 8d79d213d8..b27dd63d2b 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_emmc.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_emmc.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_emmc.c + * @file apm32f10x_emmc.c * - * @brief This file provides all the EMMC firmware functions + * @brief This file provides all the EMMC firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_emmc.h" @@ -39,7 +53,7 @@ void EMMC_ResetNORSRAM(EMMC_BANK1_NORSRAM_T bank) { /** EMMC_BANK1_NORSRAM_1 */ - if(bank == EMMC_BANK1_NORSRAM_1) + if (bank == EMMC_BANK1_NORSRAM_1) { EMMC_Bank1->SNCTRL_T[bank] = 0x000030DB; } @@ -64,7 +78,7 @@ void EMMC_ResetNORSRAM(EMMC_BANK1_NORSRAM_T bank) */ void EMMC_ResetNAND(EMMC_BANK_NAND_T bank) { - if(bank == EMMC_BANK2_NAND) + if (bank == EMMC_BANK2_NAND) { /** Set the EMMC_Bank2 registers to their reset values */ EMMC_Bank2->CTRL2 = 0x00000018; @@ -75,7 +89,7 @@ void EMMC_ResetNAND(EMMC_BANK_NAND_T bank) /** EMMC_BANK3_NAND */ else { - /* Set the EMMC_Bank3 registers to their reset values */ + /** Set the EMMC_Bank3 registers to their reset values */ EMMC_Bank3->CTRL3 = 0x00000018; EMMC_Bank3->STSINT3 = 0x00000040; EMMC_Bank3->CMSTIM3 = 0xFCFCFCFC; @@ -107,9 +121,9 @@ void EMMC_ResetPCCard(void) * * @retval None */ -void EMMC_ConfigNORSRAM(EMMC_NORSRAMConfig_T* emmcNORSRAMConfig) +void EMMC_ConfigNORSRAM(EMMC_NORSRAMConfig_T *emmcNORSRAMConfig) { - /* Bank1 NOR/SRAM control register configuration */ + /** Bank1 NOR/SRAM control register configuration */ EMMC_Bank1->SNCTRL_T[emmcNORSRAMConfig->bank] = (uint32_t)emmcNORSRAMConfig->dataAddressMux | emmcNORSRAMConfig->memoryType | @@ -124,12 +138,12 @@ void EMMC_ConfigNORSRAM(EMMC_NORSRAMConfig_T* emmcNORSRAMConfig) emmcNORSRAMConfig->extendedMode | emmcNORSRAMConfig->writeBurst; - if(emmcNORSRAMConfig->memoryType == EMMC_MEMORY_TYPE_NOR) + if (emmcNORSRAMConfig->memoryType == EMMC_MEMORY_TYPE_NOR) { EMMC_Bank1->SNCTRL_T[emmcNORSRAMConfig->bank] |= 0x00000040; } - /* Bank1 NOR/SRAM timing register configuration */ + /** Bank1 NOR/SRAM timing register configuration */ EMMC_Bank1->SNCTRL_T[emmcNORSRAMConfig->bank + 1] = (uint32_t)emmcNORSRAMConfig->readWriteTimingStruct->addressSetupTime | (emmcNORSRAMConfig->readWriteTimingStruct->addressHodeTime << 4) | @@ -139,8 +153,8 @@ void EMMC_ConfigNORSRAM(EMMC_NORSRAMConfig_T* emmcNORSRAMConfig) (emmcNORSRAMConfig->readWriteTimingStruct->dataLatency << 24) | emmcNORSRAMConfig->readWriteTimingStruct->accessMode; - /* Bank1 NOR/SRAM timing register for write configuration, if extended mode is used */ - if(emmcNORSRAMConfig->extendedMode == EMMC_EXTENDEN_MODE_ENABLE) + /** Bank1 NOR/SRAM timing register for write configuration, if extended mode is used */ + if (emmcNORSRAMConfig->extendedMode == EMMC_EXTENDEN_MODE_ENABLE) { EMMC_Bank1E->WRTTIM[emmcNORSRAMConfig->bank] = (uint32_t)emmcNORSRAMConfig->writeTimingStruct->addressSetupTime | @@ -163,11 +177,11 @@ void EMMC_ConfigNORSRAM(EMMC_NORSRAMConfig_T* emmcNORSRAMConfig) * * @retval None */ -void EMMC_ConfigNAND(EMMC_NANDConfig_T* emmcNANDConfig) +void EMMC_ConfigNAND(EMMC_NANDConfig_T *emmcNANDConfig) { uint32_t tmppcr = 0x00000000, tmppmem = 0x00000000, tmppatt = 0x00000000; - /* Set the tmppcr value according to EMMC_NANDInitStruct parameters */ + /** Set the tmppcr value according to EMMC_NANDInitStruct parameters */ tmppcr = (uint32_t)emmcNANDConfig->waitFeature | 0x00000008 | emmcNANDConfig->memoryDataWidth | emmcNANDConfig->ECC | @@ -175,28 +189,28 @@ void EMMC_ConfigNAND(EMMC_NANDConfig_T* emmcNANDConfig) (emmcNANDConfig->TCLRSetupTime << 9) | (emmcNANDConfig->TARSetupTime << 13); - /* Set tmppmem value according to EMMC_CommonSpaceTimingStructure parameters */ + /** Set tmppmem value according to EMMC_CommonSpaceTimingStructure parameters */ tmppmem = (uint32_t)emmcNANDConfig->commonSpaceTimingStruct->setupTime | (emmcNANDConfig->commonSpaceTimingStruct->waitSetupTime << 8) | (emmcNANDConfig->commonSpaceTimingStruct->holdSetupTime << 16) | (emmcNANDConfig->commonSpaceTimingStruct->HiZSetupTime << 24); - /* Set tmppatt value according to EMMC_AttributeSpaceTimingStructure parameters */ + /** Set tmppatt value according to EMMC_AttributeSpaceTimingStructure parameters */ tmppatt = (uint32_t)emmcNANDConfig->attributeSpaceTimingStruct->setupTime | (emmcNANDConfig->attributeSpaceTimingStruct->waitSetupTime << 8) | (emmcNANDConfig->attributeSpaceTimingStruct->holdSetupTime << 16) | (emmcNANDConfig->attributeSpaceTimingStruct->HiZSetupTime << 24); - if(emmcNANDConfig->bank == EMMC_BANK2_NAND) + if (emmcNANDConfig->bank == EMMC_BANK2_NAND) { - /* EMMC_BANK2_NAND registers configuration */ + /** EMMC_BANK2_NAND registers configuration */ EMMC_Bank2->CTRL2 = tmppcr; EMMC_Bank2->CMSTIM2 = tmppmem; EMMC_Bank2->AMSTIM2 = tmppatt; } else { - /* EMMC_BANK3_NAND registers configuration */ + /** EMMC_BANK3_NAND registers configuration */ EMMC_Bank3->CTRL3 = tmppcr; EMMC_Bank3->CMSTIM3 = tmppmem; EMMC_Bank3->AMSTIM3 = tmppatt; @@ -211,30 +225,30 @@ void EMMC_ConfigNAND(EMMC_NANDConfig_T* emmcNANDConfig) * * @retval None */ -void EMMC_ConfigPCCard(EMMC_PCCARDConfig_T* emmcPCCardConfig) +void EMMC_ConfigPCCard(EMMC_PCCARDConfig_T *emmcPCCardConfig) { - /* Set the PCR4 register value according to EMMC_PCCARDInitStruct parameters */ + /** Set the PCR4 register value according to EMMC_PCCARDInitStruct parameters */ EMMC_Bank4->CTRL4 = (uint32_t)emmcPCCardConfig->waitFeature | EMMC_MEMORY_DATA_WIDTH_16BIT | - (emmcPCCardConfig->TCLRSetupTime << 9) | - (emmcPCCardConfig->TARSetupTime << 13); + (emmcPCCardConfig->TCLRSetupTime << 9) | + (emmcPCCardConfig->TARSetupTime << 13); - /* Set PMEM4 register value according to EMMC_CommonSpaceTimingStructure parameters */ + /** Set PMEM4 register value according to EMMC_CommonSpaceTimingStructure parameters */ EMMC_Bank4->CMSTIM4 = (uint32_t)emmcPCCardConfig->commonSpaceTimingStruct->setupTime | - (emmcPCCardConfig->commonSpaceTimingStruct->waitSetupTime << 8) | - (emmcPCCardConfig->commonSpaceTimingStruct->holdSetupTime << 16) | - (emmcPCCardConfig->commonSpaceTimingStruct->HiZSetupTime << 24); + (emmcPCCardConfig->commonSpaceTimingStruct->waitSetupTime << 8) | + (emmcPCCardConfig->commonSpaceTimingStruct->holdSetupTime << 16) | + (emmcPCCardConfig->commonSpaceTimingStruct->HiZSetupTime << 24); - /* Set PATT4 register value according to EMMC_AttributeSpaceTimingStructure parameters */ + /** Set PATT4 register value according to EMMC_AttributeSpaceTimingStructure parameters */ EMMC_Bank4->AMSTIM4 = (uint32_t)emmcPCCardConfig->attributeSpaceTimingStruct->setupTime | - (emmcPCCardConfig->attributeSpaceTimingStruct->waitSetupTime << 8) | - (emmcPCCardConfig->attributeSpaceTimingStruct->holdSetupTime << 16) | - (emmcPCCardConfig->attributeSpaceTimingStruct->HiZSetupTime << 24); + (emmcPCCardConfig->attributeSpaceTimingStruct->waitSetupTime << 8) | + (emmcPCCardConfig->attributeSpaceTimingStruct->holdSetupTime << 16) | + (emmcPCCardConfig->attributeSpaceTimingStruct->HiZSetupTime << 24); - /* Set PIO4 register value according to EMMC_IOSpaceTimingStructure parameters */ + /** Set PIO4 register value according to EMMC_IOSpaceTimingStructure parameters */ EMMC_Bank4->IOSTIM4 = (uint32_t)emmcPCCardConfig->IOSpaceTimingStruct->setupTime | - (emmcPCCardConfig->IOSpaceTimingStruct->waitSetupTime << 8) | - (emmcPCCardConfig->IOSpaceTimingStruct->holdSetupTime << 16) | - (emmcPCCardConfig->IOSpaceTimingStruct->HiZSetupTime << 24); + (emmcPCCardConfig->IOSpaceTimingStruct->waitSetupTime << 8) | + (emmcPCCardConfig->IOSpaceTimingStruct->holdSetupTime << 16) | + (emmcPCCardConfig->IOSpaceTimingStruct->HiZSetupTime << 24); } /*! @@ -244,9 +258,9 @@ void EMMC_ConfigPCCard(EMMC_PCCARDConfig_T* emmcPCCardConfig) * * @retval None */ -void EMMC_ConfigNORSRAMStructInit(EMMC_NORSRAMConfig_T* emmcNORSRAMConfig) +void EMMC_ConfigNORSRAMStructInit(EMMC_NORSRAMConfig_T *emmcNORSRAMConfig) { - /* Reset NOR/SRAM Init structure parameters values */ + /** Reset NOR/SRAM Init structure parameters values */ emmcNORSRAMConfig->bank = EMMC_BANK1_NORSRAM_1; emmcNORSRAMConfig->dataAddressMux = EMMC_DATA_ADDRESS_MUX_ENABLE; emmcNORSRAMConfig->memoryType = EMMC_MEMORY_TYPE_SRAM; @@ -284,9 +298,9 @@ void EMMC_ConfigNORSRAMStructInit(EMMC_NORSRAMConfig_T* emmcNORSRAMConfig) * * @retval None */ -void EMMC_ConfigNANDStructInit(EMMC_NANDConfig_T* emmcNANDConfig) +void EMMC_ConfigNANDStructInit(EMMC_NANDConfig_T *emmcNANDConfig) { - /* Reset NAND Init structure parameters values */ + /** Reset NAND Init structure parameters values */ emmcNANDConfig->bank = EMMC_BANK2_NAND; emmcNANDConfig->waitFeature = EMMC_WAIT_FEATURE_DISABLE; emmcNANDConfig->memoryDataWidth = EMMC_MEMORY_DATA_WIDTH_8BIT; @@ -311,9 +325,9 @@ void EMMC_ConfigNANDStructInit(EMMC_NANDConfig_T* emmcNANDConfig) * * @retval None */ -void EMMC_ConfigPCCardStructInit(EMMC_PCCARDConfig_T* emmcPCCardConfig) +void EMMC_ConfigPCCardStructInit(EMMC_PCCARDConfig_T *emmcPCCardConfig) { - /* Reset PCCARD Init structure parameters values */ + /** Reset PCCARD Init structure parameters values */ emmcPCCardConfig->waitFeature = EMMC_WAIT_FEATURE_DISABLE; emmcPCCardConfig->TCLRSetupTime = 0x0; emmcPCCardConfig->TARSetupTime = 0x0; @@ -377,7 +391,7 @@ void EMMC_DisableNORSRAM(EMMC_BANK1_NORSRAM_T bank) */ void EMMC_EnableNAND(EMMC_BANK_NAND_T bank) { - if(bank == EMMC_BANK2_NAND) + if (bank == EMMC_BANK2_NAND) { EMMC_Bank2->CTRL2_B.MBKEN = BIT_SET; } @@ -399,7 +413,7 @@ void EMMC_EnableNAND(EMMC_BANK_NAND_T bank) */ void EMMC_DisableNAND(EMMC_BANK_NAND_T bank) { - if(bank == EMMC_BANK2_NAND) + if (bank == EMMC_BANK2_NAND) { EMMC_Bank2->CTRL2_B.MBKEN = BIT_RESET; } @@ -445,7 +459,7 @@ void EMMC_DisablePCCARD(void) */ void EMMC_EnableNANDECC(EMMC_BANK_NAND_T bank) { - if(bank == EMMC_BANK2_NAND) + if (bank == EMMC_BANK2_NAND) { EMMC_Bank2->CTRL2 |= 0x00000040; } @@ -465,11 +479,10 @@ void EMMC_EnableNANDECC(EMMC_BANK_NAND_T bank) * * @retval None * - * @note */ void EMMC_DisableNANDECC(EMMC_BANK_NAND_T bank) { - if(bank == EMMC_BANK2_NAND) + if (bank == EMMC_BANK2_NAND) { EMMC_Bank2->CTRL2 &= 0x000FFFBF; } @@ -493,7 +506,7 @@ uint32_t EMMC_ReadECC(EMMC_BANK_NAND_T bank) { uint32_t eccval = 0x00000000; - if(bank == EMMC_BANK2_NAND) + if (bank == EMMC_BANK2_NAND) { eccval = EMMC_Bank2->ECCRS2; } @@ -523,11 +536,11 @@ uint32_t EMMC_ReadECC(EMMC_BANK_NAND_T bank) */ void EMMC_EnableInterrupt(EMMC_BANK_NAND_T bank, uint32_t interrupt) { - if(bank == EMMC_BANK2_NAND) + if (bank == EMMC_BANK2_NAND) { EMMC_Bank2->STSINT2 |= interrupt; } - else if(bank == EMMC_BANK3_NAND) + else if (bank == EMMC_BANK3_NAND) { EMMC_Bank3->STSINT3 |= interrupt; } @@ -556,11 +569,11 @@ void EMMC_EnableInterrupt(EMMC_BANK_NAND_T bank, uint32_t interrupt) */ void EMMC_DisableInterrupt(EMMC_BANK_NAND_T bank, uint32_t interrupt) { - if(bank == EMMC_BANK2_NAND) + if (bank == EMMC_BANK2_NAND) { EMMC_Bank2->STSINT2 &= ~interrupt; } - else if(bank == EMMC_BANK3_NAND) + else if (bank == EMMC_BANK3_NAND) { EMMC_Bank3->STSINT3 &= ~interrupt; } @@ -588,17 +601,16 @@ void EMMC_DisableInterrupt(EMMC_BANK_NAND_T bank, uint32_t interrupt) * * @retval SET or RESET * - * @note */ uint8_t EMMC_ReadStatusFlag(EMMC_BANK_NAND_T bank, EMMC_FLAG_T flag) { uint32_t tmpsr = 0x00000000; - if(bank == EMMC_BANK2_NAND) + if (bank == EMMC_BANK2_NAND) { tmpsr = EMMC_Bank2->STSINT2; } - else if(bank == EMMC_BANK3_NAND) + else if (bank == EMMC_BANK3_NAND) { tmpsr = EMMC_Bank3->STSINT3; } @@ -606,8 +618,8 @@ uint8_t EMMC_ReadStatusFlag(EMMC_BANK_NAND_T bank, EMMC_FLAG_T flag) { tmpsr = EMMC_Bank4->STSINT4; } - /* Get the flag status */ - if((tmpsr & flag) != RESET) + /** Get the flag status */ + if ((tmpsr & flag) != RESET) { return SET; } @@ -636,11 +648,11 @@ uint8_t EMMC_ReadStatusFlag(EMMC_BANK_NAND_T bank, EMMC_FLAG_T flag) */ void EMMC_ClearStatusFlag(EMMC_BANK_NAND_T bank, uint32_t flag) { - if(bank == EMMC_BANK2_NAND) + if (bank == EMMC_BANK2_NAND) { EMMC_Bank2->STSINT2 &= ~flag; } - else if(bank == EMMC_BANK3_NAND) + else if (bank == EMMC_BANK3_NAND) { EMMC_Bank3->STSINT3 &= ~flag; } @@ -671,11 +683,11 @@ uint8_t EMMC_ReadIntFlag(EMMC_BANK_NAND_T bank, EMMC_INT_T flag) { uint32_t tmpsr = 0x0, itstatus = 0x0, itenable = 0x0; - if(bank == EMMC_BANK2_NAND) + if (bank == EMMC_BANK2_NAND) { tmpsr = EMMC_Bank2->STSINT2; } - else if(bank == EMMC_BANK3_NAND) + else if (bank == EMMC_BANK3_NAND) { tmpsr = EMMC_Bank3->STSINT3; } @@ -687,7 +699,7 @@ uint8_t EMMC_ReadIntFlag(EMMC_BANK_NAND_T bank, EMMC_INT_T flag) itstatus = tmpsr & flag; itenable = tmpsr & (flag >> 3); - if((itstatus != RESET) && (itenable != RESET)) + if ((itstatus != RESET) && (itenable != RESET)) { return SET; } @@ -716,11 +728,11 @@ uint8_t EMMC_ReadIntFlag(EMMC_BANK_NAND_T bank, EMMC_INT_T flag) */ void EMMC_ClearIntFlag(EMMC_BANK_NAND_T bank, uint32_t flag) { - if(bank == EMMC_BANK2_NAND) + if (bank == EMMC_BANK2_NAND) { EMMC_Bank2->STSINT2 &= ~(flag >> 3); } - else if(bank == EMMC_BANK3_NAND) + else if (bank == EMMC_BANK3_NAND) { EMMC_Bank3->STSINT3 &= ~(flag >> 3); } diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_fmc.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_fmc.c index 63f8bf81ae..fc9c2670c6 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_fmc.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_fmc.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_fmc.c + * @file apm32f10x_fmc.c * - * @brief This file provides all the FMC firmware functions + * @brief This file provides all the FMC firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_fmc.h" @@ -126,7 +140,7 @@ FMC_STATUS_T FMC_ErasePage(uint32_t pageAddr) FMC_STATUS_T status = FMC_STATUS_COMPLETE; status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_COMPLETE) + if (status == FMC_STATUS_COMPLETE) { FMC->CTRL2_B.PAGEERA = BIT_SET; FMC->ADDR = pageAddr; @@ -154,7 +168,7 @@ FMC_STATUS_T FMC_EraseAllPage(void) FMC_STATUS_T status = FMC_STATUS_COMPLETE; status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_COMPLETE) + if (status == FMC_STATUS_COMPLETE) { FMC->CTRL2_B.MASSERA = BIT_SET; FMC->CTRL2_B.STA = BIT_SET; @@ -181,12 +195,12 @@ FMC_STATUS_T FMC_EraseOptionBytes(void) uint16_t rdtemp = 0x00A5; FMC_STATUS_T status = FMC_STATUS_COMPLETE; - if(FMC_GetReadProtectionStatus() != RESET) + if (FMC_GetReadProtectionStatus() != RESET) { rdtemp = 0x00; } status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_COMPLETE) + if (status == FMC_STATUS_COMPLETE) { FMC->OBKEY = 0x45670123; FMC->OBKEY = 0xCDEF89AB; @@ -196,18 +210,18 @@ FMC_STATUS_T FMC_EraseOptionBytes(void) status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_COMPLETE) + if (status == FMC_STATUS_COMPLETE) { FMC->CTRL2_B.OBE = BIT_RESET; FMC->CTRL2_B.OBP = BIT_SET; OB->RDP = rdtemp; status = FMC_WaitForLastOperation(0x000B0000); - if(status != FMC_STATUS_TIMEOUT) + if (status != FMC_STATUS_TIMEOUT) { FMC->CTRL2_B.OBP = BIT_RESET; } } - else if(status != FMC_STATUS_TIMEOUT) + else if (status != FMC_STATUS_TIMEOUT) { FMC->CTRL2_B.OBP = BIT_RESET; } @@ -233,13 +247,13 @@ FMC_STATUS_T FMC_ProgramWord(uint32_t address, uint32_t data) FMC_STATUS_T status = FMC_STATUS_COMPLETE; __IOM uint32_t temp = 0; - #ifdef APM32F10X_HD - __set_PRIMASK(1); - #endif +#ifdef APM32F10X_HD + __set_PRIMASK(1); +#endif status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_COMPLETE) + if (status == FMC_STATUS_COMPLETE) { FMC->CTRL2_B.PG = BIT_SET; @@ -247,11 +261,11 @@ FMC_STATUS_T FMC_ProgramWord(uint32_t address, uint32_t data) status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_COMPLETE) + if (status == FMC_STATUS_COMPLETE) { temp = address + 2; - *(__IOM uint16_t*) temp = data >> 16; + *(__IOM uint16_t *) temp = data >> 16; status = FMC_WaitForLastOperation(0x000B0000); FMC->CTRL2_B.PG = BIT_RESET; @@ -262,9 +276,9 @@ FMC_STATUS_T FMC_ProgramWord(uint32_t address, uint32_t data) } } - #ifdef APM32F10X_HD - __set_PRIMASK(0); - #endif +#ifdef APM32F10X_HD + __set_PRIMASK(0); +#endif return status; } @@ -286,13 +300,13 @@ FMC_STATUS_T FMC_ProgramHalfWord(uint32_t address, uint16_t data) { FMC_STATUS_T status = FMC_STATUS_COMPLETE; - #ifdef APM32F10X_HD - __set_PRIMASK(1); - #endif +#ifdef APM32F10X_HD + __set_PRIMASK(1); +#endif status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_COMPLETE) + if (status == FMC_STATUS_COMPLETE) { FMC->CTRL2_B.PG = BIT_SET; *(__IOM uint16_t *)address = data; @@ -300,9 +314,9 @@ FMC_STATUS_T FMC_ProgramHalfWord(uint32_t address, uint16_t data) FMC->CTRL2_B.PG = BIT_RESET; } - #ifdef APM32F10X_HD - __set_PRIMASK(0); - #endif +#ifdef APM32F10X_HD + __set_PRIMASK(0); +#endif return status; } @@ -326,7 +340,7 @@ FMC_STATUS_T FMC_ProgramOptionByteData(uint32_t address, uint8_t data) status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_COMPLETE) + if (status == FMC_STATUS_COMPLETE) { FMC->OBKEY = 0x45670123; FMC->OBKEY = 0xCDEF89AB; @@ -334,7 +348,7 @@ FMC_STATUS_T FMC_ProgramOptionByteData(uint32_t address, uint8_t data) FMC->CTRL2_B.OBP = BIT_SET; *(__IOM uint16_t *)address = data; status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_TIMEOUT) + if (status == FMC_STATUS_TIMEOUT) { FMC->CTRL2_B.OBP = BIT_RESET; } @@ -347,11 +361,11 @@ FMC_STATUS_T FMC_ProgramOptionByteData(uint32_t address, uint8_t data) * * @param page:the address of the pages to be write protection * This parameter can be any combination of the following values: - * for APM32F10X_LD + * for APM32F10X_LD : * @arg FLASH_WRP_PAGE_0_3 to FLASH_WRP_PAGE_28_31 - * for APM32F10X_MD + * for APM32F10X_MD : * @arg FLASH_WRP_PAGE_0_3 to FLASH_WRP_PAGE_124_127 - * for APM32F10X_HD + * for APM32F10X_HD : * @arg FLASH_WRP_PAGE_0_1 to FLASH_WRP_PAGE_60_61 or FLASH_WRP_PAGE_62_127 * @arg FMC_WRP_PAGE_ALL * @@ -374,34 +388,34 @@ FMC_STATUS_T FMC_EnableWriteProtection(uint32_t page) status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_COMPLETE) + if (status == FMC_STATUS_COMPLETE) { FMC->OBKEY = 0x45670123; FMC->OBKEY = 0xCDEF89AB; FMC->CTRL2_B.OBP = BIT_SET; - if(WPP0_Data != 0xFF) + if (WPP0_Data != 0xFF) { OB->WRP0 = WPP0_Data; status = FMC_WaitForLastOperation(0x000B0000); } - if((status == FMC_STATUS_COMPLETE) && (WPP1_Data != 0xFF)) + if ((status == FMC_STATUS_COMPLETE) && (WPP1_Data != 0xFF)) { OB->WRP1 = WPP1_Data; status = FMC_WaitForLastOperation(0x000B0000); } - if((status == FMC_STATUS_COMPLETE) && (WPP2_Data != 0xFF)) + if ((status == FMC_STATUS_COMPLETE) && (WPP2_Data != 0xFF)) { OB->WRP2 = WPP2_Data; status = FMC_WaitForLastOperation(0x000B0000); } - if((status == FMC_STATUS_COMPLETE) && (WPP3_Data != 0xFF)) + if ((status == FMC_STATUS_COMPLETE) && (WPP3_Data != 0xFF)) { OB->WRP3 = WPP3_Data; status = FMC_WaitForLastOperation(0x000B0000); } - if(status != FMC_STATUS_TIMEOUT) + if (status != FMC_STATUS_TIMEOUT) { FMC->CTRL2_B.OBP = BIT_RESET; } @@ -426,7 +440,7 @@ FMC_STATUS_T FMC_EnableReadOutProtection(void) status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_COMPLETE) + if (status == FMC_STATUS_COMPLETE) { FMC->OBKEY = 0x45670123; FMC->OBKEY = 0xCDEF89AB; @@ -436,7 +450,7 @@ FMC_STATUS_T FMC_EnableReadOutProtection(void) status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_COMPLETE) + if (status == FMC_STATUS_COMPLETE) { FMC->CTRL2_B.OBE = BIT_RESET; FMC->CTRL2_B.OBP = BIT_SET; @@ -444,12 +458,12 @@ FMC_STATUS_T FMC_EnableReadOutProtection(void) status = FMC_WaitForLastOperation(0x000B0000); - if(status != FMC_STATUS_TIMEOUT) + if (status != FMC_STATUS_TIMEOUT) { FMC->CTRL2_B.OBP = BIT_RESET; } } - else if(status != FMC_STATUS_TIMEOUT) + else if (status != FMC_STATUS_TIMEOUT) { FMC->CTRL2_B.OBE = BIT_RESET; } @@ -474,7 +488,7 @@ FMC_STATUS_T FMC_DisableReadOutProtection(void) status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_COMPLETE) + if (status == FMC_STATUS_COMPLETE) { FMC->OBKEY = 0x45670123; FMC->OBKEY = 0xCDEF89AB; @@ -483,7 +497,7 @@ FMC_STATUS_T FMC_DisableReadOutProtection(void) status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_COMPLETE) + if (status == FMC_STATUS_COMPLETE) { FMC->CTRL2_B.OBE = BIT_RESET; FMC->CTRL2_B.OBP = BIT_SET; @@ -491,12 +505,12 @@ FMC_STATUS_T FMC_DisableReadOutProtection(void) status = FMC_WaitForLastOperation(0x000B0000); - if(status != FMC_STATUS_TIMEOUT) + if (status != FMC_STATUS_TIMEOUT) { FMC->CTRL2_B.OBP = BIT_RESET; } } - else if(status != FMC_STATUS_TIMEOUT) + else if (status != FMC_STATUS_TIMEOUT) { FMC->CTRL2_B.OBE = BIT_RESET; } @@ -515,7 +529,7 @@ FMC_STATUS_T FMC_DisableReadOutProtection(void) * @arg FMC_STATUS_COMPLETE * @arg FMC_STATUS_TIMEOUT */ -FMC_STATUS_T FMC_ConfigUserOptionByte(FMC_UserConfig_T* userConfig) +FMC_STATUS_T FMC_ConfigUserOptionByte(FMC_UserConfig_T *userConfig) { FMC_STATUS_T status = FMC_STATUS_COMPLETE; @@ -524,12 +538,14 @@ FMC_STATUS_T FMC_ConfigUserOptionByte(FMC_UserConfig_T* userConfig) status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_COMPLETE) + if (status == FMC_STATUS_COMPLETE) { FMC->CTRL2_B.OBP = BIT_SET; - OB->USER = userConfig->iwdtSet | userConfig->stopSet | userConfig->stdbySet | 0xF8; + OB->USER = (uint32_t)userConfig->iwdtSet | \ + (uint32_t)userConfig->stopSet | \ + (uint32_t)userConfig->stdbySet | 0xF8; status = FMC_WaitForLastOperation(0x000B0000); - if(status == FMC_STATUS_TIMEOUT) + if (status == FMC_STATUS_TIMEOUT) { FMC->CTRL2_B.OBP = BIT_RESET; } @@ -572,7 +588,7 @@ uint8_t FMC_GetReadProtectionStatus(void) { uint8_t flagstatus = RESET; - if(FMC->OBCS_B.READPROT != RESET) + if (FMC->OBCS_B.READPROT != RESET) { flagstatus = SET; } @@ -607,7 +623,7 @@ uint8_t FMC_ReadPrefetchBufferStatus(void) */ void FMC_EnableInterrupt(FMC_INT_T interrupt) { - if(interrupt == FMC_INT_ERR) + if (interrupt == FMC_INT_ERR) { FMC->CTRL2_B.ERRIE = ENABLE; } @@ -629,7 +645,7 @@ void FMC_EnableInterrupt(FMC_INT_T interrupt) */ void FMC_DisableInterrupt(FMC_INT_T interrupt) { - if(interrupt == FMC_INT_ERR) + if (interrupt == FMC_INT_ERR) { FMC->CTRL2_B.ERRIE = DISABLE; } @@ -654,11 +670,11 @@ void FMC_DisableInterrupt(FMC_INT_T interrupt) */ uint8_t FMC_ReadStatusFlag(FMC_FLAG_T flag) { - if(flag == FMC_FLAG_OBE) + if (flag == FMC_FLAG_OBE) { return FMC->OBCS_B.OBE; } - else if((FMC->STS & flag ) != RESET) + else if ((FMC->STS & flag) != RESET) { return SET; } @@ -676,9 +692,8 @@ uint8_t FMC_ReadStatusFlag(FMC_FLAG_T flag) * * @retval None * - * @note */ -void FMC_ClearStatusFlag(FMC_FLAG_T flag) +void FMC_ClearStatusFlag(uint32_t flag) { FMC->STS = flag; } @@ -698,15 +713,15 @@ FMC_STATUS_T FMC_ReadStatus(void) { FMC_STATUS_T status = FMC_STATUS_COMPLETE; - if(FMC->STS_B.BUSYF == BIT_SET) + if (FMC->STS_B.BUSYF == BIT_SET) { status = FMC_STATUS_BUSY; } - else if(FMC->STS_B.PEF == BIT_SET) + else if (FMC->STS_B.PEF == BIT_SET) { status = FMC_STATUS_ERROR_PG; } - else if(FMC->STS_B.WPEF == BIT_SET) + else if (FMC->STS_B.WPEF == BIT_SET) { status = FMC_STATUS_ERROR_WRP; } @@ -736,12 +751,12 @@ FMC_STATUS_T FMC_WaitForLastOperation(uint32_t timeOut) status = FMC_ReadStatus(); /** Wait for a Flash operation to complete or a TIMEOUT to occur */ - while((status == FMC_STATUS_BUSY) && (timeOut !=0)) + while ((status == FMC_STATUS_BUSY) && (timeOut != 0)) { status = FMC_ReadStatus(); timeOut--; } - if(timeOut == 0x00) + if (timeOut == 0x00) { status = FMC_STATUS_TIMEOUT; } diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_gpio.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_gpio.c index a3c1518eb5..e4399deb9e 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_gpio.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_gpio.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_gpio.c + * @file apm32f10x_gpio.c * - * @brief This file provides all the GPIO firmware functions + * @brief This file provides all the GPIO firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_gpio.h" @@ -32,7 +46,7 @@ * * @retval None */ -void GPIO_Reset(GPIO_T* port) +void GPIO_Reset(GPIO_T *port) { RCM_APB2_PERIPH_T APB2Periph; @@ -92,7 +106,7 @@ void GPIO_AFIOReset(void) * * @retval None */ -void GPIO_Config(GPIO_T* port, GPIO_Config_T* gpioConfig) +void GPIO_Config(GPIO_T *port, GPIO_Config_T *gpioConfig) { uint8_t i; uint32_t mode; @@ -167,10 +181,10 @@ void GPIO_Config(GPIO_T* port, GPIO_Config_T* gpioConfig) * * @retval None */ -void GPIO_StructInit(GPIO_Config_T* gpioConfig) +void GPIO_ConfigStructInit(GPIO_Config_T *gpioConfig) { gpioConfig->pin = GPIO_PIN_ALL; - gpioConfig->speed = GPIO_SPEED_2MHz; + gpioConfig->speed = GPIO_SPEED_20MHz; gpioConfig->mode = GPIO_MODE_IN_FLOATING; } @@ -185,7 +199,7 @@ void GPIO_StructInit(GPIO_Config_T* gpioConfig) * * @retval The input port pin value */ -uint8_t GPIO_ReadInputBit(GPIO_T* port, uint16_t pin) +uint8_t GPIO_ReadInputBit(GPIO_T *port, uint16_t pin) { uint8_t ret; @@ -202,7 +216,7 @@ uint8_t GPIO_ReadInputBit(GPIO_T* port, uint16_t pin) * * @retval GPIO input data port value */ -uint16_t GPIO_ReadInputPort(GPIO_T* port) +uint16_t GPIO_ReadInputPort(GPIO_T *port) { return ((uint16_t)port->IDATA); } @@ -218,7 +232,7 @@ uint16_t GPIO_ReadInputPort(GPIO_T* port) * * @retval The output port pin value */ -uint8_t GPIO_ReadOutputBit(GPIO_T* port, uint16_t pin) +uint8_t GPIO_ReadOutputBit(GPIO_T *port, uint16_t pin) { uint8_t ret; @@ -236,7 +250,7 @@ uint8_t GPIO_ReadOutputBit(GPIO_T* port, uint16_t pin) * * @retval output data port value */ -uint16_t GPIO_ReadOutputPort(GPIO_T* port) +uint16_t GPIO_ReadOutputPort(GPIO_T *port) { return ((uint16_t)port->ODATA); } @@ -252,7 +266,7 @@ uint16_t GPIO_ReadOutputPort(GPIO_T* port) * * @retval None */ -void GPIO_SetBits(GPIO_T* port, uint16_t pin) +void GPIO_SetBit(GPIO_T *port, uint16_t pin) { port->BSC = (uint32_t)pin; } @@ -268,7 +282,7 @@ void GPIO_SetBits(GPIO_T* port, uint16_t pin) * * @retval None */ -void GPIO_ResetBits(GPIO_T* port, uint16_t pin) +void GPIO_ResetBit(GPIO_T *port, uint16_t pin) { port->BC = (uint32_t)pin; } @@ -290,7 +304,7 @@ void GPIO_ResetBits(GPIO_T* port, uint16_t pin) * * @retval None */ -void GPIO_WriteBitValue(GPIO_T* port, uint16_t pin, uint8_t bitVal) +void GPIO_WriteBitValue(GPIO_T *port, uint16_t pin, uint8_t bitVal) { if (bitVal != BIT_RESET) { @@ -312,7 +326,7 @@ void GPIO_WriteBitValue(GPIO_T* port, uint16_t pin, uint8_t bitVal) * * @retval None */ -void GPIO_WriteOutputPort(GPIO_T* port, uint16_t portValue) +void GPIO_WriteOutputPort(GPIO_T *port, uint16_t portValue) { port->ODATA = (uint32_t)portValue; } @@ -328,20 +342,20 @@ void GPIO_WriteOutputPort(GPIO_T* port, uint16_t portValue) * * @retval None */ -void GPIO_ConfigPinLock(GPIO_T* port, uint16_t pin) +void GPIO_ConfigPinLock(GPIO_T *port, uint16_t pin) { uint32_t val = 0x00010000; val |= pin; - /* Set LCKK bit */ + /** Set LCKK bit */ port->LOCK = val ; - /* Reset LCKK bit */ + /** Reset LCKK bit */ port->LOCK = pin; - /* Set LCKK bit */ + /** Set LCKK bit */ port->LOCK = val; - /* Read LCKK bit*/ + /** Read LCKK bit*/ val = port->LOCK; - /* Read LCKK bit*/ + /** Read LCKK bit*/ val = port->LOCK; } @@ -457,7 +471,7 @@ void GPIO_ConfigPinRemap(GPIO_REMAP_T remap) regVal = AFIO->REMAP1; } - if(remap >> 8 == 0x18) + if (remap >> 8 == 0x18) { regVal &= 0xF0FFFFFF; AFIO->REMAP1 &= 0xF0FFFFFF; @@ -500,28 +514,28 @@ void GPIO_ConfigEINTLine(GPIO_PORT_SOURCE_T portSource, GPIO_PIN_SOURCE_T pinSou if (pinSource <= GPIO_PIN_SOURCE_3) { shift = pinSource << 2; - AFIO->EINTSEL1 &= (uint32_t )~(0x0f << shift); + AFIO->EINTSEL1 &= (uint32_t)~(0x0f << shift); AFIO->EINTSEL1 |= portSource << shift; } else if (pinSource <= GPIO_PIN_SOURCE_7) { shift = (pinSource - GPIO_PIN_SOURCE_4) << 2; - AFIO->EINTSEL2 &= (uint32_t )~(0x0f << shift); + AFIO->EINTSEL2 &= (uint32_t)~(0x0f << shift); AFIO->EINTSEL2 |= portSource << shift; } else if (pinSource <= GPIO_PIN_SOURCE_11) { shift = (pinSource - GPIO_PIN_SOURCE_8) << 2; - AFIO->EINTSEL3 &= (uint32_t )~(0x0f << shift); + AFIO->EINTSEL3 &= (uint32_t)~(0x0f << shift); AFIO->EINTSEL3 |= portSource << shift; } else if (pinSource <= GPIO_PIN_SOURCE_15) { shift = (pinSource - GPIO_PIN_SOURCE_12) << 2; - AFIO->EINTSEL4 &= (uint32_t )~(0x0f << shift); + AFIO->EINTSEL4 &= (uint32_t)~(0x0f << shift); AFIO->EINTSEL4 |= portSource << shift; } } diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_i2c.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_i2c.c index 319866723b..f03564c023 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_i2c.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_i2c.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_i2c.c + * @file apm32f10x_i2c.c * - * @brief This file provides all the I2C firmware functions + * @brief This file provides all the I2C firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_i2c.h" @@ -31,9 +45,9 @@ * * @retval None */ -void I2C_Reset(I2C_T* i2c) +void I2C_Reset(I2C_T *i2c) { - if(i2c == I2C1) + if (i2c == I2C1) { RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_I2C1); RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_I2C1); @@ -54,7 +68,7 @@ void I2C_Reset(I2C_T* i2c) * * @retval None */ -void I2C_Config(I2C_T* i2c, I2C_Config_T* i2cConfig) +void I2C_Config(I2C_T *i2c, I2C_Config_T *i2cConfig) { uint16_t tmpreg = 0, freqrange = 0; uint32_t PCLK1 = 8000000, PCLK2 = 0; @@ -65,15 +79,15 @@ void I2C_Config(I2C_T* i2c, I2C_Config_T* i2cConfig) /** I2C CTRL2 Configuration */ RCM_ReadPCLKFreq(&PCLK1, &PCLK2); freqrange = PCLK1 / 1000000; - i2c->CTRL2_B.CLKFCFG= freqrange; + i2c->CTRL2_B.CLKFCFG = freqrange; /** I2C CLKCTRL Configuration */ i2c->CTRL1_B.I2CEN = BIT_RESET; - if(i2cConfig->clockSpeed <= 100000) + if (i2cConfig->clockSpeed <= 100000) { result = (PCLK1 / (i2cConfig->clockSpeed << 1)); - if(result < 0x04) + if (result < 0x04) { result = 0x04; } @@ -83,7 +97,7 @@ void I2C_Config(I2C_T* i2c, I2C_Config_T* i2cConfig) /** Configure speed in fast mode */ else { - if(i2cConfig->dutyCycle == I2C_DUTYCYCLE_2) + if (i2cConfig->dutyCycle == I2C_DUTYCYCLE_2) { result = (PCLK1 / (i2cConfig->clockSpeed * 3)); } @@ -93,7 +107,7 @@ void I2C_Config(I2C_T* i2c, I2C_Config_T* i2cConfig) result |= I2C_DUTYCYCLE_16_9; } - if((result & 0x0FFF) == 0) + if ((result & 0x0FFF) == 0) { result |= 0x0001; } @@ -122,7 +136,7 @@ void I2C_Config(I2C_T* i2c, I2C_Config_T* i2cConfig) * * @retval None */ -void I2C_ConfigStructInit(I2C_Config_T* i2cConfig) +void I2C_ConfigStructInit(I2C_Config_T *i2cConfig) { i2cConfig->clockSpeed = 5000; i2cConfig->mode = I2C_MODE_I2C; @@ -139,7 +153,7 @@ void I2C_ConfigStructInit(I2C_Config_T* i2cConfig) * * @retval None */ -void I2C_Enable(I2C_T* i2c) +void I2C_Enable(I2C_T *i2c) { i2c->CTRL1_B.I2CEN = ENABLE; } @@ -151,7 +165,7 @@ void I2C_Enable(I2C_T* i2c) * * @retval None */ -void I2C_Disable(I2C_T* i2c) +void I2C_Disable(I2C_T *i2c) { i2c->CTRL1_B.I2CEN = DISABLE; } @@ -163,7 +177,7 @@ void I2C_Disable(I2C_T* i2c) * * @retval None */ -void I2C_EnableGenerateStart(I2C_T* i2c) +void I2C_EnableGenerateStart(I2C_T *i2c) { i2c->CTRL1_B.START = BIT_SET; } @@ -175,7 +189,7 @@ void I2C_EnableGenerateStart(I2C_T* i2c) * * @retval None */ -void I2C_DisableGenerateStart(I2C_T* i2c) +void I2C_DisableGenerateStart(I2C_T *i2c) { i2c->CTRL1_B.START = BIT_RESET; } @@ -187,7 +201,7 @@ void I2C_DisableGenerateStart(I2C_T* i2c) * * @retval None */ -void I2C_EnableGenerateStop(I2C_T* i2c) +void I2C_EnableGenerateStop(I2C_T *i2c) { i2c->CTRL1_B.STOP = BIT_SET; } @@ -199,7 +213,7 @@ void I2C_EnableGenerateStop(I2C_T* i2c) * * @retval None */ -void I2C_DisableGenerateStop(I2C_T* i2c) +void I2C_DisableGenerateStop(I2C_T *i2c) { i2c->CTRL1_B.STOP = BIT_RESET; } @@ -211,7 +225,7 @@ void I2C_DisableGenerateStop(I2C_T* i2c) * * @retval None */ -void I2C_EnableAcknowledge(I2C_T* i2c) +void I2C_EnableAcknowledge(I2C_T *i2c) { i2c->CTRL1_B.ACKEN = ENABLE; } @@ -223,7 +237,7 @@ void I2C_EnableAcknowledge(I2C_T* i2c) * * @retval None */ -void I2C_DisableAcknowledge(I2C_T* i2c) +void I2C_DisableAcknowledge(I2C_T *i2c) { i2c->CTRL1_B.ACKEN = DISABLE; } @@ -237,7 +251,7 @@ void I2C_DisableAcknowledge(I2C_T* i2c) * * @retval None */ -void I2C_ConfigOwnAddress2(I2C_T* i2c, uint8_t address) +void I2C_ConfigOwnAddress2(I2C_T *i2c, uint8_t address) { i2c->SADDR2_B.ADDR2 = address; } @@ -249,7 +263,7 @@ void I2C_ConfigOwnAddress2(I2C_T* i2c, uint8_t address) * * @retval None */ -void I2C_EnableDualAddress(I2C_T* i2c) +void I2C_EnableDualAddress(I2C_T *i2c) { i2c->SADDR2_B.ADDRNUM = ENABLE; } @@ -261,7 +275,7 @@ void I2C_EnableDualAddress(I2C_T* i2c) * * @retval None */ -void I2C_DisableDualAddress(I2C_T* i2c) +void I2C_DisableDualAddress(I2C_T *i2c) { i2c->SADDR2_B.ADDRNUM = DISABLE; } @@ -273,7 +287,7 @@ void I2C_DisableDualAddress(I2C_T* i2c) * * @retval None */ -void I2C_EnableGeneralCall(I2C_T* i2c) +void I2C_EnableGeneralCall(I2C_T *i2c) { i2c->CTRL1_B.SRBEN = ENABLE; } @@ -285,7 +299,7 @@ void I2C_EnableGeneralCall(I2C_T* i2c) * * @retval None */ -void I2C_DisableGeneralCall(I2C_T* i2c) +void I2C_DisableGeneralCall(I2C_T *i2c) { i2c->CTRL1_B.SRBEN = DISABLE; } @@ -299,7 +313,7 @@ void I2C_DisableGeneralCall(I2C_T* i2c) * * @retval None */ -void I2C_TxData(I2C_T* i2c, uint8_t data) +void I2C_TxData(I2C_T *i2c, uint8_t data) { i2c->DATA_B.DATA = data; } @@ -311,7 +325,7 @@ void I2C_TxData(I2C_T* i2c, uint8_t data) * * @retval received data */ -uint8_t I2C_RxData(I2C_T* i2c) +uint8_t I2C_RxData(I2C_T *i2c) { return i2c->DATA_B.DATA; } @@ -329,9 +343,9 @@ uint8_t I2C_RxData(I2C_T* i2c) * @arg I2C_DIRECTION_RX: Receiver mode * @retval None */ -void I2C_Tx7BitAddress(I2C_T* i2c, uint8_t address, I2C_DIRECTION_T direction) +void I2C_Tx7BitAddress(I2C_T *i2c, uint8_t address, I2C_DIRECTION_T direction) { - if(direction != I2C_DIRECTION_TX) + if (direction != I2C_DIRECTION_TX) { i2c->DATA_B.DATA = address | 0x0001; } @@ -361,7 +375,7 @@ void I2C_Tx7BitAddress(I2C_T* i2c, uint8_t address, I2C_DIRECTION_T direction) * * @retval The value of the read register */ -uint16_t I2C_ReadRegister(I2C_T* i2c, I2C_REGISTER_T i2cRegister) +uint16_t I2C_ReadRegister(I2C_T *i2c, I2C_REGISTER_T i2cRegister) { switch (i2cRegister) { @@ -397,7 +411,7 @@ uint16_t I2C_ReadRegister(I2C_T* i2c, I2C_REGISTER_T i2cRegister) * * @retval None */ -void I2C_EnableSoftwareReset(I2C_T* i2c) +void I2C_EnableSoftwareReset(I2C_T *i2c) { i2c->CTRL1_B.SWRST = ENABLE; } @@ -409,7 +423,7 @@ void I2C_EnableSoftwareReset(I2C_T* i2c) * * @retval None */ -void I2C_DisableSoftwareReset(I2C_T* i2c) +void I2C_DisableSoftwareReset(I2C_T *i2c) { i2c->CTRL1_B.SWRST = DISABLE; } @@ -423,9 +437,9 @@ void I2C_DisableSoftwareReset(I2C_T* i2c) * * @retval None */ -void I2C_ConfigNACKPosition(I2C_T* i2c, I2C_NACK_POSITION_T NACKPosition) +void I2C_ConfigNACKPosition(I2C_T *i2c, I2C_NACK_POSITION_T NACKPosition) { - if(NACKPosition == I2C_NACK_POSITION_NEXT) + if (NACKPosition == I2C_NACK_POSITION_NEXT) { i2c->CTRL1_B.ACKPOS = BIT_SET; } @@ -446,9 +460,9 @@ void I2C_ConfigNACKPosition(I2C_T* i2c, I2C_NACK_POSITION_T NACKPosition) * @arg I2C_SMBUSALER_HIGH: SMBus Alert pin high * @retval None */ -void I2C_ConfigSMBusAlert(I2C_T* i2c, I2C_SMBUSALER_T SMBusState) +void I2C_ConfigSMBusAlert(I2C_T *i2c, I2C_SMBUSALER_T SMBusState) { - if(SMBusState == I2C_SMBUSALER_LOW) + if (SMBusState == I2C_SMBUSALER_LOW) { i2c->CTRL1_B.ALERTEN = BIT_SET; } @@ -465,7 +479,7 @@ void I2C_ConfigSMBusAlert(I2C_T* i2c, I2C_SMBUSALER_T SMBusState) * * @retval None */ -void I2C_EnablePECTransmit(I2C_T* i2c) +void I2C_EnablePECTransmit(I2C_T *i2c) { i2c->CTRL1_B.PEC = BIT_SET; } @@ -477,7 +491,7 @@ void I2C_EnablePECTransmit(I2C_T* i2c) * * @retval None */ -void I2C_DisablePECTransmit(I2C_T* i2c) +void I2C_DisablePECTransmit(I2C_T *i2c) { i2c->CTRL1_B.PEC = BIT_RESET; } @@ -493,9 +507,9 @@ void I2C_DisablePECTransmit(I2C_T* i2c) * @arg I2C_PEC_POSITION_CURRENT: indicates that current byte is PEC * @retval None */ -void I2C_ConfigPECPosition(I2C_T* i2c, I2C_PEC_POSITION_T PECPosition) +void I2C_ConfigPECPosition(I2C_T *i2c, I2C_PEC_POSITION_T PECPosition) { - if(PECPosition == I2C_PEC_POSITION_NEXT) + if (PECPosition == I2C_PEC_POSITION_NEXT) { i2c->CTRL1_B.ACKPOS = BIT_SET; } @@ -512,7 +526,7 @@ void I2C_ConfigPECPosition(I2C_T* i2c, I2C_PEC_POSITION_T PECPosition) * * @retval None */ -void I2C_EnablePEC(I2C_T* i2c) +void I2C_EnablePEC(I2C_T *i2c) { i2c->CTRL1_B.PECEN = BIT_SET; } @@ -524,7 +538,7 @@ void I2C_EnablePEC(I2C_T* i2c) * * @retval None */ -void I2C_DisablePEC(I2C_T* i2c) +void I2C_DisablePEC(I2C_T *i2c) { i2c->CTRL1_B.PECEN = BIT_RESET; } @@ -536,7 +550,7 @@ void I2C_DisablePEC(I2C_T* i2c) * * @retval value of PEC */ -uint8_t I2C_ReadPEC(I2C_T* i2c) +uint8_t I2C_ReadPEC(I2C_T *i2c) { return i2c->STS2_B.PECVALUE; } @@ -548,7 +562,7 @@ uint8_t I2C_ReadPEC(I2C_T* i2c) * * @retval None */ -void I2C_EnableARP(I2C_T* i2c) +void I2C_EnableARP(I2C_T *i2c) { i2c->CTRL1_B.ARPEN = BIT_SET; } @@ -560,7 +574,7 @@ void I2C_EnableARP(I2C_T* i2c) * * @retval None */ -void I2C_DisableARP(I2C_T* i2c) +void I2C_DisableARP(I2C_T *i2c) { i2c->CTRL1_B.ARPEN = BIT_RESET; } @@ -572,7 +586,7 @@ void I2C_DisableARP(I2C_T* i2c) * * @retval None */ -void I2C_EnableStretchClock(I2C_T* i2c) +void I2C_EnableStretchClock(I2C_T *i2c) { i2c->CTRL1_B.CLKSTRETCHD = BIT_RESET; } @@ -584,7 +598,7 @@ void I2C_EnableStretchClock(I2C_T* i2c) * * @retval None */ -void I2C_DisableStretchClock(I2C_T* i2c) +void I2C_DisableStretchClock(I2C_T *i2c) { i2c->CTRL1_B.CLKSTRETCHD = BIT_SET; } @@ -600,9 +614,9 @@ void I2C_DisableStretchClock(I2C_T* i2c) * @arg I2C_DUTYCYCLE_2: I2C fast mode Tlow/Thigh = 2 * @retval None */ -void I2C_ConfigFastModeDutyCycle(I2C_T* i2c, I2C_DUTYCYCLE_T dutyCycle) +void I2C_ConfigFastModeDutyCycle(I2C_T *i2c, I2C_DUTYCYCLE_T dutyCycle) { - if(dutyCycle == I2C_DUTYCYCLE_16_9) + if (dutyCycle == I2C_DUTYCYCLE_16_9) { i2c->CLKCTRL_B.FDUTYCFG = BIT_SET; } @@ -619,7 +633,7 @@ void I2C_ConfigFastModeDutyCycle(I2C_T* i2c, I2C_DUTYCYCLE_T dutyCycle) * * @retval None */ -void I2C_EnableDMA(I2C_T* i2c) +void I2C_EnableDMA(I2C_T *i2c) { i2c->CTRL2_B.DMAEN = ENABLE; } @@ -631,7 +645,7 @@ void I2C_EnableDMA(I2C_T* i2c) * * @retval None */ -void I2C_DisableDMA(I2C_T* i2c) +void I2C_DisableDMA(I2C_T *i2c) { i2c->CTRL2_B.DMAEN = DISABLE; } @@ -643,7 +657,7 @@ void I2C_DisableDMA(I2C_T* i2c) * * @retval None */ -void I2C_EnableDMALastTransfer(I2C_T* i2c) +void I2C_EnableDMALastTransfer(I2C_T *i2c) { i2c->CTRL2_B.LTCFG = BIT_SET; } @@ -655,7 +669,7 @@ void I2C_EnableDMALastTransfer(I2C_T* i2c) * * @retval None */ -void I2C_DisableDMALastTransfer(I2C_T* i2c) +void I2C_DisableDMALastTransfer(I2C_T *i2c) { i2c->CTRL2_B.LTCFG = BIT_RESET; } @@ -673,7 +687,7 @@ void I2C_DisableDMALastTransfer(I2C_T* i2c) * * @retval None */ -void I2C_EnableInterrupt(I2C_T* i2c, uint16_t interrupt) +void I2C_EnableInterrupt(I2C_T *i2c, uint16_t interrupt) { i2c->CTRL2 |= interrupt; } @@ -691,7 +705,7 @@ void I2C_EnableInterrupt(I2C_T* i2c, uint16_t interrupt) * * @retval None */ -void I2C_DisableInterrupt(I2C_T* i2c, uint16_t interrupt) +void I2C_DisableInterrupt(I2C_T *i2c, uint16_t interrupt) { i2c->CTRL2 &= ~interrupt; } @@ -722,7 +736,7 @@ void I2C_DisableInterrupt(I2C_T* i2c, uint16_t interrupt) * * @retval Status: SUCCESS or ERROR */ -uint8_t I2C_ReadEventStatus(I2C_T* i2c, I2C_EVENT_T i2cEvent) +uint8_t I2C_ReadEventStatus(I2C_T *i2c, I2C_EVENT_T i2cEvent) { uint32_t lastevent = 0; uint32_t flag1 = 0, flag2 = 0; @@ -733,7 +747,7 @@ uint8_t I2C_ReadEventStatus(I2C_T* i2c, I2C_EVENT_T i2cEvent) lastevent = (flag1 | flag2) & 0x00FFFFFF; - if((lastevent & i2cEvent) == i2cEvent) + if ((lastevent & i2cEvent) == i2cEvent) { return SUCCESS; } @@ -747,7 +761,7 @@ uint8_t I2C_ReadEventStatus(I2C_T* i2c, I2C_EVENT_T i2cEvent) * * @retval The last event */ -uint32_t I2C_ReadLastEvent(I2C_T* i2c) +uint32_t I2C_ReadLastEvent(I2C_T *i2c) { uint32_t lastevent = 0; uint32_t flag1 = 0, flag2 = 0; @@ -792,7 +806,7 @@ uint32_t I2C_ReadLastEvent(I2C_T* i2c) * * @retval Status: flag SET or RESET */ -uint8_t I2C_ReadStatusFlag(I2C_T* i2c, I2C_FLAG_T flag) +uint8_t I2C_ReadStatusFlag(I2C_T *i2c, I2C_FLAG_T flag) { uint8_t status = 0; @@ -900,7 +914,7 @@ uint8_t I2C_ReadStatusFlag(I2C_T* i2c, I2C_FLAG_T flag) * a read operation to I2C_STS1 register (I2C_ReadStatusFlag()) * followed by a write operation to I2C_DATA register (I2C_TxData()). */ -void I2C_ClearStatusFlag(I2C_T* i2c, I2C_FLAG_T flag) +void I2C_ClearStatusFlag(I2C_T *i2c, I2C_FLAG_T flag) { switch (flag) { @@ -954,13 +968,13 @@ void I2C_ClearStatusFlag(I2C_T* i2c, I2C_FLAG_T flag) * * @retval Status: flag SET or RESET */ -uint8_t I2C_ReadIntFlag(I2C_T* i2c, I2C_INT_FLAG_T flag) +uint8_t I2C_ReadIntFlag(I2C_T *i2c, I2C_INT_FLAG_T flag) { uint32_t enablestatus = 0; enablestatus = ((flag & 0x07000000) >> 16) & (i2c->CTRL2); flag &= 0x00FFFFFF; - if(((i2c->STS1 & flag) != RESET) && enablestatus) + if (((i2c->STS1 & flag) != RESET) && enablestatus) { return SET; } @@ -973,7 +987,7 @@ uint8_t I2C_ReadIntFlag(I2C_T* i2c, I2C_INT_FLAG_T flag) * @param i2c: I2C selet 1 or 2 * * @param flag: specifies the I2C flag - * The parameter can be one of the following values: + * The parameter can be any combination of the following values: * @arg I2C_INT_FLAG_SMBALT: SMBus Alert flag * @arg I2C_INT_FLAG_TTE: Timeout or Tlow error flag * @arg I2C_INT_FLAG_PECE: PEC error in reception flag @@ -1000,12 +1014,9 @@ uint8_t I2C_ReadIntFlag(I2C_T* i2c, I2C_INT_FLAG_T flag) * a read operation to I2C_STS1 register (I2C_ReadIntFlag()) * followed by a write operation to I2C_DATA register (I2C_TxData()). */ -void I2C_ClearIntFlag(I2C_T* i2c, I2C_INT_FLAG_T flag) +void I2C_ClearIntFlag(I2C_T *i2c, uint32_t flag) { - uint32_t flagpos = 0; - - flagpos = flag & 0x00FFFFFF; - i2c->STS1 = ~flagpos; + i2c->STS1 = (uint16_t)~(flag & 0x00FFFFFF); } /**@} end of group I2C_Fuctions*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_iwdt.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_iwdt.c index a4a743749c..d3d64748a0 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_iwdt.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_iwdt.c @@ -3,10 +3,24 @@ * * @brief This file provides all the IWDT firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_iwdt.h" @@ -113,13 +127,12 @@ void IWDT_ConfigDivider(uint8_t div) * * @retval status of IWDT_FLAG (SET or RESET) * - * @note */ uint8_t IWDT_ReadStatusFlag(uint16_t flag) { uint8_t bitStatus = RESET; - if((IWDT->STS & flag) != (uint32_t)RESET) + if ((IWDT->STS & flag) != (uint32_t)RESET) { bitStatus = SET; } @@ -131,5 +144,5 @@ uint8_t IWDT_ReadStatusFlag(uint16_t flag) } /**@} end of group IWDT_Fuctions*/ -/**@} end of group IWDT_Driver */ +/**@} end of group IWDT_Driver*/ /**@} end of group Peripherals_Library*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_misc.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_misc.c index 92b925b937..e642f786bd 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_misc.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_misc.c @@ -1,13 +1,27 @@ /*! - * @file apm32f10x_misc.c + * @file apm32f10x_misc.c * - * @brief This file provides all the miscellaneous firmware functions. + * @brief This file provides all the miscellaneous firmware functions. * Include NVIC,SystemTick and Power management. * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_misc.h" @@ -26,7 +40,7 @@ #define AIRCR_VECTKEY_MASK ((uint32_t)0x05FA0000) -/**@} end of group I2C_Macros*/ +/**@} end of group MISC_Macros*/ /** @addtogroup MISC_Fuctions Fuctions @@ -48,7 +62,7 @@ */ void NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_T priorityGroup) { - SCB->AIRCR = AIRCR_VECTKEY_MASK | priorityGroup; + SCB->AIRCR = AIRCR_VECTKEY_MASK | priorityGroup; } /*! @@ -65,55 +79,55 @@ void NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_T priorityGroup) */ void NVIC_EnableIRQRequest(IRQn_Type irq, uint8_t preemptionPriority, uint8_t subPriority) { - uint32_t tempPriority, tempPrePri, tempSubPri; - uint32_t priorityGrp; + uint32_t tempPriority, tempPrePri, tempSubPri; + uint32_t priorityGrp; - /** Get priority group */ - priorityGrp = (SCB->AIRCR) & (uint32_t)0x700U; + /** Get priority group */ + priorityGrp = (SCB->AIRCR) & (uint32_t)0x700U; - /** get pre-emption priority and subpriority */ - switch(priorityGrp) - { - case NVIC_PRIORITY_GROUP_0: - tempPrePri = 0; - tempSubPri = 4; - break; + /** get pre-emption priority and subpriority */ + switch (priorityGrp) + { + case NVIC_PRIORITY_GROUP_0: + tempPrePri = 0; + tempSubPri = 4; + break; - case NVIC_PRIORITY_GROUP_1: - tempPrePri = 1; - tempSubPri = 3; - break; + case NVIC_PRIORITY_GROUP_1: + tempPrePri = 1; + tempSubPri = 3; + break; - case NVIC_PRIORITY_GROUP_2: - tempPrePri = 2; - tempSubPri = 2; - break; + case NVIC_PRIORITY_GROUP_2: + tempPrePri = 2; + tempSubPri = 2; + break; - case NVIC_PRIORITY_GROUP_3: - tempPrePri = 3; - tempSubPri = 1; - break; + case NVIC_PRIORITY_GROUP_3: + tempPrePri = 3; + tempSubPri = 1; + break; - case NVIC_PRIORITY_GROUP_4: - tempPrePri = 4; - tempSubPri = 0; - break; + case NVIC_PRIORITY_GROUP_4: + tempPrePri = 4; + tempSubPri = 0; + break; - default: - NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_0); - tempPrePri = 0; - tempSubPri = 4; - break; - } + default: + NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_0); + tempPrePri = 0; + tempSubPri = 4; + break; + } - tempPrePri = 4 - tempPrePri; - tempSubPri = 4 - tempSubPri; - tempPriority = preemptionPriority << tempPrePri; - tempPriority |= subPriority & (0x0f >> tempSubPri); - tempPriority <<= 4; - NVIC->IP[irq] = (uint8_t)tempPriority; + tempPrePri = 4 - tempPrePri; + tempSubPri = 4 - tempSubPri; + tempPriority = preemptionPriority << tempPrePri; + tempPriority |= subPriority & (0x0f >> tempSubPri); + tempPriority <<= 4; + NVIC->IP[irq] = (uint8_t)tempPriority; - /* enable the selected IRQ */ + /** enable the selected IRQ */ NVIC->ISER[irq >> 0x05U] = (uint32_t)0x01U << (irq & (uint8_t)0x1FU); } @@ -126,7 +140,7 @@ void NVIC_EnableIRQRequest(IRQn_Type irq, uint8_t preemptionPriority, uint8_t su */ void NVIC_DisableIRQRequest(IRQn_Type irq) { - /* disable the selected IRQ.*/ + /** disable the selected IRQ.*/ NVIC->ICER[irq >> 0x05U] = (uint32_t)0x01U << (irq & (uint8_t)0x1FU); } @@ -160,10 +174,9 @@ void NVIC_ConfigVectorTable(NVIC_VECT_TAB_T vectTab, uint32_t offset) */ void NVIC_SetSystemLowPower(NVIC_LOWPOWER_T lowPowerMode) { - SCB->SCR |= lowPowerMode; + SCB->SCR |= lowPowerMode; } - /*! * @brief reset the state of the low power mode * @@ -177,7 +190,7 @@ void NVIC_SetSystemLowPower(NVIC_LOWPOWER_T lowPowerMode) */ void NVIC_ResetystemLowPower(NVIC_LOWPOWER_T lowPowerMode) { - SCB->SCR &= (uint32_t)(~(uint32_t)lowPowerMode); + SCB->SCR &= (uint32_t)(~(uint32_t)lowPowerMode); } /*! @@ -192,16 +205,16 @@ void NVIC_ResetystemLowPower(NVIC_LOWPOWER_T lowPowerMode) */ void SysTick_ConfigCLKSource(SYSTICK_CLK_SOURCE_T clkSource) { - if (clkSource == SYSTICK_CLK_SOURCE_HCLK) - { - SysTick->CTRL |= (uint32_t)BIT2; - } - else - { - SysTick->CTRL &= (uint32_t)(~BIT2); - } + if (clkSource == SYSTICK_CLK_SOURCE_HCLK) + { + SysTick->CTRL |= (uint32_t)BIT2; + } + else + { + SysTick->CTRL &= (uint32_t)(~BIT2); + } } /**@} end of group MISC_Fuctions*/ -/**@} end of group MISC_Driver */ +/**@} end of group MISC_Driver*/ /**@} end of group Peripherals_Library*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_pmu.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_pmu.c index 969b1a98d7..b32726e0df 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_pmu.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_pmu.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_pmu.c + * @file apm32f10x_pmu.c * - * @brief This file provides all the PMU firmware functions. + * @brief This file provides all the PMU firmware functions. * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_pmu.h" @@ -33,8 +47,8 @@ */ void PMU_Reset(void) { - RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU); - RCM_DisableAPB1PeriphClock(RCM_APB1_PERIPH_PMU); + RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_PMU); + RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_PMU); } /*! @@ -88,7 +102,7 @@ void PMU_DisablePVD(void) /*! * @brief Configure a voltage threshold detected by a power supply voltage detector (PVD). * - * @param level : specifies the PVD detection level + * @param level:specifies the PVD detection level * This parameter can be one of the following values: * @arg PMU_PVD_LEVEL_2V2 : Config PVD detection level to 2.2V * @arg PMU_PVD_LEVEL_2V3 : Config PVD detection level to 2.3V @@ -104,9 +118,9 @@ void PMU_DisablePVD(void) void PMU_ConfigPVDLevel(PMU_PVD_LEVEL_T level) { - /* Clear PLS[7:5] bits */ + /** Clear PLS[7:5] bits */ PMU->CTRL_B.PLSEL = 0x0000; - /* Store the new value */ + /** Store the new value */ PMU->CTRL_B.PLSEL = level; } @@ -151,17 +165,20 @@ void PMU_DisableWakeUpPin(void) */ void PMU_EnterSTOPMode(PMU_REGULATOR_T regulator, PMU_STOP_ENTRY_T entry) { - /** Clear PLS and LPSM bits */ + /** Clear PDDSCFG and LPDSCFG bits */ PMU->CTRL_B.PDDSCFG = 0x00; PMU->CTRL_B.LPDSCFG = 0x00; - /** Set LPSM bit according to PWR_Regulator value */ - PMU->CTRL_B.PDDSCFG = regulator; + /** Set LPDSCFG bit according to regulator value */ + PMU->CTRL_B.LPDSCFG = regulator; + /** Set Cortex System Control Register */ + SCB->SCR |= (uint32_t)0x04; /** Select STOP mode entry*/ - if(entry == PMU_STOP_ENTRY_WFI) + if (entry == PMU_STOP_ENTRY_WFI) { /** Request Wait For Interrupt */ __WFI(); - } else + } + else { /** Request Wait For Event */ __WFE(); @@ -169,7 +186,6 @@ void PMU_EnterSTOPMode(PMU_REGULATOR_T regulator, PMU_STOP_ENTRY_T entry) /** Reset SLEEPDEEP bit of Cortex System Control Register */ SCB->SCR &= (uint32_t)~((uint32_t)0x04); - } /*! @@ -181,16 +197,16 @@ void PMU_EnterSTOPMode(PMU_REGULATOR_T regulator, PMU_STOP_ENTRY_T entry) */ void PMU_EnterSTANDBYMode(void) { - /* Clear Wake-up flag */ + /** Clear Wake-up flag */ PMU->CTRL_B.WUFLGCLR = BIT_SET; - /* Select STANDBY mode */ + /** Select STANDBY mode */ PMU->CTRL_B.PDDSCFG = BIT_SET; - /* Set SLEEPDEEP bit of Cortex System Control Register */ - SCB->SCR |= (uint8_t )0x04; + /** Set Cortex System Control Register */ + SCB->SCR |= (uint32_t)0x04; #if defined ( __CC_ARM ) __force_stores(); #endif - /* Request Wait For Interrupt */ + /** Request Wait For Interrupt */ __WFI(); } @@ -198,7 +214,7 @@ void PMU_EnterSTANDBYMode(void) /*! * @brief Read the specified PWR flag is set or not. * - * @param flag : Reads the status of specifies the flag. + * @param flag:Reads the status of specifies the flag. * This parameter can be one of the following values: * @arg PMU_FLAG_WUE : Wake Up flag * @arg PMU_FLAG_SB : StandBy flag @@ -210,13 +226,15 @@ uint8_t PMU_ReadStatusFlag(PMU_FLAG_T flag) { uint8_t BitStatus = BIT_RESET; - if(flag == PMU_FLAG_WUE) + if (flag == PMU_FLAG_WUE) { BitStatus = PMU->CSTS_B.WUEFLG; - } else if(flag == PMU_FLAG_SB) + } + else if (flag == PMU_FLAG_SB) { BitStatus = PMU->CSTS_B.SBFLG; - } else if(flag == PMU_FLAG_PVDO) + } + else if (flag == PMU_FLAG_PVDO) { BitStatus = PMU->CSTS_B.PVDOFLG; } @@ -226,7 +244,7 @@ uint8_t PMU_ReadStatusFlag(PMU_FLAG_T flag) /*! * @brief Clears the PWR's pending flags. * - * @param flag : Clears the status of specifies the flag. + * @param flag:Clears the status of specifies the flag. * This parameter can be one of the following values: * @arg PMU_FLAG_WUE : Wake Up flag * @arg PMU_FLAG_SB : StandBy flag @@ -235,15 +253,16 @@ uint8_t PMU_ReadStatusFlag(PMU_FLAG_T flag) */ void PMU_ClearStatusFlag(PMU_FLAG_T flag) { - if(flag == PMU_FLAG_WUE) + if (flag == PMU_FLAG_WUE) { PMU->CTRL_B.WUFLGCLR = BIT_SET; - } else if(flag == PMU_FLAG_SB) + } + else if (flag == PMU_FLAG_SB) { PMU->CTRL_B.SBFLGCLR = BIT_SET; } } /**@} end of group PMU_Fuctions*/ -/**@} end of group PMU_Driver */ +/**@} end of group PMU_Driver*/ /**@} end of group Peripherals_Library*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_qspi.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_qspi.c index 5706b95e1a..2e3b694aa0 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_qspi.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_qspi.c @@ -3,12 +3,27 @@ * * @brief This file contains all the functions for the QSPI peripheral * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ +#if defined (APM32F10X_MD) || defined (APM32F10X_LD) #include "apm32f10x_qspi.h" /** @addtogroup Peripherals_Library Standard Peripheral Library @@ -58,7 +73,7 @@ void QSPI_Reset(void) * * @retval None */ -void QSPI_Config(QSPI_Config_T * qspiConfig) +void QSPI_Config(QSPI_Config_T *qspiConfig) { QSPI->CTRL1_B.CPHA = qspiConfig->clockPhase; QSPI->CTRL1_B.CPOL = qspiConfig->clockPolarity; @@ -67,7 +82,6 @@ void QSPI_Config(QSPI_Config_T * qspiConfig) QSPI->CTRL1_B.SSTEN = qspiConfig->selectSlaveToggle; QSPI->BR = qspiConfig->clockDiv; - } /*! @@ -571,24 +585,25 @@ void QSPI_ClearIntFlag(uint32_t flag) { volatile uint32_t dummy = 0; - if(flag & QSPI_INT_FLAG_TFO) + if (flag & QSPI_INT_FLAG_TFO) { dummy = QSPI->TFOIC; } - else if(flag & QSPI_INT_FLAG_RFO) + else if (flag & QSPI_INT_FLAG_RFO) { dummy = QSPI->RFOIC; } - else if(flag & QSPI_INT_FLAG_RFU) + else if (flag & QSPI_INT_FLAG_RFU) { dummy = QSPI->RFUIC; } - else if(flag & QSPI_INT_FLAG_MST) + else if (flag & QSPI_INT_FLAG_MST) { dummy = QSPI->MIC; } } +#endif //defined APM32F10X_MD/LD /**@} end of group QSPI_Fuctions*/ -/**@} end of group QSPI_Driver */ +/**@} end of group QSPI_Driver*/ /**@} end of group Peripherals_Library*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_rcm.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_rcm.c index a1d6205224..bf518d02ea 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_rcm.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_rcm.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_rcm.c + * @file apm32f10x_rcm.c * - * @brief This file provides all the RCM firmware functions + * @brief This file provides all the RCM firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_rcm.h" @@ -102,14 +116,14 @@ uint8_t RCM_WaitHSEReady(void) } /*! - * @brief Set HSI trimming value + * @brief Config HSI trimming value * * @param HSITrim: HSI trimming value * This parameter must be a number between 0 and 0x1F. * * @retval None */ -void RCM_SetHSITrim(uint8_t HSITrim) +void RCM_ConfigHSITrim(uint8_t HSITrim) { RCM->CTRL_B.HSITRIM = HSITrim; } @@ -145,10 +159,12 @@ void RCM_DisableHSI(void) * @brief Configures the External Low Speed oscillator (LSE) * * @param state : Specifies the new state of the LSE + * This parameter can be one of the following values: + * @arg RCM_LSE_CLOSE : Close the LSE + * @arg RCM_LSE_OPEN : Open the LSE + * @arg RCM_LSE_BYPASS : LSE bypass * * @retval None - * - * @note */ void RCM_ConfigLSE(RCM_LSE_T state) { @@ -172,8 +188,6 @@ void RCM_ConfigLSE(RCM_LSE_T state) * @param None * * @retval None - * - * @note */ void RCM_EnableLSI(void) { @@ -186,8 +200,6 @@ void RCM_EnableLSI(void) * @param None * * @retval None - * - * @note */ void RCM_DisableLSI(void) { @@ -273,14 +285,12 @@ void RCM_DisableCSS(void) * @param mcoClock: specifies the clock source to output * This parameter can be one of the following values: * @arg RCM_MCOCLK_NO_CLOCK : No clock selected. - * @arg RCM_MCOCLK_SYSCLK : HSI14 oscillator clock selected. - * @arg RCM_MCOCLK_HSI : LSI oscillator clock selected. - * @arg RCM_MCOCLK_HSE : LSE oscillator clock selected. - * @arg RCM_MCOCLK_PLLCLK_DIV_2 : System clock selected. + * @arg RCM_MCOCLK_SYSCLK : System clock selected. + * @arg RCM_MCOCLK_HSI : HSI oscillator clock selected. + * @arg RCM_MCOCLK_HSE : HSE oscillator clock selected. + * @arg RCM_MCOCLK_PLLCLK_DIV_2 : PLL clock divided by 2 selected. * * @retval None - * - * @note */ void RCM_ConfigMCO(RCM_MCOCLK_T mcoClock) { @@ -300,7 +310,7 @@ void RCM_ConfigMCO(RCM_MCOCLK_T mcoClock) */ void RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_T sysClkSelect) { - RCM->CFG_B.SCLKSW = sysClkSelect; + RCM->CFG_B.SCLKSEL = sysClkSelect; } /*! @@ -312,11 +322,7 @@ void RCM_ConfigSYSCLK(RCM_SYSCLK_SEL_T sysClkSelect) */ RCM_SYSCLK_SEL_T RCM_ReadSYSCLKSource(void) { - RCM_SYSCLK_SEL_T sysClock; - - sysClock = (RCM_SYSCLK_SEL_T)RCM->CFG_B.SCLKSWSTS; - - return sysClock; + return (RCM_SYSCLK_SEL_T)RCM->CFG_B.SCLKSELSTS; } /*! @@ -335,8 +341,6 @@ RCM_SYSCLK_SEL_T RCM_ReadSYSCLKSource(void) * @arg RCM_AHB_DIV_512 : HCLK = SYSCLK / 512 * * @retval None - * - * @note */ void RCM_ConfigAHB(RCM_AHB_DIV_T AHBDiv) { @@ -482,47 +486,47 @@ uint32_t RCM_ReadSYSCLKFreq(void) uint32_t sysClock, pllMull, pllSource; /** get sys clock */ - sysClock = RCM->CFG_B.SCLKSW; + sysClock = RCM->CFG_B.SCLKSEL; switch (sysClock) { - /** sys clock is HSI */ - case RCM_SYSCLK_SEL_HSI: - sysClock = HSI_VALUE; - break; + /** sys clock is HSI */ + case RCM_SYSCLK_SEL_HSI: + sysClock = HSI_VALUE; + break; - /** sys clock is HSE */ - case RCM_SYSCLK_SEL_HSE: - sysClock = HSE_VALUE; - break; + /** sys clock is HSE */ + case RCM_SYSCLK_SEL_HSE: + sysClock = HSE_VALUE; + break; - /** sys clock is PLL */ - case RCM_SYSCLK_SEL_PLL: - pllMull = RCM->CFG_B.PLLMULCFG + 2; - pllSource = RCM->CFG_B.PLLSRCSEL; + /** sys clock is PLL */ + case RCM_SYSCLK_SEL_PLL: + pllMull = RCM->CFG_B.PLLMULCFG + 2; + pllSource = RCM->CFG_B.PLLSRCSEL; - /** PLL entry clock source is HSE */ - if (pllSource == BIT_SET) + /** PLL entry clock source is HSE */ + if (pllSource == BIT_SET) + { + sysClock = HSE_VALUE * pllMull; + + /** HSE clock divided by 2 */ + if (pllSource == RCM->CFG_B.PLLHSEPSC) { - sysClock = HSE_VALUE * pllMull; - - /** HSE clock divided by 2 */ - if (pllSource == RCM->CFG_B.PLLHSEPSC) - { - sysClock >>= 1; - } - } - /** PLL entry clock source is HSI/2 */ - else - { - sysClock = (HSI_VALUE >> 1) * pllMull; + sysClock >>= 1; } + } + /** PLL entry clock source is HSI/2 */ + else + { + sysClock = (HSI_VALUE >> 1) * pllMull; + } - break; + break; - default: - sysClock = HSI_VALUE; - break; + default: + sysClock = HSI_VALUE; + break; } return sysClock; @@ -557,7 +561,7 @@ uint32_t RCM_ReadHCLKFreq(void) * * @retval None */ -void RCM_ReadPCLKFreq(uint32_t* PCLK1, uint32_t* PCLK2) +void RCM_ReadPCLKFreq(uint32_t *PCLK1, uint32_t *PCLK2) { uint32_t hclk, divider; uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; @@ -897,7 +901,6 @@ void RCM_DisableAPB1PeriphReset(uint32_t APB1Periph) * * @retval None * - * @note */ void RCM_EnableBackupReset(void) { @@ -948,7 +951,7 @@ void RCM_EnableInterrupt(uint32_t interrupt) * @arg RCM_INT_HSIRDY : HSI ready interrupt * @arg RCM_INT_HSERDY : HSE ready interrupt * @arg RCM_INT_PLLRDY : PLL ready interrupt -RCM_DisableInterrupt(RCM_INT_LSIRDY) * + * * @retval None */ void RCM_DisableInterrupt(uint32_t interrupt) @@ -989,20 +992,20 @@ uint8_t RCM_ReadStatusFlag(RCM_FLAG_T flag) switch (reg) { - case 0: - reg = RCM->CTRL; - break; + case 0: + reg = RCM->CTRL; + break; - case 1: - reg = RCM->BDCTRL; - break; + case 1: + reg = RCM->BDCTRL; + break; - case 2: - reg = RCM->CSTS; - break; + case 2: + reg = RCM->CSTS; + break; - default: - break; + default: + break; } if (reg & bit) @@ -1032,7 +1035,7 @@ void RCM_ClearStatusFlag(void) /*! * @brief Reads the specified RCM interrupt Flag * - * @param flag : Reads specifies RCM interrupt flag. + * @param flag :Reads specifies RCM interrupt flag. * This parameter can be one of the following values: * @arg RCM_INT_LSIRDY : LSI ready interrupt flag * @arg RCM_INT_LSERDY : LSE ready interrupt flag @@ -1045,11 +1048,7 @@ void RCM_ClearStatusFlag(void) */ uint8_t RCM_ReadIntFlag(RCM_INT_T flag) { - uint8_t ret; - - ret = (RCM->INT& flag) ? SET : RESET; - - return ret; + return (RCM->INT &flag) ? SET : RESET; } /*! diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_rtc.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_rtc.c index 71db57ceb7..14489aadc0 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_rtc.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_rtc.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_rtc.c + * @file apm32f10x_rtc.c * - * @brief This file provides all the RTC firmware functions + * @brief This file provides all the RTC firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_rtc.h" @@ -55,7 +69,10 @@ void RTC_DisableConfigMode(void) */ uint32_t RTC_ReadCounter(void) { - return (((RTC->CNTH_B.CNTH) << 16) | (RTC->CNTL_B.CNTL)); + uint32_t reg = 0; + reg = (RTC->CNTH_B.CNTH) << 16; + reg |= (RTC->CNTL_B.CNTL); + return (reg); } /*! @@ -112,7 +129,10 @@ void RTC_ConfigAlarm(uint32_t value) */ uint32_t RTC_ReadDivider(void) { - return ((RTC->PSCH_B.PSCH & 0x000F) << 16 ) | (RTC->PSCL_B.PSCL); + uint32_t reg = 0; + reg = (RTC->PSCH_B.PSCH & 0x000F) << 16; + reg |= (RTC->PSCL_B.PSCL); + return (reg); } /*! @@ -124,7 +144,7 @@ uint32_t RTC_ReadDivider(void) */ void RTC_WaitForLastTask(void) { - while(RTC->CSTS_B.OCFLG == BIT_RESET) + while (RTC->CSTS_B.OCFLG == BIT_RESET) { } } @@ -139,17 +159,17 @@ void RTC_WaitForLastTask(void) void RTC_WaitForSynchor(void) { RTC->CSTS_B.RSYNCFLG = BIT_RESET; - while(RTC->CSTS_B.RSYNCFLG == BIT_RESET) - { - } + while (RTC->CSTS_B.RSYNCFLG == BIT_RESET); } /*! * @brief Enable RTC interrupts. * - * @param interrupt: RTC interrupt - * - * @retval None + * @param interrupt: specifies the RTC interrupt sources to be enabled + * This parameter can be any combination of the following values: + * @arg RTC_INT_OVR : Overflow interrupt + * @arg RTC_INT_ALR : Alarm interrupt + * @arg RTC_INT_SEC : Second interrupt */ void RTC_EnableInterrupt(uint16_t interrupt) { @@ -159,31 +179,45 @@ void RTC_EnableInterrupt(uint16_t interrupt) /*! * @brief Disable RTC interrupts. * - * @param interrupt: RTC interrupt + * @param interrupt: specifies the RTC interrupt sources to be disabled + * This parameter can be any combination of the following values: + * @arg RTC_INT_OVR : Overflow interrupt + * @arg RTC_INT_ALR : Alarm interrupt + * @arg RTC_INT_SEC : Second interrupt * * @retval None */ void RTC_DisableInterrupt(uint16_t interrupt) { - RTC->CTRL &= (uint32_t )~interrupt; + RTC->CTRL &= (uint32_t)~interrupt; } /*! * @brief Read flag bit * - * @param flag: Flags to read + * @param flag: specifies the flag to check. + * This parameter can be one of the following values: + * @arg RTC_FLAG_OC : RTC Operation Complete flag + * @arg RTC_FLAG_RSYNC: Registers Synchronized flag + * @arg RTC_FLAG_OVR : Overflow flag + * @arg RTC_FLAG_ALR : Alarm flag + * @arg RTC_FLAG_SEC : Second flag * - * @retval flag bit + * @retval SET or RESET */ uint8_t RTC_ReadStatusFlag(RTC_FLAG_T flag) { - return (RTC->CSTS & flag) ? SET : RESET; + return (RTC->CSTS & flag) ? SET : RESET; } /*! * @brief Clear flag bit * - * @param flag: Flags to clear + * @param flag: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg RTC_FLAG_OVR : Overflow flag + * @arg RTC_FLAG_ALR : Alarm flag + * @arg RTC_FLAG_SEC : Second flag * * @retval None */ @@ -195,7 +229,11 @@ void RTC_ClearStatusFlag(uint16_t flag) /*! * @brief Read interrupt flag bit is set * - * @param flag:Flag bit to check + * @param flag: specifies the flag to check. + * This parameter can be any combination of the following values: + * @arg RTC_INT_OVR : Overflow interrupt + * @arg RTC_INT_ALR : Alarm interrupt + * @arg RTC_INT_SEC : Second interrupt * * @retval None */ @@ -207,7 +245,11 @@ uint8_t RTC_ReadIntFlag(RTC_INT_T flag) /*! * @brief Clear RTC interrupt flag bit * - * @param flag: Clears the specified interrupt flag bit + * @param flag: specifies the flag to clear. + * This parameter can be one of the following values: + * @arg RTC_INT_OVR : Overflow interrupt + * @arg RTC_INT_ALR : Alarm interrupt + * @arg RTC_INT_SEC : Second interrupt * * @retval None */ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_sci2c.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_sci2c.c index 4b5ea1276a..9c7f865592 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_sci2c.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_sci2c.c @@ -3,10 +3,24 @@ * * @brief This file contains all the functions for the SCI2C peripheral * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_sci2c.h" @@ -33,7 +47,7 @@ */ void SCI2C_Reset(SCI2C_T *i2c) { - if(i2c == I2C3) + if (i2c == I2C3) { RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_I2C1); RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_I2C1); @@ -64,7 +78,7 @@ void SCI2C_Config(SCI2C_T *i2c, SCI2C_Config_T *sci2cConfig) i2c->CTRL2_B.I2CEN = BIT_RESET; - if(sci2cConfig->mode == SCI2C_MODE_MASTER) + if (sci2cConfig->mode == SCI2C_MODE_MASTER) { i2c->CTRL1_B.MST = BIT_SET; i2c->CTRL1_B.SLADIS = BIT_SET; @@ -84,17 +98,17 @@ void SCI2C_Config(SCI2C_T *i2c, SCI2C_Config_T *sci2cConfig) i2c->CTRL1_B.SAM = sci2cConfig->addrMode; i2c->SLAADDR = sci2cConfig->slaveAddr; - if(sci2cConfig->speed == SCI2C_SPEED_STANDARD) + if (sci2cConfig->speed == SCI2C_SPEED_STANDARD) { i2c->SSCLC = sci2cConfig->clkLowPeriod; i2c->SSCHC = sci2cConfig->clkHighPeriod; } - else if(sci2cConfig->speed == SCI2C_SPEED_FAST) + else if (sci2cConfig->speed == SCI2C_SPEED_FAST) { i2c->FSCLC = sci2cConfig->clkLowPeriod; i2c->FSCHC = sci2cConfig->clkHighPeriod; } - else if(sci2cConfig->speed == SCI2C_SPEED_HIGH) + else if (sci2cConfig->speed == SCI2C_SPEED_HIGH) { i2c->HSCLC = sci2cConfig->clkLowPeriod; i2c->HSCHC = sci2cConfig->clkHighPeriod; @@ -145,7 +159,7 @@ uint8_t SCI2C_ReadStatusFlag(SCI2C_T *i2c, SCI2C_FLAG_T flag) { uint8_t ret = RESET; - if(flag & BIT8) + if (flag & BIT8) { ret = i2c->STS2 & flag ? SET : RESET; } @@ -214,47 +228,47 @@ void SCI2C_ClearIntFlag(SCI2C_T *i2c, SCI2C_INT_T flag) { volatile uint32_t dummy = 0; - if(flag == SCI2C_INT_ALL) + if (flag == SCI2C_INT_ALL) { dummy = i2c->INTCLR; } - else if(flag == SCI2C_INT_RFU) + else if (flag == SCI2C_INT_RFU) { dummy = i2c->RFUIC; } - else if(flag == SCI2C_INT_RFO) + else if (flag == SCI2C_INT_RFO) { dummy = i2c->RFOIC; } - else if(flag == SCI2C_INT_TFO) + else if (flag == SCI2C_INT_TFO) { dummy = i2c->TFOIC; } - else if(flag == SCI2C_INT_RR) + else if (flag == SCI2C_INT_RR) { dummy = i2c->RRIC; } - else if(flag == SCI2C_INT_TA) + else if (flag == SCI2C_INT_TA) { dummy = i2c->TAIC; } - else if(flag == SCI2C_INT_RD) + else if (flag == SCI2C_INT_RD) { dummy = i2c->RDIC; } - else if(flag == SCI2C_INT_ACT) + else if (flag == SCI2C_INT_ACT) { dummy = i2c->AIC; } - else if(flag == SCI2C_INT_STPD) + else if (flag == SCI2C_INT_STPD) { dummy = i2c->STPDIC; } - else if(flag == SCI2C_INT_STAD) + else if (flag == SCI2C_INT_STAD) { dummy = i2c->STADIC; } - else if(flag == SCI2C_INT_GC) + else if (flag == SCI2C_INT_GC) { dummy = i2c->GCIC; } @@ -442,7 +456,7 @@ void SCI2C_ConfigSpeed(SCI2C_T *i2c, SCI2C_SPEED_T speed) * @arg SCI2C_ADDR_MODE_10BIT: 10-bit address mode. * * @param addr: Specifies the address. - + * * @retval None */ void SCI2C_ConfigMasterAddr(SCI2C_T *i2c, SCI2C_ADDR_MODE_T mode, uint16_t addr) @@ -462,7 +476,7 @@ void SCI2C_ConfigMasterAddr(SCI2C_T *i2c, SCI2C_ADDR_MODE_T mode, uint16_t addr) * @arg SCI2C_ADDR_MODE_10BIT: 10-bit address mode. * * @param addr: Specifies the address. - + * * @retval None */ void SCI2C_ConfigSlaveAddr(SCI2C_T *i2c, SCI2C_ADDR_MODE_T mode, uint16_t addr) @@ -570,7 +584,6 @@ void SCI2C_TxData(SCI2C_T *i2c, uint8_t data) * * @retval Received data * - * @note */ uint8_t SCI2C_RxData(SCI2C_T *i2c) { @@ -718,17 +731,17 @@ void SCI2C_BlockTxCmd(SCI2C_T *i2c, uint8_t enable) */ void SCI2C_ConfigClkPeriod(SCI2C_T *i2c, SCI2C_SPEED_T speed, uint16_t highPeriod, uint16_t lowPeriod) { - if(speed == SCI2C_SPEED_STANDARD) + if (speed == SCI2C_SPEED_STANDARD) { i2c->SSCLC = lowPeriod; i2c->SSCHC = highPeriod; } - else if(speed == SCI2C_SPEED_FAST) + else if (speed == SCI2C_SPEED_FAST) { i2c->FSCLC = lowPeriod; i2c->FSCHC = highPeriod; } - else if(speed == SCI2C_SPEED_HIGH) + else if (speed == SCI2C_SPEED_HIGH) { i2c->HSCLC = lowPeriod; i2c->HSCHC = highPeriod; @@ -882,7 +895,7 @@ void SCI2C_ConfigDMARxDataLevel(SCI2C_T *i2c, uint8_t cnt) */ void SCI2C_ConfigSpikeSuppressionLimit(SCI2C_T *i2c, SCI2C_SPEED_T speed, uint8_t limit) { - if(speed == SCI2C_SPEED_HIGH) + if (speed == SCI2C_SPEED_HIGH) { i2c->HSSSL = limit; } @@ -895,4 +908,3 @@ void SCI2C_ConfigSpikeSuppressionLimit(SCI2C_T *i2c, SCI2C_SPEED_T speed, uint8_ /**@} end of group SCI2C_Fuctions*/ /**@} end of group SCI2C_Driver*/ /**@} end of group Peripherals_Library*/ - diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_sdio.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_sdio.c index f79af54970..1a2d3a82be 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_sdio.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_sdio.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_sdio.c + * @file apm32f10x_sdio.c * - * @brief This file provides all the SDIO firmware functions + * @brief This file provides all the SDIO firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_sdio.h" @@ -51,7 +65,7 @@ void SDIO_Reset(void) * * @retval None */ -void SDIO_Config(SDIO_Config_T* sdioConfig) +void SDIO_Config(SDIO_Config_T *sdioConfig) { uint32_t tmp = 0; @@ -59,7 +73,7 @@ void SDIO_Config(SDIO_Config_T* sdioConfig) tmp &= 0xFFFF8100; tmp |= (sdioConfig->clockDiv | sdioConfig->clockPowerSave | sdioConfig->clockBypass | sdioConfig->busWide | - sdioConfig->clockEdge | sdioConfig->hardwareFlowControl); + sdioConfig->clockEdge | sdioConfig->hardwareFlowControl); SDIO->CLKCTRL = tmp; } @@ -71,14 +85,14 @@ void SDIO_Config(SDIO_Config_T* sdioConfig) * * @retval None */ -void SDIO_ConfigStructInit(SDIO_Config_T* sdioConfig) +void SDIO_ConfigStructInit(SDIO_Config_T *sdioConfig) { - sdioConfig->clockDiv = 0x00; - sdioConfig->clockEdge = SDIO_CLOCK_EDGE_RISING; - sdioConfig->clockBypass = SDIO_CLOCK_BYPASS_DISABLE; - sdioConfig->clockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; - sdioConfig->busWide = SDIO_BUSWIDE_1B; - sdioConfig->hardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; + sdioConfig->clockDiv = 0x00; + sdioConfig->clockEdge = SDIO_CLOCK_EDGE_RISING; + sdioConfig->clockBypass = SDIO_CLOCK_BYPASS_DISABLE; + sdioConfig->clockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; + sdioConfig->busWide = SDIO_BUS_WIDE_1B; + sdioConfig->hardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; } /*! @@ -161,13 +175,12 @@ void SDIO_DisableDMA(void) /*! * @brief Configs the SDIO Command and send the command * - * @param cmdConfig: pointer to a SDIO_CMDConfig_T structure + * @param cmdConfig: pointer to a SDIO_CmdConfig_T structure * * @retval None * - * @note */ -void SDIO_TxCommand(SDIO_CMDConfig_T *cmdConfig) +void SDIO_TxCommand(SDIO_CmdConfig_T *cmdConfig) { uint32_t tmpreg = 0; @@ -175,26 +188,25 @@ void SDIO_TxCommand(SDIO_CMDConfig_T *cmdConfig) tmpreg = SDIO->CMD; tmpreg &= 0xFFFFF800; tmpreg |= (uint32_t)cmdConfig->cmdIndex | cmdConfig->response - | cmdConfig->wait | cmdConfig->CPSM; + | cmdConfig->wait | cmdConfig->CPSM; SDIO->CMD = tmpreg; } /*! * @brief Fills each SDIO_CMD_ConfigStruct_T member with its default value * - * @param cmdConfig: pointer to a SDIO_CMDConfig_T structure + * @param cmdConfig: pointer to a SDIO_CmdConfig_T structure * * @retval None * - * @note */ -void SDIO_TxCommandStructInit(SDIO_CMDConfig_T* cmdConfig) +void SDIO_TxCommandStructInit(SDIO_CmdConfig_T *cmdConfig) { - cmdConfig->argument = 0x00; - cmdConfig->cmdIndex = 0x00; - cmdConfig->response = SDIO_RESPONSE_NO; - cmdConfig->wait = SDIO_WAIT_NO; - cmdConfig->CPSM = SDIO_CPSM_DISABLE; + cmdConfig->argument = 0x00; + cmdConfig->cmdIndex = 0x00; + cmdConfig->response = SDIO_RESPONSE_NO; + cmdConfig->wait = SDIO_WAIT_NO; + cmdConfig->CPSM = SDIO_CPSM_DISABLE; } /*! @@ -204,7 +216,6 @@ void SDIO_TxCommandStructInit(SDIO_CMDConfig_T* cmdConfig) * * @retval The command index of the last command response received * - * @note */ uint8_t SDIO_ReadCommandResponse(void) { @@ -225,11 +236,11 @@ uint8_t SDIO_ReadCommandResponse(void) */ uint32_t SDIO_ReadResponse(SDIO_RES_T res) { - __IO uint32_t tmp = 0; + __IO uint32_t tmp = 0; - tmp = ((uint32_t)(SDIO_BASE + 0x14)) + res; + tmp = ((uint32_t)(SDIO_BASE + 0x14)) + res; - return (*(__IO uint32_t *) tmp); + return (*(__IO uint32_t *) tmp); } /*! @@ -239,7 +250,7 @@ uint32_t SDIO_ReadResponse(SDIO_RES_T res) * * @retval None */ -void SDIO_ConfigData(SDIO_DataConfig_T* dataConfig) +void SDIO_ConfigData(SDIO_DataConfig_T *dataConfig) { uint32_t tmpreg = 0; @@ -252,7 +263,7 @@ void SDIO_ConfigData(SDIO_DataConfig_T* dataConfig) tmpreg &= 0xFFFFFF08; tmpreg |= (uint32_t)dataConfig->dataBlockSize | dataConfig->transferDir - | dataConfig->transferMode | dataConfig->DPSM; + | dataConfig->transferMode | dataConfig->DPSM; SDIO->DCTRL = tmpreg; } @@ -264,14 +275,14 @@ void SDIO_ConfigData(SDIO_DataConfig_T* dataConfig) * * @retval None */ -void SDIO_ConfigDataStructInit(SDIO_DataConfig_T* dataConfig) +void SDIO_ConfigDataStructInit(SDIO_DataConfig_T *dataConfig) { - dataConfig->dataTimeOut = 0xFFFFFFFF; - dataConfig->dataLength = 0x00; - dataConfig->dataBlockSize = SDIO_DATA_BLOCKSIZE_1B; - dataConfig->transferDir = SDIO_TRANSFER_DIR_TOCARD; - dataConfig->transferMode = SDIO_TRANSFER_MODE_BLOCK; - dataConfig->DPSM = SDIO_DPSM_DISABLE; + dataConfig->dataTimeOut = 0xFFFFFFFF; + dataConfig->dataLength = 0x00; + dataConfig->dataBlockSize = SDIO_DATA_BLOCKSIZE_1B; + dataConfig->transferDir = SDIO_TRANSFER_DIR_TO_CARD; + dataConfig->transferMode = SDIO_TRANSFER_MODE_BLOCK; + dataConfig->DPSM = SDIO_DPSM_DISABLE; } /*! @@ -289,7 +300,7 @@ uint32_t SDIO_ReadDataCounter(void) /*! * @brief Write the SDIO Data * - * @param Data : Write 32-bit data + * @param Data:Write 32-bit data * * @retval None */ @@ -380,11 +391,10 @@ void SDIO_DisableStartReadWait(void) * * @retval None * - * @note */ void SDIO_ConfigSDIOReadWaitMode(SDIO_READ_WAIT_MODE_T readWaitMode) { - *(__IO uint32_t *) DCTRL_RDWAIT_BB = readWaitMode; + *(__IO uint32_t *) DCTRL_RDWAIT_BB = readWaitMode; } /*! * @brief Enables SDIO SD I/O Mode Operation @@ -395,7 +405,7 @@ void SDIO_ConfigSDIOReadWaitMode(SDIO_READ_WAIT_MODE_T readWaitMode) */ void SDIO_EnableSDIO(void) { - *(__IO uint32_t *) DCTRL_SDIOF_BB = (uint32_t)SET; + *(__IO uint32_t *) DCTRL_SDIOF_BB = (uint32_t)SET; } /*! @@ -407,7 +417,7 @@ void SDIO_EnableSDIO(void) */ void SDIO_DisableSDIO(void) { - *(__IO uint32_t *) DCTRL_SDIOF_BB = (uint32_t)RESET; + *(__IO uint32_t *) DCTRL_SDIOF_BB = (uint32_t)RESET; } /*! @@ -612,17 +622,7 @@ void SDIO_DisableInterrupt(uint32_t interrupt) */ uint8_t SDIO_ReadStatusFlag(SDIO_FLAG_T flag) { - uint8_t bitstatus = RESET; - - if ((SDIO->STS & flag) != (uint32_t)RESET) - { - bitstatus = SET; - } - else - { - bitstatus = RESET; - } - return bitstatus; + return (SDIO->STS & flag) ? SET : RESET; } /*! @@ -648,7 +648,7 @@ uint8_t SDIO_ReadStatusFlag(SDIO_FLAG_T flag) */ void SDIO_ClearStatusFlag(uint32_t flag) { - SDIO->ICF = flag; + SDIO->ICF = flag; } /*! @@ -722,7 +722,7 @@ uint8_t SDIO_ReadIntFlag(SDIO_INT_T flag) */ void SDIO_ClearIntFlag(uint32_t flag) { - SDIO->ICF = flag; + SDIO->ICF = flag; } /**@} end of group SDIO_Fuctions*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_spi.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_spi.c index 079685b148..1588cc17ab 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_spi.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_spi.c @@ -3,10 +3,24 @@ * * @brief This file provides all the SPI firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_spi.h" @@ -31,19 +45,19 @@ * * @retval None */ -void SPI_I2S_Reset(SPI_T* spi) +void SPI_I2S_Reset(SPI_T *spi) { - if(spi == SPI1) + if (spi == SPI1) { RCM_EnableAPB2PeriphReset(RCM_APB2_PERIPH_SPI1); RCM_DisableAPB2PeriphReset(RCM_APB2_PERIPH_SPI1); } - else if(spi == SPI2) + else if (spi == SPI2) { RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_SPI2); RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_SPI2); } - else if(spi == SPI3) + else if (spi == SPI3) { RCM_EnableAPB1PeriphReset(RCM_APB1_PERIPH_SPI3); RCM_DisableAPB1PeriphReset(RCM_APB1_PERIPH_SPI3); @@ -59,13 +73,13 @@ void SPI_I2S_Reset(SPI_T* spi) * * @retval None */ -void SPI_Config(SPI_T* spi, SPI_Config_T* spiConfig) +void SPI_Config(SPI_T *spi, SPI_Config_T *spiConfig) { spi->CTRL1 &= 0x3040; spi->CTRL1 |= (uint16_t)((uint32_t)spiConfig->direction | spiConfig->mode | - spiConfig->length | spiConfig->polarity | - spiConfig->phase | spiConfig->nss | - spiConfig->baudrateDiv | spiConfig->firstBit); + spiConfig->length | spiConfig->polarity | + spiConfig->phase | spiConfig->nss | + spiConfig->baudrateDiv | spiConfig->firstBit); spi->CRCPOLY = spiConfig->crcPolynomial; } @@ -78,24 +92,24 @@ void SPI_Config(SPI_T* spi, SPI_Config_T* spiConfig) * * @retval None */ -void I2S_Config(SPI_T* spi, I2S_Config_T* i2sConfig) +void I2S_Config(SPI_T *spi, I2S_Config_T *i2sConfig) { uint16_t i2sDiv = 2, i2sOdd = 0, packetSize = 1; uint32_t tmp = 0; uint32_t sysClock = 0; - /* Clear MODESEL, I2SEN, I2SMOD, PFSSEL, I2SSSEL, CPOL, DATALEN and CHLEN bits */ + /** Clear MODESEL, I2SEN, I2SMOD, PFSSEL, I2SSSEL, CPOL, DATALEN and CHLEN bits */ spi->I2SCFG &= 0xF040; spi->I2SPSC = 0x0002; - if(i2sConfig->audioDiv == I2S_AUDIO_DIV_DEFAULT) + if (i2sConfig->audioDiv == I2S_AUDIO_DIV_DEFAULT) { spi->I2SPSC_B.ODDPSC = 0; spi->I2SPSC_B.I2SPSC = 2; } else { - if(i2sConfig->length == I2S_DATA_LENGHT_16B) + if (i2sConfig->length == I2S_DATA_LENGHT_16B) { packetSize = 1; } @@ -106,13 +120,13 @@ void I2S_Config(SPI_T* spi, I2S_Config_T* i2sConfig) sysClock = RCM_ReadSYSCLKFreq(); - if(i2sConfig->MCLKOutput == I2S_MCLK_OUTPUT_ENABLE) + if (i2sConfig->MCLKOutput == I2S_MCLK_OUTPUT_ENABLE) { tmp = (uint16_t)(((((sysClock / 256) * 10) / i2sConfig ->audioDiv)) + 5); } else { - tmp = (uint16_t)(((((sysClock / (32 * packetSize)) *10 ) / i2sConfig ->audioDiv )) + 5); + tmp = (uint16_t)(((((sysClock / (32 * packetSize)) * 10) / i2sConfig ->audioDiv)) + 5); } tmp = tmp / 10; @@ -130,7 +144,10 @@ void I2S_Config(SPI_T* spi, I2S_Config_T* i2sConfig) spi->I2SPSC_B.ODDPSC = i2sOdd; spi->I2SPSC |= i2sConfig->MCLKOutput; - spi->I2SCFG = i2sConfig->mode | i2sConfig->standard | i2sConfig->length | i2sConfig->polarity; + spi->I2SCFG = (uint32_t)i2sConfig->mode | \ + (uint32_t)i2sConfig->standard | \ + (uint32_t)i2sConfig->length | \ + (uint32_t)i2sConfig->polarity; /** select I2S mode */ spi->I2SCFG_B.MODESEL = BIT_SET; @@ -143,7 +160,7 @@ void I2S_Config(SPI_T* spi, I2S_Config_T* i2sConfig) * * @retval None */ -void SPI_ConfigStructInit(SPI_Config_T* spiConfig) +void SPI_ConfigStructInit(SPI_Config_T *spiConfig) { spiConfig->direction = SPI_DIRECTION_2LINES_FULLDUPLEX; spiConfig->mode = SPI_MODE_SLAVE; @@ -163,7 +180,7 @@ void SPI_ConfigStructInit(SPI_Config_T* spiConfig) * * @retval None */ -void I2S_ConfigStructInit(I2S_Config_T* i2sConfig) +void I2S_ConfigStructInit(I2S_Config_T *i2sConfig) { i2sConfig->mode = I2S_MODE_SLAVE_TX; i2sConfig->standard = I2S_STANDARD_PHILLIPS; @@ -179,7 +196,7 @@ void I2S_ConfigStructInit(I2S_Config_T* i2sConfig) * * @retval None */ -void SPI_Enable(SPI_T* spi) +void SPI_Enable(SPI_T *spi) { spi->CTRL1_B.SPIEN = BIT_SET; } @@ -191,7 +208,7 @@ void SPI_Enable(SPI_T* spi) * * @retval None */ -void SPI_Disable(SPI_T* spi) +void SPI_Disable(SPI_T *spi) { spi->CTRL1_B.SPIEN = BIT_RESET; } @@ -203,7 +220,7 @@ void SPI_Disable(SPI_T* spi) * * @retval None */ -void I2S_Enable(SPI_T* spi) +void I2S_Enable(SPI_T *spi) { spi->I2SCFG_B.I2SEN = BIT_SET; } @@ -215,7 +232,7 @@ void I2S_Enable(SPI_T* spi) * * @retval None */ -void I2S_Disable(SPI_T* spi) +void I2S_Disable(SPI_T *spi) { spi->I2SCFG_B.I2SEN = BIT_RESET; } @@ -231,9 +248,9 @@ void I2S_Disable(SPI_T* spi) * @arg SPI_I2S_DMA_REQ_RX: Rx buffer DMA transfer request * @retval None */ -void SPI_I2S_EnableDMA(SPI_T* spi, SPI_I2S_DMA_REQ_T dmaReq) +void SPI_I2S_EnableDMA(SPI_T *spi, SPI_I2S_DMA_REQ_T dmaReq) { - if(dmaReq == SPI_I2S_DMA_REQ_TX) + if (dmaReq == SPI_I2S_DMA_REQ_TX) { spi->CTRL2_B.TXDEN = ENABLE; } @@ -254,9 +271,9 @@ void SPI_I2S_EnableDMA(SPI_T* spi, SPI_I2S_DMA_REQ_T dmaReq) * @arg SPI_I2S_DMA_REQ_RX: Rx buffer DMA transfer request * @retval None */ -void SPI_I2S_DisableDMA(SPI_T* spi, SPI_I2S_DMA_REQ_T dmaReq) +void SPI_I2S_DisableDMA(SPI_T *spi, SPI_I2S_DMA_REQ_T dmaReq) { - if(dmaReq == SPI_I2S_DMA_REQ_TX) + if (dmaReq == SPI_I2S_DMA_REQ_TX) { spi->CTRL2_B.TXDEN = DISABLE; } @@ -275,7 +292,7 @@ void SPI_I2S_DisableDMA(SPI_T* spi, SPI_I2S_DMA_REQ_T dmaReq) * * @retval None */ -void SPI_I2S_TxData(SPI_T* spi, uint16_t data) +void SPI_I2S_TxData(SPI_T *spi, uint16_t data) { spi->DATA = data; } @@ -289,7 +306,7 @@ void SPI_I2S_TxData(SPI_T* spi, uint16_t data) * * @retval None */ -uint16_t SPI_I2S_RxData(SPI_T* spi) +uint16_t SPI_I2S_RxData(SPI_T *spi) { return spi->DATA; } @@ -301,7 +318,7 @@ uint16_t SPI_I2S_RxData(SPI_T* spi) * * @retval None */ -void SPI_SetSoftwareNSS(SPI_T* spi) +void SPI_SetSoftwareNSS(SPI_T *spi) { spi->CTRL1_B.ISSEL = BIT_SET; } @@ -313,7 +330,7 @@ void SPI_SetSoftwareNSS(SPI_T* spi) * * @retval None */ -void SPI_ResetSoftwareNSS(SPI_T* spi) +void SPI_ResetSoftwareNSS(SPI_T *spi) { spi->CTRL1_B.ISSEL = BIT_RESET; } @@ -325,7 +342,7 @@ void SPI_ResetSoftwareNSS(SPI_T* spi) * * @retval None */ -void SPI_EnableSSOutput(SPI_T* spi) +void SPI_EnableSSOutput(SPI_T *spi) { spi->CTRL2_B.SSOEN = BIT_SET; } @@ -337,7 +354,7 @@ void SPI_EnableSSOutput(SPI_T* spi) * * @retval None */ -void SPI_DisableSSOutput(SPI_T* spi) +void SPI_DisableSSOutput(SPI_T *spi) { spi->CTRL2_B.SSOEN = BIT_RESET; } @@ -347,11 +364,14 @@ void SPI_DisableSSOutput(SPI_T* spi) * * @param spi: The SPIx can be 1,2,3 * - * @param length: Select the SPI data Size + * @param length: specifies the SPI data size. + * This parameter can be one of the following values: + * @arg SPI_DATA_LENGTH_16B: Set data frame format to 16bit + * @arg SPI_DATA_LENGTH_8B : Set data frame format to 8bit * * @retval None */ -void SPI_ConfigDataSize(SPI_T* spi, uint16_t length) +void SPI_ConfigDataSize(SPI_T *spi, SPI_DATA_LENGTH_T length) { spi->CTRL1_B.DFLSEL = BIT_RESET; spi->CTRL1 |= length; @@ -364,9 +384,9 @@ void SPI_ConfigDataSize(SPI_T* spi, uint16_t length) * * @retval None */ -void SPI_TxCRC(SPI_T* spi) +void SPI_TxCRC(SPI_T *spi) { - spi->CTRL1_B.CECNXT = BIT_SET; + spi->CTRL1_B.CRCNXT = BIT_SET; } /*! @@ -376,7 +396,7 @@ void SPI_TxCRC(SPI_T* spi) * * @retval None */ -void SPI_EnableCRC(SPI_T* spi) +void SPI_EnableCRC(SPI_T *spi) { spi->CTRL1_B.CRCEN = BIT_SET; } @@ -387,7 +407,7 @@ void SPI_EnableCRC(SPI_T* spi) * @param spi: The SPIx can be 1,2,3 * */ -void SPI_DisableCRC(SPI_T* spi) +void SPI_DisableCRC(SPI_T *spi) { spi->CTRL1_B.CRCEN = BIT_RESET; } @@ -399,7 +419,7 @@ void SPI_DisableCRC(SPI_T* spi) * * @retval The SPI transmit CRC register value */ -uint16_t SPI_ReadTxCRC(SPI_T* spi) +uint16_t SPI_ReadTxCRC(SPI_T *spi) { return spi->TXCRC_B.TXCRC; } @@ -411,7 +431,7 @@ uint16_t SPI_ReadTxCRC(SPI_T* spi) * * @retval The SPI receive CRC register value */ -uint16_t SPI_ReadRxCRC(SPI_T* spi) +uint16_t SPI_ReadRxCRC(SPI_T *spi) { return spi->RXCRC_B.RXCRC; } @@ -423,7 +443,7 @@ uint16_t SPI_ReadRxCRC(SPI_T* spi) * * @retval The SPI CRC Polynomial register value */ -uint16_t SPI_ReadCRCPolynomial(SPI_T* spi) +uint16_t SPI_ReadCRCPolynomial(SPI_T *spi) { return spi->CRCPOLY_B.CRCPOLY; } @@ -439,9 +459,9 @@ uint16_t SPI_ReadCRCPolynomial(SPI_T* spi) * @arg SPI_DIRECTION_TX: Selects Tx transmission direction * @retval None */ -void SPI_ConfigBiDirectionalLine(SPI_T* spi, SPI_DIRECTION_SELECT_T direction) +void SPI_ConfigBiDirectionalLine(SPI_T *spi, SPI_DIRECTION_SELECT_T direction) { - if(direction == SPI_DIRECTION_TX) + if (direction == SPI_DIRECTION_TX) { spi->CTRL1 |= SPI_DIRECTION_TX; } @@ -463,9 +483,9 @@ void SPI_ConfigBiDirectionalLine(SPI_T* spi, SPI_DIRECTION_SELECT_T direction) * @arg SPI_I2S_INT_ERR: Error interrupt * @retval None */ -void SPI_I2S_EnableInterrupt(SPI_T* spi, SPI_I2S_INT_T interrupt) +void SPI_I2S_EnableInterrupt(SPI_T *spi, SPI_I2S_INT_T interrupt) { - spi->CTRL2 |= (interrupt >> 8); + spi->CTRL2 |= (interrupt >> 8); } /*! @@ -480,9 +500,9 @@ void SPI_I2S_EnableInterrupt(SPI_T* spi, SPI_I2S_INT_T interrupt) * @arg SPI_I2S_INT_ERR: Error interrupt * @retval None */ -void SPI_I2S_DisableInterrupt(SPI_T* spi, SPI_I2S_INT_T interrupt) +void SPI_I2S_DisableInterrupt(SPI_T *spi, SPI_I2S_INT_T interrupt) { - spi->CTRL2 &= ~(interrupt >> 8); + spi->CTRL2 &= ~(interrupt >> 8); } /*! @@ -503,9 +523,9 @@ void SPI_I2S_DisableInterrupt(SPI_T* spi, SPI_I2S_INT_T interrupt) * * @retval SET or RESET */ -uint8_t SPI_I2S_ReadStatusFlag(SPI_T* spi, SPI_FLAG_T flag) +uint8_t SPI_I2S_ReadStatusFlag(SPI_T *spi, SPI_FLAG_T flag) { - if((spi->STS & flag) != RESET) + if ((spi->STS & flag) != RESET) { return SET; } @@ -533,7 +553,7 @@ uint8_t SPI_I2S_ReadStatusFlag(SPI_T* spi, SPI_FLAG_T flag) * a read/write operation to SPI_STS register (SPI_I2S_ReadStatusFlag()) * followed by a write operation to SPI_CTRL1 register (SPI_Enable()). */ -void SPI_I2S_ClearStatusFlag(SPI_T* spi, SPI_FLAG_T flag) +void SPI_I2S_ClearStatusFlag(SPI_T *spi, SPI_FLAG_T flag) { spi->STS_B.CRCEFLG = BIT_RESET; } @@ -554,12 +574,12 @@ void SPI_I2S_ClearStatusFlag(SPI_T* spi, SPI_FLAG_T flag) * * @retval SET or RESET */ -uint8_t SPI_I2S_ReadIntFlag(SPI_T* spi, SPI_I2S_INT_T flag) +uint8_t SPI_I2S_ReadIntFlag(SPI_T *spi, SPI_I2S_INT_T flag) { uint32_t intEnable; uint32_t intStatus; - intEnable = (uint32_t)(spi->CTRL2 & (flag>>8)); + intEnable = (uint32_t)(spi->CTRL2 & (flag >> 8)); intStatus = (uint32_t)(spi->STS & flag); if (intEnable && intStatus) @@ -588,7 +608,7 @@ uint8_t SPI_I2S_ReadIntFlag(SPI_T* spi, SPI_I2S_INT_T flag) * a read/write operation to SPI_STS register (SPI_I2S_ReadIntFlag()) * followed by a write operation to SPI_CTRL1 register (SPI_Enable()). */ -void SPI_I2S_ClearIntFlag(SPI_T* spi, SPI_I2S_INT_T flag) +void SPI_I2S_ClearIntFlag(SPI_T *spi, SPI_I2S_INT_T flag) { spi->STS_B.CRCEFLG = BIT_RESET; } diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_tmr.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_tmr.c index 343cb19770..50a1449c36 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_tmr.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_tmr.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_tmr.c + * @file apm32f10x_tmr.c * - * @brief This file provides all the TMR firmware functions. + * @brief This file provides all the TMR firmware functions. * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_tmr.h" @@ -24,10 +38,10 @@ @{ */ -static void TI1Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); -static void TI2Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); -static void TI3Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); -static void TI4Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); +static void TI1Config(TMR_T *tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); +static void TI2Config(TMR_T *tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); +static void TI3Config(TMR_T *tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); +static void TI4Config(TMR_T *tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter); /*! * @brief Deinitializes the TMRx peripheral registers to their default reset values. @@ -36,9 +50,8 @@ static void TI4Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uin * * @retval None * - * @note */ -void TMR_Reset(TMR_T* tmr) +void TMR_Reset(TMR_T *tmr) { if (tmr == TMR1) { @@ -91,12 +104,12 @@ void TMR_Reset(TMR_T* tmr) * * @retval None */ -void TMR_ConfigTimeBase(TMR_T* tmr, TMR_BaseConfig_T* baseConfig) +void TMR_ConfigTimeBase(TMR_T *tmr, TMR_BaseConfig_T *baseConfig) { uint16_t temp; if ((tmr == TMR1) || (tmr == TMR8) || (tmr == TMR2) || (tmr == TMR3) || - (tmr == TMR4) || (tmr == TMR5)) + (tmr == TMR4) || (tmr == TMR5)) { temp = tmr->CTRL1; temp &= 0x038F; @@ -116,7 +129,7 @@ void TMR_ConfigTimeBase(TMR_T* tmr, TMR_BaseConfig_T* baseConfig) { tmr->REPCNT = baseConfig->repetitionCounter; } - tmr->CEG_B.BEG = 0x01; + tmr->CEG_B.UEG = 0x01; } /*! @@ -124,31 +137,31 @@ void TMR_ConfigTimeBase(TMR_T* tmr, TMR_BaseConfig_T* baseConfig) * * @param tmr: The TMRx can be 1 to 8 except 6 and 7 * - * @param OC1Config: Pointer to a TMR_OCConfig_T structure + * @param OCConfig: Pointer to a TMR_OCConfig_T structure * * @retval None */ -void TMR_ConfigOC1(TMR_T* tmr, TMR_OCConfig_T* OC1Config) +void TMR_ConfigOC1(TMR_T *tmr, TMR_OCConfig_T *OCConfig) { tmr->CCEN_B.CC1EN = BIT_RESET; tmr->CCM1_COMPARE_B.CC1SEL = BIT_RESET; - tmr->CCM1_COMPARE_B.OC1MOD = OC1Config->mode; + tmr->CCM1_COMPARE_B.OC1MOD = OCConfig->mode; - tmr->CCEN_B.CC1POL = OC1Config->polarity; - tmr->CCEN_B.CC1EN = OC1Config->outputState; + tmr->CCEN_B.CC1POL = OCConfig->polarity; + tmr->CCEN_B.CC1EN = OCConfig->outputState; if ((tmr == TMR1) || (tmr == TMR8)) { - tmr->CCEN_B.CC1NPOL = OC1Config->nPolarity; - tmr->CCEN_B.CC1NEN = OC1Config->outputNState; + tmr->CCEN_B.CC1NPOL = OCConfig->nPolarity; + tmr->CCEN_B.CC1NEN = OCConfig->outputNState; tmr->CTRL2_B.OC1OIS = BIT_RESET; tmr->CTRL2_B.OC1NOIS = BIT_RESET; - tmr->CTRL2_B.OC1OIS = OC1Config->idleState; - tmr->CTRL2_B.OC1NOIS = OC1Config->nIdleState; + tmr->CTRL2_B.OC1OIS = OCConfig->idleState; + tmr->CTRL2_B.OC1NOIS = OCConfig->nIdleState; } - tmr->CC1 = OC1Config->pulse; + tmr->CC1 = OCConfig->pulse; } /*! @@ -156,36 +169,36 @@ void TMR_ConfigOC1(TMR_T* tmr, TMR_OCConfig_T* OC1Config) * * @param tmr: The TMRx can be 1 to 8 except 6 and 7 * - * @param OC2Config: Pointer to a TMR_OCConfig_T structure + * @param OCConfig: Pointer to a TMR_OCConfig_T structure * * @retval None */ -void TMR_ConfigOC2(TMR_T* tmr, TMR_OCConfig_T* OC2Config) +void TMR_ConfigOC2(TMR_T *tmr, TMR_OCConfig_T *OCConfig) { tmr->CCEN_B.CC2EN = BIT_RESET; tmr->CCM1_COMPARE_B.OC2MOD = BIT_RESET; tmr->CCM1_COMPARE_B.CC2SEL = BIT_RESET; - tmr->CCM1_COMPARE_B.OC2MOD = OC2Config->mode; + tmr->CCM1_COMPARE_B.OC2MOD = OCConfig->mode; tmr->CCEN_B.CC2POL = BIT_RESET; - tmr->CCEN_B.CC2POL = OC2Config->polarity; - tmr->CCEN_B.CC2EN = OC2Config->outputState; + tmr->CCEN_B.CC2POL = OCConfig->polarity; + tmr->CCEN_B.CC2EN = OCConfig->outputState; if ((tmr == TMR1) || (tmr == TMR8)) { tmr->CCEN_B.CC2NPOL = BIT_RESET; - tmr->CCEN_B.CC2NPOL = OC2Config->nPolarity; + tmr->CCEN_B.CC2NPOL = OCConfig->nPolarity; tmr->CCEN_B.CC2NEN = BIT_RESET; - tmr->CCEN_B.CC2NEN = OC2Config->outputNState; + tmr->CCEN_B.CC2NEN = OCConfig->outputNState; tmr->CTRL2_B.OC2OIS = BIT_RESET; tmr->CTRL2_B.OC2NOIS = BIT_RESET; - tmr->CTRL2_B.OC2OIS = OC2Config->idleState; - tmr->CTRL2_B.OC2NOIS = OC2Config->nIdleState; + tmr->CTRL2_B.OC2OIS = OCConfig->idleState; + tmr->CTRL2_B.OC2NOIS = OCConfig->nIdleState; } - tmr->CC2 = OC2Config->pulse; + tmr->CC2 = OCConfig->pulse; } /*! @@ -193,35 +206,35 @@ void TMR_ConfigOC2(TMR_T* tmr, TMR_OCConfig_T* OC2Config) * * @param tmr: The TMRx can be 1 to 8 except 6 and 7 * - * @param OC3Config: Pointer to a TMR_OCConfig_T structure + * @param OCConfig: Pointer to a TMR_OCConfig_T structure * * @retval None */ -void TMR_ConfigOC3(TMR_T* tmr, TMR_OCConfig_T* OC3Config) +void TMR_ConfigOC3(TMR_T *tmr, TMR_OCConfig_T *OCConfig) { tmr->CCEN_B.CC3EN = BIT_RESET; - tmr->CCM2_COMPARE_B.OC3MODE = BIT_RESET; + tmr->CCM2_COMPARE_B.OC3MOD = BIT_RESET; tmr->CCM2_COMPARE_B.CC3SEL = BIT_RESET; - tmr->CCM2_COMPARE_B.OC3MODE = OC3Config->mode; + tmr->CCM2_COMPARE_B.OC3MOD = OCConfig->mode; tmr->CCEN_B.CC3POL = BIT_RESET; - tmr->CCEN_B.CC3POL = OC3Config->polarity; - tmr->CCEN_B.CC3EN = OC3Config->outputState; + tmr->CCEN_B.CC3POL = OCConfig->polarity; + tmr->CCEN_B.CC3EN = OCConfig->outputState; if ((tmr == TMR1) || (tmr == TMR8)) { tmr->CCEN_B.CC3NPOL = BIT_RESET; - tmr->CCEN_B.CC3NPOL = OC3Config->nPolarity; + tmr->CCEN_B.CC3NPOL = OCConfig->nPolarity; tmr->CCEN_B.CC3NEN = BIT_RESET; - tmr->CCEN_B.CC3NEN = OC3Config->outputNState; + tmr->CCEN_B.CC3NEN = OCConfig->outputNState; tmr->CTRL2_B.OC3OIS = BIT_RESET; tmr->CTRL2_B.OC3NOIS = BIT_RESET; - tmr->CTRL2_B.OC3OIS = OC3Config->idleState; - tmr->CTRL2_B.OC3NOIS = OC3Config->nIdleState; + tmr->CTRL2_B.OC3OIS = OCConfig->idleState; + tmr->CTRL2_B.OC3NOIS = OCConfig->nIdleState; } - tmr->CC3 = OC3Config->pulse; + tmr->CC3 = OCConfig->pulse; } /*! @@ -229,28 +242,28 @@ void TMR_ConfigOC3(TMR_T* tmr, TMR_OCConfig_T* OC3Config) * * @param tmr: The TMRx can be 1 to 8 except 6 and 7 * - * @param OC4Config: Pointer to a TMR_OCConfig_T structure + * @param OCConfig: Pointer to a TMR_OCConfig_T structure * * @retval None */ -void TMR_ConfigOC4(TMR_T* tmr, TMR_OCConfig_T* OC4Config) +void TMR_ConfigOC4(TMR_T *tmr, TMR_OCConfig_T *OCConfig) { tmr->CCEN_B.CC4EN = BIT_RESET; - tmr->CCM2_COMPARE_B.OC4MODE = BIT_RESET; + tmr->CCM2_COMPARE_B.OC4MOD = BIT_RESET; tmr->CCM2_COMPARE_B.CC4SEL = BIT_RESET; - tmr->CCM2_COMPARE_B.OC4MODE = OC4Config->mode; + tmr->CCM2_COMPARE_B.OC4MOD = OCConfig->mode; tmr->CCEN_B.CC4POL = BIT_RESET; - tmr->CCEN_B.CC4POL = OC4Config->polarity; - tmr->CCEN_B.CC4EN = OC4Config->outputState; + tmr->CCEN_B.CC4POL = OCConfig->polarity; + tmr->CCEN_B.CC4EN = OCConfig->outputState; if ((tmr == TMR1) || (tmr == TMR8)) { tmr->CTRL2_B.OC4OIS = BIT_RESET; - tmr->CTRL2_B.OC4OIS = OC4Config->idleState; + tmr->CTRL2_B.OC4OIS = OCConfig->idleState; } - tmr->CC4 = OC4Config->pulse; + tmr->CC4 = OCConfig->pulse; } /*! @@ -262,7 +275,7 @@ void TMR_ConfigOC4(TMR_T* tmr, TMR_OCConfig_T* OC4Config) * * @retval None */ -void TMR_ConfigIC(TMR_T* tmr, TMR_ICConfig_T* ICConfig) +void TMR_ConfigIC(TMR_T *tmr, TMR_ICConfig_T *ICConfig) { if (ICConfig->channel == TMR_CHANNEL_1) { @@ -295,15 +308,15 @@ void TMR_ConfigIC(TMR_T* tmr, TMR_ICConfig_T* ICConfig) * * @retval None */ -void TMR_ConfigBDT(TMR_T* tmr, TMR_BDTConfig_T* BDTConfig) +void TMR_ConfigBDT(TMR_T *tmr, TMR_BDTConfig_T *BDTConfig) { - tmr->BDT = (BDTConfig->IMOS)<<10 |\ - (BDTConfig->RMOS)<<11 |\ - (BDTConfig->lockLevel)<<8 |\ - (BDTConfig->deadTime) |\ - (BDTConfig->BRKState)<<12 |\ - (BDTConfig->BRKPolarity)<<13 |\ - (BDTConfig->automaticOutput)<<14; + tmr->BDT = (BDTConfig->IMOS) << 10 | \ + (BDTConfig->RMOS) << 11 | \ + (BDTConfig->lockLevel) << 8 | \ + (BDTConfig->deadTime) | \ + (BDTConfig->BRKState) << 12 | \ + (BDTConfig->BRKPolarity) << 13 | \ + (BDTConfig->automaticOutput) << 14; } /*! @@ -313,7 +326,7 @@ void TMR_ConfigBDT(TMR_T* tmr, TMR_BDTConfig_T* BDTConfig) * * @retval None */ -void TMR_ConfigTimeBaseStructInit(TMR_BaseConfig_T* baseConfig) +void TMR_ConfigTimeBaseStructInit(TMR_BaseConfig_T *baseConfig) { baseConfig->period = 0xFFFF; baseConfig->division = 0x0000; @@ -329,7 +342,7 @@ void TMR_ConfigTimeBaseStructInit(TMR_BaseConfig_T* baseConfig) * * @retval None */ -void TMR_ConfigOCStructInit(TMR_OCConfig_T* OCConfig) +void TMR_ConfigOCStructInit(TMR_OCConfig_T *OCConfig) { OCConfig->mode = TMR_OC_MODE_TMRING; OCConfig->outputState = TMR_OC_STATE_DISABLE; @@ -348,7 +361,7 @@ void TMR_ConfigOCStructInit(TMR_OCConfig_T* OCConfig) * * @retval None */ -void TMR_ConfigICStructInit(TMR_ICConfig_T* ICConfig) +void TMR_ConfigICStructInit(TMR_ICConfig_T *ICConfig) { ICConfig->channel = TMR_CHANNEL_1; ICConfig->polarity = TMR_IC_POLARITY_RISING; @@ -364,7 +377,7 @@ void TMR_ConfigICStructInit(TMR_ICConfig_T* ICConfig) * * @retval None */ -void TMR_ConfigBDTStructInit( TMR_BDTConfig_T* BDTConfig) +void TMR_ConfigBDTStructInit(TMR_BDTConfig_T *BDTConfig) { BDTConfig->RMOS = TMR_RMOS_STATE_DISABLE; BDTConfig->IMOS = TMR_IMOS_STATE_DISABLE; @@ -382,7 +395,7 @@ void TMR_ConfigBDTStructInit( TMR_BDTConfig_T* BDTConfig) * * @retval None */ -void TMR_Enable(TMR_T* tmr) +void TMR_Enable(TMR_T *tmr) { tmr->CTRL1_B.CNTEN = ENABLE; } @@ -394,7 +407,7 @@ void TMR_Enable(TMR_T* tmr) * * @retval None */ -void TMR_Disable(TMR_T* tmr) +void TMR_Disable(TMR_T *tmr) { tmr->CTRL1_B.CNTEN = DISABLE; } @@ -408,7 +421,7 @@ void TMR_Disable(TMR_T* tmr) * * @retval None */ -void TMR_ConfigPWM(TMR_T* tmr, TMR_ICConfig_T* PWMConfig) +void TMR_ConfigPWM(TMR_T *tmr, TMR_ICConfig_T *PWMConfig) { uint16_t icpolarity = TMR_IC_POLARITY_RISING; uint16_t icselection = TMR_IC_SELECTION_DIRECT_TI; @@ -454,7 +467,7 @@ void TMR_ConfigPWM(TMR_T* tmr, TMR_ICConfig_T* PWMConfig) * * @retval None */ -void TMR_EnablePWMOutputs(TMR_T* tmr) +void TMR_EnablePWMOutputs(TMR_T *tmr) { tmr->BDT_B.MOEN = ENABLE; } @@ -466,7 +479,7 @@ void TMR_EnablePWMOutputs(TMR_T* tmr) * * @retval None */ -void TMR_DisablePWMOutputs(TMR_T* tmr) +void TMR_DisablePWMOutputs(TMR_T *tmr) { tmr->BDT_B.MOEN = DISABLE; } @@ -482,9 +495,9 @@ void TMR_DisablePWMOutputs(TMR_T* tmr) * * @retval None */ -void TMR_ConfigDMA(TMR_T* tmr, TMR_DMA_BASE_T baseAddress, TMR_DMA_BURSTLENGTH_T burstLength) +void TMR_ConfigDMA(TMR_T *tmr, TMR_DMA_BASE_T baseAddress, TMR_DMA_BURSTLENGTH_T burstLength) { - tmr->DCTRL = baseAddress | burstLength; + tmr->DCTRL = (uint32_t)baseAddress | (uint32_t)burstLength; } /*! @@ -503,9 +516,8 @@ void TMR_ConfigDMA(TMR_T* tmr, TMR_DMA_BASE_T baseAddress, TMR_DMA_BURSTLENGTH_T * @arg TMR_DMA_SOURCE_TRG: TMR Trigger DMA souces * @retval None * - * @note */ -void TMR_EnableDMASoure(TMR_T* tmr, uint16_t dmaSource) +void TMR_EnableDMASoure(TMR_T *tmr, uint16_t dmaSource) { tmr->DIEN |= dmaSource; } @@ -526,9 +538,8 @@ void TMR_EnableDMASoure(TMR_T* tmr, uint16_t dmaSource) * @arg TMR_DMA_SOURCE_TRG: TMR Trigger DMA souces * @retval None * - * @note */ -void TMR_DisableDMASoure(TMR_T* tmr, uint16_t dmaSource) +void TMR_DisableDMASoure(TMR_T *tmr, uint16_t dmaSource) { tmr->DIEN &= ~dmaSource; } @@ -540,7 +551,7 @@ void TMR_DisableDMASoure(TMR_T* tmr, uint16_t dmaSource) * * @retval None */ -void TMR_ConfigInternalClock(TMR_T* tmr) +void TMR_ConfigInternalClock(TMR_T *tmr) { tmr->SMCTRL_B.SMFSEL = DISABLE; } @@ -558,7 +569,7 @@ void TMR_ConfigInternalClock(TMR_T* tmr) * @arg TMR_TRIGGER_SOURCE_ITR3: TMR Internal Trigger 3 * @retval None */ -void TMR_ConfigIntTrigExternalClock(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource) +void TMR_ConfigIntTrigExternalClock(TMR_T *tmr, TMR_TRIGGER_SOURCE_T triggerSource) { TMR_SelectInputTrigger(tmr, triggerSource); tmr->SMCTRL_B.SMFSEL = 0x07; @@ -584,8 +595,8 @@ void TMR_ConfigIntTrigExternalClock(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSour * * @retval None */ -void TMR_ConfigTrigExternalClock(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource, - TMR_IC_POLARITY_T ICpolarity, uint16_t ICfilter) +void TMR_ConfigTrigExternalClock(TMR_T *tmr, TMR_TRIGGER_SOURCE_T triggerSource, + TMR_IC_POLARITY_T ICpolarity, uint16_t ICfilter) { if (triggerSource == 0x06) { @@ -621,7 +632,7 @@ void TMR_ConfigTrigExternalClock(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource, * * @retval None */ -void TMR_ConfigETRClockMode1(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, +void TMR_ConfigETRClockMode1(TMR_T *tmr, TMR_EXTTRG_PSC_T prescaler, TMR_EXTTRG_POL_T polarity, uint16_t filter) { TMR_ConfigETR(tmr, prescaler, polarity, filter); @@ -651,7 +662,7 @@ void TMR_ConfigETRClockMode1(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, * * @retval None */ -void TMR_ConfigETRClockMode2(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, +void TMR_ConfigETRClockMode2(TMR_T *tmr, TMR_EXTTRG_PSC_T prescaler, TMR_EXTTRG_POL_T polarity, uint16_t filter) { TMR_ConfigETR(tmr, prescaler, polarity, filter); @@ -678,7 +689,7 @@ void TMR_ConfigETRClockMode2(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, * * @retval None */ -void TMR_ConfigETR(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, +void TMR_ConfigETR(TMR_T *tmr, TMR_EXTTRG_PSC_T prescaler, TMR_EXTTRG_POL_T polarity, uint16_t filter) { tmr->SMCTRL &= 0x00FF; @@ -696,11 +707,11 @@ void TMR_ConfigETR(TMR_T* tmr, TMR_EXTTRG_PSC_T prescaler, * * @param pscReloadMode: specifies the TMR prescaler Reload mode * The parameter can be one of following values: - * @arg TMR_PRESCALER_RELOAD_UPDATA: The Prescaler is loaded at the update event - * @arg TMR_PRESCALER_RELOAD_IMMEDIATE: The Prescaler is loaded immediately + * @arg TMR_PSC_RELOAD_UPDATE: The Prescaler is loaded at the update event + * @arg TMR_PSC_RELOAD_IMMEDIATE: The Prescaler is loaded immediately * @retval None */ -void TMR_ConfigPrescaler(TMR_T* tmr, uint16_t prescaler, TMR_PRESCALER_RELOAD_T pscReloadMode) +void TMR_ConfigPrescaler(TMR_T *tmr, uint16_t prescaler, TMR_PSC_RELOAD_T pscReloadMode) { tmr->PSC = prescaler; tmr->CEG_B.UEG = pscReloadMode; @@ -720,7 +731,7 @@ void TMR_ConfigPrescaler(TMR_T* tmr, uint16_t prescaler, TMR_PRESCALER_RELOAD_T * @arg TMR_COUNTER_MODE_CENTERALIGNED3: Timer Center Aligned Mode3 * @retval None */ -void TMR_ConfigCounterMode(TMR_T* tmr, TMR_COUNTER_MODE_T countMode) +void TMR_ConfigCounterMode(TMR_T *tmr, TMR_COUNTER_MODE_T countMode) { tmr->CTRL1_B.CNTDIR = BIT_RESET; tmr->CTRL1_B.CAMSEL = BIT_RESET; @@ -745,7 +756,7 @@ void TMR_ConfigCounterMode(TMR_T* tmr, TMR_COUNTER_MODE_T countMode) * * @retval None */ -void TMR_SelectInputTrigger(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource) +void TMR_SelectInputTrigger(TMR_T *tmr, TMR_TRIGGER_SOURCE_T triggerSource) { tmr->SMCTRL_B.TRGSEL = BIT_RESET; tmr->SMCTRL_B.TRGSEL = triggerSource; @@ -774,7 +785,7 @@ void TMR_SelectInputTrigger(TMR_T* tmr, TMR_TRIGGER_SOURCE_T triggerSource) * @arg TMR_IC_POLARITY_FALLING: TMR IC polarity falling * @retval None */ -void TMR_ConfigEncodeInterface(TMR_T* tmr, TMR_ENCODER_MODE_T encodeMode, TMR_IC_POLARITY_T IC1Polarity, +void TMR_ConfigEncodeInterface(TMR_T *tmr, TMR_ENCODER_MODE_T encodeMode, TMR_IC_POLARITY_T IC1Polarity, TMR_IC_POLARITY_T IC2Polarity) { tmr->SMCTRL_B.SMFSEL = BIT_RESET; @@ -801,7 +812,7 @@ void TMR_ConfigEncodeInterface(TMR_T* tmr, TMR_ENCODER_MODE_T encodeMode, TMR_IC * @arg TMR_FORCED_ACTION_INACTIVE: Force inactive level on OC1REF * @retval None */ -void TMR_ConfigForcedOC1(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) +void TMR_ConfigForcedOC1(TMR_T *tmr, TMR_FORCED_ACTION_T forcesAction) { tmr->CCM1_COMPARE_B.OC1MOD = BIT_RESET; tmr->CCM1_COMPARE_B.OC1MOD = forcesAction; @@ -818,7 +829,7 @@ void TMR_ConfigForcedOC1(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) * @arg TMR_FORCED_ACTION_INACTIVE: Force inactive level on OC1REF * @retval None */ -void TMR_ConfigForcedOC2(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) +void TMR_ConfigForcedOC2(TMR_T *tmr, TMR_FORCED_ACTION_T forcesAction) { tmr->CCM1_COMPARE_B.OC2MOD = BIT_RESET; tmr->CCM1_COMPARE_B.OC2MOD = forcesAction; @@ -836,10 +847,10 @@ void TMR_ConfigForcedOC2(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) * * @retval None */ -void TMR_ConfigForcedOC3(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) +void TMR_ConfigForcedOC3(TMR_T *tmr, TMR_FORCED_ACTION_T forcesAction) { - tmr->CCM2_COMPARE_B.OC3MODE = BIT_RESET; - tmr->CCM2_COMPARE_B.OC3MODE = forcesAction; + tmr->CCM2_COMPARE_B.OC3MOD = BIT_RESET; + tmr->CCM2_COMPARE_B.OC3MOD = forcesAction; } /*! @@ -854,10 +865,10 @@ void TMR_ConfigForcedOC3(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) * * @retval None */ -void TMR_ConfigForcedOC4(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) +void TMR_ConfigForcedOC4(TMR_T *tmr, TMR_FORCED_ACTION_T forcesAction) { - tmr->CCM2_COMPARE_B.OC4MODE = BIT_RESET; - tmr->CCM2_COMPARE_B.OC4MODE = forcesAction; + tmr->CCM2_COMPARE_B.OC4MOD = BIT_RESET; + tmr->CCM2_COMPARE_B.OC4MOD = forcesAction; } /*! @@ -867,7 +878,7 @@ void TMR_ConfigForcedOC4(TMR_T* tmr, TMR_FORCED_ACTION_T forcesAction) * * @retval None */ -void TMR_EnableAUTOReload(TMR_T* tmr) +void TMR_EnableAutoReload(TMR_T *tmr) { tmr->CTRL1_B.ARPEN = ENABLE; } @@ -879,7 +890,7 @@ void TMR_EnableAUTOReload(TMR_T* tmr) * * @retval None */ -void TMR_DisableAUTOReload(TMR_T* tmr) +void TMR_DisableAutoReload(TMR_T *tmr) { tmr->CTRL1_B.ARPEN = DISABLE; } @@ -891,7 +902,7 @@ void TMR_DisableAUTOReload(TMR_T* tmr) * * @retval None */ -void TMR_EnableSelectCOM(TMR_T* tmr) +void TMR_EnableSelectCOM(TMR_T *tmr) { tmr->CTRL2_B.CCUSEL = ENABLE; } @@ -902,7 +913,7 @@ void TMR_EnableSelectCOM(TMR_T* tmr) * * @retval None */ -void TMR_DisableSelectCOM(TMR_T* tmr) +void TMR_DisableSelectCOM(TMR_T *tmr) { tmr->CTRL2_B.CCUSEL = DISABLE; } @@ -914,7 +925,7 @@ void TMR_DisableSelectCOM(TMR_T* tmr) * * @retval None */ -void TMR_EnableCCDMA(TMR_T* tmr) +void TMR_EnableCCDMA(TMR_T *tmr) { tmr->CTRL2_B.CCDSEL = ENABLE; } @@ -926,7 +937,7 @@ void TMR_EnableCCDMA(TMR_T* tmr) * * @retval None */ -void TMR_DisableCCDMA(TMR_T* tmr) +void TMR_DisableCCDMA(TMR_T *tmr) { tmr->CTRL2_B.CCDSEL = DISABLE; } @@ -938,7 +949,7 @@ void TMR_DisableCCDMA(TMR_T* tmr) * * @retval None */ -void TMR_EnableCCPreload(TMR_T* tmr) +void TMR_EnableCCPreload(TMR_T *tmr) { tmr->CTRL2_B.CCPEN = ENABLE; } @@ -950,7 +961,7 @@ void TMR_EnableCCPreload(TMR_T* tmr) * * @retval None */ -void TMR_DisableCCPreload(TMR_T* tmr) +void TMR_DisableCCPreload(TMR_T *tmr) { tmr->CTRL2_B.CCPEN = DISABLE; } @@ -966,7 +977,7 @@ void TMR_DisableCCPreload(TMR_T* tmr) * @arg TMR_OC_PRELOAD_ENABLE * @retval None */ -void TMR_ConfigOC1Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) +void TMR_ConfigOC1Preload(TMR_T *tmr, TMR_OC_PRELOAD_T OCPreload) { tmr->CCM1_COMPARE_B.OC1PEN = OCPreload; } @@ -982,7 +993,7 @@ void TMR_ConfigOC1Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) * @arg TMR_OC_PRELOAD_ENABLE * @retval None */ -void TMR_ConfigOC2Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) +void TMR_ConfigOC2Preload(TMR_T *tmr, TMR_OC_PRELOAD_T OCPreload) { tmr->CCM1_COMPARE_B.OC2PEN = OCPreload; } @@ -998,7 +1009,7 @@ void TMR_ConfigOC2Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) * @arg TMR_OC_PRELOAD_ENABLE * @retval None */ -void TMR_ConfigOC3Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) +void TMR_ConfigOC3Preload(TMR_T *tmr, TMR_OC_PRELOAD_T OCPreload) { tmr->CCM2_COMPARE_B.OC3PEN = OCPreload; } @@ -1014,7 +1025,7 @@ void TMR_ConfigOC3Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) * @arg TMR_OC_PRELOAD_ENABLE * @retval Nonee */ -void TMR_ConfigOC4Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) +void TMR_ConfigOC4Preload(TMR_T *tmr, TMR_OC_PRELOAD_T OCPreload) { tmr->CCM2_COMPARE_B.OC4PEN = OCPreload; } @@ -1030,7 +1041,7 @@ void TMR_ConfigOC4Preload(TMR_T* tmr, TMR_OC_PRELOAD_T OCPreload) * @arg TMR_OC_FAST_ENABLE * @retval None */ -void TMR_ConfigOC1Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) +void TMR_ConfigOC1Fast(TMR_T *tmr, TMR_OC_FAST_T OCFast) { tmr->CCM1_COMPARE_B.OC1FEN = OCFast; } @@ -1046,7 +1057,7 @@ void TMR_ConfigOC1Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) * @arg TMR_OC_FAST_ENABLE * @retval None */ -void TMR_ConfigOC2Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) +void TMR_ConfigOC2Fast(TMR_T *tmr, TMR_OC_FAST_T OCFast) { tmr->CCM1_COMPARE_B.OC2FEN = OCFast; } @@ -1062,7 +1073,7 @@ void TMR_ConfigOC2Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) * @arg TMR_OC_FAST_ENABLE * @retval None */ -void TMR_ConfigOC3Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) +void TMR_ConfigOC3Fast(TMR_T *tmr, TMR_OC_FAST_T OCFast) { tmr->CCM2_COMPARE_B.OC3FEN = OCFast; } @@ -1078,7 +1089,7 @@ void TMR_ConfigOC3Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) * @arg TMR_OC_FAST_ENABLE * @retval None */ -void TMR_ConfigOC4Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) +void TMR_ConfigOC4Fast(TMR_T *tmr, TMR_OC_FAST_T OCFast) { tmr->CCM2_COMPARE_B.OC4FEN = OCFast; } @@ -1094,7 +1105,7 @@ void TMR_ConfigOC4Fast(TMR_T* tmr, TMR_OC_FAST_T OCFast) * @arg TMR_OC_CLEAR_ENABLE * @retval None */ -void TMR_ClearOC1Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) +void TMR_ClearOC1Ref(TMR_T *tmr, TMR_OC_CLEAR_T OCClear) { tmr->CCM1_COMPARE_B.OC1CEN = OCClear; } @@ -1110,7 +1121,7 @@ void TMR_ClearOC1Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) * @arg TMR_OC_CLEAR_ENABLE * @retval None */ -void TMR_ClearOC2Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) +void TMR_ClearOC2Ref(TMR_T *tmr, TMR_OC_CLEAR_T OCClear) { tmr->CCM1_COMPARE_B.OC2CEN = OCClear; } @@ -1126,7 +1137,7 @@ void TMR_ClearOC2Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) * @arg TMR_OC_CLEAR_ENABLE * @retval None */ -void TMR_ClearOC3Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) +void TMR_ClearOC3Ref(TMR_T *tmr, TMR_OC_CLEAR_T OCClear) { tmr->CCM2_COMPARE_B.OC3CEN = OCClear; } @@ -1142,7 +1153,7 @@ void TMR_ClearOC3Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) * @arg TMR_OC_CLEAR_ENABLE * @retval None */ -void TMR_ClearOC4Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) +void TMR_ClearOC4Ref(TMR_T *tmr, TMR_OC_CLEAR_T OCClear) { tmr->CCM2_COMPARE_B.OC4CEN = OCClear; } @@ -1158,7 +1169,7 @@ void TMR_ClearOC4Ref(TMR_T* tmr, TMR_OC_CLEAR_T OCClear) * @arg TMR_OC_POLARITY_LOW: Output Compare active low * @retval Nonee */ -void TMR_ConfigOC1Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) +void TMR_ConfigOC1Polarity(TMR_T *tmr, TMR_OC_POLARITY_T polarity) { tmr->CCEN_B.CC1POL = polarity; } @@ -1174,7 +1185,7 @@ void TMR_ConfigOC1Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) * @arg TMR_OC_NPOLARITY_LOW: Output Compare active low * @retval None */ -void TMR_ConfigOC1NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T nPolarity) +void TMR_ConfigOC1NPolarity(TMR_T *tmr, TMR_OC_NPOLARITY_T nPolarity) { tmr->CCEN_B.CC1NPOL = nPolarity; } @@ -1190,7 +1201,7 @@ void TMR_ConfigOC1NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T nPolarity) * @arg TMR_OC_POLARITY_LOW: Output Compare active low * @retval None */ -void TMR_ConfigOC2Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) +void TMR_ConfigOC2Polarity(TMR_T *tmr, TMR_OC_POLARITY_T polarity) { tmr->CCEN_B.CC2POL = polarity; } @@ -1206,7 +1217,7 @@ void TMR_ConfigOC2Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) * @arg TMR_OC_NPOLARITY_LOW: Output Compare active low * @retval None */ -void TMR_ConfigOC2NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T nPolarity) +void TMR_ConfigOC2NPolarity(TMR_T *tmr, TMR_OC_NPOLARITY_T nPolarity) { tmr->CCEN_B.CC2NPOL = nPolarity; } @@ -1222,7 +1233,7 @@ void TMR_ConfigOC2NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T nPolarity) * @arg TMR_OC_POLARITY_LOW: Output Compare active low * @retval None */ -void TMR_ConfigOC3Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) +void TMR_ConfigOC3Polarity(TMR_T *tmr, TMR_OC_POLARITY_T polarity) { tmr->CCEN_B.CC3POL = polarity; } @@ -1238,7 +1249,7 @@ void TMR_ConfigOC3Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) * @arg TMR_OC_NPOLARITY_LOW: Output Compare active low * @retval None */ -void TMR_ConfigOC3NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T nPolarity) +void TMR_ConfigOC3NPolarity(TMR_T *tmr, TMR_OC_NPOLARITY_T nPolarity) { tmr->CCEN_B.CC3NPOL = nPolarity; } @@ -1254,7 +1265,7 @@ void TMR_ConfigOC3NPolarity(TMR_T* tmr, TMR_OC_NPOLARITY_T nPolarity) * @arg TMR_OC_POLARITY_LOW: Output Compare active low * @retval None */ -void TMR_ConfigOC4Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) +void TMR_ConfigOC4Polarity(TMR_T *tmr, TMR_OC_POLARITY_T polarity) { tmr->CCEN_B.CC4POL = polarity; } @@ -1272,7 +1283,7 @@ void TMR_ConfigOC4Polarity(TMR_T* tmr, TMR_OC_POLARITY_T polarity) * @arg TMR_CHANNEL_4: Timer Channel 4 * @retval None */ -void TMR_EnableCCxChannel(TMR_T* tmr, TMR_CHANNEL_T channel) +void TMR_EnableCCxChannel(TMR_T *tmr, TMR_CHANNEL_T channel) { tmr->CCEN |= BIT_SET << channel; } @@ -1290,7 +1301,7 @@ void TMR_EnableCCxChannel(TMR_T* tmr, TMR_CHANNEL_T channel) * @arg TMR_CHANNEL_4: Timer Channel 4 * @retval None */ -void TMR_DisableCCxChannel(TMR_T* tmr, TMR_CHANNEL_T channel) +void TMR_DisableCCxChannel(TMR_T *tmr, TMR_CHANNEL_T channel) { tmr->CCEN &= BIT_RESET << channel; } @@ -1307,7 +1318,7 @@ void TMR_DisableCCxChannel(TMR_T* tmr, TMR_CHANNEL_T channel) * @arg TMR_CHANNEL_3: Timer Channel 3 * @retval None */ -void TMR_EnableCCxNChannel(TMR_T* tmr, TMR_CHANNEL_T channel) +void TMR_EnableCCxNChannel(TMR_T *tmr, TMR_CHANNEL_T channel) { tmr->CCEN |= 0x04 << channel; } @@ -1324,7 +1335,7 @@ void TMR_EnableCCxNChannel(TMR_T* tmr, TMR_CHANNEL_T channel) * @arg TMR_CHANNEL_3: Timer Channel 3 * @retval None */ -void TMR_DisableCCxNChannel(TMR_T* tmr, TMR_CHANNEL_T channel) +void TMR_DisableCCxNChannel(TMR_T *tmr, TMR_CHANNEL_T channel) { tmr->CCEN &= BIT_RESET << channel; } @@ -1353,7 +1364,7 @@ void TMR_DisableCCxNChannel(TMR_T* tmr, TMR_CHANNEL_T channel) * @arg TMR_OC_MODE_PWM2 * @retval None */ -void TMR_SelectOCxMode(TMR_T* tmr, TMR_CHANNEL_T channel, TMR_OC_MODE_T mode) +void TMR_SelectOCxMode(TMR_T *tmr, TMR_CHANNEL_T channel, TMR_OC_MODE_T mode) { tmr->CCEN &= BIT_RESET << channel; @@ -1367,11 +1378,11 @@ void TMR_SelectOCxMode(TMR_T* tmr, TMR_CHANNEL_T channel, TMR_OC_MODE_T mode) } else if (channel == TMR_CHANNEL_3) { - tmr->CCM2_COMPARE_B.OC3MODE = mode; + tmr->CCM2_COMPARE_B.OC3MOD = mode; } else if (channel == TMR_CHANNEL_4) { - tmr->CCM2_COMPARE_B.OC4MODE = mode; + tmr->CCM2_COMPARE_B.OC4MOD = mode; } } @@ -1382,9 +1393,9 @@ void TMR_SelectOCxMode(TMR_T* tmr, TMR_CHANNEL_T channel, TMR_OC_MODE_T mode) * * @retval None */ -void TMR_EnableNoUpdate(TMR_T* tmr) +void TMR_EnableUpdate(TMR_T *tmr) { - tmr->CTRL1_B.UD = ENABLE; + tmr->CTRL1_B.UD = DISABLE; } /*! @@ -1394,9 +1405,9 @@ void TMR_EnableNoUpdate(TMR_T* tmr) * * @retval None */ -void TMR_DisableNoUpdate(TMR_T* tmr) +void TMR_DisableUpdate(TMR_T *tmr) { - tmr->CTRL1_B.UD = DISABLE; + tmr->CTRL1_B.UD = ENABLE; } /*! @@ -1410,7 +1421,7 @@ void TMR_DisableNoUpdate(TMR_T* tmr) * @arg TMR_UPDATE_SOURCE_REGULAR * @retval None */ -void TMR_ConfigUPdateRequest(TMR_T* tmr, TMR_UPDATE_SOURCE_T updateSource) +void TMR_ConfigUpdateRequest(TMR_T *tmr, TMR_UPDATE_SOURCE_T updateSource) { if (updateSource != TMR_UPDATE_SOURCE_GLOBAL) { @@ -1429,7 +1440,7 @@ void TMR_ConfigUPdateRequest(TMR_T* tmr, TMR_UPDATE_SOURCE_T updateSource) * * @retval None */ -void TMR_EnableHallSensor(TMR_T* tmr) +void TMR_EnableHallSensor(TMR_T *tmr) { tmr->CTRL2_B.TI1SEL = ENABLE; } @@ -1441,13 +1452,13 @@ void TMR_EnableHallSensor(TMR_T* tmr) * * @retval None */ -void TMR_DisableHallSensor(TMR_T* tmr) +void TMR_DisableHallSensor(TMR_T *tmr) { tmr->CTRL2_B.TI1SEL = DISABLE; } /*! - * @brief Selects the Sing pulse Mode. + * @brief Config the Sing pulse Mode. * * @param tmr: The TMRx can be 1 to 8 * @@ -1457,7 +1468,7 @@ void TMR_DisableHallSensor(TMR_T* tmr) * @arg TMR_SPM_SINGLE * @retval None */ -void TMR_SelectSinglePulseMode(TMR_T* tmr, TMR_SPM_T singlePulseMode) +void TMR_ConfigSinglePulseMode(TMR_T *tmr, TMR_SPM_T singlePulseMode) { tmr->CTRL1_B.SPMEN = singlePulseMode; } @@ -1480,7 +1491,7 @@ void TMR_SelectSinglePulseMode(TMR_T* tmr, TMR_SPM_T singlePulseMode) * @arg TMR_TRGO_SOURCE_OC4REF * @retval None */ -void TMR_SelectOutputTrigger(TMR_T* tmr, TMR_TRGO_SOURCE_T TRGOSource) +void TMR_SelectOutputTrigger(TMR_T *tmr, TMR_TRGO_SOURCE_T TRGOSource) { tmr->CTRL2_B.MMSEL = TRGOSource; } @@ -1495,10 +1506,10 @@ void TMR_SelectOutputTrigger(TMR_T* tmr, TMR_TRGO_SOURCE_T TRGOSource) * @arg TMR_SLAVE_MODE_RESET * @arg TMR_SLAVE_MODE_GATED * @arg TMR_SLAVE_MODE_TRIGGER - * @arg TMR_SLAVE_MODE_EXTERNALL + * @arg TMR_SLAVE_MODE_EXTERNAL1 * @retval None */ -void TMR_SelectSlaveMode(TMR_T* tmr, TMR_SLAVE_MODE_T slaveMode) +void TMR_SelectSlaveMode(TMR_T *tmr, TMR_SLAVE_MODE_T slaveMode) { tmr->SMCTRL_B.SMFSEL = slaveMode; } @@ -1510,7 +1521,7 @@ void TMR_SelectSlaveMode(TMR_T* tmr, TMR_SLAVE_MODE_T slaveMode) * * @retval None */ -void TMR_EnableMasterSlaveMode(TMR_T* tmr) +void TMR_EnableMasterSlaveMode(TMR_T *tmr) { tmr->SMCTRL_B.MSMEN = ENABLE; } @@ -1522,7 +1533,7 @@ void TMR_EnableMasterSlaveMode(TMR_T* tmr) * * @retval None */ -void TMR_DisableMasterSlaveMode(TMR_T* tmr) +void TMR_DisableMasterSlaveMode(TMR_T *tmr) { tmr->SMCTRL_B.MSMEN = DISABLE; } @@ -1536,7 +1547,7 @@ void TMR_DisableMasterSlaveMode(TMR_T* tmr) * * @retval None */ -void TMR_ConfigCounter(TMR_T* tmr, uint16_t counter) +void TMR_ConfigCounter(TMR_T *tmr, uint16_t counter) { tmr->CNT = counter; } @@ -1550,7 +1561,7 @@ void TMR_ConfigCounter(TMR_T* tmr, uint16_t counter) * * @retval None */ -void TMR_ConfigAutoreload(TMR_T* tmr, uint16_t autoReload) +void TMR_ConfigAutoreload(TMR_T *tmr, uint16_t autoReload) { tmr->AUTORLD = autoReload; } @@ -1564,7 +1575,7 @@ void TMR_ConfigAutoreload(TMR_T* tmr, uint16_t autoReload) * * @retval None */ -void TMR_ConfigCompare1(TMR_T* tmr, uint16_t compare1) +void TMR_ConfigCompare1(TMR_T *tmr, uint16_t compare1) { tmr->CC1 = compare1; } @@ -1578,7 +1589,7 @@ void TMR_ConfigCompare1(TMR_T* tmr, uint16_t compare1) * * @retval None */ -void TMR_ConfigCompare2(TMR_T* tmr, uint16_t compare2) +void TMR_ConfigCompare2(TMR_T *tmr, uint16_t compare2) { tmr->CC2 = compare2; } @@ -1592,7 +1603,7 @@ void TMR_ConfigCompare2(TMR_T* tmr, uint16_t compare2) * * @retval None */ -void TMR_ConfigCompare3(TMR_T* tmr, uint16_t compare3) +void TMR_ConfigCompare3(TMR_T *tmr, uint16_t compare3) { tmr->CC3 = compare3; } @@ -1606,7 +1617,7 @@ void TMR_ConfigCompare3(TMR_T* tmr, uint16_t compare3) * * @retval None */ -void TMR_ConfigCompare4(TMR_T* tmr, uint16_t compare4) +void TMR_ConfigCompare4(TMR_T *tmr, uint16_t compare4) { tmr->CC4 = compare4; } @@ -1624,7 +1635,7 @@ void TMR_ConfigCompare4(TMR_T* tmr, uint16_t compare4) * @arg TMR_IC_PSC_8: capture is done once every 8 events * @retval None */ -void TMR_ConfigIC1Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) +void TMR_ConfigIC1Prescal(TMR_T *tmr, TMR_IC_PSC_T prescaler) { tmr->CCM1_CAPTURE_B.IC1PSC = BIT_RESET; tmr->CCM1_CAPTURE_B.IC1PSC = prescaler; @@ -1642,7 +1653,7 @@ void TMR_ConfigIC1Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) * @arg TMR_IC_PSC_8: capture is done once every 8 events * @retval None */ -void TMR_ConfigIC2Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) +void TMR_ConfigIC2Prescal(TMR_T *tmr, TMR_IC_PSC_T prescaler) { tmr->CCM1_CAPTURE_B.IC2PSC = BIT_RESET; tmr->CCM1_CAPTURE_B.IC2PSC = prescaler; @@ -1661,7 +1672,7 @@ void TMR_ConfigIC2Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) * @arg TMR_IC_PSC_8: capture is done once every 8 events * @retval None */ -void TMR_ConfigIC3Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) +void TMR_ConfigIC3Prescal(TMR_T *tmr, TMR_IC_PSC_T prescaler) { tmr->CCM2_CAPTURE_B.IC3PSC = BIT_RESET; tmr->CCM2_CAPTURE_B.IC3PSC = prescaler; @@ -1680,7 +1691,7 @@ void TMR_ConfigIC3Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) * @arg TMR_IC_PSC_8: capture is done once every 8 events * @retval None */ -void TMR_ConfigIC4Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) +void TMR_ConfigIC4Prescal(TMR_T *tmr, TMR_IC_PSC_T prescaler) { tmr->CCM2_CAPTURE_B.IC4PSC = BIT_RESET; tmr->CCM2_CAPTURE_B.IC4PSC = prescaler; @@ -1698,7 +1709,7 @@ void TMR_ConfigIC4Prescal(TMR_T* tmr, TMR_IC_PSC_T prescaler) * @arg TMR_CLOCK_DIV_4: TDTS = 4*Tck_tim * @retval None */ -void TMR_ConfigClockDivision(TMR_T* tmr, TMR_CLOCK_DIV_T clockDivision) +void TMR_ConfigClockDivision(TMR_T *tmr, TMR_CLOCK_DIV_T clockDivision) { tmr->CTRL1_B.CLKDIV = clockDivision; } @@ -1710,7 +1721,7 @@ void TMR_ConfigClockDivision(TMR_T* tmr, TMR_CLOCK_DIV_T clockDivision) * * @retval Capture Compare 1 Register value. */ -uint16_t TMR_ReadCaputer1(TMR_T* tmr) +uint16_t TMR_ReadCaputer1(TMR_T *tmr) { return tmr->CC1; } @@ -1722,7 +1733,7 @@ uint16_t TMR_ReadCaputer1(TMR_T* tmr) * * @retval Capture Compare 2 Register value. */ -uint16_t TMR_ReadCaputer2(TMR_T* tmr) +uint16_t TMR_ReadCaputer2(TMR_T *tmr) { return tmr->CC2; } @@ -1734,7 +1745,7 @@ uint16_t TMR_ReadCaputer2(TMR_T* tmr) * * @retval Capture Compare 3 Register value. */ -uint16_t TMR_ReadCaputer3(TMR_T* tmr) +uint16_t TMR_ReadCaputer3(TMR_T *tmr) { return tmr->CC3; } @@ -1746,7 +1757,7 @@ uint16_t TMR_ReadCaputer3(TMR_T* tmr) * * @retval Capture Compare 4 Register value. */ -uint16_t TMR_ReadCaputer4(TMR_T* tmr) +uint16_t TMR_ReadCaputer4(TMR_T *tmr) { return tmr->CC4; } @@ -1758,7 +1769,7 @@ uint16_t TMR_ReadCaputer4(TMR_T* tmr) * * @retval Counter Register value. */ -uint16_t TMR_ReadCounter(TMR_T* tmr) +uint16_t TMR_ReadCounter(TMR_T *tmr) { return tmr->CNT; } @@ -1770,7 +1781,7 @@ uint16_t TMR_ReadCounter(TMR_T* tmr) * * @retval Prescaler Register value. */ -uint16_t TMR_ReadPrescaler(TMR_T* tmr) +uint16_t TMR_ReadPrescaler(TMR_T *tmr) { return tmr->PSC; } @@ -1794,7 +1805,7 @@ uint16_t TMR_ReadPrescaler(TMR_T* tmr) * * @note TMR6 and TMR7 can only generate an TMR_INT_UPDATE. */ -void TMR_EnableInterrupt(TMR_T* tmr, uint16_t interrupt) +void TMR_EnableInterrupt(TMR_T *tmr, uint16_t interrupt) { tmr->DIEN |= interrupt; } @@ -1818,7 +1829,7 @@ void TMR_EnableInterrupt(TMR_T* tmr, uint16_t interrupt) * * @note TMR6 and TMR7 can only generate an TMR_INT_UPDATE. */ -void TMR_DisableInterrupt(TMR_T* tmr, uint16_t interrupt) +void TMR_DisableInterrupt(TMR_T *tmr, uint16_t interrupt) { tmr->DIEN &= ~interrupt; } @@ -1842,7 +1853,7 @@ void TMR_DisableInterrupt(TMR_T* tmr, uint16_t interrupt) * * @note TMR6 and TMR7 can only generate an TMR_EVENT_UPDATE. */ -void TMR_GenerateEvent(TMR_T* tmr, uint16_t eventSources) +void TMR_GenerateEvent(TMR_T *tmr, uint16_t eventSources) { tmr->CEG = eventSources; } @@ -1870,16 +1881,9 @@ void TMR_GenerateEvent(TMR_T* tmr, uint16_t eventSources) * * @note TMR6 and TMR7 can only generate an TMR_FLAG_UPDATE. */ -uint16_t TMR_ReadStatusFlag(TMR_T* tmr, TMR_FLAG_T flag) +uint16_t TMR_ReadStatusFlag(TMR_T *tmr, TMR_FLAG_T flag) { - if ((tmr->STS & flag) != RESET) - { - return SET; - } - else - { - return RESET; - } + return (tmr->STS & flag) ? SET : RESET; } /*! @@ -1905,7 +1909,7 @@ uint16_t TMR_ReadStatusFlag(TMR_T* tmr, TMR_FLAG_T flag) * * @note TMR6 and TMR7 can only generate an TMR_FLAG_UPDATE. */ -void TMR_ClearStatusFlag(TMR_T* tmr, uint16_t flag) +void TMR_ClearStatusFlag(TMR_T *tmr, uint16_t flag) { tmr->STS = ~flag; } @@ -1929,9 +1933,9 @@ void TMR_ClearStatusFlag(TMR_T* tmr, uint16_t flag) * * @note TMR6 and TMR7 can only generate an TMR_INT_UPDATE. */ -uint16_t TMR_ReadIntFlag(TMR_T* tmr, TMR_INT_T flag) +uint16_t TMR_ReadIntFlag(TMR_T *tmr, TMR_INT_T flag) { - if (((tmr->STS & flag) != RESET ) && ((tmr->DIEN & flag) != RESET)) + if (((tmr->STS & flag) != RESET) && ((tmr->DIEN & flag) != RESET)) { return SET; } @@ -1960,7 +1964,7 @@ uint16_t TMR_ReadIntFlag(TMR_T* tmr, TMR_INT_T flag) * * @note TMR6 and TMR7 can only generate an TMR_INT_UPDATE. */ -void TMR_ClearIntFlag(TMR_T* tmr, uint16_t flag) +void TMR_ClearIntFlag(TMR_T *tmr, uint16_t flag) { tmr->STS = ~flag; } @@ -1978,7 +1982,7 @@ void TMR_ClearIntFlag(TMR_T* tmr, uint16_t flag) * * @retval None */ -static void TI1Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) +static void TI1Config(TMR_T *tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) { uint16_t tmpchctrl = 0; @@ -1990,7 +1994,7 @@ static void TI1Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uin tmr->CCM1_CAPTURE_B.IC1F = ICfilter; if ((tmr == TMR1) || (tmr == TMR8) || (tmr == TMR2) || (tmr == TMR3) || - (tmr == TMR4) || (tmr == TMR5)) + (tmr == TMR4) || (tmr == TMR5)) { tmr->CCEN_B.CC1POL = BIT_RESET; tmr->CCEN_B.CC1EN = BIT_SET; @@ -2022,7 +2026,7 @@ static void TI1Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uin * * @retval None */ -static void TI2Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) +static void TI2Config(TMR_T *tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) { uint16_t tmpchctrl = 0; @@ -2034,7 +2038,7 @@ static void TI2Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uin tmr->CCM1_CAPTURE_B.IC2F = ICfilter; if ((tmr == TMR1) || (tmr == TMR8) || (tmr == TMR2) || (tmr == TMR3) || - (tmr == TMR4) || (tmr == TMR5)) + (tmr == TMR4) || (tmr == TMR5)) { tmr->CCEN_B.CC2POL = BIT_RESET; tmr->CCEN_B.CC2EN = BIT_SET; @@ -2066,7 +2070,7 @@ static void TI2Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uin * * @retval None */ -static void TI3Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) +static void TI3Config(TMR_T *tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) { uint16_t tmpchctrl = 0; @@ -2078,7 +2082,7 @@ static void TI3Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uin tmr->CCM2_CAPTURE_B.IC3F = ICfilter; if ((tmr == TMR1) || (tmr == TMR8) || (tmr == TMR2) || (tmr == TMR3) || - (tmr == TMR4) || (tmr == TMR5)) + (tmr == TMR4) || (tmr == TMR5)) { tmr->CCEN_B.CC3POL = BIT_RESET; tmr->CCEN_B.CC3EN = BIT_SET; @@ -2110,7 +2114,7 @@ static void TI3Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uin * * @retval None */ -static void TI4Config(TMR_T* tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) +static void TI4Config(TMR_T *tmr, uint16_t ICpolarity, uint16_t ICselection, uint16_t ICfilter) { uint16_t tmpchctrl = 0; diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_usart.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_usart.c index 23eb7fa355..081c50ce7a 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_usart.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_usart.c @@ -1,12 +1,26 @@ /*! - * @file apm32f10x_usart.c + * @file apm32f10x_usart.c * - * @brief This file provides all the USART firmware functions + * @brief This file provides all the USART firmware functions * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_usart.h" @@ -33,7 +47,7 @@ * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_Reset(USART_T* usart) +void USART_Reset(USART_T *usart) { if (USART1 == usart) { @@ -73,13 +87,15 @@ void USART_Reset(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_Config(USART_T* uart, USART_Config_T* usartConfig) +void USART_Config(USART_T *uart, USART_Config_T *usartConfig) { uint32_t temp, fCLK, intDiv, fractionalDiv; temp = uart->CTRL1; temp &= 0xE9F3; - temp |= usartConfig->mode | usartConfig->parity | usartConfig->wordLength; + temp |= (uint32_t)usartConfig->mode | \ + (uint32_t)usartConfig->parity | \ + (uint32_t)usartConfig->wordLength; uart->CTRL1 = temp; temp = uart->CTRL2; @@ -116,7 +132,7 @@ void USART_Config(USART_T* uart, USART_Config_T* usartConfig) * * @retval None */ -void USART_ConfigStructInit(USART_Config_T* usartConfig) +void USART_ConfigStructInit(USART_Config_T *usartConfig) { usartConfig->baudRate = 9600; usartConfig->wordLength = USART_WORD_LEN_8B; @@ -137,7 +153,7 @@ void USART_ConfigStructInit(USART_Config_T* usartConfig) * * @note The usart can be USART1, USART2, USART3 */ -void USART_ConfigClock(USART_T* usart, USART_ClockConfig_T* clockConfig) +void USART_ConfigClock(USART_T *usart, USART_ClockConfig_T *clockConfig) { usart->CTRL2_B.CLKEN = clockConfig->clock; usart->CTRL2_B.CPHA = clockConfig->phase; @@ -152,9 +168,8 @@ void USART_ConfigClock(USART_T* usart, USART_ClockConfig_T* clockConfig) * * @retval None * - * @note */ -void USART_ConfigClockStructInit(USART_ClockConfig_T* clockConfig) +void USART_ConfigClockStructInit(USART_ClockConfig_T *clockConfig) { clockConfig->clock = USART_CLKEN_DISABLE; clockConfig->phase = USART_CLKPHA_1EDGE; @@ -171,7 +186,7 @@ void USART_ConfigClockStructInit(USART_ClockConfig_T* clockConfig) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_Enable(USART_T* usart) +void USART_Enable(USART_T *usart) { usart->CTRL1_B.UEN = BIT_SET; } @@ -185,7 +200,7 @@ void USART_Enable(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_Disable(USART_T* usart) +void USART_Disable(USART_T *usart) { usart->CTRL1_B.UEN = BIT_RESET; } @@ -205,7 +220,7 @@ void USART_Disable(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_EnableDMA(USART_T* usart, USART_DMA_T dmaReq) +void USART_EnableDMA(USART_T *usart, USART_DMA_T dmaReq) { usart->CTRL3 |= dmaReq; } @@ -225,7 +240,7 @@ void USART_EnableDMA(USART_T* usart, USART_DMA_T dmaReq) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_DisableDMA(USART_T* usart, USART_DMA_T dmaReq) +void USART_DisableDMA(USART_T *usart, USART_DMA_T dmaReq) { usart->CTRL3 &= (uint32_t)~dmaReq; } @@ -241,7 +256,7 @@ void USART_DisableDMA(USART_T* usart, USART_DMA_T dmaReq) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_Address(USART_T* usart, uint8_t address) +void USART_Address(USART_T *usart, uint8_t address) { usart->CTRL2_B.ADDR = address; } @@ -260,7 +275,7 @@ void USART_Address(USART_T* usart, uint8_t address) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_ConfigWakeUp(USART_T* usart, USART_WAKEUP_T wakeup) +void USART_ConfigWakeUp(USART_T *usart, USART_WAKEUP_T wakeup) { usart->CTRL1_B.WUPMCFG = wakeup; } @@ -274,7 +289,7 @@ void USART_ConfigWakeUp(USART_T* usart, USART_WAKEUP_T wakeup) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_EnableMuteMode(USART_T* usart) +void USART_EnableMuteMode(USART_T *usart) { usart->CTRL1_B.RXMUTEEN = BIT_SET; } @@ -288,7 +303,7 @@ void USART_EnableMuteMode(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_DisableMuteMode(USART_T* usart) +void USART_DisableMuteMode(USART_T *usart) { usart->CTRL1_B.RXMUTEEN = BIT_RESET; } @@ -307,7 +322,7 @@ void USART_DisableMuteMode(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_ConfigLINBreakDetectLength(USART_T* usart, USART_LBDL_T length) +void USART_ConfigLINBreakDetectLength(USART_T *usart, USART_LBDL_T length) { usart->CTRL2_B.LBDLCFG = length; } @@ -321,7 +336,7 @@ void USART_ConfigLINBreakDetectLength(USART_T* usart, USART_LBDL_T length) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_EnableLIN(USART_T* usart) +void USART_EnableLIN(USART_T *usart) { usart->CTRL2_B.LINMEN = BIT_SET; } @@ -335,7 +350,7 @@ void USART_EnableLIN(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_DisableLIN(USART_T* usart) +void USART_DisableLIN(USART_T *usart) { usart->CTRL2_B.LINMEN = BIT_RESET; } @@ -349,7 +364,7 @@ void USART_DisableLIN(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_EnableTx(USART_T* usart) +void USART_EnableTx(USART_T *usart) { usart->CTRL1_B.TXEN = BIT_SET; } @@ -363,7 +378,7 @@ void USART_EnableTx(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_DisableTx(USART_T* usart) +void USART_DisableTx(USART_T *usart) { usart->CTRL1_B.TXEN = BIT_RESET; } @@ -377,7 +392,7 @@ void USART_DisableTx(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_EnableRx(USART_T* usart) +void USART_EnableRx(USART_T *usart) { usart->CTRL1_B.RXEN = BIT_SET; } @@ -391,7 +406,7 @@ void USART_EnableRx(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_DisableRx(USART_T* usart) +void USART_DisableRx(USART_T *usart) { usart->CTRL1_B.RXEN = BIT_RESET; } @@ -407,7 +422,7 @@ void USART_DisableRx(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_TxData(USART_T* usart, uint16_t data) +void USART_TxData(USART_T *usart, uint16_t data) { usart->DATA_B.DATA = data; } @@ -421,7 +436,7 @@ void USART_TxData(USART_T* usart, uint16_t data) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -uint16_t USART_RxData(USART_T* usart) +uint16_t USART_RxData(USART_T *usart) { return (uint16_t)(usart->DATA_B.DATA); } @@ -435,7 +450,7 @@ uint16_t USART_RxData(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_TxBreak(USART_T* usart) +void USART_TxBreak(USART_T *usart) { usart->CTRL1_B.TXBF = BIT_SET; } @@ -451,7 +466,7 @@ void USART_TxBreak(USART_T* usart) * * @note The usart can be USART1, USART2, USART3 */ -void USART_ConfigGuardTime(USART_T* usart, uint8_t guardTime) +void USART_ConfigGuardTime(USART_T *usart, uint8_t guardTime) { usart->GTPSC_B.GRDT = guardTime; } @@ -467,7 +482,7 @@ void USART_ConfigGuardTime(USART_T* usart, uint8_t guardTime) * * @note The usart can be USART1, USART2, USART3 */ -void USART_ConfigPrescaler(USART_T* usart, uint8_t div) +void USART_ConfigPrescaler(USART_T *usart, uint8_t div) { usart->GTPSC_B.PSC = div; } @@ -481,7 +496,7 @@ void USART_ConfigPrescaler(USART_T* usart, uint8_t div) * * @note The Smart Card mode is not available for UART4 and UART5 */ -void USART_EnableSmartCard(USART_T* usart) +void USART_EnableSmartCard(USART_T *usart) { usart->CTRL3_B.SCEN = BIT_SET; } @@ -495,7 +510,7 @@ void USART_EnableSmartCard(USART_T* usart) * * @note The Smart Card mode is not available for UART4 and UART5 */ -void USART_DisableSmartCard(USART_T* usart) +void USART_DisableSmartCard(USART_T *usart) { usart->CTRL3_B.SCEN = BIT_RESET; } @@ -509,7 +524,7 @@ void USART_DisableSmartCard(USART_T* usart) * * @note The Smart Card mode is not available for UART4 and UART5 */ -void USART_EnableSmartCardNACK(USART_T* usart) +void USART_EnableSmartCardNACK(USART_T *usart) { usart->CTRL3_B.SCNACKEN = BIT_SET; } @@ -523,7 +538,7 @@ void USART_EnableSmartCardNACK(USART_T* usart) * * @note The Smart Card mode is not available for UART4 and UART5 */ -void USART_DisableSmartCardNACK(USART_T* usart) +void USART_DisableSmartCardNACK(USART_T *usart) { usart->CTRL3_B.SCNACKEN = BIT_RESET; } @@ -537,7 +552,7 @@ void USART_DisableSmartCardNACK(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_EnableHalfDuplex(USART_T* usart) +void USART_EnableHalfDuplex(USART_T *usart) { usart->CTRL3_B.HDEN = BIT_SET; } @@ -551,7 +566,7 @@ void USART_EnableHalfDuplex(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_DisableHalfDuplex(USART_T* usart) +void USART_DisableHalfDuplex(USART_T *usart) { usart->CTRL3_B.HDEN = BIT_RESET; } @@ -569,7 +584,7 @@ void USART_DisableHalfDuplex(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_ConfigIrDA(USART_T* usart, USART_IRDALP_T IrDAMode) +void USART_ConfigIrDA(USART_T *usart, USART_IRDALP_T IrDAMode) { usart->CTRL3_B.IRLPEN = IrDAMode; } @@ -583,7 +598,7 @@ void USART_ConfigIrDA(USART_T* usart, USART_IRDALP_T IrDAMode) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_EnableIrDA(USART_T* usart) +void USART_EnableIrDA(USART_T *usart) { usart->CTRL3_B.IREN = BIT_SET; } @@ -597,7 +612,7 @@ void USART_EnableIrDA(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_DisableIrDA(USART_T* usart) +void USART_DisableIrDA(USART_T *usart) { usart->CTRL3_B.IREN = BIT_RESET; } @@ -622,23 +637,23 @@ void USART_DisableIrDA(USART_T* usart) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_EnableInterrupt(USART_T* usart, USART_INT_T interrupt) +void USART_EnableInterrupt(USART_T *usart, USART_INT_T interrupt) { uint32_t temp; temp = (uint32_t)(interrupt & 0xffff); - if (interrupt & 0X10000) + if (interrupt & 0x10000) { usart->CTRL1 |= temp; } - if (interrupt & 0X20000) + if (interrupt & 0x20000) { usart->CTRL2 |= temp; } - if (interrupt & 0X40000) + if (interrupt & 0x40000) { usart->CTRL3 |= temp; } @@ -664,23 +679,23 @@ void USART_EnableInterrupt(USART_T* usart, USART_INT_T interrupt) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_DisableInterrupt(USART_T* usart, USART_INT_T interrupt) +void USART_DisableInterrupt(USART_T *usart, USART_INT_T interrupt) { uint32_t temp; temp = (uint32_t)~(interrupt & 0xffff); - if (interrupt & 0X10000) + if (interrupt & 0x10000) { usart->CTRL1 &= temp; } - if (interrupt & 0X20000) + if (interrupt & 0x20000) { usart->CTRL2 &= temp; } - if (interrupt & 0X40000) + if (interrupt & 0x40000) { usart->CTRL3 &= temp; } @@ -708,7 +723,7 @@ void USART_DisableInterrupt(USART_T* usart, USART_INT_T interrupt) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -uint8_t USART_ReadStatusFlag(USART_T* usart, USART_FLAG_T flag) +uint8_t USART_ReadStatusFlag(USART_T *usart, USART_FLAG_T flag) { return (usart->STS & flag) ? SET : RESET; } @@ -729,7 +744,7 @@ uint8_t USART_ReadStatusFlag(USART_T* usart, USART_FLAG_T flag) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_ClearStatusFlag(USART_T* usart, USART_FLAG_T flag) +void USART_ClearStatusFlag(USART_T *usart, USART_FLAG_T flag) { usart->STS &= (uint32_t)~flag; } @@ -756,7 +771,7 @@ void USART_ClearStatusFlag(USART_T* usart, USART_FLAG_T flag) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -uint8_t USART_ReadIntFlag(USART_T* usart, USART_INT_T flag) +uint8_t USART_ReadIntFlag(USART_T *usart, USART_INT_T flag) { uint32_t itFlag, srFlag; @@ -801,7 +816,7 @@ uint8_t USART_ReadIntFlag(USART_T* usart, USART_INT_T flag) * * @note The usart can be USART1, USART2, USART3, UART4 and UART5 */ -void USART_ClearIntFlag(USART_T* usart, USART_INT_T flag) +void USART_ClearIntFlag(USART_T *usart, USART_INT_T flag) { uint32_t srFlag; diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_wwdt.c b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_wwdt.c index 6e374cd5b4..e7a65ea69d 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_wwdt.c +++ b/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_wwdt.c @@ -3,10 +3,24 @@ * * @brief This file contains all the functions for the WWDT peripheral * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x_wwdt.h" @@ -125,7 +139,7 @@ void WWDT_Enable(uint8_t counter) */ uint8_t WWDT_ReadFlag(void) { - return (uint8_t) (WWDT->STS); + return (uint8_t)(WWDT->STS); } /*! @@ -141,5 +155,5 @@ void WWDT_ClearFlag(void) } /**@} end of group WWDT_Fuctions*/ -/**@} end of group WWDT_Driver */ +/**@} end of group WWDT_Driver*/ /**@} end of group Peripherals_Library*/ diff --git a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/LICENSE.txt b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/LICENSE.txt new file mode 100644 index 0000000000..f0cd2d9ccf --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/LICENSE.txt @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_armcc.h b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_armcc.h index a19425d9fe..81ac0625f4 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_armcc.h +++ b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_armcc.h @@ -1,11 +1,11 @@ /**************************************************************************//** * @file cmsis_armcc.h * @brief CMSIS compiler ARMCC (Arm Compiler 5) header file - * @version V5.1.0 - * @date 08. May 2019 + * @version V5.0.4 + * @date 10. January 2018 ******************************************************************************/ /* - * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -27,107 +27,78 @@ #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) - #error "Please use Arm Compiler Toolchain V4.0.677 or later!" + #error "Please use Arm Compiler Toolchain V4.0.677 or later!" #endif /* CMSIS compiler control architecture macros */ #if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) - #define __ARM_ARCH_6M__ 1 +#define __ARM_ARCH_6M__ 1 #endif #if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) - #define __ARM_ARCH_7M__ 1 + #define __ARM_ARCH_7M__ 1 #endif #if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) - #define __ARM_ARCH_7EM__ 1 + #define __ARM_ARCH_7EM__ 1 #endif - /* __ARM_ARCH_8M_BASE__ not applicable */ - /* __ARM_ARCH_8M_MAIN__ not applicable */ +/* __ARM_ARCH_8M_BASE__ not applicable */ +/* __ARM_ARCH_8M_MAIN__ not applicable */ -/* CMSIS compiler control DSP macros */ -#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - #define __ARM_FEATURE_DSP 1 -#endif /* CMSIS compiler specific defines */ #ifndef __ASM - #define __ASM __asm + #define __ASM __asm #endif #ifndef __INLINE - #define __INLINE __inline + #define __INLINE __inline #endif #ifndef __STATIC_INLINE - #define __STATIC_INLINE static __inline + #define __STATIC_INLINE static __inline #endif #ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE static __forceinline + #define __STATIC_FORCEINLINE static __forceinline #endif #ifndef __NO_RETURN - #define __NO_RETURN __declspec(noreturn) + #define __NO_RETURN __declspec(noreturn) #endif #ifndef __USED - #define __USED __attribute__((used)) + #define __USED __attribute__((used)) #endif #ifndef __WEAK - #define __WEAK __attribute__((weak)) + #define __WEAK __attribute__((weak)) #endif #ifndef __PACKED - #define __PACKED __attribute__((packed)) + #define __PACKED __attribute__((packed)) #endif #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT __packed struct + #define __PACKED_STRUCT __packed struct #endif #ifndef __PACKED_UNION - #define __PACKED_UNION __packed union + #define __PACKED_UNION __packed union #endif #ifndef __UNALIGNED_UINT32 /* deprecated */ - #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) + #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) #endif #ifndef __UNALIGNED_UINT16_WRITE - #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) #endif #ifndef __UNALIGNED_UINT16_READ - #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) #endif #ifndef __UNALIGNED_UINT32_WRITE - #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) #endif #ifndef __UNALIGNED_UINT32_READ - #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) #endif #ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) + #define __ALIGNED(x) __attribute__((aligned(x))) #endif #ifndef __RESTRICT - #define __RESTRICT __restrict -#endif -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __memory_changed() -#endif - -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START -#define __PROGRAM_START __main -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) + #define __RESTRICT __restrict #endif /* ########################### Core Function Access ########################### */ @@ -158,8 +129,8 @@ */ __STATIC_INLINE uint32_t __get_CONTROL(void) { - register uint32_t __regControl __ASM("control"); - return(__regControl); + register uint32_t __regControl __ASM("control"); + return (__regControl); } @@ -170,8 +141,8 @@ __STATIC_INLINE uint32_t __get_CONTROL(void) */ __STATIC_INLINE void __set_CONTROL(uint32_t control) { - register uint32_t __regControl __ASM("control"); - __regControl = control; + register uint32_t __regControl __ASM("control"); + __regControl = control; } @@ -182,8 +153,8 @@ __STATIC_INLINE void __set_CONTROL(uint32_t control) */ __STATIC_INLINE uint32_t __get_IPSR(void) { - register uint32_t __regIPSR __ASM("ipsr"); - return(__regIPSR); + register uint32_t __regIPSR __ASM("ipsr"); + return (__regIPSR); } @@ -194,8 +165,8 @@ __STATIC_INLINE uint32_t __get_IPSR(void) */ __STATIC_INLINE uint32_t __get_APSR(void) { - register uint32_t __regAPSR __ASM("apsr"); - return(__regAPSR); + register uint32_t __regAPSR __ASM("apsr"); + return (__regAPSR); } @@ -206,8 +177,8 @@ __STATIC_INLINE uint32_t __get_APSR(void) */ __STATIC_INLINE uint32_t __get_xPSR(void) { - register uint32_t __regXPSR __ASM("xpsr"); - return(__regXPSR); + register uint32_t __regXPSR __ASM("xpsr"); + return (__regXPSR); } @@ -218,8 +189,8 @@ __STATIC_INLINE uint32_t __get_xPSR(void) */ __STATIC_INLINE uint32_t __get_PSP(void) { - register uint32_t __regProcessStackPointer __ASM("psp"); - return(__regProcessStackPointer); + register uint32_t __regProcessStackPointer __ASM("psp"); + return (__regProcessStackPointer); } @@ -230,8 +201,8 @@ __STATIC_INLINE uint32_t __get_PSP(void) */ __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) { - register uint32_t __regProcessStackPointer __ASM("psp"); - __regProcessStackPointer = topOfProcStack; + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; } @@ -242,8 +213,8 @@ __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) */ __STATIC_INLINE uint32_t __get_MSP(void) { - register uint32_t __regMainStackPointer __ASM("msp"); - return(__regMainStackPointer); + register uint32_t __regMainStackPointer __ASM("msp"); + return (__regMainStackPointer); } @@ -254,8 +225,8 @@ __STATIC_INLINE uint32_t __get_MSP(void) */ __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) { - register uint32_t __regMainStackPointer __ASM("msp"); - __regMainStackPointer = topOfMainStack; + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; } @@ -266,8 +237,8 @@ __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) */ __STATIC_INLINE uint32_t __get_PRIMASK(void) { - register uint32_t __regPriMask __ASM("primask"); - return(__regPriMask); + register uint32_t __regPriMask __ASM("primask"); + return (__regPriMask); } @@ -278,8 +249,8 @@ __STATIC_INLINE uint32_t __get_PRIMASK(void) */ __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) { - register uint32_t __regPriMask __ASM("primask"); - __regPriMask = (priMask); + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); } @@ -309,8 +280,8 @@ __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) */ __STATIC_INLINE uint32_t __get_BASEPRI(void) { - register uint32_t __regBasePri __ASM("basepri"); - return(__regBasePri); + register uint32_t __regBasePri __ASM("basepri"); + return (__regBasePri); } @@ -321,8 +292,8 @@ __STATIC_INLINE uint32_t __get_BASEPRI(void) */ __STATIC_INLINE void __set_BASEPRI(uint32_t basePri) { - register uint32_t __regBasePri __ASM("basepri"); - __regBasePri = (basePri & 0xFFU); + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xFFU); } @@ -334,8 +305,8 @@ __STATIC_INLINE void __set_BASEPRI(uint32_t basePri) */ __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) { - register uint32_t __regBasePriMax __ASM("basepri_max"); - __regBasePriMax = (basePri & 0xFFU); + register uint32_t __regBasePriMax __ASM("basepri_max"); + __regBasePriMax = (basePri & 0xFFU); } @@ -346,8 +317,8 @@ __STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) */ __STATIC_INLINE uint32_t __get_FAULTMASK(void) { - register uint32_t __regFaultMask __ASM("faultmask"); - return(__regFaultMask); + register uint32_t __regFaultMask __ASM("faultmask"); + return (__regFaultMask); } @@ -358,8 +329,8 @@ __STATIC_INLINE uint32_t __get_FAULTMASK(void) */ __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) { - register uint32_t __regFaultMask __ASM("faultmask"); - __regFaultMask = (faultMask & (uint32_t)1U); + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1U); } #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ @@ -375,10 +346,10 @@ __STATIC_INLINE uint32_t __get_FPSCR(void) { #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - register uint32_t __regfpscr __ASM("fpscr"); - return(__regfpscr); + register uint32_t __regfpscr __ASM("fpscr"); + return (__regfpscr); #else - return(0U); + return (0U); #endif } @@ -392,10 +363,10 @@ __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) { #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) - register uint32_t __regfpscr __ASM("fpscr"); - __regfpscr = (fpscr); + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); #else - (void)fpscr; + (void)fpscr; #endif } @@ -491,8 +462,8 @@ __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) #ifndef __NO_EMBEDDED_ASM __attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) { - rev16 r0, r0 - bx lr + rev16 r0, r0 + bx lr } #endif @@ -506,8 +477,8 @@ __attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(u #ifndef __NO_EMBEDDED_ASM __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) { - revsh r0, r0 - bx lr + revsh r0, r0 + bx lr } #endif @@ -540,22 +511,22 @@ __attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(in */ #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) - #define __RBIT __rbit +#define __RBIT __rbit #else __attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) { - uint32_t result; - uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + uint32_t result; + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ - result = value; /* r will be reversed bits of v; first get LSB of v */ - for (value >>= 1U; value != 0U; value >>= 1U) - { - result <<= 1U; - result |= value & 1U; - s--; - } - result <<= s; /* shift when v's highest bits are zero */ - return result; + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ + return result; } #endif @@ -579,9 +550,9 @@ __attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) \return value of type uint8_t at (*ptr) */ #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) #else - #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") #endif @@ -592,9 +563,9 @@ __attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) \return value of type uint16_t at (*ptr) */ #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) #else - #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") #endif @@ -605,9 +576,9 @@ __attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) \return value of type uint32_t at (*ptr) */ #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) #else - #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") #endif @@ -620,9 +591,9 @@ __attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) \return 1 Function failed */ #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXB(value, ptr) __strex(value, ptr) + #define __STREXB(value, ptr) __strex(value, ptr) #else - #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") #endif @@ -635,9 +606,9 @@ __attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) \return 1 Function failed */ #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXH(value, ptr) __strex(value, ptr) + #define __STREXH(value, ptr) __strex(value, ptr) #else - #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") #endif @@ -650,9 +621,9 @@ __attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) \return 1 Function failed */ #if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) - #define __STREXW(value, ptr) __strex(value, ptr) + #define __STREXW(value, ptr) __strex(value, ptr) #else - #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") #endif @@ -693,8 +664,8 @@ __attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) #ifndef __NO_EMBEDDED_ASM __attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) { - rrx r0, r0 - bx lr + rrx r0, r0 + bx lr } #endif @@ -764,20 +735,20 @@ __attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint3 */ __attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) { - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) + if ((sat >= 1U) && (sat <= 32U)) { - return max; + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } } - else if (val < min) - { - return min; - } - } - return val; + return val; } /** @@ -789,25 +760,25 @@ __attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint3 */ __attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) { - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) + if (sat <= 31U) { - return max; + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; + return (uint32_t)val; } #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ -/**@}*/ /* end of group CMSIS_Core_InstructionInterface */ +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ /* ################### Compiler specific Intrinsics ########################### */ @@ -888,7 +859,7 @@ __attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint ((int64_t)(ARG3) << 32U) ) >> 32U)) #endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ -/**@} end of group CMSIS_SIMD_intrinsics */ +/*@} end of group CMSIS_SIMD_intrinsics */ #endif /* __CMSIS_ARMCC_H */ diff --git a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_armclang.h b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_armclang.h index ef919934c5..a25b249fe1 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_armclang.h +++ b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_armclang.h @@ -1,11 +1,11 @@ /**************************************************************************//** * @file cmsis_armclang.h * @brief CMSIS compiler armclang (Arm Compiler 6) header file - * @version V5.2.0 - * @date 08. May 2019 + * @version V5.0.4 + * @date 10. January 2018 ******************************************************************************/ /* - * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -30,111 +30,90 @@ #pragma clang system_header /* treat file as system include file */ #ifndef __ARM_COMPAT_H -#include /* Compatibility header for Arm Compiler 5 intrinsics */ + #include /* Compatibility header for Arm Compiler 5 intrinsics */ #endif /* CMSIS compiler specific defines */ #ifndef __ASM - #define __ASM __asm + #define __ASM __asm #endif #ifndef __INLINE - #define __INLINE __inline + #define __INLINE __inline #endif #ifndef __STATIC_INLINE - #define __STATIC_INLINE static __inline + #define __STATIC_INLINE static __inline #endif #ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline #endif #ifndef __NO_RETURN - #define __NO_RETURN __attribute__((__noreturn__)) + #define __NO_RETURN __attribute__((__noreturn__)) #endif #ifndef __USED - #define __USED __attribute__((used)) + #define __USED __attribute__((used)) #endif #ifndef __WEAK - #define __WEAK __attribute__((weak)) + #define __WEAK __attribute__((weak)) #endif #ifndef __PACKED - #define __PACKED __attribute__((packed, aligned(1))) + #define __PACKED __attribute__((packed, aligned(1))) #endif #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) #endif #ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #define __PACKED_UNION union __attribute__((packed, aligned(1))) #endif #ifndef __UNALIGNED_UINT32 /* deprecated */ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpacked" /*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +struct __attribute__((packed)) T_UINT32 +{ + uint32_t v; +}; +#pragma clang diagnostic pop +#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) #endif #ifndef __UNALIGNED_UINT16_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpacked" /*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; +#pragma clang diagnostic pop +#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) #endif #ifndef __UNALIGNED_UINT16_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpacked" /*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +__PACKED_STRUCT T_UINT16_READ { uint16_t v; }; +#pragma clang diagnostic pop +#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) #endif #ifndef __UNALIGNED_UINT32_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpacked" /*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; +#pragma clang diagnostic pop +#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) #endif #ifndef __UNALIGNED_UINT32_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpacked" /*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +__PACKED_STRUCT T_UINT32_READ { uint32_t v; }; +#pragma clang diagnostic pop +#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) #endif #ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) + #define __ALIGNED(x) __attribute__((aligned(x))) #endif #ifndef __RESTRICT - #define __RESTRICT __restrict -#endif -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") + #define __RESTRICT __restrict #endif -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START -#define __PROGRAM_START __main -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) -#endif /* ########################### Core Function Access ########################### */ /** \ingroup CMSIS_Core_FunctionInterface @@ -165,10 +144,10 @@ */ __STATIC_FORCEINLINE uint32_t __get_CONTROL(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, control" : "=r"(result)); + return (result); } @@ -180,10 +159,10 @@ __STATIC_FORCEINLINE uint32_t __get_CONTROL(void) */ __STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, control_ns" : "=r"(result)); + return (result); } #endif @@ -195,7 +174,7 @@ __STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) */ __STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) { - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); + __ASM volatile("MSR control, %0" : : "r"(control) : "memory"); } @@ -207,7 +186,7 @@ __STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) */ __STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) { - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); + __ASM volatile("MSR control_ns, %0" : : "r"(control) : "memory"); } #endif @@ -219,10 +198,10 @@ __STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) */ __STATIC_FORCEINLINE uint32_t __get_IPSR(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, ipsr" : "=r"(result)); + return (result); } @@ -233,10 +212,10 @@ __STATIC_FORCEINLINE uint32_t __get_IPSR(void) */ __STATIC_FORCEINLINE uint32_t __get_APSR(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, apsr" : "=r"(result)); + return (result); } @@ -247,10 +226,10 @@ __STATIC_FORCEINLINE uint32_t __get_APSR(void) */ __STATIC_FORCEINLINE uint32_t __get_xPSR(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, xpsr" : "=r"(result)); + return (result); } @@ -261,10 +240,10 @@ __STATIC_FORCEINLINE uint32_t __get_xPSR(void) */ __STATIC_FORCEINLINE uint32_t __get_PSP(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, psp" : "=r"(result)); + return (result); } @@ -276,10 +255,10 @@ __STATIC_FORCEINLINE uint32_t __get_PSP(void) */ __STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, psp_ns" : "=r"(result)); + return (result); } #endif @@ -291,7 +270,7 @@ __STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) */ __STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) { - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); + __ASM volatile("MSR psp, %0" : : "r"(topOfProcStack) :); } @@ -303,7 +282,7 @@ __STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) */ __STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) { - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); + __ASM volatile("MSR psp_ns, %0" : : "r"(topOfProcStack) :); } #endif @@ -315,10 +294,10 @@ __STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) */ __STATIC_FORCEINLINE uint32_t __get_MSP(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, msp" : "=r"(result)); + return (result); } @@ -330,10 +309,10 @@ __STATIC_FORCEINLINE uint32_t __get_MSP(void) */ __STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, msp_ns" : "=r"(result)); + return (result); } #endif @@ -345,7 +324,7 @@ __STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) */ __STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) { - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); + __ASM volatile("MSR msp, %0" : : "r"(topOfMainStack) :); } @@ -357,7 +336,7 @@ __STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) */ __STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) { - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); + __ASM volatile("MSR msp_ns, %0" : : "r"(topOfMainStack) :); } #endif @@ -370,10 +349,10 @@ __STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) */ __STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, sp_ns" : "=r"(result)); + return (result); } @@ -384,7 +363,7 @@ __STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) */ __STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) { - __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); + __ASM volatile("MSR sp_ns, %0" : : "r"(topOfStack) :); } #endif @@ -396,10 +375,10 @@ __STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) */ __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, primask" : "=r"(result)); + return (result); } @@ -411,10 +390,10 @@ __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) */ __STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, primask_ns" : "=r"(result)); + return (result); } #endif @@ -426,7 +405,7 @@ __STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) */ __STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) { - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); + __ASM volatile("MSR primask, %0" : : "r"(priMask) : "memory"); } @@ -438,7 +417,7 @@ __STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) */ __STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) { - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); + __ASM volatile("MSR primask_ns, %0" : : "r"(priMask) : "memory"); } #endif @@ -469,10 +448,10 @@ __STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) */ __STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, basepri" : "=r"(result)); + return (result); } @@ -484,10 +463,10 @@ __STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) */ __STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, basepri_ns" : "=r"(result)); + return (result); } #endif @@ -499,7 +478,7 @@ __STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) */ __STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) { - __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); + __ASM volatile("MSR basepri, %0" : : "r"(basePri) : "memory"); } @@ -511,7 +490,7 @@ __STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) */ __STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) { - __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); + __ASM volatile("MSR basepri_ns, %0" : : "r"(basePri) : "memory"); } #endif @@ -524,7 +503,7 @@ __STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) */ __STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) { - __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); + __ASM volatile("MSR basepri_max, %0" : : "r"(basePri) : "memory"); } @@ -535,10 +514,10 @@ __STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) */ __STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, faultmask" : "=r"(result)); + return (result); } @@ -550,10 +529,10 @@ __STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) */ __STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, faultmask_ns" : "=r"(result)); + return (result); } #endif @@ -565,7 +544,7 @@ __STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) */ __STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) { - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); + __ASM volatile("MSR faultmask, %0" : : "r"(faultMask) : "memory"); } @@ -577,7 +556,7 @@ __STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) */ __STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) { - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); + __ASM volatile("MSR faultmask_ns, %0" : : "r"(faultMask) : "memory"); } #endif @@ -603,11 +582,11 @@ __STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; + return 0U; #else - uint32_t result; - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return result; + uint32_t result; + __ASM volatile("MRS %0, psplim" : "=r"(result)); + return result; #endif } @@ -624,12 +603,12 @@ __STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) __STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) { #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; #else - uint32_t result; - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return result; + uint32_t result; + __ASM volatile("MRS %0, psplim_ns" : "=r"(result)); + return result; #endif } #endif @@ -648,10 +627,10 @@ __STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) { #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; #else - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); + __ASM volatile("MSR psplim, %0" : : "r"(ProcStackPtrLimit)); #endif } @@ -669,10 +648,10 @@ __STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) __STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) { #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; #else - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); + __ASM volatile("MSR psplim_ns, %0\n" : : "r"(ProcStackPtrLimit)); #endif } #endif @@ -690,12 +669,12 @@ __STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) { #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; #else - uint32_t result; - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - return result; + uint32_t result; + __ASM volatile("MRS %0, msplim" : "=r"(result)); + return result; #endif } @@ -712,12 +691,12 @@ __STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) __STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) { #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; #else - uint32_t result; - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return result; + uint32_t result; + __ASM volatile("MRS %0, msplim_ns" : "=r"(result)); + return result; #endif } #endif @@ -735,10 +714,10 @@ __STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) { #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; #else - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); + __ASM volatile("MSR msplim, %0" : : "r"(MainStackPtrLimit)); #endif } @@ -755,10 +734,10 @@ __STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) { #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; #else - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); + __ASM volatile("MSR msplim_ns, %0" : : "r"(MainStackPtrLimit)); #endif } #endif @@ -804,13 +783,11 @@ __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) * For thumb1, use low register (r0-r7), specified by constraint "l" * Otherwise, use general registers, specified by constraint "r" */ #if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_RW_REG(r) "+l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) + #define __CMSIS_GCC_OUT_REG(r) "=l" (r) + #define __CMSIS_GCC_USE_REG(r) "l" (r) #else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_RW_REG(r) "+r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) + #define __CMSIS_GCC_OUT_REG(r) "=r" (r) + #define __CMSIS_GCC_USE_REG(r) "r" (r) #endif /** @@ -847,14 +824,14 @@ __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) so that all instructions following the ISB are fetched from cache or memory, after the instruction has been completed. */ -#define __ISB() __builtin_arm_isb(0xF) +#define __ISB() __builtin_arm_isb(0xF); /** \brief Data Synchronization Barrier \details Acts as a special kind of Data Memory Barrier. It completes when all explicit memory accesses before this instruction complete. */ -#define __DSB() __builtin_arm_dsb(0xF) +#define __DSB() __builtin_arm_dsb(0xF); /** @@ -862,7 +839,7 @@ __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) \details Ensures the apparent order of the explicit memory operations before and after the instruction, without ensuring their completion. */ -#define __DMB() __builtin_arm_dmb(0xF) +#define __DMB() __builtin_arm_dmb(0xF); /** @@ -901,12 +878,12 @@ __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) */ __STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) { - op2 %= 32U; - if (op2 == 0U) - { - return op1; - } - return (op1 >> op2) | (op1 << (32U - op2)); + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); } @@ -934,23 +911,7 @@ __STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) \param [in] value Value to count the leading zeros \return number of leading zeros in value */ -__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) -{ - /* Even though __builtin_clz produces a CLZ instruction on ARM, formally - __builtin_clz(0) is undefined behaviour, so handle this case specially. - This guarantees ARM-compatible results if happening to compile on a non-ARM - target, and ensures the compiler doesn't decide to activate any - optimisations using the logic "value was passed to __builtin_clz, so it - is non-zero". - ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a - single CLZ instruction. - */ - if (value == 0U) - { - return 32U; - } - return __builtin_clz(value); -} +#define __CLZ (uint8_t)__builtin_clz #if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ @@ -1062,10 +1023,10 @@ __STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) */ __STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) { - uint32_t result; + uint32_t result; - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); + __ASM volatile("rrx %0, %1" : __CMSIS_GCC_OUT_REG(result) : __CMSIS_GCC_USE_REG(value)); + return (result); } @@ -1077,10 +1038,10 @@ __STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) */ __STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) { - uint32_t result; + uint32_t result; - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); /* Add explicit type cast here */ + __ASM volatile("ldrbt %0, %1" : "=r"(result) : "Q"(*ptr)); + return ((uint8_t) result); /* Add explicit type cast here */ } @@ -1092,10 +1053,10 @@ __STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) */ __STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) { - uint32_t result; + uint32_t result; - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); /* Add explicit type cast here */ + __ASM volatile("ldrht %0, %1" : "=r"(result) : "Q"(*ptr)); + return ((uint16_t) result); /* Add explicit type cast here */ } @@ -1107,10 +1068,10 @@ __STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) */ __STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) { - uint32_t result; + uint32_t result; - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); + __ASM volatile("ldrt %0, %1" : "=r"(result) : "Q"(*ptr)); + return (result); } @@ -1122,7 +1083,7 @@ __STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) */ __STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) { - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); + __ASM volatile("strbt %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); } @@ -1134,7 +1095,7 @@ __STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) */ __STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) { - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); + __ASM volatile("strht %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); } @@ -1146,7 +1107,7 @@ __STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) */ __STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) { - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); + __ASM volatile("strt %1, %0" : "=Q"(*ptr) : "r"(value)); } #else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ @@ -1162,20 +1123,20 @@ __STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) */ __STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) { - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) + if ((sat >= 1U) && (sat <= 32U)) { - return max; + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } } - else if (val < min) - { - return min; - } - } - return val; + return val; } /** @@ -1187,19 +1148,19 @@ __STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) */ __STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) { - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) + if (sat <= 31U) { - return max; + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; + return (uint32_t)val; } #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ @@ -1217,10 +1178,10 @@ __STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) */ __STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) { - uint32_t result; + uint32_t result; - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); + __ASM volatile("ldab %0, %1" : "=r"(result) : "Q"(*ptr)); + return ((uint8_t) result); } @@ -1232,10 +1193,10 @@ __STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) */ __STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) { - uint32_t result; + uint32_t result; - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); + __ASM volatile("ldah %0, %1" : "=r"(result) : "Q"(*ptr)); + return ((uint16_t) result); } @@ -1247,10 +1208,10 @@ __STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) */ __STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) { - uint32_t result; + uint32_t result; - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); + __ASM volatile("lda %0, %1" : "=r"(result) : "Q"(*ptr)); + return (result); } @@ -1262,7 +1223,7 @@ __STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) */ __STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) { - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); + __ASM volatile("stlb %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); } @@ -1274,7 +1235,7 @@ __STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) */ __STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) { - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); + __ASM volatile("stlh %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); } @@ -1286,7 +1247,7 @@ __STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) */ __STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) { - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); + __ASM volatile("stl %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); } @@ -1352,7 +1313,7 @@ __STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) #endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ -/**@}*/ /* end of group CMSIS_Core_InstructionInterface */ +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ /* ################### Compiler specific Intrinsics ########################### */ @@ -1363,65 +1324,536 @@ __STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) #if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) -#define __SADD8 __builtin_arm_sadd8 -#define __QADD8 __builtin_arm_qadd8 -#define __SHADD8 __builtin_arm_shadd8 -#define __UADD8 __builtin_arm_uadd8 -#define __UQADD8 __builtin_arm_uqadd8 -#define __UHADD8 __builtin_arm_uhadd8 -#define __SSUB8 __builtin_arm_ssub8 -#define __QSUB8 __builtin_arm_qsub8 -#define __SHSUB8 __builtin_arm_shsub8 -#define __USUB8 __builtin_arm_usub8 -#define __UQSUB8 __builtin_arm_uqsub8 -#define __UHSUB8 __builtin_arm_uhsub8 -#define __SADD16 __builtin_arm_sadd16 -#define __QADD16 __builtin_arm_qadd16 -#define __SHADD16 __builtin_arm_shadd16 -#define __UADD16 __builtin_arm_uadd16 -#define __UQADD16 __builtin_arm_uqadd16 -#define __UHADD16 __builtin_arm_uhadd16 -#define __SSUB16 __builtin_arm_ssub16 -#define __QSUB16 __builtin_arm_qsub16 -#define __SHSUB16 __builtin_arm_shsub16 -#define __USUB16 __builtin_arm_usub16 -#define __UQSUB16 __builtin_arm_uqsub16 -#define __UHSUB16 __builtin_arm_uhsub16 -#define __SASX __builtin_arm_sasx -#define __QASX __builtin_arm_qasx -#define __SHASX __builtin_arm_shasx -#define __UASX __builtin_arm_uasx -#define __UQASX __builtin_arm_uqasx -#define __UHASX __builtin_arm_uhasx -#define __SSAX __builtin_arm_ssax -#define __QSAX __builtin_arm_qsax -#define __SHSAX __builtin_arm_shsax -#define __USAX __builtin_arm_usax -#define __UQSAX __builtin_arm_uqsax -#define __UHSAX __builtin_arm_uhsax -#define __USAD8 __builtin_arm_usad8 -#define __USADA8 __builtin_arm_usada8 -#define __SSAT16 __builtin_arm_ssat16 -#define __USAT16 __builtin_arm_usat16 -#define __UXTB16 __builtin_arm_uxtb16 -#define __UXTAB16 __builtin_arm_uxtab16 -#define __SXTB16 __builtin_arm_sxtb16 -#define __SXTAB16 __builtin_arm_sxtab16 -#define __SMUAD __builtin_arm_smuad -#define __SMUADX __builtin_arm_smuadx -#define __SMLAD __builtin_arm_smlad -#define __SMLADX __builtin_arm_smladx -#define __SMLALD __builtin_arm_smlald -#define __SMLALDX __builtin_arm_smlaldx -#define __SMUSD __builtin_arm_smusd -#define __SMUSDX __builtin_arm_smusdx -#define __SMLSD __builtin_arm_smlsd -#define __SMLSDX __builtin_arm_smlsdx -#define __SMLSLD __builtin_arm_smlsld -#define __SMLSLDX __builtin_arm_smlsldx -#define __SEL __builtin_arm_sel -#define __QADD __builtin_arm_qadd -#define __QSUB __builtin_arm_qsub +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("sadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("qadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("shadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uqadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uhadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("ssub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("qsub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("shsub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("usub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uqsub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uhsub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("sadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("qadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("shadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uqadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uhadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("ssub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("qsub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("shsub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("usub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uqsub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uhsub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("sasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("qasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("shasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uqasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uhasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("ssax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("qsax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("shsax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("usax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uqsax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uhsax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("usad8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile("usada8 %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile("uxtb16 %0, %1" : "=r"(result) : "r"(op1)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uxtab16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile("sxtb16 %0, %1" : "=r"(result) : "r"(op1)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("sxtab16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("smuad %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("smuadx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile("smlad %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile("smladx %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD(uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u + { + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile("smlald %0, %1, %2, %3" : "=r"(llr.w32[0]), "=r"(llr.w32[1]): "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1])); +#else /* Big endian */ + __ASM volatile("smlald %0, %1, %2, %3" : "=r"(llr.w32[1]), "=r"(llr.w32[0]): "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0])); +#endif + + return (llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX(uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u + { + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile("smlaldx %0, %1, %2, %3" : "=r"(llr.w32[0]), "=r"(llr.w32[1]): "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1])); +#else /* Big endian */ + __ASM volatile("smlaldx %0, %1, %2, %3" : "=r"(llr.w32[1]), "=r"(llr.w32[0]): "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0])); +#endif + + return (llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("smusd %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("smusdx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile("smlsd %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile("smlsdx %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD(uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u + { + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile("smlsld %0, %1, %2, %3" : "=r"(llr.w32[0]), "=r"(llr.w32[1]): "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1])); +#else /* Big endian */ + __ASM volatile("smlsld %0, %1, %2, %3" : "=r"(llr.w32[1]), "=r"(llr.w32[0]): "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0])); +#endif + + return (llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX(uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u + { + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile("smlsldx %0, %1, %2, %3" : "=r"(llr.w32[0]), "=r"(llr.w32[1]): "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1])); +#else /* Big endian */ + __ASM volatile("smlsldx %0, %1, %2, %3" : "=r"(llr.w32[1]), "=r"(llr.w32[0]): "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0])); +#endif + + return (llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("sel %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE int32_t __QADD(int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile("qadd %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE int32_t __QSUB(int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile("qsub %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif #define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) @@ -1429,16 +1861,16 @@ __STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) #define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) -__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +__STATIC_FORCEINLINE int32_t __SMMLA(int32_t op1, int32_t op2, int32_t op3) { - int32_t result; + int32_t result; - __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); + __ASM volatile("smmla %0, %1, %2, %3" : "=r"(result): "r"(op1), "r"(op2), "r"(op3)); + return (result); } #endif /* (__ARM_FEATURE_DSP == 1) */ -/**@} end of group CMSIS_SIMD_intrinsics */ +/*@} end of group CMSIS_SIMD_intrinsics */ #endif /* __CMSIS_ARMCLANG_H */ diff --git a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_armclang_ltm.h b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_armclang_ltm.h index 356182c5f9..f80786e767 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_armclang_ltm.h +++ b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_armclang_ltm.h @@ -30,110 +30,113 @@ #pragma clang system_header /* treat file as system include file */ #ifndef __ARM_COMPAT_H -#include /* Compatibility header for Arm Compiler 5 intrinsics */ + #include /* Compatibility header for Arm Compiler 5 intrinsics */ #endif /* CMSIS compiler specific defines */ #ifndef __ASM - #define __ASM __asm + #define __ASM __asm #endif #ifndef __INLINE - #define __INLINE __inline + #define __INLINE __inline #endif #ifndef __STATIC_INLINE - #define __STATIC_INLINE static __inline + #define __STATIC_INLINE static __inline #endif #ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline #endif #ifndef __NO_RETURN - #define __NO_RETURN __attribute__((__noreturn__)) + #define __NO_RETURN __attribute__((__noreturn__)) #endif #ifndef __USED - #define __USED __attribute__((used)) + #define __USED __attribute__((used)) #endif #ifndef __WEAK - #define __WEAK __attribute__((weak)) + #define __WEAK __attribute__((weak)) #endif #ifndef __PACKED - #define __PACKED __attribute__((packed, aligned(1))) + #define __PACKED __attribute__((packed, aligned(1))) #endif #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) #endif #ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #define __PACKED_UNION union __attribute__((packed, aligned(1))) #endif #ifndef __UNALIGNED_UINT32 /* deprecated */ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpacked" /*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +struct __attribute__((packed)) T_UINT32 +{ + uint32_t v; +}; +#pragma clang diagnostic pop +#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) #endif #ifndef __UNALIGNED_UINT16_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpacked" /*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; +#pragma clang diagnostic pop +#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) #endif #ifndef __UNALIGNED_UINT16_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpacked" /*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +__PACKED_STRUCT T_UINT16_READ { uint16_t v; }; +#pragma clang diagnostic pop +#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) #endif #ifndef __UNALIGNED_UINT32_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpacked" /*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; +#pragma clang diagnostic pop +#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) #endif #ifndef __UNALIGNED_UINT32_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wpacked" /*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +__PACKED_STRUCT T_UINT32_READ { uint32_t v; }; +#pragma clang diagnostic pop +#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) #endif #ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) + #define __ALIGNED(x) __attribute__((aligned(x))) #endif #ifndef __RESTRICT - #define __RESTRICT __restrict + #define __RESTRICT __restrict #endif #ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") + #define __COMPILER_BARRIER() __ASM volatile("":::"memory") #endif /* ######################### Startup and Lowlevel Init ######################## */ #ifndef __PROGRAM_START -#define __PROGRAM_START __main + #define __PROGRAM_START __main #endif #ifndef __INITIAL_SP -#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit + #define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit #endif #ifndef __STACK_LIMIT -#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base + #define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base #endif #ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors + #define __VECTOR_TABLE __Vectors #endif #ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) + #define __VECTOR_TABLE_ATTRIBUTE __attribute((used, section("RESET"))) #endif @@ -166,10 +169,10 @@ */ __STATIC_FORCEINLINE uint32_t __get_CONTROL(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, control" : "=r"(result)); + return (result); } @@ -181,10 +184,10 @@ __STATIC_FORCEINLINE uint32_t __get_CONTROL(void) */ __STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, control_ns" : "=r"(result)); + return (result); } #endif @@ -196,7 +199,7 @@ __STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) */ __STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) { - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); + __ASM volatile("MSR control, %0" : : "r"(control) : "memory"); } @@ -208,7 +211,7 @@ __STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) */ __STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) { - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); + __ASM volatile("MSR control_ns, %0" : : "r"(control) : "memory"); } #endif @@ -220,10 +223,10 @@ __STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) */ __STATIC_FORCEINLINE uint32_t __get_IPSR(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, ipsr" : "=r"(result)); + return (result); } @@ -234,10 +237,10 @@ __STATIC_FORCEINLINE uint32_t __get_IPSR(void) */ __STATIC_FORCEINLINE uint32_t __get_APSR(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, apsr" : "=r"(result)); + return (result); } @@ -248,10 +251,10 @@ __STATIC_FORCEINLINE uint32_t __get_APSR(void) */ __STATIC_FORCEINLINE uint32_t __get_xPSR(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, xpsr" : "=r"(result)); + return (result); } @@ -262,10 +265,10 @@ __STATIC_FORCEINLINE uint32_t __get_xPSR(void) */ __STATIC_FORCEINLINE uint32_t __get_PSP(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, psp" : "=r"(result)); + return (result); } @@ -277,10 +280,10 @@ __STATIC_FORCEINLINE uint32_t __get_PSP(void) */ __STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, psp_ns" : "=r"(result)); + return (result); } #endif @@ -292,7 +295,7 @@ __STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) */ __STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) { - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); + __ASM volatile("MSR psp, %0" : : "r"(topOfProcStack) :); } @@ -304,7 +307,7 @@ __STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) */ __STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) { - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); + __ASM volatile("MSR psp_ns, %0" : : "r"(topOfProcStack) :); } #endif @@ -316,10 +319,10 @@ __STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) */ __STATIC_FORCEINLINE uint32_t __get_MSP(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, msp" : "=r"(result)); + return (result); } @@ -331,10 +334,10 @@ __STATIC_FORCEINLINE uint32_t __get_MSP(void) */ __STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, msp_ns" : "=r"(result)); + return (result); } #endif @@ -346,7 +349,7 @@ __STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) */ __STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) { - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); + __ASM volatile("MSR msp, %0" : : "r"(topOfMainStack) :); } @@ -358,7 +361,7 @@ __STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) */ __STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) { - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); + __ASM volatile("MSR msp_ns, %0" : : "r"(topOfMainStack) :); } #endif @@ -371,10 +374,10 @@ __STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) */ __STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, sp_ns" : "=r"(result)); + return (result); } @@ -385,7 +388,7 @@ __STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) */ __STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) { - __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); + __ASM volatile("MSR sp_ns, %0" : : "r"(topOfStack) :); } #endif @@ -397,10 +400,10 @@ __STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) */ __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, primask" : "=r"(result)); + return (result); } @@ -412,10 +415,10 @@ __STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) */ __STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, primask_ns" : "=r"(result)); + return (result); } #endif @@ -427,7 +430,7 @@ __STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) */ __STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) { - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); + __ASM volatile("MSR primask, %0" : : "r"(priMask) : "memory"); } @@ -439,7 +442,7 @@ __STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) */ __STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) { - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); + __ASM volatile("MSR primask_ns, %0" : : "r"(priMask) : "memory"); } #endif @@ -470,10 +473,10 @@ __STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) */ __STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, basepri" : "=r"(result)); + return (result); } @@ -485,10 +488,10 @@ __STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) */ __STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, basepri_ns" : "=r"(result)); + return (result); } #endif @@ -500,7 +503,7 @@ __STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) */ __STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) { - __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); + __ASM volatile("MSR basepri, %0" : : "r"(basePri) : "memory"); } @@ -512,7 +515,7 @@ __STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) */ __STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) { - __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); + __ASM volatile("MSR basepri_ns, %0" : : "r"(basePri) : "memory"); } #endif @@ -525,7 +528,7 @@ __STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) */ __STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) { - __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); + __ASM volatile("MSR basepri_max, %0" : : "r"(basePri) : "memory"); } @@ -536,10 +539,10 @@ __STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) */ __STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, faultmask" : "=r"(result)); + return (result); } @@ -551,10 +554,10 @@ __STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) */ __STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) { - uint32_t result; + uint32_t result; - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); + __ASM volatile("MRS %0, faultmask_ns" : "=r"(result)); + return (result); } #endif @@ -566,7 +569,7 @@ __STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) */ __STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) { - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); + __ASM volatile("MSR faultmask, %0" : : "r"(faultMask) : "memory"); } @@ -578,7 +581,7 @@ __STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) */ __STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) { - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); + __ASM volatile("MSR faultmask_ns, %0" : : "r"(faultMask) : "memory"); } #endif @@ -604,11 +607,11 @@ __STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; + return 0U; #else - uint32_t result; - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return result; + uint32_t result; + __ASM volatile("MRS %0, psplim" : "=r"(result)); + return result; #endif } @@ -625,12 +628,12 @@ __STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) __STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) { #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; #else - uint32_t result; - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return result; + uint32_t result; + __ASM volatile("MRS %0, psplim_ns" : "=r"(result)); + return result; #endif } #endif @@ -649,10 +652,10 @@ __STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) { #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; #else - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); + __ASM volatile("MSR psplim, %0" : : "r"(ProcStackPtrLimit)); #endif } @@ -670,10 +673,10 @@ __STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) __STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) { #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; #else - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); + __ASM volatile("MSR psplim_ns, %0\n" : : "r"(ProcStackPtrLimit)); #endif } #endif @@ -691,12 +694,12 @@ __STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) { #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; #else - uint32_t result; - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - return result; + uint32_t result; + __ASM volatile("MRS %0, msplim" : "=r"(result)); + return result; #endif } @@ -713,12 +716,12 @@ __STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) __STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) { #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; #else - uint32_t result; - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return result; + uint32_t result; + __ASM volatile("MRS %0, msplim_ns" : "=r"(result)); + return result; #endif } #endif @@ -736,10 +739,10 @@ __STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) { #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; #else - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); + __ASM volatile("MSR msplim, %0" : : "r"(MainStackPtrLimit)); #endif } @@ -756,10 +759,10 @@ __STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) { #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; #else - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); + __ASM volatile("MSR msplim_ns, %0" : : "r"(MainStackPtrLimit)); #endif } #endif @@ -805,11 +808,11 @@ __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) * For thumb1, use low register (r0-r7), specified by constraint "l" * Otherwise, use general registers, specified by constraint "r" */ #if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) + #define __CMSIS_GCC_OUT_REG(r) "=l" (r) + #define __CMSIS_GCC_USE_REG(r) "l" (r) #else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) + #define __CMSIS_GCC_OUT_REG(r) "=r" (r) + #define __CMSIS_GCC_USE_REG(r) "r" (r) #endif /** @@ -900,12 +903,12 @@ __STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) */ __STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) { - op2 %= 32U; - if (op2 == 0U) - { - return op1; - } - return (op1 >> op2) | (op1 << (32U - op2)); + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); } @@ -935,20 +938,20 @@ __STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) */ __STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) { - /* Even though __builtin_clz produces a CLZ instruction on ARM, formally - __builtin_clz(0) is undefined behaviour, so handle this case specially. - This guarantees ARM-compatible results if happening to compile on a non-ARM - target, and ensures the compiler doesn't decide to activate any - optimisations using the logic "value was passed to __builtin_clz, so it - is non-zero". - ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a - single CLZ instruction. - */ - if (value == 0U) - { - return 32U; - } - return __builtin_clz(value); + /* Even though __builtin_clz produces a CLZ instruction on ARM, formally + __builtin_clz(0) is undefined behaviour, so handle this case specially. + This guarantees ARM-compatible results if happening to compile on a non-ARM + target, and ensures the compiler doesn't decide to activate any + optimisations using the logic "value was passed to __builtin_clz, so it + is non-zero". + ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a + single CLZ instruction. + */ + if (value == 0U) + { + return 32U; + } + return __builtin_clz(value); } @@ -1061,10 +1064,10 @@ __STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) */ __STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) { - uint32_t result; + uint32_t result; - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); + __ASM volatile("rrx %0, %1" : __CMSIS_GCC_OUT_REG(result) : __CMSIS_GCC_USE_REG(value)); + return (result); } @@ -1076,10 +1079,10 @@ __STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) */ __STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) { - uint32_t result; + uint32_t result; - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); /* Add explicit type cast here */ + __ASM volatile("ldrbt %0, %1" : "=r"(result) : "Q"(*ptr)); + return ((uint8_t) result); /* Add explicit type cast here */ } @@ -1091,10 +1094,10 @@ __STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) */ __STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) { - uint32_t result; + uint32_t result; - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); /* Add explicit type cast here */ + __ASM volatile("ldrht %0, %1" : "=r"(result) : "Q"(*ptr)); + return ((uint16_t) result); /* Add explicit type cast here */ } @@ -1106,10 +1109,10 @@ __STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) */ __STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) { - uint32_t result; + uint32_t result; - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); + __ASM volatile("ldrt %0, %1" : "=r"(result) : "Q"(*ptr)); + return (result); } @@ -1121,7 +1124,7 @@ __STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) */ __STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) { - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); + __ASM volatile("strbt %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); } @@ -1133,7 +1136,7 @@ __STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) */ __STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) { - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); + __ASM volatile("strht %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); } @@ -1145,7 +1148,7 @@ __STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) */ __STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) { - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); + __ASM volatile("strt %1, %0" : "=Q"(*ptr) : "r"(value)); } #else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ @@ -1161,20 +1164,20 @@ __STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) */ __STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) { - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) + if ((sat >= 1U) && (sat <= 32U)) { - return max; + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } } - else if (val < min) - { - return min; - } - } - return val; + return val; } /** @@ -1186,19 +1189,19 @@ __STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) */ __STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) { - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) + if (sat <= 31U) { - return max; + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; + return (uint32_t)val; } #endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ @@ -1216,10 +1219,10 @@ __STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) */ __STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) { - uint32_t result; + uint32_t result; - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); + __ASM volatile("ldab %0, %1" : "=r"(result) : "Q"(*ptr)); + return ((uint8_t) result); } @@ -1231,10 +1234,10 @@ __STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) */ __STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) { - uint32_t result; + uint32_t result; - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); + __ASM volatile("ldah %0, %1" : "=r"(result) : "Q"(*ptr)); + return ((uint16_t) result); } @@ -1246,10 +1249,10 @@ __STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) */ __STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) { - uint32_t result; + uint32_t result; - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); + __ASM volatile("lda %0, %1" : "=r"(result) : "Q"(*ptr)); + return (result); } @@ -1261,7 +1264,7 @@ __STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) */ __STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) { - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); + __ASM volatile("stlb %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); } @@ -1273,7 +1276,7 @@ __STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) */ __STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) { - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); + __ASM volatile("stlh %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); } @@ -1285,7 +1288,7 @@ __STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) */ __STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) { - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); + __ASM volatile("stl %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); } @@ -1364,308 +1367,308 @@ __STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) __STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("sadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("qadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("shadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uqadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uhadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("ssub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("qsub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("shsub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("usub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uqsub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uhsub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("sadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("qadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("shadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uqadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uhadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("ssub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("qsub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("shsub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("usub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uqsub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uhsub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("sasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("qasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("shasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uqasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uhasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("ssax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("qsax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("shsax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("usax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uqsax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uhsax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("usad8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) { - uint32_t result; + uint32_t result; - __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); + __ASM volatile("usada8 %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); } #define __SSAT16(ARG1,ARG2) \ @@ -1684,190 +1687,194 @@ __STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) __STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) { - uint32_t result; + uint32_t result; - __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); + __ASM volatile("uxtb16 %0, %1" : "=r"(result) : "r"(op1)); + return (result); } __STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("uxtab16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } __STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) { - uint32_t result; + uint32_t result; - __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); - return(result); + __ASM volatile("sxtb16 %0, %1" : "=r"(result) : "r"(op1)); + return (result); } __STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("sxtab16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } -__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +__STATIC_FORCEINLINE uint32_t __SMUAD(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("smuad %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } -__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +__STATIC_FORCEINLINE uint32_t __SMUADX(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("smuadx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } -__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +__STATIC_FORCEINLINE uint32_t __SMLAD(uint32_t op1, uint32_t op2, uint32_t op3) { - uint32_t result; + uint32_t result; - __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); + __ASM volatile("smlad %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); } -__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +__STATIC_FORCEINLINE uint32_t __SMLADX(uint32_t op1, uint32_t op2, uint32_t op3) { - uint32_t result; + uint32_t result; - __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); + __ASM volatile("smladx %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); } -__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +__STATIC_FORCEINLINE uint64_t __SMLALD(uint32_t op1, uint32_t op2, uint64_t acc) { - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; + union llreg_u + { + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; #ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); + __ASM volatile("smlald %0, %1, %2, %3" : "=r"(llr.w32[0]), "=r"(llr.w32[1]): "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1])); #else /* Big endian */ - __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); + __ASM volatile("smlald %0, %1, %2, %3" : "=r"(llr.w32[1]), "=r"(llr.w32[0]): "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0])); #endif - return(llr.w64); + return (llr.w64); } -__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +__STATIC_FORCEINLINE uint64_t __SMLALDX(uint32_t op1, uint32_t op2, uint64_t acc) { - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; + union llreg_u + { + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; #ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); + __ASM volatile("smlaldx %0, %1, %2, %3" : "=r"(llr.w32[0]), "=r"(llr.w32[1]): "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1])); #else /* Big endian */ - __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); + __ASM volatile("smlaldx %0, %1, %2, %3" : "=r"(llr.w32[1]), "=r"(llr.w32[0]): "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0])); #endif - return(llr.w64); + return (llr.w64); } -__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +__STATIC_FORCEINLINE uint32_t __SMUSD(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("smusd %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } -__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +__STATIC_FORCEINLINE uint32_t __SMUSDX(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("smusdx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } -__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +__STATIC_FORCEINLINE uint32_t __SMLSD(uint32_t op1, uint32_t op2, uint32_t op3) { - uint32_t result; + uint32_t result; - __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); + __ASM volatile("smlsd %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); } -__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +__STATIC_FORCEINLINE uint32_t __SMLSDX(uint32_t op1, uint32_t op2, uint32_t op3) { - uint32_t result; + uint32_t result; - __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); - return(result); + __ASM volatile("smlsdx %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); } -__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +__STATIC_FORCEINLINE uint64_t __SMLSLD(uint32_t op1, uint32_t op2, uint64_t acc) { - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; + union llreg_u + { + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; #ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); + __ASM volatile("smlsld %0, %1, %2, %3" : "=r"(llr.w32[0]), "=r"(llr.w32[1]): "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1])); #else /* Big endian */ - __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); + __ASM volatile("smlsld %0, %1, %2, %3" : "=r"(llr.w32[1]), "=r"(llr.w32[0]): "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0])); #endif - return(llr.w64); + return (llr.w64); } -__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +__STATIC_FORCEINLINE uint64_t __SMLSLDX(uint32_t op1, uint32_t op2, uint64_t acc) { - union llreg_u{ - uint32_t w32[2]; - uint64_t w64; - } llr; - llr.w64 = acc; + union llreg_u + { + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; #ifndef __ARMEB__ /* Little endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); + __ASM volatile("smlsldx %0, %1, %2, %3" : "=r"(llr.w32[0]), "=r"(llr.w32[1]): "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1])); #else /* Big endian */ - __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); + __ASM volatile("smlsldx %0, %1, %2, %3" : "=r"(llr.w32[1]), "=r"(llr.w32[0]): "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0])); #endif - return(llr.w64); + return (llr.w64); } -__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +__STATIC_FORCEINLINE uint32_t __SEL(uint32_t op1, uint32_t op2) { - uint32_t result; + uint32_t result; - __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("sel %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } -__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +__STATIC_FORCEINLINE int32_t __QADD(int32_t op1, int32_t op2) { - int32_t result; + int32_t result; - __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("qadd %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } -__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +__STATIC_FORCEINLINE int32_t __QSUB(int32_t op1, int32_t op2) { - int32_t result; + int32_t result; - __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); - return(result); + __ASM volatile("qsub %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); } #define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ @@ -1876,12 +1883,12 @@ __STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) #define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) -__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +__STATIC_FORCEINLINE int32_t __SMMLA(int32_t op1, int32_t op2, int32_t op3) { - int32_t result; + int32_t result; - __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); + __ASM volatile("smmla %0, %1, %2, %3" : "=r"(result): "r"(op1), "r"(op2), "r"(op3)); + return (result); } #endif /* (__ARM_FEATURE_DSP == 1) */ diff --git a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_compiler.h b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_compiler.h index adbf296f15..30d5800c0e 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_compiler.h +++ b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_compiler.h @@ -1,8 +1,8 @@ /**************************************************************************//** * @file cmsis_compiler.h * @brief CMSIS compiler generic header file - * @version V5.1.0 - * @date 09. October 2018 + * @version V5.0.4 + * @date 10. January 2018 ******************************************************************************/ /* * Copyright (c) 2009-2018 Arm Limited. All rights reserved. @@ -31,251 +31,243 @@ * Arm Compiler 4/5 */ #if defined ( __CC_ARM ) - #include "cmsis_armcc.h" +#include "cmsis_armcc.h" /* - * Arm Compiler 6.6 LTM (armclang) + * Arm Compiler 6 (armclang) */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) - #include "cmsis_armclang_ltm.h" - - /* - * Arm Compiler above 6.10.1 (armclang) - */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) - #include "cmsis_armclang.h" +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) +#include "cmsis_armclang.h" /* * GNU Compiler */ #elif defined ( __GNUC__ ) - #include "cmsis_gcc.h" +#include "cmsis_gcc.h" /* * IAR Compiler */ #elif defined ( __ICCARM__ ) - #include +#include /* * TI Arm Compiler */ #elif defined ( __TI_ARM__ ) - #include +#include - #ifndef __ASM +#ifndef __ASM #define __ASM __asm - #endif - #ifndef __INLINE +#endif +#ifndef __INLINE #define __INLINE inline - #endif - #ifndef __STATIC_INLINE +#endif +#ifndef __STATIC_INLINE #define __STATIC_INLINE static inline - #endif - #ifndef __STATIC_FORCEINLINE +#endif +#ifndef __STATIC_FORCEINLINE #define __STATIC_FORCEINLINE __STATIC_INLINE - #endif - #ifndef __NO_RETURN +#endif +#ifndef __NO_RETURN #define __NO_RETURN __attribute__((noreturn)) - #endif - #ifndef __USED +#endif +#ifndef __USED #define __USED __attribute__((used)) - #endif - #ifndef __WEAK +#endif +#ifndef __WEAK #define __WEAK __attribute__((weak)) - #endif - #ifndef __PACKED +#endif +#ifndef __PACKED #define __PACKED __attribute__((packed)) - #endif - #ifndef __PACKED_STRUCT +#endif +#ifndef __PACKED_STRUCT #define __PACKED_STRUCT struct __attribute__((packed)) - #endif - #ifndef __PACKED_UNION +#endif +#ifndef __PACKED_UNION #define __PACKED_UNION union __attribute__((packed)) - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ +struct __attribute__((packed)) T_UINT32 +{ + uint32_t v; +}; +#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE +__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; +#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ +__PACKED_STRUCT T_UINT16_READ { uint16_t v; }; +#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE +__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; +#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ +__PACKED_STRUCT T_UINT32_READ { uint32_t v; }; +#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED #define __ALIGNED(x) __attribute__((aligned(x))) - #endif - #ifndef __RESTRICT - #define __RESTRICT __restrict - #endif - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #endif +#endif +#ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT +#endif /* * TASKING Compiler */ #elif defined ( __TASKING__ ) - /* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all intrinsics, - * Including the CMSIS ones. - */ +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ - #ifndef __ASM +#ifndef __ASM #define __ASM __asm - #endif - #ifndef __INLINE +#endif +#ifndef __INLINE #define __INLINE inline - #endif - #ifndef __STATIC_INLINE +#endif +#ifndef __STATIC_INLINE #define __STATIC_INLINE static inline - #endif - #ifndef __STATIC_FORCEINLINE +#endif +#ifndef __STATIC_FORCEINLINE #define __STATIC_FORCEINLINE __STATIC_INLINE - #endif - #ifndef __NO_RETURN +#endif +#ifndef __NO_RETURN #define __NO_RETURN __attribute__((noreturn)) - #endif - #ifndef __USED +#endif +#ifndef __USED #define __USED __attribute__((used)) - #endif - #ifndef __WEAK +#endif +#ifndef __WEAK #define __WEAK __attribute__((weak)) - #endif - #ifndef __PACKED +#endif +#ifndef __PACKED #define __PACKED __packed__ - #endif - #ifndef __PACKED_STRUCT +#endif +#ifndef __PACKED_STRUCT #define __PACKED_STRUCT struct __packed__ - #endif - #ifndef __PACKED_UNION +#endif +#ifndef __PACKED_UNION #define __PACKED_UNION union __packed__ - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - struct __packed__ T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ +struct __packed__ T_UINT32 +{ + uint32_t v; +}; +#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE +__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; +#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ +__PACKED_STRUCT T_UINT16_READ { uint16_t v; }; +#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE +__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; +#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ +__PACKED_STRUCT T_UINT32_READ { uint32_t v; }; +#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED #define __ALIGNED(x) __align(x) - #endif - #ifndef __RESTRICT +#endif +#ifndef __RESTRICT #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. #define __RESTRICT - #endif - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #endif +#endif /* * COSMIC Compiler */ #elif defined ( __CSMC__ ) - #include +#include - #ifndef __ASM +#ifndef __ASM #define __ASM _asm - #endif - #ifndef __INLINE +#endif +#ifndef __INLINE #define __INLINE inline - #endif - #ifndef __STATIC_INLINE +#endif +#ifndef __STATIC_INLINE #define __STATIC_INLINE static inline - #endif - #ifndef __STATIC_FORCEINLINE +#endif +#ifndef __STATIC_FORCEINLINE #define __STATIC_FORCEINLINE __STATIC_INLINE - #endif - #ifndef __NO_RETURN +#endif +#ifndef __NO_RETURN // NO RETURN is automatically detected hence no warning here #define __NO_RETURN - #endif - #ifndef __USED +#endif +#ifndef __USED #warning No compiler specific solution for __USED. __USED is ignored. #define __USED - #endif - #ifndef __WEAK +#endif +#ifndef __WEAK #define __WEAK __weak - #endif - #ifndef __PACKED +#endif +#ifndef __PACKED #define __PACKED @packed - #endif - #ifndef __PACKED_STRUCT +#endif +#ifndef __PACKED_STRUCT #define __PACKED_STRUCT @packed struct - #endif - #ifndef __PACKED_UNION +#endif +#ifndef __PACKED_UNION #define __PACKED_UNION @packed union - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - @packed struct T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ +@packed struct T_UINT32 +{ + uint32_t v; +}; +#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE +__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; +#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ +__PACKED_STRUCT T_UINT16_READ { uint16_t v; }; +#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE +__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; +#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ +__PACKED_STRUCT T_UINT32_READ { uint32_t v; }; +#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. #define __ALIGNED(x) - #endif - #ifndef __RESTRICT +#endif +#ifndef __RESTRICT #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. #define __RESTRICT - #endif - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #endif +#endif #else - #error Unknown compiler. +#error Unknown compiler. #endif diff --git a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_gcc.h b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_gcc.h new file mode 100644 index 0000000000..9c86a21ba3 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_gcc.h @@ -0,0 +1,2092 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.0.4 + * @date 09. April 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpacked" +#pragma GCC diagnostic ignored "-Wattributes" +struct __attribute__((packed)) T_UINT32 +{ + uint32_t v; +}; +#pragma GCC diagnostic pop +#define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpacked" +#pragma GCC diagnostic ignored "-Wattributes" +__PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; +#pragma GCC diagnostic pop +#define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpacked" +#pragma GCC diagnostic ignored "-Wattributes" +__PACKED_STRUCT T_UINT16_READ { uint16_t v; }; +#pragma GCC diagnostic pop +#define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpacked" +#pragma GCC diagnostic ignored "-Wattributes" +__PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; +#pragma GCC diagnostic pop +#define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wpacked" +#pragma GCC diagnostic ignored "-Wattributes" +__PACKED_STRUCT T_UINT32_READ { uint32_t v; }; +#pragma GCC diagnostic pop +#define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile("cpsid i" : : : "memory"); +} + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, control" : "=r"(result)); + return (result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, control_ns" : "=r"(result)); + return (result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile("MSR control, %0" : : "r"(control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile("MSR control_ns, %0" : : "r"(control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, ipsr" : "=r"(result)); + return (result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, apsr" : "=r"(result)); + return (result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, xpsr" : "=r"(result)); + return (result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, psp" : "=r"(result)); + return (result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, psp_ns" : "=r"(result)); + return (result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile("MSR psp, %0" : : "r"(topOfProcStack) :); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile("MSR psp_ns, %0" : : "r"(topOfProcStack) :); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, msp" : "=r"(result)); + return (result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, msp_ns" : "=r"(result)); + return (result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile("MSR msp, %0" : : "r"(topOfMainStack) :); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile("MSR msp_ns, %0" : : "r"(topOfMainStack) :); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, sp_ns" : "=r"(result)); + return (result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile("MSR sp_ns, %0" : : "r"(topOfStack) :); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, primask" : "=r"(result) :: "memory"); + return (result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, primask_ns" : "=r"(result) :: "memory"); + return (result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile("MSR primask, %0" : : "r"(priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile("MSR primask_ns, %0" : : "r"(priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_fault_irq(void) +{ + __ASM volatile("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, basepri" : "=r"(result)); + return (result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, basepri_ns" : "=r"(result)); + return (result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile("MSR basepri, %0" : : "r"(basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile("MSR basepri_ns, %0" : : "r"(basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile("MSR basepri_max, %0" : : "r"(basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, faultmask" : "=r"(result)); + return (result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile("MRS %0, faultmask_ns" : "=r"(result)); + return (result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile("MSR faultmask, %0" : : "r"(faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile("MSR faultmask_ns, %0" : : "r"(faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile("MRS %0, psplim" : "=r"(result)); + return result; +#endif +} + +#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile("MRS %0, psplim_ns" : "=r"(result)); + return result; +#endif +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile("MSR psplim, %0" : : "r"(ProcStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)ProcStackPtrLimit; +#else + __ASM volatile("MSR psplim_ns, %0\n" : : "r"(ProcStackPtrLimit)); +#endif +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always in non-secure + mode. + + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile("MRS %0, msplim" : "=r"(result)); + return result; +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence zero is returned always. + + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + return 0U; +#else + uint32_t result; + __ASM volatile("MRS %0, msplim_ns" : "=r"(result)); + return result; +#endif +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored in non-secure + mode. + + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile("MSR msplim, %0" : : "r"(MainStackPtrLimit)); +#endif +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer Limit (non-secure) + Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure + Stack Pointer Limit register hence the write is silently ignored. + + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)MainStackPtrLimit; +#else + __ASM volatile("MSR msplim_ns, %0" : : "r"(MainStackPtrLimit)); +#endif +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_get_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); +#else + uint32_t result; + + __ASM volatile("VMRS %0, fpscr" : "=r"(result)); + return (result); +#endif +#else + return (0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_set_fpscr) +// Re-enable using built-in when GCC has been fixed +// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); +#else + __ASM volatile("VMSR fpscr, %0" : : "r"(fpscr) : "vfpcc", "memory"); +#endif +#else + (void)fpscr; +#endif +} + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) + #define __CMSIS_GCC_OUT_REG(r) "=l" (r) + #define __CMSIS_GCC_RW_REG(r) "+l" (r) + #define __CMSIS_GCC_USE_REG(r) "l" (r) +#else + #define __CMSIS_GCC_OUT_REG(r) "=r" (r) + #define __CMSIS_GCC_RW_REG(r) "+r" (r) + #define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP() __ASM volatile ("nop") + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI() __ASM volatile ("wfi") + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE() __ASM volatile ("wfe") + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV() __ASM volatile ("sev") + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __ASM volatile("isb 0xF"::: "memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __ASM volatile("dsb 0xF"::: "memory"); +} + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __ASM volatile("dmb 0xF"::: "memory"); +} + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile("rev %0, %1" : __CMSIS_GCC_OUT_REG(result) : __CMSIS_GCC_USE_REG(value)); + return result; +#endif +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile("rev16 %0, %1" : __CMSIS_GCC_OUT_REG(result) : __CMSIS_GCC_USE_REG(value)); + return result; +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (int16_t)__builtin_bswap16(value); +#else + int16_t result; + + __ASM volatile("revsh %0, %1" : __CMSIS_GCC_OUT_REG(result) : __CMSIS_GCC_USE_REG(value)); + return result; +#endif +} + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile("rbit %0, %1" : "=r"(result) : "r"(value)); +#else + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return result; +} + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ (uint8_t)__builtin_clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile("ldrexb %0, %1" : "=r"(result) : "Q"(*addr)); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile("ldrexb %0, [%1]" : "=r"(result) : "r"(addr) : "memory"); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile("ldrexh %0, %1" : "=r"(result) : "Q"(*addr)); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile("ldrexh %0, [%1]" : "=r"(result) : "r"(addr) : "memory"); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile("ldrex %0, %1" : "=r"(result) : "Q"(*addr)); + return (result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile("strexb %0, %2, %1" : "=&r"(result), "=Q"(*addr) : "r"((uint32_t)value)); + return (result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile("strexh %0, %2, %1" : "=&r"(result), "=Q"(*addr) : "r"((uint32_t)value)); + return (result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile("strex %0, %2, %1" : "=&r"(result), "=Q"(*addr) : "r"(value)); + return (result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__STATIC_FORCEINLINE void __CLREX(void) +{ + __ASM volatile("clrex" ::: "memory"); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ + __extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile("rrx %0, %1" : __CMSIS_GCC_OUT_REG(result) : __CMSIS_GCC_USE_REG(value)); + return (result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile("ldrbt %0, %1" : "=r"(result) : "Q"(*ptr)); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile("ldrbt %0, [%1]" : "=r"(result) : "r"(ptr) : "memory"); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile("ldrht %0, %1" : "=r"(result) : "Q"(*ptr)); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile("ldrht %0, [%1]" : "=r"(result) : "r"(ptr) : "memory"); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile("ldrt %0, %1" : "=r"(result) : "Q"(*ptr)); + return (result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile("strbt %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile("strht %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile("strt %1, %0" : "=Q"(*ptr) : "r"(value)); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile("ldab %0, %1" : "=r"(result) : "Q"(*ptr)); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile("ldah %0, %1" : "=r"(result) : "Q"(*ptr)); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile("lda %0, %1" : "=r"(result) : "Q"(*ptr)); + return (result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile("stlb %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile("stlh %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile("stl %1, %0" : "=Q"(*ptr) : "r"((uint32_t)value)); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile("ldaexb %0, %1" : "=r"(result) : "Q"(*ptr)); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile("ldaexh %0, %1" : "=r"(result) : "Q"(*ptr)); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile("ldaex %0, %1" : "=r"(result) : "Q"(*ptr)); + return (result); +} + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile("stlexb %0, %2, %1" : "=&r"(result), "=Q"(*ptr) : "r"((uint32_t)value)); + return (result); +} + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile("stlexh %0, %2, %1" : "=&r"(result), "=Q"(*ptr) : "r"((uint32_t)value)); + return (result); +} + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile("stlex %0, %2, %1" : "=&r"(result), "=Q"(*ptr) : "r"((uint32_t)value)); + return (result); +} + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("sadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("qadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("shadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uqadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uhadd8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("ssub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("qsub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("shsub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("usub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uqsub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uhsub8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("sadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("qadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("shadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uqadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uhadd16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("ssub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("qsub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("shsub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("usub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uqsub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uhsub16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("sasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("qasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("shasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uqasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uhasx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("ssax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("qsax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("shsax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("usax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uqsax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uhsax %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("usad8 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile("usada8 %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile("uxtb16 %0, %1" : "=r"(result) : "r"(op1)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("uxtab16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile("sxtb16 %0, %1" : "=r"(result) : "r"(op1)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("sxtab16 %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("smuad %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("smuadx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile("smlad %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile("smladx %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD(uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u + { + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile("smlald %0, %1, %2, %3" : "=r"(llr.w32[0]), "=r"(llr.w32[1]): "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1])); +#else /* Big endian */ + __ASM volatile("smlald %0, %1, %2, %3" : "=r"(llr.w32[1]), "=r"(llr.w32[0]): "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0])); +#endif + + return (llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX(uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u + { + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile("smlaldx %0, %1, %2, %3" : "=r"(llr.w32[0]), "=r"(llr.w32[1]): "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1])); +#else /* Big endian */ + __ASM volatile("smlaldx %0, %1, %2, %3" : "=r"(llr.w32[1]), "=r"(llr.w32[0]): "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0])); +#endif + + return (llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("smusd %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("smusdx %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile("smlsd %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile("smlsdx %0, %1, %2, %3" : "=r"(result) : "r"(op1), "r"(op2), "r"(op3)); + return (result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD(uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u + { + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile("smlsld %0, %1, %2, %3" : "=r"(llr.w32[0]), "=r"(llr.w32[1]): "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1])); +#else /* Big endian */ + __ASM volatile("smlsld %0, %1, %2, %3" : "=r"(llr.w32[1]), "=r"(llr.w32[0]): "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0])); +#endif + + return (llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX(uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u + { + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile("smlsldx %0, %1, %2, %3" : "=r"(llr.w32[0]), "=r"(llr.w32[1]): "r"(op1), "r"(op2), "0"(llr.w32[0]), "1"(llr.w32[1])); +#else /* Big endian */ + __ASM volatile("smlsldx %0, %1, %2, %3" : "=r"(llr.w32[1]), "=r"(llr.w32[0]): "r"(op1), "r"(op2), "0"(llr.w32[1]), "1"(llr.w32[0])); +#endif + + return (llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile("sel %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE int32_t __QADD(int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile("qadd %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +__STATIC_FORCEINLINE int32_t __QSUB(int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile("qsub %0, %1, %2" : "=r"(result) : "r"(op1), "r"(op2)); + return (result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA(int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile("smmla %0, %1, %2, %3" : "=r"(result): "r"(op1), "r"(op2), "r"(op3)); + return (result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_iccarm.h b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_iccarm.h new file mode 100644 index 0000000000..908caa52cf --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_iccarm.h @@ -0,0 +1,941 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR Compiler for Arm) header file + * @version V5.0.7 + * @date 19. June 2018 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017-2018 IAR Systems +// +// Licensed under the Apache License, Version 2.0 (the "License") +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +//------------------------------------------------------------------------------ + + +#ifndef __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ + /* Macros already defined */ +#else + #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' + #if __ARM_ARCH == 6 + #define __ARM_ARCH_6M__ 1 + #elif __ARM_ARCH == 7 + #if __ARM_FEATURE_DSP + #define __ARM_ARCH_7EM__ 1 + #else + #define __ARM_ARCH_7M__ 1 + #endif + #endif /* __ARM_ARCH */ + #endif /* __ARM_ARCH_PROFILE == 'M' */ +#endif + +/* Alternativ core deduction for older ICCARM's */ +#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ + !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) + #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) + #define __ARM_ARCH_6M__ 1 + #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) + #define __ARM_ARCH_7M__ 1 + #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) + #define __ARM_ARCH_7EM__ 1 + #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #else + #error "Unknown target." + #endif +#endif + + + +#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 + #define __IAR_M0_FAMILY 1 +#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 + #define __IAR_M0_FAMILY 1 +#else + #define __IAR_M0_FAMILY 0 +#endif + + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __FORCEINLINE + #define __FORCEINLINE _Pragma("inline=forced") +#endif + +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __FORCEINLINE __STATIC_INLINE +#endif + +#ifndef __UNALIGNED_UINT16_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint16_t __iar_uint16_read(void const *ptr) +{ + return *(__packed uint16_t *)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) +{ + *(__packed uint16_t *)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint32_t __iar_uint32_read(void const *ptr) +{ + return *(__packed uint32_t *)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) +{ + *(__packed uint32_t *)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32 /* deprecated */ +#pragma language=save +#pragma language=extended +__packed struct __iar_u32 +{ + uint32_t v; +}; +#pragma language=restore +#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + +#if defined(__CLZ) + #undef __CLZ +#endif +#if defined(__REVSH) + #undef __REVSH +#endif +#if defined(__RBIT) + #undef __RBIT +#endif +#if defined(__SSAT) + #undef __SSAT +#endif +#if defined(__USAT) + #undef __USAT +#endif + +#include "iccarm_builtin.h" + +#define __disable_fault_irq __iar_builtin_disable_fiq +#define __disable_irq __iar_builtin_disable_interrupt +#define __enable_fault_irq __iar_builtin_enable_fiq +#define __enable_irq __iar_builtin_enable_interrupt +#define __arm_rsr __iar_builtin_rsr +#define __arm_wsr __iar_builtin_wsr + + +#define __get_APSR() (__arm_rsr("APSR")) +#define __get_BASEPRI() (__arm_rsr("BASEPRI")) +#define __get_CONTROL() (__arm_rsr("CONTROL")) +#define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) + +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR() (__arm_rsr("FPSCR")) +#define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) +#else +#define __get_FPSCR() ( 0 ) +#define __set_FPSCR(VALUE) ((void)VALUE) +#endif + +#define __get_IPSR() (__arm_rsr("IPSR")) +#define __get_MSP() (__arm_rsr("MSP")) +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) +// without main extensions, the non-secure MSPLIM is RAZ/WI +#define __get_MSPLIM() (0U) +#else +#define __get_MSPLIM() (__arm_rsr("MSPLIM")) +#endif +#define __get_PRIMASK() (__arm_rsr("PRIMASK")) +#define __get_PSP() (__arm_rsr("PSP")) + +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) +// without main extensions, the non-secure PSPLIM is RAZ/WI +#define __get_PSPLIM() (0U) +#else +#define __get_PSPLIM() (__arm_rsr("PSPLIM")) +#endif + +#define __get_xPSR() (__arm_rsr("xPSR")) + +#define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) +#define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) +#define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE))) +#define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) +#define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) + +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) +// without main extensions, the non-secure MSPLIM is RAZ/WI +#define __set_MSPLIM(VALUE) ((void)(VALUE)) +#else +#define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) +#endif +#define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) +#define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) +// without main extensions, the non-secure PSPLIM is RAZ/WI +#define __set_PSPLIM(VALUE) ((void)(VALUE)) +#else +#define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) +#endif + +#define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) +#define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE))) +#define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) +#define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) +#define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) +#define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) +#define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) +#define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) +#define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) +#define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) +#define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) +#define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) +#define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) +#define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) + +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) +// without main extensions, the non-secure PSPLIM is RAZ/WI +#define __TZ_get_PSPLIM_NS() (0U) +#define __TZ_set_PSPLIM_NS(VALUE) ((void)(VALUE)) +#else +#define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) +#define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) +#endif + +#define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) +#define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) + +#define __NOP __iar_builtin_no_operation + +#define __CLZ __iar_builtin_CLZ +#define __CLREX __iar_builtin_CLREX + +#define __DMB __iar_builtin_DMB +#define __DSB __iar_builtin_DSB +#define __ISB __iar_builtin_ISB + +#define __LDREXB __iar_builtin_LDREXB +#define __LDREXH __iar_builtin_LDREXH +#define __LDREXW __iar_builtin_LDREX + +#define __RBIT __iar_builtin_RBIT +#define __REV __iar_builtin_REV +#define __REV16 __iar_builtin_REV16 + +__IAR_FT int16_t __REVSH(int16_t val) +{ + return (int16_t) __iar_builtin_REVSH(val); +} + +#define __ROR __iar_builtin_ROR +#define __RRX __iar_builtin_RRX + +#define __SEV __iar_builtin_SEV + +#if !__IAR_M0_FAMILY + #define __SSAT __iar_builtin_SSAT +#endif + +#define __STREXB __iar_builtin_STREXB +#define __STREXH __iar_builtin_STREXH +#define __STREXW __iar_builtin_STREX + +#if !__IAR_M0_FAMILY + #define __USAT __iar_builtin_USAT +#endif + +#define __WFE __iar_builtin_WFE +#define __WFI __iar_builtin_WFI + +#if __ARM_MEDIA__ + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB +#endif + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #define __CLZ __cmsis_iar_clz_not_active + #define __SSAT __cmsis_iar_ssat_not_active + #define __USAT __cmsis_iar_usat_not_active + #define __RBIT __cmsis_iar_rbit_not_active + #define __get_APSR __cmsis_iar_get_APSR_not_active +#endif + + +#if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) +#define __get_FPSCR __cmsis_iar_get_FPSR_not_active +#define __set_FPSCR __cmsis_iar_set_FPSR_not_active +#endif + +#ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! +#endif + +#include + +#if __IAR_M0_FAMILY +/* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ +#undef __CLZ +#undef __SSAT +#undef __USAT +#undef __RBIT +#undef __get_APSR + +__STATIC_INLINE uint8_t __CLZ(uint32_t data) +{ + if (data == 0U) + { + return 32U; + } + + uint32_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count += 1U; + mask = mask >> 1U; + } + return count; +} + +__STATIC_INLINE uint32_t __RBIT(uint32_t v) +{ + uint8_t sc = 31U; + uint32_t r = v; + for (v >>= 1U; v; v >>= 1U) + { + r <<= 1U; + r |= v & 1U; + sc--; + } + return (r << sc); +} + +__STATIC_INLINE uint32_t __get_APSR(void) +{ + uint32_t res; + __asm("MRS %0,APSR" : "=r"(res)); + return res; +} + +#endif + +#if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) +#undef __get_FPSCR +#undef __set_FPSCR +#define __get_FPSCR() (0) +#define __set_FPSCR(VALUE) ((void)VALUE) +#endif + +#pragma diag_suppress=Pe940 +#pragma diag_suppress=Pe177 + +#define __enable_irq __enable_interrupt +#define __disable_irq __disable_interrupt +#define __NOP __no_operation + +#define __get_xPSR __get_PSR + +#if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) + +__IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) +{ + return __LDREX((unsigned long *)ptr); +} + +__IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) +{ + return __STREX(value, (unsigned long *)ptr); +} +#endif + + +/* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ +#if (__CORTEX_M >= 0x03) + +__IAR_FT uint32_t __RRX(uint32_t value) +{ + uint32_t result; + __ASM("RRX %0, %1" : "=r"(result) : "r"(value) : "cc"); + return (result); +} + +__IAR_FT void __set_BASEPRI_MAX(uint32_t value) +{ + __asm volatile("MSR BASEPRI_MAX,%0"::"r"(value)); +} + + +#define __enable_fault_irq __enable_fiq +#define __disable_fault_irq __disable_fiq + + +#endif /* (__CORTEX_M >= 0x03) */ + +__IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + return (op1 >> op2) | (op1 << ((sizeof(op1) * 8) - op2)); +} + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +__IAR_FT uint32_t __get_MSPLIM(void) +{ + uint32_t res; +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + res = 0U; +#else + __asm volatile("MRS %0,MSPLIM" : "=r"(res)); +#endif + return res; +} + +__IAR_FT void __set_MSPLIM(uint32_t value) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)value; +#else + __asm volatile("MSR MSPLIM,%0" :: "r"(value)); +#endif +} + +__IAR_FT uint32_t __get_PSPLIM(void) +{ + uint32_t res; +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; +#else + __asm volatile("MRS %0,PSPLIM" : "=r"(res)); +#endif + return res; +} + +__IAR_FT void __set_PSPLIM(uint32_t value) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; +#else + __asm volatile("MSR PSPLIM,%0" :: "r"(value)); +#endif +} + +__IAR_FT uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t res; + __asm volatile("MRS %0,CONTROL_NS" : "=r"(res)); + return res; +} + +__IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) +{ + __asm volatile("MSR CONTROL_NS,%0" :: "r"(value)); +} + +__IAR_FT uint32_t __TZ_get_PSP_NS(void) +{ + uint32_t res; + __asm volatile("MRS %0,PSP_NS" : "=r"(res)); + return res; +} + +__IAR_FT void __TZ_set_PSP_NS(uint32_t value) +{ + __asm volatile("MSR PSP_NS,%0" :: "r"(value)); +} + +__IAR_FT uint32_t __TZ_get_MSP_NS(void) +{ + uint32_t res; + __asm volatile("MRS %0,MSP_NS" : "=r"(res)); + return res; +} + +__IAR_FT void __TZ_set_MSP_NS(uint32_t value) +{ + __asm volatile("MSR MSP_NS,%0" :: "r"(value)); +} + +__IAR_FT uint32_t __TZ_get_SP_NS(void) +{ + uint32_t res; + __asm volatile("MRS %0,SP_NS" : "=r"(res)); + return res; +} +__IAR_FT void __TZ_set_SP_NS(uint32_t value) +{ + __asm volatile("MSR SP_NS,%0" :: "r"(value)); +} + +__IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t res; + __asm volatile("MRS %0,PRIMASK_NS" : "=r"(res)); + return res; +} + +__IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) +{ + __asm volatile("MSR PRIMASK_NS,%0" :: "r"(value)); +} + +__IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t res; + __asm volatile("MRS %0,BASEPRI_NS" : "=r"(res)); + return res; +} + +__IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) +{ + __asm volatile("MSR BASEPRI_NS,%0" :: "r"(value)); +} + +__IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t res; + __asm volatile("MRS %0,FAULTMASK_NS" : "=r"(res)); + return res; +} + +__IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) +{ + __asm volatile("MSR FAULTMASK_NS,%0" :: "r"(value)); +} + +__IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) +{ + uint32_t res; +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; +#else + __asm volatile("MRS %0,PSPLIM_NS" : "=r"(res)); +#endif + return res; +} + +__IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) +{ +#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; +#else + __asm volatile("MSR PSPLIM_NS,%0" :: "r"(value)); +#endif +} + +__IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) +{ + uint32_t res; + __asm volatile("MRS %0,MSPLIM_NS" : "=r"(res)); + return res; +} + +__IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) +{ + __asm volatile("MSR MSPLIM_NS,%0" :: "r"(value)); +} + +#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + +#if __IAR_M0_FAMILY +__STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +__STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} +#endif + +#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + +__IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) +{ + uint32_t res; + __ASM("LDRBT %0, [%1]" : "=r"(res) : "r"(addr) : "memory"); + return ((uint8_t)res); +} + +__IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) +{ + uint32_t res; + __ASM("LDRHT %0, [%1]" : "=r"(res) : "r"(addr) : "memory"); + return ((uint16_t)res); +} + +__IAR_FT uint32_t __LDRT(volatile uint32_t *addr) +{ + uint32_t res; + __ASM("LDRT %0, [%1]" : "=r"(res) : "r"(addr) : "memory"); + return res; +} + +__IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) +{ + __ASM("STRBT %1, [%0]" : : "r"(addr), "r"((uint32_t)value) : "memory"); +} + +__IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) +{ + __ASM("STRHT %1, [%0]" : : "r"(addr), "r"((uint32_t)value) : "memory"); +} + +__IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) +{ + __ASM("STRT %1, [%0]" : : "r"(addr), "r"(value) : "memory"); +} + +#endif /* (__CORTEX_M >= 0x03) */ + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + +__IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t res; + __ASM volatile("LDAB %0, [%1]" : "=r"(res) : "r"(ptr) : "memory"); + return ((uint8_t)res); +} + +__IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t res; + __ASM volatile("LDAH %0, [%1]" : "=r"(res) : "r"(ptr) : "memory"); + return ((uint16_t)res); +} + +__IAR_FT uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t res; + __ASM volatile("LDA %0, [%1]" : "=r"(res) : "r"(ptr) : "memory"); + return res; +} + +__IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile("STLB %1, [%0]" :: "r"(ptr), "r"(value) : "memory"); +} + +__IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile("STLH %1, [%0]" :: "r"(ptr), "r"(value) : "memory"); +} + +__IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile("STL %1, [%0]" :: "r"(ptr), "r"(value) : "memory"); +} + +__IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t res; + __ASM volatile("LDAEXB %0, [%1]" : "=r"(res) : "r"(ptr) : "memory"); + return ((uint8_t)res); +} + +__IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t res; + __ASM volatile("LDAEXH %0, [%1]" : "=r"(res) : "r"(ptr) : "memory"); + return ((uint16_t)res); +} + +__IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t res; + __ASM volatile("LDAEX %0, [%1]" : "=r"(res) : "r"(ptr) : "memory"); + return res; +} + +__IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t res; + __ASM volatile("STLEXB %0, %2, [%1]" : "=r"(res) : "r"(ptr), "r"(value) : "memory"); + return res; +} + +__IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t res; + __ASM volatile("STLEXH %0, %2, [%1]" : "=r"(res) : "r"(ptr), "r"(value) : "memory"); + return res; +} + +__IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t res; + __ASM volatile("STLEX %0, %2, [%1]" : "=r"(res) : "r"(ptr), "r"(value) : "memory"); + return res; +} + +#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#undef __IAR_FT +#undef __IAR_M0_FAMILY +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_version.h b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_version.h index 660f612aa3..f2fc98e765 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_version.h +++ b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/cmsis_version.h @@ -23,9 +23,9 @@ */ #if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ + #pragma system_include /* treat file as system include file for MISRA check */ #elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ + #pragma clang system_header /* treat file as system include file */ #endif #ifndef __CMSIS_VERSION_H diff --git a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/core_cm3.h b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/core_cm3.h index 8157ca782d..33a0b01e2d 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/core_cm3.h +++ b/bsp/apm32/libraries/APM32F10x_Library/CMSIS/Include/core_cm3.h @@ -1,11 +1,11 @@ /**************************************************************************//** * @file core_cm3.h * @brief CMSIS Cortex-M3 Core Peripheral Access Layer Header File - * @version V5.1.0 - * @date 13. March 2019 + * @version V5.0.8 + * @date 04. June 2018 ******************************************************************************/ /* - * Copyright (c) 2009-2019 Arm Limited. All rights reserved. + * Copyright (c) 2009-2018 Arm Limited. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * @@ -23,9 +23,9 @@ */ #if defined ( __ICCARM__ ) - #pragma system_include /* treat file as system include file for MISRA check */ + #pragma system_include /* treat file as system include file for MISRA check */ #elif defined (__clang__) - #pragma clang system_header /* treat file as system include file */ + #pragma clang system_header /* treat file as system include file */ #endif #ifndef __CORE_CM3_H_GENERIC @@ -34,7 +34,7 @@ #include #ifdef __cplusplus - extern "C" { +extern "C" { #endif /** @@ -76,39 +76,39 @@ #define __FPU_USED 0U #if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif +#if defined __TARGET_FPU_VFP +#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" +#endif #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) - #if defined __ARM_FP - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif +#if defined __ARM_PCS_VFP +#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" +#endif #elif defined ( __GNUC__ ) - #if defined (__VFP_FP__) && !defined(__SOFTFP__) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif +#if defined (__VFP_FP__) && !defined(__SOFTFP__) +#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" +#endif #elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif +#if defined __ARMVFP__ +#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" +#endif #elif defined ( __TI_ARM__ ) - #if defined __TI_VFP_SUPPORT__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif +#if defined __TI_VFP_SUPPORT__ +#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" +#endif #elif defined ( __TASKING__ ) - #if defined __FPU_VFP__ - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif +#if defined __FPU_VFP__ +#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" +#endif #elif defined ( __CSMC__ ) - #if ( __CSMC__ & 0x400U) - #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" - #endif +#if ( __CSMC__ & 0x400U) +#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" +#endif #endif @@ -127,30 +127,30 @@ #define __CORE_CM3_H_DEPENDANT #ifdef __cplusplus - extern "C" { +extern "C" { #endif /* check device defines and use defaults */ #if defined __CHECK_DEVICE_DEFINES - #ifndef __CM3_REV - #define __CM3_REV 0x0200U - #warning "__CM3_REV not defined in device header file; using default!" - #endif +#ifndef __CM3_REV +#define __CM3_REV 0x0200U +#warning "__CM3_REV not defined in device header file; using default!" +#endif - #ifndef __MPU_PRESENT - #define __MPU_PRESENT 0U - #warning "__MPU_PRESENT not defined in device header file; using default!" - #endif +#ifndef __MPU_PRESENT +#define __MPU_PRESENT 0U +#warning "__MPU_PRESENT not defined in device header file; using default!" +#endif - #ifndef __NVIC_PRIO_BITS - #define __NVIC_PRIO_BITS 3U - #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" - #endif +#ifndef __NVIC_PRIO_BITS +#define __NVIC_PRIO_BITS 3U +#warning "__NVIC_PRIO_BITS not defined in device header file; using default!" +#endif - #ifndef __Vendor_SysTickConfig - #define __Vendor_SysTickConfig 0U - #warning "__Vendor_SysTickConfig not defined in device header file; using default!" - #endif +#ifndef __Vendor_SysTickConfig +#define __Vendor_SysTickConfig 0U +#warning "__Vendor_SysTickConfig not defined in device header file; using default!" +#endif #endif /* IO definitions (access restrictions to peripheral registers) */ @@ -162,9 +162,9 @@ \li for automatic generation of peripheral register debug information. */ #ifdef __cplusplus - #define __I volatile /*!< Defines 'read only' permissions */ +#define __I volatile /*!< Defines 'read only' permissions */ #else - #define __I volatile const /*!< Defines 'read only' permissions */ +#define __I volatile const /*!< Defines 'read only' permissions */ #endif #define __O volatile /*!< Defines 'write only' permissions */ #define __IO volatile /*!< Defines 'read / write' permissions */ @@ -205,16 +205,16 @@ */ typedef union { - struct - { - uint32_t _reserved0:27; /*!< bit: 0..26 Reserved */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + struct + { + uint32_t _reserved0: 27; /*!< bit: 0..26 Reserved */ + uint32_t Q: 1; /*!< bit: 27 Saturation condition flag */ + uint32_t V: 1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C: 1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z: 1; /*!< bit: 30 Zero condition code flag */ + uint32_t N: 1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } APSR_Type; /* APSR Register Definitions */ @@ -239,12 +239,12 @@ typedef union */ typedef union { - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + struct + { + uint32_t ISR: 9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0: 23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } IPSR_Type; /* IPSR Register Definitions */ @@ -257,21 +257,21 @@ typedef union */ typedef union { - struct - { - uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ - uint32_t _reserved0:1; /*!< bit: 9 Reserved */ - uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ - uint32_t _reserved1:8; /*!< bit: 16..23 Reserved */ - uint32_t T:1; /*!< bit: 24 Thumb bit */ - uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ - uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ - uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ - uint32_t C:1; /*!< bit: 29 Carry condition code flag */ - uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ - uint32_t N:1; /*!< bit: 31 Negative condition code flag */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + struct + { + uint32_t ISR: 9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0: 1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1: 6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t _reserved1: 8; /*!< bit: 16..23 Reserved */ + uint32_t T: 1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2: 2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q: 1; /*!< bit: 27 Saturation condition flag */ + uint32_t V: 1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C: 1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z: 1; /*!< bit: 30 Zero condition code flag */ + uint32_t N: 1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } xPSR_Type; /* xPSR Register Definitions */ @@ -308,13 +308,13 @@ typedef union */ typedef union { - struct - { - uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ - uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ - uint32_t _reserved1:30; /*!< bit: 2..31 Reserved */ - } b; /*!< Structure used for bit access */ - uint32_t w; /*!< Type used for word access */ + struct + { + uint32_t nPRIV: 1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL: 1; /*!< bit: 1 Stack to be used */ + uint32_t _reserved1: 30; /*!< bit: 2..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ } CONTROL_Type; /* CONTROL Register Definitions */ @@ -339,19 +339,19 @@ typedef union */ typedef struct { - __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ - uint32_t RESERVED0[24U]; - __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ - uint32_t RESERVED1[24U]; - __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ - uint32_t RESERVED2[24U]; - __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ - uint32_t RESERVED3[24U]; - __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ - uint32_t RESERVED4[56U]; - __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ - uint32_t RESERVED5[644U]; - __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ } NVIC_Type; /* Software Triggered Interrupt Register Definitions */ @@ -373,27 +373,27 @@ typedef struct */ typedef struct { - __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ - __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ - __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ - __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ - __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ - __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ - __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ - __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ - __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ - __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ - __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ - __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ - __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ - __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ - __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ - __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ - __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ - __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ - __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ - uint32_t RESERVED0[5U]; - __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ } SCB_Type; /* SCB CPUID Register Definitions */ @@ -654,12 +654,12 @@ typedef struct */ typedef struct { - uint32_t RESERVED0[1U]; - __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ #if defined (__CM3_REV) && (__CM3_REV >= 0x200U) - __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ #else - uint32_t RESERVED1[1U]; + uint32_t RESERVED1[1U]; #endif } SCnSCB_Type; @@ -668,12 +668,6 @@ typedef struct #define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ /* Auxiliary Control Register Definitions */ -#if defined (__CM3_REV) && (__CM3_REV >= 0x200U) -#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ -#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ - -#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ -#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ #define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ #define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ @@ -683,7 +677,6 @@ typedef struct #define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ #define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ -#endif /*@} end of group CMSIS_SCnotSCB */ @@ -700,10 +693,10 @@ typedef struct */ typedef struct { - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ - __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ - __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ - __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ } SysTick_Type; /* SysTick Control / Status Register Definitions */ @@ -752,35 +745,38 @@ typedef struct */ typedef struct { - __OM union - { - __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ - __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ - __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ - } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ - uint32_t RESERVED0[864U]; - __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ - uint32_t RESERVED1[15U]; - __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ - uint32_t RESERVED2[15U]; - __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ - uint32_t RESERVED3[32U]; - uint32_t RESERVED4[43U]; - __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ - __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ - uint32_t RESERVED5[6U]; - __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ - __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ - __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ - __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ - __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ - __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ - __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ - __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ - __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ - __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ - __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ - __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ } ITM_Type; /* ITM Trace Privilege Register Definitions */ @@ -815,6 +811,18 @@ typedef struct #define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ #define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + /* ITM Lock Status Register Definitions */ #define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ #define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ @@ -840,29 +848,29 @@ typedef struct */ typedef struct { - __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ - __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ - __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ - __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ - __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ - __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ - __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ - __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ - __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ - __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ - __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ - uint32_t RESERVED0[1U]; - __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ - __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ - __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ - uint32_t RESERVED1[1U]; - __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ - __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ - __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ - uint32_t RESERVED2[1U]; - __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ - __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ - __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ } DWT_Type; /* DWT Control Register Definitions */ @@ -987,30 +995,30 @@ typedef struct */ typedef struct { - __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ - __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ - uint32_t RESERVED0[2U]; - __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ - uint32_t RESERVED1[55U]; - __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ - uint32_t RESERVED2[131U]; - __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ - __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ - __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ - uint32_t RESERVED3[759U]; - __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ - __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ - __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ - uint32_t RESERVED4[1U]; - __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ - __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ - __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ - uint32_t RESERVED5[39U]; - __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ - __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ - uint32_t RESERVED7[8U]; - __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ - __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ + __IM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER Register */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ } TPI_Type; /* TPI Asynchronous Clock Prescaler Register Definitions */ @@ -1047,13 +1055,13 @@ typedef struct /* TPI Integration ETM Data Register Definitions (FIFO0) */ #define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ -#define TPI_FIFO0_ITM_ATVALID_Msk (0x1UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ #define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ #define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ #define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ -#define TPI_FIFO0_ETM_ATVALID_Msk (0x1UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ #define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ #define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ @@ -1076,13 +1084,13 @@ typedef struct /* TPI Integration ITM Data Register Definitions (FIFO1) */ #define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ -#define TPI_FIFO1_ITM_ATVALID_Msk (0x1UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ #define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ #define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ #define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ -#define TPI_FIFO1_ETM_ATVALID_Msk (0x1UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ #define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ #define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ @@ -1149,17 +1157,17 @@ typedef struct */ typedef struct { - __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ - __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ - __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ - __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ - __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ - __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ - __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ - __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ - __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ - __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ } MPU_Type; #define MPU_TYPE_RALIASES 4U @@ -1245,10 +1253,10 @@ typedef struct */ typedef struct { - __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ - __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ - __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ - __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ } CoreDebug_Type; /* Debug Halting Control and Status Register Definitions */ @@ -1391,8 +1399,8 @@ typedef struct #define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) - #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ - #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ +#define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ #endif /*@} */ @@ -1422,33 +1430,33 @@ typedef struct */ #ifdef CMSIS_NVIC_VIRTUAL - #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE - #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" - #endif - #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE +#define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" +#endif +#include CMSIS_NVIC_VIRTUAL_HEADER_FILE #else - #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping - #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping - #define NVIC_EnableIRQ __NVIC_EnableIRQ - #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ - #define NVIC_DisableIRQ __NVIC_DisableIRQ - #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ - #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ - #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ - #define NVIC_GetActive __NVIC_GetActive - #define NVIC_SetPriority __NVIC_SetPriority - #define NVIC_GetPriority __NVIC_GetPriority - #define NVIC_SystemReset __NVIC_SystemReset +#define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping +#define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping +#define NVIC_EnableIRQ __NVIC_EnableIRQ +#define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ +#define NVIC_DisableIRQ __NVIC_DisableIRQ +#define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ +#define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ +#define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ +#define NVIC_GetActive __NVIC_GetActive +#define NVIC_SetPriority __NVIC_SetPriority +#define NVIC_GetPriority __NVIC_GetPriority +#define NVIC_SystemReset __NVIC_SystemReset #endif /* CMSIS_NVIC_VIRTUAL */ #ifdef CMSIS_VECTAB_VIRTUAL - #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE - #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" - #endif - #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" +#endif +#include CMSIS_VECTAB_VIRTUAL_HEADER_FILE #else - #define NVIC_SetVector __NVIC_SetVector - #define NVIC_GetVector __NVIC_GetVector +#define NVIC_SetVector __NVIC_SetVector +#define NVIC_GetVector __NVIC_GetVector #endif /* (CMSIS_VECTAB_VIRTUAL) */ #define NVIC_USER_IRQ_OFFSET 16 @@ -1471,15 +1479,15 @@ typedef struct */ __STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) { - uint32_t reg_value; - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - reg_value = SCB->AIRCR; /* read old register configuration */ - reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ - reg_value = (reg_value | - ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos) ); /* Insert write key and priority group */ - SCB->AIRCR = reg_value; + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos)); /* Insert write key and priority group */ + SCB->AIRCR = reg_value; } @@ -1490,7 +1498,7 @@ __STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) */ __STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) { - return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); } @@ -1502,12 +1510,10 @@ __STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) */ __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) { - if ((int32_t)(IRQn) >= 0) - { - __COMPILER_BARRIER(); - NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __COMPILER_BARRIER(); - } + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } @@ -1521,14 +1527,14 @@ __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) */ __STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) { - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } + if ((int32_t)(IRQn) >= 0) + { + return ((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return (0U); + } } @@ -1540,12 +1546,12 @@ __STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) */ __STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) { - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - __DSB(); - __ISB(); - } + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } } @@ -1559,14 +1565,14 @@ __STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) */ __STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) { - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } + if ((int32_t)(IRQn) >= 0) + { + return ((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return (0U); + } } @@ -1578,10 +1584,10 @@ __STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) */ __STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) { - if ((int32_t)(IRQn) >= 0) - { - NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } @@ -1593,10 +1599,10 @@ __STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) */ __STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) { - if ((int32_t)(IRQn) >= 0) - { - NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); - } + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); + } } @@ -1610,14 +1616,14 @@ __STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) */ __STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) { - if ((int32_t)(IRQn) >= 0) - { - return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); - } - else - { - return(0U); - } + if ((int32_t)(IRQn) >= 0) + { + return ((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return (0U); + } } @@ -1632,14 +1638,14 @@ __STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) */ __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) { - if ((int32_t)(IRQn) >= 0) - { - NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } - else - { - SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); - } + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)IRQn) & 0xFUL) - 4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } } @@ -1655,14 +1661,14 @@ __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) __STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) { - if ((int32_t)(IRQn) >= 0) - { - return(((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); - } - else - { - return(((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); - } + if ((int32_t)(IRQn) >= 0) + { + return (((uint32_t)NVIC->IP[((uint32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return (((uint32_t)SCB->SHP[(((uint32_t)IRQn) & 0xFUL) - 4UL] >> (8U - __NVIC_PRIO_BITS))); + } } @@ -1677,19 +1683,19 @@ __STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) \param [in] SubPriority Subpriority value (starting from 0). \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). */ -__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +__STATIC_INLINE uint32_t NVIC_EncodePriority(uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) { - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - return ( - ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | - ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) - ); + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits)) - 1UL))) + ); } @@ -1704,17 +1710,17 @@ __STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t P \param [out] pPreemptPriority Preemptive priority value (starting from 0). \param [out] pSubPriority Subpriority value (starting from 0). */ -__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +__STATIC_INLINE void NVIC_DecodePriority(uint32_t Priority, uint32_t PriorityGroup, uint32_t *const pPreemptPriority, uint32_t *const pSubPriority) { - uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ - uint32_t PreemptPriorityBits; - uint32_t SubPriorityBits; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; - PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); - SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); - *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); - *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority) & (uint32_t)((1UL << (SubPriorityBits)) - 1UL); } @@ -1729,9 +1735,8 @@ __STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGr */ __STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) { - uint32_t vectors = (uint32_t )SCB->VTOR; - (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector; - /* ARM Application Note 321 states that the M3 does not require the architectural barrier */ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; } @@ -1745,8 +1750,8 @@ __STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) */ __STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) { - uint32_t vectors = (uint32_t )SCB->VTOR; - return (uint32_t)(* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)); + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; } @@ -1756,17 +1761,17 @@ __STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) */ __NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) { - __DSB(); /* Ensure all outstanding memory accesses included + __DSB(); /* Ensure all outstanding memory accesses included buffered write are completed before reset */ - SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | - (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | - SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ - __DSB(); /* Ensure completion of memory access */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ - for(;;) /* wait until reset */ - { - __NOP(); - } + for (;;) /* wait until reset */ + { + __NOP(); + } } /*@} end of CMSIS_Core_NVICFunctions */ @@ -1779,7 +1784,6 @@ __NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void) #endif - /* ########################## FPU functions #################################### */ /** \ingroup CMSIS_Core_FunctionInterface @@ -1829,18 +1833,18 @@ __STATIC_INLINE uint32_t SCB_GetFPUType(void) */ __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) { - if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) - { - return (1UL); /* Reload value impossible */ - } + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } - SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ - NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ - SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ - SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | - SysTick_CTRL_TICKINT_Msk | - SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ - return (0UL); /* Function successful */ + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority(SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ } #endif @@ -1869,18 +1873,18 @@ extern volatile int32_t ITM_RxBuffer; /*!< External \param [in] ch Character to transmit. \returns Character to transmit. */ -__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +__STATIC_INLINE uint32_t ITM_SendChar(uint32_t ch) { - if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ - ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ - { - while (ITM->PORT[0U].u32 == 0UL) + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL) != 0UL)) /* ITM Port #0 enabled */ { - __NOP(); + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; } - ITM->PORT[0U].u8 = (uint8_t)ch; - } - return (ch); + return (ch); } @@ -1890,17 +1894,17 @@ __STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) \return Received character. \return -1 No character pending. */ -__STATIC_INLINE int32_t ITM_ReceiveChar (void) +__STATIC_INLINE int32_t ITM_ReceiveChar(void) { - int32_t ch = -1; /* no character available */ + int32_t ch = -1; /* no character available */ - if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) - { - ch = ITM_RxBuffer; - ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ - } + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } - return (ch); + return (ch); } @@ -1910,17 +1914,17 @@ __STATIC_INLINE int32_t ITM_ReceiveChar (void) \return 0 No character available. \return 1 Character available. */ -__STATIC_INLINE int32_t ITM_CheckChar (void) +__STATIC_INLINE int32_t ITM_CheckChar(void) { - if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) - { - return (0); /* no character available */ - } - else - { - return (1); /* character available */ - } + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } } /*@} end of CMSIS_core_DebugFunctions */ diff --git a/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Include/apm32f10x.h b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Include/apm32f10x.h index f5edd39559..24e12575f6 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Include/apm32f10x.h +++ b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Include/apm32f10x.h @@ -1,21 +1,35 @@ /*! - * @file apm32f10x.h + * @file apm32f10x.h * - * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer Header File. * - * @details This file contains all the peripheral register's definitions, bits definitions and memory mapping + * @details This file contains all the peripheral register's definitions, bits definitions and memory mapping * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ -#ifndef __APM32F10x_H -#define __APM32F10x_H +#ifndef __APM32F10X_H +#define __APM32F10X_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif /*! @@ -31,11 +45,11 @@ * @brief Define Value of the External oscillator in Hz */ #ifndef HSE_VALUE - #define HSE_VALUE ((uint32_t)8000000) +#define HSE_VALUE ((uint32_t)8000000) #endif /** Time out for HSE start up */ -#define HSE_STARTUP_TIMEOUT ((uint16_t)0x0500) +#define HSE_STARTUP_TIMEOUT ((uint16_t)0x05000) /** Value of the Internal oscillator in Hz */ #define HSI_VALUE ((uint32_t)8000000) @@ -45,7 +59,7 @@ */ #define __APM32F10X_STDPERIPH_VERSION_MAIN (0x01) /*!< [31:24] main version */ #define __APM32F10X_STDPERIPH_VERSION_SUB1 (0x00) /*!< [23:16] sub1 version */ -#define __APM32F10X_STDPERIPH_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */ +#define __APM32F10X_STDPERIPH_VERSION_SUB2 (0x02) /*!< [15:8] sub2 version */ #define __APM32F10X_STDPERIPH_VERSION_RC (0x00) /*!< [7:0] release candidate */ #define __APM32F10X_STDPERIPH_VERSION ( (__APM32F10X_STDPERIPH_VERSION_MAIN << 24)\ |(__APM32F10X_STDPERIPH_VERSION_SUB1 << 16)\ @@ -54,7 +68,7 @@ /** APM32 devices does not provide an MPU */ - #define __MPU_PRESENT 0 +#define __MPU_PRESENT 0 /** APM32 uses 4 Bits for the Priority Levels */ #define __NVIC_PRIO_BITS 4 /** Set to 1 if different SysTick Config is used */ @@ -66,143 +80,143 @@ */ typedef enum IRQn { -/****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ - NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ - MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ - BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ - UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ - SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ - DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ - PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ - SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ + /****** Cortex-M3 Processor Exceptions Numbers ***************************************************/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + MemoryManagement_IRQn = -12, /*!< 4 Cortex-M3 Memory Management Interrupt */ + BusFault_IRQn = -11, /*!< 5 Cortex-M3 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /*!< 6 Cortex-M3 Usage Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 Cortex-M3 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /*!< 12 Cortex-M3 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /*!< 14 Cortex-M3 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 Cortex-M3 System Tick Interrupt */ -/****** APM32 specific Interrupt Numbers *********************************************************/ - WWDT_IRQn = 0, /*!< Window WatchDog Interrupt */ - PVD_IRQn = 1, /*!< PVD through EINT Line detection Interrupt */ - TAMPER_IRQn = 2, /*!< Tamper Interrupt */ - RTC_IRQn = 3, /*!< RTC global Interrupt */ - FMC_IRQn = 4, /*!< FMC global Interrupt */ - RCM_IRQn = 5, /*!< RCM global Interrupt */ - EINT0_IRQn = 6, /*!< EINT Line0 Interrupt */ - EINT1_IRQn = 7, /*!< EINT Line1 Interrupt */ - EINT2_IRQn = 8, /*!< EINT Line2 Interrupt */ - EINT3_IRQn = 9, /*!< EINT Line3 Interrupt */ - EINT4_IRQn = 10, /*!< EINT Line4 Interrupt */ - DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ - DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ - DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ - DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ - DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ - DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ - DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ + /****** APM32 specific Interrupt Numbers *********************************************************/ + WWDT_IRQn = 0, /*!< Window WatchDog Interrupt */ + PVD_IRQn = 1, /*!< PVD through EINT Line detection Interrupt */ + TAMPER_IRQn = 2, /*!< Tamper Interrupt */ + RTC_IRQn = 3, /*!< RTC global Interrupt */ + FLASH_IRQn = 4, /*!< FLASH global Interrupt */ + RCM_IRQn = 5, /*!< RCM global Interrupt */ + EINT0_IRQn = 6, /*!< EINT Line0 Interrupt */ + EINT1_IRQn = 7, /*!< EINT Line1 Interrupt */ + EINT2_IRQn = 8, /*!< EINT Line2 Interrupt */ + EINT3_IRQn = 9, /*!< EINT Line3 Interrupt */ + EINT4_IRQn = 10, /*!< EINT Line4 Interrupt */ + DMA1_Channel1_IRQn = 11, /*!< DMA1 Channel 1 global Interrupt */ + DMA1_Channel2_IRQn = 12, /*!< DMA1 Channel 2 global Interrupt */ + DMA1_Channel3_IRQn = 13, /*!< DMA1 Channel 3 global Interrupt */ + DMA1_Channel4_IRQn = 14, /*!< DMA1 Channel 4 global Interrupt */ + DMA1_Channel5_IRQn = 15, /*!< DMA1 Channel 5 global Interrupt */ + DMA1_Channel6_IRQn = 16, /*!< DMA1 Channel 6 global Interrupt */ + DMA1_Channel7_IRQn = 17, /*!< DMA1 Channel 7 global Interrupt */ #if defined (APM32F10X_LD) - /** APM32F10X Low-density devices specific Interrupt Numbers */ - ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ - USBD1_HP_CAN1_TX_IRQn = 19, /*!< USB Device 1 High Priority or CAN1 TX Interrupts */ - USBD1_LP_CAN1_RX0_IRQn = 20, /*!< USB Device 1 Low Priority or CAN1 RX0 Interrupts */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EINT9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TMR1_BRK_IRQn = 24, /*!< TMR1 Break Interrupt */ - TMR1_UP_IRQn = 25, /*!< TMR1 Update Interrupt */ - TMR1_TRG_COM_IRQn = 26, /*!< TMR1 Trigger and Commutation Interrupt */ - TMR1_CC_IRQn = 27, /*!< TMR1 Capture Compare Interrupt */ - TMR2_IRQn = 28, /*!< TMR2 global Interrupt */ - TMR3_IRQn = 29, /*!< TMR3 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - EINT15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTCAlarm_IRQn = 41, /*!< RTC Alarm through EINT Line Interrupt */ - USBDWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EINT Line Interrupt */ - FPU_IRQn = 43, /*!< FPU Global Interrupt */ - QSPI_IRQn = 44, /*!< QSPI Global Interrupt */ - USBD2_HP_IRQn = 45, /*!< USB Device 2 High Priority */ - USBD2_LP_IRQn = 46 /*!< USB Device 2 Low Priority */ + /** APM32F10X Low-density devices specific Interrupt Numbers */ + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USBD1_HP_CAN1_TX_IRQn = 19, /*!< USB Device 1 High Priority or CAN1 TX Interrupts */ + USBD1_LP_CAN1_RX0_IRQn = 20, /*!< USB Device 1 Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EINT9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TMR1_BRK_IRQn = 24, /*!< TMR1 Break Interrupt */ + TMR1_UP_IRQn = 25, /*!< TMR1 Update Interrupt */ + TMR1_TRG_COM_IRQn = 26, /*!< TMR1 Trigger and Commutation Interrupt */ + TMR1_CC_IRQn = 27, /*!< TMR1 Capture Compare Interrupt */ + TMR2_IRQn = 28, /*!< TMR2 global Interrupt */ + TMR3_IRQn = 29, /*!< TMR3 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + EINT15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EINT Line Interrupt */ + USBDWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EINT Line Interrupt */ + FPU_IRQn = 43, /*!< FPU Global Interrupt */ + QSPI_IRQn = 44, /*!< QSPI Global Interrupt */ + USBD2_HP_IRQn = 45, /*!< USB Device 2 High Priority */ + USBD2_LP_IRQn = 46 /*!< USB Device 2 Low Priority */ #elif defined (APM32F10X_MD) - /** APM32F10X Medium-density devices specific Interrupt Numbers */ - ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ - USBD1_HP_CAN1_TX_IRQn = 19, /*!< USB Device 1 High Priority or CAN1 TX Interrupts */ - USBD1_LP_CAN1_RX0_IRQn = 20, /*!< USB Device 1 Low Priority or CAN1 RX0 Interrupts */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EINT9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TMR1_BRK_IRQn = 24, /*!< TMR1 Break Interrupt */ - TMR1_UP_IRQn = 25, /*!< TMR1 Update Interrupt */ - TMR1_TRG_COM_IRQn = 26, /*!< TMR1 Trigger and Commutation Interrupt */ - TMR1_CC_IRQn = 27, /*!< TMR1 Capture Compare Interrupt */ - TMR2_IRQn = 28, /*!< TMR2 global Interrupt */ - TMR3_IRQn = 29, /*!< TMR3 global Interrupt */ - TMR4_IRQn = 30, /*!< TMR4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EINT15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTCAlarm_IRQn = 41, /*!< RTC Alarm through EINT Line Interrupt */ - USBDWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EINT Line Interrupt */ - FPU_IRQn = 43, /*!< FPU Global Interrupt */ - QSPI_IRQn = 44, /*!< QSPI Global Interrupt */ - USBD2_HP_IRQn = 45, /*!< USB Device 2 High Priority */ - USBD2_LP_IRQn = 46 /*!< USB Device 2 Low Priority */ + /** APM32F10X Medium-density devices specific Interrupt Numbers */ + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USBD1_HP_CAN1_TX_IRQn = 19, /*!< USB Device 1 High Priority or CAN1 TX Interrupts */ + USBD1_LP_CAN1_RX0_IRQn = 20, /*!< USB Device 1 Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EINT9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TMR1_BRK_IRQn = 24, /*!< TMR1 Break Interrupt */ + TMR1_UP_IRQn = 25, /*!< TMR1 Update Interrupt */ + TMR1_TRG_COM_IRQn = 26, /*!< TMR1 Trigger and Commutation Interrupt */ + TMR1_CC_IRQn = 27, /*!< TMR1 Capture Compare Interrupt */ + TMR2_IRQn = 28, /*!< TMR2 global Interrupt */ + TMR3_IRQn = 29, /*!< TMR3 global Interrupt */ + TMR4_IRQn = 30, /*!< TMR4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EINT15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EINT Line Interrupt */ + USBDWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EINT Line Interrupt */ + FPU_IRQn = 43, /*!< FPU Global Interrupt */ + QSPI_IRQn = 44, /*!< QSPI Global Interrupt */ + USBD2_HP_IRQn = 45, /*!< USB Device 2 High Priority */ + USBD2_LP_IRQn = 46 /*!< USB Device 2 Low Priority */ #elif defined (APM32F10X_HD) - /** APM32F10X High-density devices specific Interrupt Numbers */ - ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ - USBD1_HP_CAN1_TX_IRQn = 19, /*!< USB Device 1 High Priority or CAN1 TX Interrupts */ - USBD1_LP_CAN1_RX0_IRQn = 20, /*!< USB Device 1 Low Priority or CAN1 RX0 Interrupts */ - CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ - CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ - EINT9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ - TMR1_BRK_IRQn = 24, /*!< TMR1 Break Interrupt */ - TMR1_UP_IRQn = 25, /*!< TMR1 Update Interrupt */ - TMR1_TRG_COM_IRQn = 26, /*!< TMR1 Trigger and Commutation Interrupt */ - TMR1_CC_IRQn = 27, /*!< TMR1 Capture Compare Interrupt */ - TMR2_IRQn = 28, /*!< TMR2 global Interrupt */ - TMR3_IRQn = 29, /*!< TMR3 global Interrupt */ - TMR4_IRQn = 30, /*!< TMR4 global Interrupt */ - I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ - I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ - I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ - I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ - SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ - SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ - USART1_IRQn = 37, /*!< USART1 global Interrupt */ - USART2_IRQn = 38, /*!< USART2 global Interrupt */ - USART3_IRQn = 39, /*!< USART3 global Interrupt */ - EINT15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ - RTCAlarm_IRQn = 41, /*!< RTC Alarm through EINT Line Interrupt */ - USBDWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EINT Line Interrupt */ - TMR8_BRK_IRQn = 43, /*!< TMR8 Break Interrupt */ - TMR8_UP_IRQn = 44, /*!< TMR8 Update Interrupt */ - TMR8_TRG_COM_IRQn = 45, /*!< TMR8 Trigger and Commutation Interrupt */ - TMR8_CC_IRQn = 46, /*!< TMR8 Capture Compare Interrupt */ - ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ - EMMC_IRQn = 48, /*!< EMMC global Interrupt */ - SDIO_IRQn = 49, /*!< SDIO global Interrupt */ - TMR5_IRQn = 50, /*!< TMR5 global Interrupt */ - SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ - UART4_IRQn = 52, /*!< UART4 global Interrupt */ - UART5_IRQn = 53, /*!< UART5 global Interrupt */ - TMR6_IRQn = 54, /*!< TMR6 global Interrupt */ - TMR7_IRQn = 55, /*!< TMR7 global Interrupt */ - DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ - DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ - DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ - DMA2_Channel4_5_IRQn = 59, /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ - USBD2_HP_CAN2_TX_IRQn = 61, /*!< USB Device 2 High Priority or CAN2 TX Interrupts */ - USBD2_LP_CAN2_RX0_IRQn = 62, /*!< USB Device 2 Low Priority or CAN2 RX0 Interrupts */ - CAN2_RX1_IRQn = 63, /*!< CAN2 RX1 Interrupts */ - CAN2_SCE_IRQn = 64, /*!< CAN2 SCE Interrupts */ + /** APM32F10X High-density devices specific Interrupt Numbers */ + ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */ + USBD1_HP_CAN1_TX_IRQn = 19, /*!< USB Device 1 High Priority or CAN1 TX Interrupts */ + USBD1_LP_CAN1_RX0_IRQn = 20, /*!< USB Device 1 Low Priority or CAN1 RX0 Interrupts */ + CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */ + CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */ + EINT9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */ + TMR1_BRK_IRQn = 24, /*!< TMR1 Break Interrupt */ + TMR1_UP_IRQn = 25, /*!< TMR1 Update Interrupt */ + TMR1_TRG_COM_IRQn = 26, /*!< TMR1 Trigger and Commutation Interrupt */ + TMR1_CC_IRQn = 27, /*!< TMR1 Capture Compare Interrupt */ + TMR2_IRQn = 28, /*!< TMR2 global Interrupt */ + TMR3_IRQn = 29, /*!< TMR3 global Interrupt */ + TMR4_IRQn = 30, /*!< TMR4 global Interrupt */ + I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */ + I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */ + I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ + I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ + SPI1_IRQn = 35, /*!< SPI1 global Interrupt */ + SPI2_IRQn = 36, /*!< SPI2 global Interrupt */ + USART1_IRQn = 37, /*!< USART1 global Interrupt */ + USART2_IRQn = 38, /*!< USART2 global Interrupt */ + USART3_IRQn = 39, /*!< USART3 global Interrupt */ + EINT15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */ + RTCAlarm_IRQn = 41, /*!< RTC Alarm through EINT Line Interrupt */ + USBDWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EINT Line Interrupt */ + TMR8_BRK_IRQn = 43, /*!< TMR8 Break Interrupt */ + TMR8_UP_IRQn = 44, /*!< TMR8 Update Interrupt */ + TMR8_TRG_COM_IRQn = 45, /*!< TMR8 Trigger and Commutation Interrupt */ + TMR8_CC_IRQn = 46, /*!< TMR8 Capture Compare Interrupt */ + ADC3_IRQn = 47, /*!< ADC3 global Interrupt */ + EMMC_IRQn = 48, /*!< EMMC global Interrupt */ + SDIO_IRQn = 49, /*!< SDIO global Interrupt */ + TMR5_IRQn = 50, /*!< TMR5 global Interrupt */ + SPI3_IRQn = 51, /*!< SPI3 global Interrupt */ + UART4_IRQn = 52, /*!< UART4 global Interrupt */ + UART5_IRQn = 53, /*!< UART5 global Interrupt */ + TMR6_IRQn = 54, /*!< TMR6 global Interrupt */ + TMR7_IRQn = 55, /*!< TMR7 global Interrupt */ + DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt */ + DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ + DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt */ + DMA2_Channel4_5_IRQn = 59, /*!< DMA2 Channel 4 and Channel 5 global Interrupt */ + USBD2_HP_CAN2_TX_IRQn = 61, /*!< USB Device 2 High Priority or CAN2 TX Interrupts */ + USBD2_LP_CAN2_RX0_IRQn = 62, /*!< USB Device 2 Low Priority or CAN2 RX0 Interrupts */ + CAN2_RX1_IRQn = 63, /*!< CAN2 RX1 Interrupts */ + CAN2_SCE_IRQn = 64, /*!< CAN2 SCE Interrupts */ #endif } IRQn_Type; @@ -248,13 +262,13 @@ typedef __I uint16_t vuc16; typedef __I uint8_t vuc8; #ifndef __IM - #define __IM __I +#define __IM __I #endif #ifndef __OM - #define __OM __O +#define __OM __O #endif #ifndef __IOM - #define __IOM __IO +#define __IOM __IO #endif enum {BIT_RESET, BIT_SET}; @@ -305,8 +319,8 @@ typedef struct struct { - __IOM uint32_t SCLKSW : 2; - __IM uint32_t SCLKSWSTS : 2; + __IOM uint32_t SCLKSEL : 2; + __IM uint32_t SCLKSELSTS : 2; __IOM uint32_t AHBPSC : 4; __IOM uint32_t APB1PSC : 3; __IOM uint32_t APB2PSC : 3; @@ -502,7 +516,7 @@ typedef struct /** Backup domain control register */ union - { + { __IOM uint32_t BDCTRL; struct @@ -2041,7 +2055,7 @@ typedef struct __OM uint32_t COMG : 1; __OM uint32_t TEG : 1; __OM uint32_t BEG : 1; - __OM uint32_t RESERVED : 24; + __IM uint32_t RESERVED : 24; } CEG_B; }; @@ -2090,12 +2104,12 @@ typedef struct __IOM uint32_t CC3SEL : 2; __IOM uint32_t OC3FEN : 1; __IOM uint32_t OC3PEN : 1; - __IOM uint32_t OC3MODE : 3; + __IOM uint32_t OC3MOD : 3; __IOM uint32_t OC3CEN : 1; __IOM uint32_t CC4SEL : 2; __IOM uint32_t OC4FEN : 1; __IOM uint32_t OC4PEN : 1; - __IOM uint32_t OC4MODE : 3; + __IOM uint32_t OC4MOD : 3; __IOM uint32_t OC4CEN : 1; __IM uint32_t RESERVED : 16; } CCM2_COMPARE_B; @@ -2455,10 +2469,7 @@ typedef struct struct { __IOM uint32_t DLCODE : 4; - __IM uint32_t RESERVED1 : 4; - __IOM uint32_t TXTS : 1; - __IM uint32_t RESERVED2 : 7; - __IOM uint32_t MTS : 16; + __IOM uint32_t RESERVED : 28; } TXDLEN_B; }; @@ -2519,9 +2530,9 @@ typedef struct struct { __IM uint32_t DLCODE : 4; - __IM uint32_t RESERVED : 4; + __IM uint32_t RESERVED1 : 4; __IM uint32_t FMIDX : 8; - __IM uint32_t MTS : 16; + __IM uint32_t RESERVED2 : 16; } RXDLEN_B; }; @@ -2532,10 +2543,10 @@ typedef struct struct { + __IM uint32_t DATABYTE0 : 8; __IM uint32_t DATABYTE1 : 8; __IM uint32_t DATABYTE2 : 8; __IM uint32_t DATABYTE3 : 8; - __IM uint32_t DATABYTE4 : 8; } RXMDL_B; }; @@ -2546,10 +2557,10 @@ typedef struct struct { + __IM uint32_t DATABYTE4 : 8; __IM uint32_t DATABYTE5 : 8; __IM uint32_t DATABYTE6 : 8; __IM uint32_t DATABYTE7 : 8; - __IM uint32_t DATABYTE8 : 8; } RXMDH_B; }; } CAN_RxMailBox_T; @@ -2601,7 +2612,7 @@ typedef struct } FBANK1_B; }; - /** @brief CAN Filter bank register 1 */ + /** @brief CAN Filter bank register 2 */ union { __IOM uint32_t FBANK2; @@ -2663,8 +2674,7 @@ typedef struct __IOM uint32_t ARTXMD : 1; __IOM uint32_t AWUPCFG : 1; __IOM uint32_t ALBOFFM : 1; - __IOM uint32_t TTCM : 1; - __IM uint32_t RESERVED1 : 7; + __IM uint32_t RESERVED1 : 8; __IOM uint32_t SWRST : 1; __IOM uint32_t DBGFRZE : 1; __IM uint32_t RESERVED2 : 15; @@ -2739,7 +2749,7 @@ typedef struct __IOM uint32_t FFULLFLG0 : 1; __IOM uint32_t FOVRFLG0 : 1; __IOM uint32_t RFOM0 : 1; - __IM uint32_t RESERVED2 : 26; + __IM uint32_t RESERVED1 : 26; } RXF0_B; }; @@ -2838,7 +2848,9 @@ typedef struct struct { __IOM uint32_t FINITEN : 1; - __IM uint32_t RESERVED : 31; + __IM uint32_t RESERVED : 7; + __IOM uint32_t CAN2BN : 6; + __IM uint32_t RESERVED1 : 18; } FCTRL_B; }; @@ -2863,7 +2875,21 @@ typedef struct __IOM uint32_t FMCFG11 : 1; __IOM uint32_t FMCFG12 : 1; __IOM uint32_t FMCFG13 : 1; - __IM uint32_t RESERVED : 18; + __IOM uint32_t FMCFG14 : 1; + __IOM uint32_t FMCFG15 : 1; + __IOM uint32_t FMCFG16 : 1; + __IOM uint32_t FMCFG17 : 1; + __IOM uint32_t FMCFG18 : 1; + __IOM uint32_t FMCFG19 : 1; + __IOM uint32_t FMCFG20 : 1; + __IOM uint32_t FMCFG21 : 1; + __IOM uint32_t FMCFG22 : 1; + __IOM uint32_t FMCFG23 : 1; + __IOM uint32_t FMCFG24 : 1; + __IOM uint32_t FMCFG25 : 1; + __IOM uint32_t FMCFG26 : 1; + __IOM uint32_t FMCFG27 : 1; + __IM uint32_t RESERVED : 4; } FMCFG_B; }; @@ -2890,8 +2916,22 @@ typedef struct __IOM uint32_t FSCFG11 : 1; __IOM uint32_t FSCFG12 : 1; __IOM uint32_t FSCFG13 : 1; - __IM uint32_t RESERVED : 18; - }FSCFG_B; + __IOM uint32_t FSCFG14 : 1; + __IOM uint32_t FSCFG15 : 1; + __IOM uint32_t FSCFG16 : 1; + __IOM uint32_t FSCFG17 : 1; + __IOM uint32_t FSCFG18 : 1; + __IOM uint32_t FSCFG19 : 1; + __IOM uint32_t FSCFG20 : 1; + __IOM uint32_t FSCFG21 : 1; + __IOM uint32_t FSCFG22 : 1; + __IOM uint32_t FSCFG23 : 1; + __IOM uint32_t FSCFG24 : 1; + __IOM uint32_t FSCFG25 : 1; + __IOM uint32_t FSCFG26 : 1; + __IOM uint32_t FSCFG27 : 1; + __IM uint32_t RESERVED : 4; + } FSCFG_B; }; __IM uint32_t RESERVED3; @@ -2917,7 +2957,21 @@ typedef struct __IOM uint32_t FFASS11 : 1; __IOM uint32_t FFASS12 : 1; __IOM uint32_t FFASS13 : 1; - __IM uint32_t RESERVED : 18; + __IOM uint32_t FFASS14 : 1; + __IOM uint32_t FFASS15 : 1; + __IOM uint32_t FFASS16 : 1; + __IOM uint32_t FFASS17 : 1; + __IOM uint32_t FFASS18 : 1; + __IOM uint32_t FFASS19 : 1; + __IOM uint32_t FFASS20 : 1; + __IOM uint32_t FFASS21 : 1; + __IOM uint32_t FFASS22 : 1; + __IOM uint32_t FFASS23 : 1; + __IOM uint32_t FFASS24 : 1; + __IOM uint32_t FFASS25 : 1; + __IOM uint32_t FFASS26 : 1; + __IOM uint32_t FFASS27 : 1; + __IM uint32_t RESERVED : 4; } FFASS_B; }; @@ -2944,13 +2998,27 @@ typedef struct __IOM uint32_t FACT11 : 1; __IOM uint32_t FACT12 : 1; __IOM uint32_t FACT13 : 1; - __IM uint32_t RESERVED : 18; + __IOM uint32_t FACT14 : 1; + __IOM uint32_t FACT15 : 1; + __IOM uint32_t FACT16 : 1; + __IOM uint32_t FACT17 : 1; + __IOM uint32_t FACT18 : 1; + __IOM uint32_t FACT19 : 1; + __IOM uint32_t FACT20 : 1; + __IOM uint32_t FACT21 : 1; + __IOM uint32_t FACT22 : 1; + __IOM uint32_t FACT23 : 1; + __IOM uint32_t FACT24 : 1; + __IOM uint32_t FACT25 : 1; + __IOM uint32_t FACT26 : 1; + __IOM uint32_t FACT27 : 1; + __IM uint32_t RESERVED : 4; } FACT_B; }; __IM uint32_t RESERVED5[8]; - CAN_FilterRegister_T sFilterRegister[14]; + CAN_FilterRegister_T sFilterRegister[28]; } CAN_T; @@ -3458,7 +3526,7 @@ typedef struct __IM uint32_t ADC2DATA : 16; } REGDATA_B; }; -}ADC_T; +} ADC_T; /** * @brief External Interrupt(EINT) @@ -3532,25 +3600,25 @@ typedef struct struct { - __IOM uint32_t PTEN0 : 1; - __IOM uint32_t PTEN1 : 1; - __IOM uint32_t PTEN2 : 1; - __IOM uint32_t PTEN3 : 1; - __IOM uint32_t PTEN4 : 1; - __IOM uint32_t PTEN5 : 1; - __IOM uint32_t PTEN6 : 1; - __IOM uint32_t PTEN7 : 1; - __IOM uint32_t PTEN8 : 1; - __IOM uint32_t PTEN9 : 1; - __IOM uint32_t PTEN10 : 1; - __IOM uint32_t PTEN11 : 1; - __IOM uint32_t PTEN12 : 1; - __IOM uint32_t PTEN13 : 1; - __IOM uint32_t PTEN14 : 1; - __IOM uint32_t PTEN15 : 1; - __IOM uint32_t PTEN16 : 1; - __IOM uint32_t PTEN17 : 1; - __IOM uint32_t PTEN18 : 1; + __IOM uint32_t RTEN0 : 1; + __IOM uint32_t RTEN1 : 1; + __IOM uint32_t RTEN2 : 1; + __IOM uint32_t RTEN3 : 1; + __IOM uint32_t RTEN4 : 1; + __IOM uint32_t RTEN5 : 1; + __IOM uint32_t RTEN6 : 1; + __IOM uint32_t RTEN7 : 1; + __IOM uint32_t RTEN8 : 1; + __IOM uint32_t RTEN9 : 1; + __IOM uint32_t RTEN10 : 1; + __IOM uint32_t RTEN11 : 1; + __IOM uint32_t RTEN12 : 1; + __IOM uint32_t RTEN13 : 1; + __IOM uint32_t RTEN14 : 1; + __IOM uint32_t RTEN15 : 1; + __IOM uint32_t RTEN16 : 1; + __IOM uint32_t RTEN17 : 1; + __IOM uint32_t RTEN18 : 1; __IM uint32_t RESERVED : 12; } RTEN_B; }; @@ -3644,7 +3712,7 @@ typedef struct __IM uint32_t RESERVED : 12; } IF_B; }; -}EINT_T; +} EINT_T; /** * @brief Independent watchdog(IWDT) @@ -3700,7 +3768,7 @@ typedef struct __IM uint32_t RESERVED : 30; } STS_B; }; -}IWDT_T; +} IWDT_T; /** * @brief Serial peripheral interface(SPI) @@ -3724,7 +3792,7 @@ typedef struct __IOM uint32_t SSEN : 1; __IOM uint32_t RXOMEN : 1; __IOM uint32_t DFLSEL : 1; - __IOM uint32_t CECNXT : 1; + __IOM uint32_t CRCNXT : 1; __IOM uint32_t CRCEN : 1; __IOM uint32_t BMOEN : 1; __IOM uint32_t BMEN : 1; @@ -3802,7 +3870,7 @@ typedef struct { __IM uint32_t RXCRC : 16; __IM uint32_t RESERVED : 16; - }RXCRC_B; + } RXCRC_B; }; /** Transmit CRC register */ @@ -3814,7 +3882,7 @@ typedef struct { __IM uint32_t TXCRC : 16; __IM uint32_t RESERVED : 16; - }TXCRC_B; + } TXCRC_B; }; /** Transmit I2S CTRL register */ @@ -3834,7 +3902,7 @@ typedef struct __IOM uint32_t I2SEN : 1; __IOM uint32_t MODESEL : 1; __IM uint32_t RESERVED2 : 20; - }I2SCFG_B; + } I2SCFG_B; }; /** Transmit I2S DIV register */ @@ -3848,9 +3916,9 @@ typedef struct __IOM uint32_t ODDPSC : 1; __IOM uint32_t MCIEN : 1; __IM uint32_t RESERVED1 : 22; - }I2SPSC_B; + } I2SPSC_B; }; -}SPI_T; +} SPI_T; /** * @brief Window watchdog (WWDT) @@ -3896,7 +3964,7 @@ typedef struct __IM uint32_t RESERVED : 31; } STS_B; }; -}WWDT_T; +} WWDT_T; /** * @brief Secure digital input/output interface (SDIO) @@ -4056,7 +4124,7 @@ typedef struct __IOM uint32_t DMAEN : 1; __IOM uint32_t DBSIZE : 4; __IOM uint32_t RWSTR : 1; - __IOM uint32_t PWSTOP : 1; + __IOM uint32_t RWSTOP : 1; __IOM uint32_t RDWAIT : 1; __IOM uint32_t SDIOF : 1; __IM uint32_t RESERVED : 20; @@ -4166,7 +4234,7 @@ typedef struct __IOM uint32_t RXDAVB : 1; __IOM uint32_t SDIOINTREC : 1; __IOM uint32_t ATACLPREC : 1; - __IM uint32_t RESERVEDIE : 8; + __IM uint32_t RESERVED : 8; } MASK_B; }; @@ -4196,7 +4264,7 @@ typedef struct __IOM uint32_t FIFODATA : 32; } FIFODATA_B; }; -}SDIO_T; +} SDIO_T; /** * @brief Digital to Analog Converter(DAC) @@ -4232,12 +4300,12 @@ typedef struct /** Software trigger register */ union { - __IOM uint32_t SWTRG; + __OM uint32_t SWTRG; struct { - __IOM uint32_t SWTRG1 : 1; - __IOM uint32_t SWTRG2 : 1; + __OM uint32_t SWTRG1 : 1; + __OM uint32_t SWTRG2 : 1; __IM uint32_t RESERVED : 30; } SWTRG_B; }; @@ -4279,13 +4347,13 @@ typedef struct } DH8R1_B; }; - /** Channel2 12-bit right-aligned register */ - union - { - __IOM uint32_t DH12R2; + /** Channel2 12-bit right-aligned register */ + union + { + __IOM uint32_t DH12R2; - struct - { + struct + { __IOM uint32_t DATA : 12; __IM uint32_t RESERVED : 20; } DH12R2_B; @@ -4301,7 +4369,7 @@ typedef struct __IM uint32_t RESERVED1 : 4; __IOM uint32_t DATA : 12; __IM uint32_t RESERVED2 : 16; - }DH12L2_B; + } DH12L2_B; }; /** Channel2 8-bit right-aligned register */ @@ -4351,8 +4419,8 @@ typedef struct struct { - __IOM uint32_t CH1DH : 8; - __IOM uint32_t CH2DH : 8; + __IOM uint32_t DATACH1 : 8; + __IOM uint32_t DATACH2 : 8; __IM uint32_t RESERVED : 16; } DH8RDUAL_B; }; @@ -4360,11 +4428,11 @@ typedef struct /** Channel1 data output register */ union { - __IOM uint32_t DATAOCH1; + __IM uint32_t DATAOCH1; struct { - __IOM uint32_t DATA : 12; + __IM uint32_t DATA : 12; __IM uint32_t RESERVED : 20; } DATAOCH1_B; }; @@ -4372,15 +4440,15 @@ typedef struct /** Channel2 data output register */ union { - __IOM uint32_t DATAOCH2; + __IM uint32_t DATAOCH2; struct { - __IOM uint32_t DATA : 12; + __IM uint32_t DATA : 12; __IM uint32_t RESERVED : 20; } DATAOCH2_B; }; -}DAC_T; +} DAC_T; /** * @brief EMMC Register @@ -4411,9 +4479,9 @@ typedef struct __IOM uint32_t CRAMPSIZECFG : 3; __IOM uint32_t WRBURSTEN : 1; __IOM uint32_t RESERVED2 : 12; - }CSCTRL_B; + } CSCTRL_B; }; -}SNCTRL_T; +} SNCTRL_T; typedef struct { @@ -4432,9 +4500,9 @@ typedef struct __IOM uint32_t DATALATCFG : 4; __IOM uint32_t ACCMODECFG : 2; __IM uint32_t RESERVED2 : 2; - }WRTTIM_T; + } WRTTIM_T; }; -}SNWCLK_T; +} SNWCLK_T; /** * @brief Flexible Static Memory Controller @@ -4475,7 +4543,7 @@ typedef struct __IOM uint32_t A2RDCFG : 4; __IOM uint32_t ECCPSCFG : 3; __IM uint32_t RESERVED3 : 12; - }CTRL2_B; + } CTRL2_B; }; /** FIFO status and interrupt register 2 */ @@ -4492,8 +4560,8 @@ typedef struct __IOM uint32_t IHLDEN : 1; __IOM uint32_t IFEDEN : 1; __IM uint32_t FEFLG : 1; - __IM uint32_t RESERVED :25; - }STSINT2_B; + __IM uint32_t RESERVED : 25; + } STSINT2_B; }; /** Common memory space timing register 2 */ union @@ -4506,7 +4574,7 @@ typedef struct __IOM uint32_t WAIT2 : 8; __IOM uint32_t HLD2 : 8; __IOM uint32_t HIZ2 : 8; - }CMSTIM2_B; + } CMSTIM2_B; }; /** Attribute memory space timing register 2 */ @@ -4520,7 +4588,7 @@ typedef struct __IOM uint32_t WAIT2 : 8; __IOM uint32_t HLD2 : 8; __IOM uint32_t HIZ2 : 8; - }AMSTIM2_B; + } AMSTIM2_B; }; __IOM uint32_t RESERVED; @@ -4535,7 +4603,7 @@ typedef struct __IM uint32_t ECCRS2 : 32; } ECCRS2_B; }; -}EMMC_Bank2_T; +} EMMC_Bank2_T; /** * @brief Flexible Static Memory Controller Bank 3 @@ -4560,7 +4628,7 @@ typedef struct __IOM uint32_t A2RDCFG : 4; __IOM uint32_t ECCPSCFG : 3; __IM uint32_t RESERVED3 : 12; - }CTRL3_B; + } CTRL3_B; }; /** FIFO status and interrupt register 3 */ @@ -4577,8 +4645,8 @@ typedef struct __IOM uint32_t IHLDEN : 1; __IOM uint32_t IFEDEN : 1; __IM uint32_t FEFLG : 1; - __IM uint32_t RESERVED :16; - }STSINT3_B; + __IM uint32_t RESERVED : 16; + } STSINT3_B; }; /** Common memory space timing register 3 */ @@ -4592,7 +4660,7 @@ typedef struct __IOM uint32_t WAIT3 : 8; __IOM uint32_t HLD3 : 8; __IOM uint32_t HIZ3 : 8; - }CMSTIM3_B; + } CMSTIM3_B; }; /** Attribute memory space timing register 3 */ @@ -4606,7 +4674,7 @@ typedef struct __IOM uint32_t WAIT3 : 8; __IOM uint32_t HLD3 : 8; __IOM uint32_t HIZ3 : 8; - }AMSTIM3_B; + } AMSTIM3_B; }; __IOM uint32_t RESERVED; @@ -4621,7 +4689,7 @@ typedef struct __IM uint32_t ECCRS3 : 32; } ECCRS3_B; }; -}EMMC_Bank3_T; +} EMMC_Bank3_T; /** * @brief Flexible Static Memory Controller Bank 4 @@ -4646,7 +4714,7 @@ typedef struct __IOM uint32_t A2RDCFG : 4; __IOM uint32_t ECCPSCFG : 3; __IM uint32_t RESERVED3 : 12; - }CTRL4_B; + } CTRL4_B; }; /** FIFO status and interrupt register 4 */ @@ -4663,8 +4731,8 @@ typedef struct __IOM uint32_t IHLDEN : 1; __IOM uint32_t IFEDEN : 1; __IM uint32_t FEFLG : 1; - __IM uint32_t RESERVED :16; - }STSINT4_B; + __IM uint32_t RESERVED : 16; + } STSINT4_B; }; /** Common memory space timing register 4 */ @@ -4678,7 +4746,7 @@ typedef struct __IOM uint32_t WAIT4 : 8; __IOM uint32_t HLD4 : 8; __IOM uint32_t HIZ4 : 8; - }CMSTIM4_B; + } CMSTIM4_B; }; /** Attribute memory space timing register 4 */ @@ -4692,7 +4760,7 @@ typedef struct __IOM uint32_t WAIT4 : 8; __IOM uint32_t HLD4 : 8; __IOM uint32_t HIZ4 : 8; - }AMSTIM4_B; + } AMSTIM4_B; }; /** I/O space timing register 4 */ @@ -4706,9 +4774,9 @@ typedef struct __IOM uint32_t WAIT4 : 8; __IOM uint32_t HLD4 : 8; __IOM uint32_t HIZ4 : 8; - }IOSTIM4_B; + } IOSTIM4_B; }; -}EMMC_Bank4_T; +} EMMC_Bank4_T; /** * @brief Queued serial peripheral interface(QSPI) @@ -4731,7 +4799,7 @@ typedef struct __IM uint32_t RESERVED3 : 7; __IOM uint32_t FRF : 2; __IM uint32_t RESERVED4 : 8; - }CTRL1_B; + } CTRL1_B; }; /** @brief Control register 2 */ @@ -4742,7 +4810,7 @@ typedef struct { __IOM uint32_t NDF : 16; __IM uint32_t RESERVED : 16; - }CTRL2_B; + } CTRL2_B; }; /** @brief QSPI Enable register */ @@ -4753,7 +4821,7 @@ typedef struct { __IOM uint32_t EN : 1; __IM uint32_t RESERVED : 31; - }SSIEN_B; + } SSIEN_B; }; __IM uint32_t RESERVED; @@ -4766,7 +4834,7 @@ typedef struct { __IOM uint32_t SLAEN : 1; __IM uint32_t RESERVED : 31; - }SLAEN_B; + } SLAEN_B; }; /** @brief Baudrate register */ @@ -4777,7 +4845,7 @@ typedef struct { __IOM uint32_t CLKDIV : 16; __IM uint32_t RESERVED : 16; - }BR_B; + } BR_B; }; /** @brief Transmission FIFO threshhold level register */ @@ -4790,7 +4858,7 @@ typedef struct __IM uint32_t RESERVED1 : 13; __IOM uint32_t TFTH : 3; __IM uint32_t RESERVED2 : 13; - }TFTL_B; + } TFTL_B; }; /** @brief Reception FIFO threshhold level register */ @@ -4801,7 +4869,7 @@ typedef struct { __IOM uint32_t RFT : 3; __IM uint32_t RESERVED : 29; - }RFTL_B; + } RFTL_B; }; /** @brief Transmission FIFO level register */ @@ -4812,7 +4880,7 @@ typedef struct { __IOM uint32_t TFL : 3; __IM uint32_t RESERVED : 29; - }TFL_B; + } TFL_B; }; /** @brief Reception FIFO level register */ @@ -4823,7 +4891,7 @@ typedef struct { __IOM uint32_t RFL : 3; __IM uint32_t RESERVED : 29; - }RFL_B; + } RFL_B; }; /** @brief Status register */ @@ -4840,7 +4908,7 @@ typedef struct __IM uint32_t RESERVED1 : 1; __IOM uint32_t DCEF : 1; __IM uint32_t RESERVED2 : 25; - }STS_B; + } STS_B; }; /** @brief Interrupt enable register */ @@ -4856,7 +4924,7 @@ typedef struct __IOM uint32_t RFFIE : 1; __IOM uint32_t MSTIE : 1; __IM uint32_t RESERVED : 26; - }INTEN_B; + } INTEN_B; }; /** @brief Interrupt status register */ @@ -4872,7 +4940,7 @@ typedef struct __IM uint32_t RFFIF : 1; __IM uint32_t MSTIF : 1; __IM uint32_t RESERVED : 26; - }ISTS_B; + } ISTS_B; }; /** @brief Raw interrupt register */ @@ -4888,7 +4956,7 @@ typedef struct __IM uint32_t RXFIR : 1; __IM uint32_t MSTIR : 1; __IM uint32_t RESERVED : 26; - }RIS_B; + } RIS_B; }; /** @brief Transmission FIFO overflow interrupt clear register */ @@ -4899,7 +4967,7 @@ typedef struct { __IM uint32_t TFOIC : 1; __IM uint32_t RESERVED : 31; - }TFOIC_B; + } TFOIC_B; }; /** @brief Reception FIFO overflow interrupt clear register */ @@ -4910,7 +4978,7 @@ typedef struct { __IM uint32_t RFOIC : 1; __IM uint32_t RESERVED : 31; - }RFOIC_B; + } RFOIC_B; }; /** @brief Reception FIFO underflow interrupt clear register */ @@ -4921,7 +4989,7 @@ typedef struct { __IM uint32_t RFUIC : 1; __IM uint32_t RESERVED : 31; - }RFUIC_B; + } RFUIC_B; }; /** @brief Master interrupt clear register */ @@ -4932,7 +5000,7 @@ typedef struct { __IM uint32_t MIC : 1; __IM uint32_t RESERVED : 31; - }MIC_B; + } MIC_B; }; /** @brief Interrupt clear register */ @@ -4943,7 +5011,7 @@ typedef struct { __IM uint32_t ICF : 1; __IM uint32_t RESERVED : 31; - }ICF_B; + } ICF_B; }; __IM uint32_t RESERVED1[5]; @@ -4955,7 +5023,7 @@ typedef struct struct { __IOM uint32_t DATA : 32; - }DATA_B; + } DATA_B; }; __IM uint32_t RESERVED2[35]; @@ -4970,7 +5038,7 @@ typedef struct __IM uint32_t RESERVED1 : 8; __IOM uint32_t RSE : 1; __IM uint32_t RESERVED2 : 15; - }RSD_B; + } RSD_B; }; /** @brief Reception sample register */ @@ -4988,7 +5056,7 @@ typedef struct __IM uint32_t RESERVED3 : 14; __IOM uint32_t CSEN : 1; __IM uint32_t RESERVED4 : 1; - }CTRL3_B; + } CTRL3_B; }; __IM uint32_t RESERVED3[66]; @@ -5001,9 +5069,9 @@ typedef struct { __IOM uint32_t IOSW : 1; __IM uint32_t RESERVED : 31; - }IOSW_B; + } IOSW_B; }; -}QSPI_T; +} QSPI_T; /** * @brief SEC Inter-integrated circuit (SCI2C) @@ -5027,7 +5095,7 @@ typedef struct __IOM uint32_t RFFIE : 1; __IOM uint32_t DSMA : 1; __IM uint32_t RESERVED2 : 21; - }CTRL1_B; + } CTRL1_B; }; /** @brief Master address register */ @@ -5041,7 +5109,7 @@ typedef struct __IOM uint32_t GCEN : 1; __IOM uint32_t MAM : 1; __IM uint32_t RESERVED : 19; - }TARADDR_B; + } TARADDR_B; }; /** @brief Slave address register */ @@ -5052,7 +5120,7 @@ typedef struct { __IOM uint32_t ADDR : 10; __IM uint32_t RESERVED : 22; - }SLAADDR_B; + } SLAADDR_B; }; /** @brief High speed master code register */ @@ -5063,7 +5131,7 @@ typedef struct { __IOM uint32_t HSMC : 4; __IM uint32_t RESERVED : 28; - }HSMC_B; + } HSMC_B; }; /** @brief Data register */ @@ -5076,7 +5144,7 @@ typedef struct __IOM uint32_t CMD : 1; __IOM uint32_t STOP : 1; __IM uint32_t RESERVED : 22; - }DATA_B; + } DATA_B; }; /** @brief Standard speed clock high counter register */ @@ -5087,7 +5155,7 @@ typedef struct { __IOM uint32_t CNT : 16; __IM uint32_t RESERVED : 16; - }SSCHC_B; + } SSCHC_B; }; /** @brief Standard speed clock low counter register */ @@ -5098,7 +5166,7 @@ typedef struct { __IOM uint32_t CNT : 16; __IM uint32_t RESERVED : 16; - }SSCLC_B; + } SSCLC_B; }; /** @brief Fast speed clock high counter register */ @@ -5109,7 +5177,7 @@ typedef struct { __IOM uint32_t CNT : 16; __IM uint32_t RESERVED : 16; - }FSCHC_B; + } FSCHC_B; }; /** @brief Fast speed clock low counter register */ @@ -5120,7 +5188,7 @@ typedef struct { __IOM uint32_t CNT : 16; __IM uint32_t RESERVED : 16; - }FSCLC_B; + } FSCLC_B; }; /** @brief High speed clock high counter */ @@ -5131,7 +5199,7 @@ typedef struct { __IOM uint32_t CNT : 16; __IM uint32_t RESERVED : 16; - }HSCHC_B; + } HSCHC_B; }; /** @brief High speed clock low counter register */ @@ -5142,7 +5210,7 @@ typedef struct { __IOM uint32_t CNT : 16; __IM uint32_t RESERVED : 16; - }HSCLC_B; + } HSCLC_B; }; /** @brief Interrupt status register */ @@ -5166,7 +5234,7 @@ typedef struct __IM uint32_t RSTADIF : 1; __IM uint32_t MOHIF : 1; __IM uint32_t RESERVED : 18; - }INTSTS_B; + } INTSTS_B; }; /** @brief Interrupt enable register */ @@ -5190,7 +5258,7 @@ typedef struct __IOM uint32_t RSTADIE : 1; __IOM uint32_t MOHIE : 1; __IM uint32_t RESERVED : 18; - }INTEN_B; + } INTEN_B; }; /** @brief Raw interrupt status register */ @@ -5213,7 +5281,7 @@ typedef struct __IM uint32_t GCIF : 1; __IM uint32_t RSTADIF : 1; __IM uint32_t RESERVED : 18; - }RIS_B; + } RIS_B; }; /** @brief Reception FIFO threshold register */ @@ -5224,7 +5292,7 @@ typedef struct { __IOM uint32_t RFT : 8; __IM uint32_t RESERVED : 24; - }RFT_B; + } RFT_B; }; /** @brief Transmission FIFO threshold register */ @@ -5235,7 +5303,7 @@ typedef struct { __IOM uint32_t TFT : 8; __IM uint32_t RESERVED : 24; - }TFT_B; + } TFT_B; }; /** @brief Interruption clear register */ @@ -5246,7 +5314,7 @@ typedef struct { __IM uint32_t INTCLR : 1; __IM uint32_t RESERVED : 31; - }INTCLR_B; + } INTCLR_B; }; /** @brief Reception FIFO underflow interruption clear register */ @@ -5257,7 +5325,7 @@ typedef struct { __IM uint32_t RFUIC : 1; __IM uint32_t RESERVED : 31; - }RFUIC_B; + } RFUIC_B; }; /** @brief Reception FIFO overflow interruption clear register */ @@ -5268,7 +5336,7 @@ typedef struct { __IM uint32_t RFOIC : 1; __IM uint32_t RESERVED : 31; - }RFOIC_B; + } RFOIC_B; }; /** @brief Transmission FIFO overflow interruption clear register */ @@ -5279,7 +5347,7 @@ typedef struct { __IM uint32_t TFOIC : 1; __IM uint32_t RESERVED : 31; - }TFOIC_B; + } TFOIC_B; }; /** @brief Reception request interruption clear register */ @@ -5290,7 +5358,7 @@ typedef struct { __IM uint32_t RRIC : 1; __IM uint32_t RESERVED : 31; - }RRIC_B; + } RRIC_B; }; /** @brief Transmission abort interruption clear register */ @@ -5301,7 +5369,7 @@ typedef struct { __IM uint32_t TAIC : 1; __IM uint32_t RESERVED : 31; - }TAIC_B; + } TAIC_B; }; /** @brief Receive done interruption clear register */ @@ -5312,7 +5380,7 @@ typedef struct { __IM uint32_t RDIC : 1; __IM uint32_t RESERVED : 31; - }RDIC_B; + } RDIC_B; }; /** @brief Activity interruption clear register */ @@ -5323,7 +5391,7 @@ typedef struct { __IM uint32_t AIC : 1; __IM uint32_t RESERVED : 31; - }AIC_B; + } AIC_B; }; /** @brief Stop detection interruption clear register */ @@ -5334,7 +5402,7 @@ typedef struct { __IM uint32_t STPDIC : 1; __IM uint32_t RESERVED : 31; - }STPDIC_B; + } STPDIC_B; }; /** @brief Start detection interruption clear register */ @@ -5345,7 +5413,7 @@ typedef struct { __IM uint32_t STADIC : 1; __IM uint32_t RESERVED : 31; - }STADIC_B; + } STADIC_B; }; /** @brief General call interruption clear register */ @@ -5356,7 +5424,7 @@ typedef struct { __IM uint32_t GCIC : 1; __IM uint32_t RESERVED : 31; - }GCIC_B; + } GCIC_B; }; /** @brief Control register 2 */ @@ -5369,7 +5437,7 @@ typedef struct __IOM uint32_t ABR : 1; __IOM uint32_t TCB : 1; __IM uint32_t RESERVED : 29; - }CTRL2_B; + } CTRL2_B; }; /** @brief Status register 1 */ @@ -5386,7 +5454,7 @@ typedef struct __IM uint32_t MAF : 1; __IM uint32_t SAF : 1; __IM uint32_t RESERVED : 24; - }STS1_B; + } STS1_B; }; /** @brief Transmission FIFO level */ @@ -5397,7 +5465,7 @@ typedef struct { __IOM uint32_t TFL : 4; __IM uint32_t RESERVED : 28; - }TFL_B; + } TFL_B; }; /** @brief Reception FIFO level */ @@ -5408,7 +5476,7 @@ typedef struct { __IOM uint32_t RFL : 4; __IM uint32_t RESERVED : 28; - }RFL_B; + } RFL_B; }; /** @brief SDA hold time length register */ @@ -5420,7 +5488,7 @@ typedef struct __IOM uint32_t TXHOLD : 16; __IOM uint32_t RXHOLD : 8; __IM uint32_t RESERVED : 8; - }SDAHOLD_B; + } SDAHOLD_B; }; /** @brief Transmission abort source register */ @@ -5446,7 +5514,7 @@ typedef struct __IM uint32_t USRARB : 1; __IM uint32_t FLUCNT : 1; __IM uint32_t RESERVED : 16; - }TAS_B; + } TAS_B; }; /** @brief Slave data NACK only register */ @@ -5457,7 +5525,7 @@ typedef struct { __IOM uint32_t NACK : 1; __IM uint32_t RESERVED : 31; - }SDNO_B; + } SDNO_B; }; /** @brief DMA control register */ @@ -5469,7 +5537,7 @@ typedef struct __IOM uint32_t RXEN : 1; __IOM uint32_t TXEN : 1; __IM uint32_t RESERVED : 30; - }DMACTRL_B; + } DMACTRL_B; }; /** @brief DMA transmission data level register */ @@ -5480,7 +5548,7 @@ typedef struct { __IOM uint32_t DTDL : 4; __IM uint32_t RESERVED : 28; - }DTDL_B; + } DTDL_B; }; /** @brief DMA teception data level register */ @@ -5491,7 +5559,7 @@ typedef struct { __IOM uint32_t DRDL : 4; __IM uint32_t RESERVED : 28; - }DRDL_B; + } DRDL_B; }; /** @brief SDA delay register */ @@ -5502,7 +5570,7 @@ typedef struct { __IOM uint32_t SDADLY : 8; __IM uint32_t RESERVED : 24; - }SDADLY_B; + } SDADLY_B; }; /** @brief Genernal call ACK register */ @@ -5513,7 +5581,7 @@ typedef struct { __IOM uint32_t GCA : 1; __IM uint32_t RESERVED : 31; - }GCA_B; + } GCA_B; }; /** @brief Status register 2 */ @@ -5526,7 +5594,7 @@ typedef struct __IM uint32_t SDWB : 1; __IM uint32_t SRDL : 1; __IM uint32_t RESERVED : 29; - }STS2_B; + } STS2_B; }; /** @brief Low speed spike suppression limit */ @@ -5537,7 +5605,7 @@ typedef struct { __IOM uint32_t LSSSL : 8; __IM uint32_t RESERVED : 24; - }LSSSL_B; + } LSSSL_B; }; /** @brief High speed spike suppression limit */ @@ -5548,7 +5616,7 @@ typedef struct { __IOM uint32_t HSSSL : 8; __IM uint32_t RESERVED : 24; - }HSSSL_B; + } HSSSL_B; }; uint32_t RESERVED[22]; @@ -5561,9 +5629,9 @@ typedef struct { __IOM uint32_t SW : 1; __IM uint32_t RESERVED : 31; - }SW_B; + } SW_B; }; -}SCI2C_T; +} SCI2C_T; /** * @brief Dynamic memory controler (DMC) @@ -5582,7 +5650,7 @@ typedef struct __IOM uint32_t CAWCFG : 4; __IOM uint32_t DWCFG : 2; __IM uint32_t RESERVED2 : 16; - }CFG_B; + } CFG_B; }; /** @brief Timing register 0 */ @@ -5601,7 +5669,7 @@ typedef struct __IOM uint32_t ATACP : 4; __IOM uint32_t ECASLSEL1 : 1; __IOM uint32_t EXSR1 : 5; - }TIM0_B; + } TIM0_B; }; /** @brief Timing register 1 */ @@ -5613,7 +5681,7 @@ typedef struct __IOM uint32_t STBTIM : 16; __IOM uint32_t ARNUMCFG : 4; __IM uint32_t RESERVED : 12; - }TIM1_B; + } TIM1_B; }; /** @brief Control register 1 */ @@ -5634,7 +5702,7 @@ typedef struct __IM uint32_t SRMFLG : 1; __IOM uint32_t BANKNUMCFG : 5; __IM uint32_t RESERVED2 : 15; - }CTRL1_B; + } CTRL1_B; }; /** @brief Refresh register */ @@ -5645,7 +5713,7 @@ typedef struct { __IOM uint32_t RCYCCFG : 16; __IM uint32_t RESERVED : 16; - }REF_B; + } REF_B; }; /** @brief Chip select register */ @@ -5657,7 +5725,7 @@ typedef struct __IM uint32_t RESERVED : 16; __IOM uint32_t BACHIPSEL : 16; - }CHIPSEL_B; + } CHIPSEL_B; }; __IM uint32_t RESERVED[15]; @@ -5671,7 +5739,7 @@ typedef struct __IOM uint32_t MSIZESEL : 5; __IOM uint32_t MTYPESEL : 3; __IM uint32_t RESERVED : 24; - }MASK_B; + } MASK_B; }; __IM uint32_t RESERVED1[234]; @@ -5684,7 +5752,7 @@ typedef struct { __IOM uint32_t MCSW : 1; __IM uint32_t RESERVED : 31; - }SW_B; + } SW_B; }; /** @brief Control register 2 */ @@ -5697,10 +5765,12 @@ typedef struct __IOM uint32_t RDDEN : 1; __IOM uint32_t RDDCFG : 3; __IOM uint32_t WPEN : 1; - __IM uint32_t RESERVED : 26; - }CTRL2_B; + __IOM uint32_t BUFFEN : 1; + __IOM uint32_t WRPBSEL : 1; + __IM uint32_t RESERVED : 24; + } CTRL2_B; }; -}DMC_T; +} DMC_T; /** * @brief Debug MCU(DBGMCU) @@ -5716,7 +5786,7 @@ typedef struct __IOM uint32_t EQR : 12; __IM uint32_t RESERVED : 4; __IOM uint32_t WVR : 16; - }IDCODE_B; + } IDCODE_B; }; /** @brief Control register */ @@ -5753,9 +5823,9 @@ typedef struct __IOM uint32_t TMR10_STS : 1; __IOM uint32_t TMR11_STS : 1; __IM uint32_t RESERVED3 : 1; - }CFG_B; + } CFG_B; }; -}DBGMCU_T; +} DBGMCU_T; /** * @brief USB Device controler(USBD) @@ -5777,13 +5847,13 @@ typedef union __IOM uint32_t RXDTOG : 1; __IOM uint32_t CTFR : 1; __IM uint32_t RESERVED : 16; - }EP_B; -}USB_EP_REG_T; + } EP_B; +} USBD_EP_REG_T; typedef struct { /** Endpoint */ - USB_EP_REG_T EP[8]; + USBD_EP_REG_T EP[8]; __IM uint32_t RESERVED[8]; @@ -5809,7 +5879,7 @@ typedef struct __IOM uint32_t PMAOUIEN : 1; __IOM uint32_t CTRIEN : 1; __IM uint32_t RESERVED2 : 16; - }CTRL_B; + } CTRL_B; }; /** @brief Interrupt status register */ @@ -5831,7 +5901,7 @@ typedef struct __IOM uint32_t PMOFLG : 1; __IOM uint32_t CTFLG : 1; __IM uint32_t RESERVED2 : 16; - }INTSTS_B; + } INTSTS_B; }; /** @brief Frame number register */ @@ -5847,7 +5917,7 @@ typedef struct __IM uint32_t RXDMSTS : 1; __IM uint32_t RXDPSTS : 1; __IM uint32_t RESERVED : 16; - }FRANUM_B; + } FRANUM_B; }; /** @brief Device address register */ @@ -5860,7 +5930,7 @@ typedef struct __IOM uint32_t ADDR : 7; __IOM uint32_t USBDEN : 1; __IM uint32_t RESERVED : 24; - }ADDR_B; + } ADDR_B; }; /** @brief Buffer table address register */ @@ -5873,7 +5943,7 @@ typedef struct __IM uint32_t RESERVED1 : 3; __IOM uint32_t BUFFTB : 13; __IM uint32_t RESERVED2 : 16; - }BUFFTB_B; + } BUFFTB_B; }; __IM uint32_t RESERVED1[43]; @@ -5887,9 +5957,9 @@ typedef struct { __IOM uint32_t SWITCH : 1; __IM uint32_t RESERVED : 31; - }SWITCH_B; + } SWITCH_B; }; -}USBD_T; +} USBD_T; /** FMC base address in the alias region */ #define FMC_BASE ((uint32_t)0x08000000) @@ -6096,11 +6166,12 @@ typedef struct #if defined (APM32F10X_MD) || defined (APM32F10X_LD) #define QSPI ((QSPI_T *)QSPI_BASE) -#elif defined (APM32F10X_HD) -#define DMC ((DMC_T *)DMC_BASE) +#endif +#if defined (APM32F10X_HD) +#define DMC ((DMC_T *)DMC_BASE) #endif -/* Define one bit mask */ +/** Define one bit mask */ #define BIT0 ((uint32_t)0x00000001) #define BIT1 ((uint32_t)0x00000002) #define BIT2 ((uint32_t)0x00000004) @@ -6153,6 +6224,6 @@ typedef struct } #endif -#endif /* __APM32F10x_H */ +#endif /* __APM32F10X_H */ diff --git a/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Include/system_apm32f10x.h b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Include/system_apm32f10x.h index 2054757063..29a91b55f1 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Include/system_apm32f10x.h +++ b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Include/system_apm32f10x.h @@ -3,17 +3,31 @@ * * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #ifndef __SYSTEM_APM32F10X_H #define __SYSTEM_APM32F10X_H #ifdef __cplusplus - extern "C" { +extern "C" { #endif extern uint32_t SystemCoreClock; diff --git a/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/ARM/startup_apm32f10x_hd.s b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/ARM/startup_apm32f10x_hd.s index d82311b15e..5be8ad078a 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/ARM/startup_apm32f10x_hd.s +++ b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/ARM/startup_apm32f10x_hd.s @@ -1,262 +1,367 @@ ;/*! -; * @file startup_apm32f10x_hd.s +; * @file startup_apm32f10x_hd.s ; * -; * @brief CMSIS Cortex-M3 based Core Device Startup File for Device startup_apm32f10x_hd +; * @brief CMSIS Cortex-M3 based Core Device Startup File for Device startup_apm32f10x_hd ; * -; * @version V1.0.1 +; * @version V1.0.2 ; * -; * @date 2021-03-23 +; * @date 2022-01-05 ; * +; * @attention +; * +; * Copyright (C) 2020-2022 Geehy Semiconductor +; * +; * You may not use this file except in compliance with the +; * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). +; * +; * The program is only for reference, which is distributed in the hope +; * that it will be usefull and instructional for customers to develop +; * their software. Unless required by applicable law or agreed to in +; * writing, the program is distributed on an "AS IS" BASIS, WITHOUT +; * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. +; * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions +; * and limitations under the License. ; */ -; Stack Configuration -; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; +; + Stack Configuration +; + Stack Size(in Bytes) < 0x0 - 0xFFFFFFFF: 8 > +; +< / h > Stack_Size EQU 0x00000400 - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp +AREA STACK, NOINIT, READWRITE, ALIGN = 3 + Stack_Mem SPACE Stack_Size + __initial_sp -; Heap Configuration -; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; + ; + Heap Configuration +; + Heap Size(in Bytes) < 0x0 - 0xFFFFFFFF: 8 > +; +< / h > Heap_Size EQU 0x00000200 - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit +AREA HEAP, NOINIT, READWRITE, ALIGN = 3 + __heap_base + Heap_Mem SPACE Heap_Size + __heap_limit - PRESERVE8 - THUMB + PRESERVE8 + THUMB -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size + ; +Vector Table Mapped to Address 0 at Reset +AREA RESET, DATA, READONLY +EXPORT __Vectors +EXPORT __Vectors_End +EXPORT __Vectors_Size -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler +__Vectors DCD __initial_sp ; +Top of Stack +DCD Reset_Handler ; +Reset Handler +DCD NMI_Handler ; +NMI Handler +DCD HardFault_Handler ; +Hard Fault Handler +DCD MemManage_Handler ; +MPU Fault Handler +DCD BusFault_Handler ; +Bus Fault Handler +DCD UsageFault_Handler ; +Usage Fault Handler +DCD 0 ; +Reserved +DCD 0 ; +Reserved +DCD 0 ; +Reserved +DCD 0 ; +Reserved +DCD SVC_Handler ; +SVCall Handler +DCD DebugMon_Handler ; +Debug Monitor Handler +DCD 0 ; +Reserved +DCD PendSV_Handler ; +PendSV Handler +DCD SysTick_Handler ; +SysTick Handler - ; External Interrupts - DCD WWDT_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EINT Line detect - DCD TAMPER_IRQHandler ; Tamper - DCD RTC_IRQHandler ; RTC - DCD FMC_IRQHandler ; Flash - DCD RCM_IRQHandler ; RCM - DCD EINT0_IRQHandler ; EINT Line 0 - DCD EINT1_IRQHandler ; EINT Line 1 - DCD EINT2_IRQHandler ; EINT Line 2 - DCD EINT3_IRQHandler ; EINT Line 3 - DCD EINT4_IRQHandler ; EINT Line 4 - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 - DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 - DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 - DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 - DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 - DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 - DCD ADC1_2_IRQHandler ; ADC1 & ADC2 - DCD USBD1_HP_CAN1_TX_IRQHandler ; USBD1 High Priority or CAN1 TX - DCD USBD1_LP_CAN1_RX0_IRQHandler ; USBD1 Low Priority or CAN1 RX0 - DCD CAN1_RX1_IRQHandler ; CAN1 RX1 - DCD CAN1_SCE_IRQHandler ; CAN1 SCE - DCD EINT9_5_IRQHandler ; EINT Line 9..5 - DCD TMR1_BRK_IRQHandler ; TMR1 Break - DCD TMR1_UP_IRQHandler ; TMR1 Update - DCD TMR1_TRG_COM_IRQHandler ; TMR1 Trigger and Commutation - DCD TMR1_CC_IRQHandler ; TMR1 Capture Compare - DCD TMR2_IRQHandler ; TMR2 - DCD TMR3_IRQHandler ; TMR3 - DCD TMR4_IRQHandler ; TMR4 - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD I2C2_EV_IRQHandler ; I2C2 Event - DCD I2C2_ER_IRQHandler ; I2C2 Error - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD USART3_IRQHandler ; USART3 - DCD EINT15_10_IRQHandler ; EINT Line 15..10 - DCD RTCAlarm_IRQHandler ; RTC Alarm through EINT Line - DCD USBDWakeUp_IRQHandler ; USBD Wakeup from suspend - DCD TMR8_BRK_IRQHandler ; TMR8 Break - DCD TMR8_UP_IRQHandler ; TMR8 Update - DCD TMR8_TRG_COM_IRQHandler ; TMR8 Trigger and Commutation - DCD TMR8_CC_IRQHandler ; TMR8 Capture Compare - DCD ADC3_IRQHandler ; ADC3 - DCD EMMC_IRQHandler ; EMMC - DCD SDIO_IRQHandler ; SDIO - DCD TMR5_IRQHandler ; TMR5 - DCD SPI3_IRQHandler ; SPI3 - DCD UART4_IRQHandler ; UART4 - DCD UART5_IRQHandler ; UART5 - DCD TMR6_IRQHandler ; TMR6 - DCD TMR7_IRQHandler ; TMR7 - DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1 - DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2 - DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3 - DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5 - DCD 0 ; Reserved - DCD USBD2_HP_CAN2_TX_IRQHandler ; USBD2 High Priority or CAN2 TX - DCD USBD2_LP_CAN2_RX0_IRQHandler ; USBD2 Low Priority or CAN2 RX0 - DCD CAN2_RX1_IRQHandler ; CAN2 RX1 - DCD CAN2_SCE_IRQHandler ; CAN2 SCE +; +External Interrupts +DCD WWDT_IRQHandler ; +Window Watchdog +DCD PVD_IRQHandler ; +PVD through EINT Line detect +DCD TAMPER_IRQHandler ; +Tamper +DCD RTC_IRQHandler ; +RTC +DCD FLASH_IRQHandler ; +Flash +DCD RCM_IRQHandler ; +RCM +DCD EINT0_IRQHandler ; +EINT Line 0 +DCD EINT1_IRQHandler ; +EINT Line 1 +DCD EINT2_IRQHandler ; +EINT Line 2 +DCD EINT3_IRQHandler ; +EINT Line 3 +DCD EINT4_IRQHandler ; +EINT Line 4 +DCD DMA1_Channel1_IRQHandler ; +DMA1 Channel 1 +DCD DMA1_Channel2_IRQHandler ; +DMA1 Channel 2 +DCD DMA1_Channel3_IRQHandler ; +DMA1 Channel 3 +DCD DMA1_Channel4_IRQHandler ; +DMA1 Channel 4 +DCD DMA1_Channel5_IRQHandler ; +DMA1 Channel 5 +DCD DMA1_Channel6_IRQHandler ; +DMA1 Channel 6 +DCD DMA1_Channel7_IRQHandler ; +DMA1 Channel 7 +DCD ADC1_2_IRQHandler ; +ADC1 &ADC2 +DCD USBD1_HP_CAN1_TX_IRQHandler ; +USBD1 High Priority or CAN1 TX +DCD USBD1_LP_CAN1_RX0_IRQHandler ; +USBD1 Low Priority or CAN1 RX0 +DCD CAN1_RX1_IRQHandler ; +CAN1 RX1 +DCD CAN1_SCE_IRQHandler ; +CAN1 SCE +DCD EINT9_5_IRQHandler ; +EINT Line 9..5 +DCD TMR1_BRK_IRQHandler ; +TMR1 Break +DCD TMR1_UP_IRQHandler ; +TMR1 Update +DCD TMR1_TRG_COM_IRQHandler ; +TMR1 Trigger and Commutation +DCD TMR1_CC_IRQHandler ; +TMR1 Capture Compare +DCD TMR2_IRQHandler ; +TMR2 +DCD TMR3_IRQHandler ; +TMR3 +DCD TMR4_IRQHandler ; +TMR4 +DCD I2C1_EV_IRQHandler ; +I2C1 Event +DCD I2C1_ER_IRQHandler ; +I2C1 Error +DCD I2C2_EV_IRQHandler ; +I2C2 Event +DCD I2C2_ER_IRQHandler ; +I2C2 Error +DCD SPI1_IRQHandler ; +SPI1 +DCD SPI2_IRQHandler ; +SPI2 +DCD USART1_IRQHandler ; +USART1 +DCD USART2_IRQHandler ; +USART2 +DCD USART3_IRQHandler ; +USART3 +DCD EINT15_10_IRQHandler ; +EINT Line 15..10 +DCD RTCAlarm_IRQHandler ; +RTC Alarm through EINT Line +DCD USBDWakeUp_IRQHandler ; +USBD Wakeup from suspend +DCD TMR8_BRK_IRQHandler ; +TMR8 Break +DCD TMR8_UP_IRQHandler ; +TMR8 Update +DCD TMR8_TRG_COM_IRQHandler ; +TMR8 Trigger and Commutation +DCD TMR8_CC_IRQHandler ; +TMR8 Capture Compare +DCD ADC3_IRQHandler ; +ADC3 +DCD EMMC_IRQHandler ; +EMMC +DCD SDIO_IRQHandler ; +SDIO +DCD TMR5_IRQHandler ; +TMR5 +DCD SPI3_IRQHandler ; +SPI3 +DCD UART4_IRQHandler ; +UART4 +DCD UART5_IRQHandler ; +UART5 +DCD TMR6_IRQHandler ; +TMR6 +DCD TMR7_IRQHandler ; +TMR7 +DCD DMA2_Channel1_IRQHandler ; +DMA2 Channel1 +DCD DMA2_Channel2_IRQHandler ; +DMA2 Channel2 +DCD DMA2_Channel3_IRQHandler ; +DMA2 Channel3 +DCD DMA2_Channel4_5_IRQHandler ; +DMA2 Channel4 &Channel5 +DCD 0 ; +Reserved +DCD USBD2_HP_CAN2_TX_IRQHandler ; +USBD2 High Priority or CAN2 TX +DCD USBD2_LP_CAN2_RX0_IRQHandler ; +USBD2 Low Priority or CAN2 RX0 +DCD CAN2_RX1_IRQHandler ; +CAN2 RX1 +DCD CAN2_SCE_IRQHandler ; +CAN2 SCE __Vectors_End __Vectors_Size EQU __Vectors_End - __Vectors - AREA |.text|, CODE, READONLY +AREA | .text |, CODE, READONLY -; Reset handler +; +Reset handler Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP +EXPORT Reset_Handler [WEAK] +IMPORT __main +IMPORT SystemInit +LDR R0, = SystemInit + BLX R0 + LDR R0, = __main + BX R0 + ENDP -; Dummy Exception Handlers (infinite loops which can be modified) + ; +Dummy Exception Handlers(infinite loops which can be modified) NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP +EXPORT NMI_Handler [WEAK] +B . +ENDP HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP +PROC +EXPORT HardFault_Handler [WEAK] +B . +ENDP MemManage_Handler\ - PROC - EXPORT MemManage_Handler [WEAK] - B . - ENDP +PROC +EXPORT MemManage_Handler [WEAK] +B . +ENDP BusFault_Handler\ - PROC - EXPORT BusFault_Handler [WEAK] - B . - ENDP +PROC +EXPORT BusFault_Handler [WEAK] +B . +ENDP UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler [WEAK] - B . - ENDP +PROC +EXPORT UsageFault_Handler [WEAK] +B . +ENDP SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP +EXPORT SVC_Handler [WEAK] +B . +ENDP DebugMon_Handler\ - PROC - EXPORT DebugMon_Handler [WEAK] - B . - ENDP +PROC +EXPORT DebugMon_Handler [WEAK] +B . +ENDP PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP +EXPORT PendSV_Handler [WEAK] +B . +ENDP SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP +EXPORT SysTick_Handler [WEAK] +B . +ENDP Default_Handler PROC - EXPORT WWDT_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT TAMPER_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FMC_IRQHandler [WEAK] - EXPORT RCM_IRQHandler [WEAK] - EXPORT EINT0_IRQHandler [WEAK] - EXPORT EINT1_IRQHandler [WEAK] - EXPORT EINT2_IRQHandler [WEAK] - EXPORT EINT3_IRQHandler [WEAK] - EXPORT EINT4_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_IRQHandler [WEAK] - EXPORT DMA1_Channel3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_IRQHandler [WEAK] - EXPORT DMA1_Channel5_IRQHandler [WEAK] - EXPORT DMA1_Channel6_IRQHandler [WEAK] - EXPORT DMA1_Channel7_IRQHandler [WEAK] - EXPORT ADC1_2_IRQHandler [WEAK] - EXPORT USBD1_HP_CAN1_TX_IRQHandler [WEAK] - EXPORT USBD1_LP_CAN1_RX0_IRQHandler [WEAK] - EXPORT CAN1_RX1_IRQHandler [WEAK] - EXPORT CAN1_SCE_IRQHandler [WEAK] - EXPORT EINT9_5_IRQHandler [WEAK] - EXPORT TMR1_BRK_IRQHandler [WEAK] - EXPORT TMR1_UP_IRQHandler [WEAK] - EXPORT TMR1_TRG_COM_IRQHandler [WEAK] - EXPORT TMR1_CC_IRQHandler [WEAK] - EXPORT TMR2_IRQHandler [WEAK] - EXPORT TMR3_IRQHandler [WEAK] - EXPORT TMR4_IRQHandler [WEAK] - EXPORT I2C1_EV_IRQHandler [WEAK] - EXPORT I2C1_ER_IRQHandler [WEAK] - EXPORT I2C2_EV_IRQHandler [WEAK] - EXPORT I2C2_ER_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT USART3_IRQHandler [WEAK] - EXPORT EINT15_10_IRQHandler [WEAK] - EXPORT RTCAlarm_IRQHandler [WEAK] - EXPORT USBDWakeUp_IRQHandler [WEAK] - EXPORT TMR8_BRK_IRQHandler [WEAK] - EXPORT TMR8_UP_IRQHandler [WEAK] - EXPORT TMR8_TRG_COM_IRQHandler [WEAK] - EXPORT TMR8_CC_IRQHandler [WEAK] - EXPORT ADC3_IRQHandler [WEAK] - EXPORT EMMC_IRQHandler [WEAK] - EXPORT SDIO_IRQHandler [WEAK] - EXPORT TMR5_IRQHandler [WEAK] - EXPORT SPI3_IRQHandler [WEAK] - EXPORT UART4_IRQHandler [WEAK] - EXPORT UART5_IRQHandler [WEAK] - EXPORT TMR6_IRQHandler [WEAK] - EXPORT TMR7_IRQHandler [WEAK] - EXPORT DMA2_Channel1_IRQHandler [WEAK] - EXPORT DMA2_Channel2_IRQHandler [WEAK] - EXPORT DMA2_Channel3_IRQHandler [WEAK] - EXPORT DMA2_Channel4_5_IRQHandler [WEAK] - EXPORT USBD2_HP_CAN2_TX_IRQHandler [WEAK] - EXPORT USBD2_LP_CAN2_RX0_IRQHandler [WEAK] - EXPORT CAN2_RX1_IRQHandler [WEAK] - EXPORT CAN2_SCE_IRQHandler [WEAK] +EXPORT WWDT_IRQHandler [WEAK] +EXPORT PVD_IRQHandler [WEAK] +EXPORT TAMPER_IRQHandler [WEAK] +EXPORT RTC_IRQHandler [WEAK] +EXPORT FLASH_IRQHandler [WEAK] +EXPORT RCM_IRQHandler [WEAK] +EXPORT EINT0_IRQHandler [WEAK] +EXPORT EINT1_IRQHandler [WEAK] +EXPORT EINT2_IRQHandler [WEAK] +EXPORT EINT3_IRQHandler [WEAK] +EXPORT EINT4_IRQHandler [WEAK] +EXPORT DMA1_Channel1_IRQHandler [WEAK] +EXPORT DMA1_Channel2_IRQHandler [WEAK] +EXPORT DMA1_Channel3_IRQHandler [WEAK] +EXPORT DMA1_Channel4_IRQHandler [WEAK] +EXPORT DMA1_Channel5_IRQHandler [WEAK] +EXPORT DMA1_Channel6_IRQHandler [WEAK] +EXPORT DMA1_Channel7_IRQHandler [WEAK] +EXPORT ADC1_2_IRQHandler [WEAK] +EXPORT USBD1_HP_CAN1_TX_IRQHandler [WEAK] +EXPORT USBD1_LP_CAN1_RX0_IRQHandler [WEAK] +EXPORT CAN1_RX1_IRQHandler [WEAK] +EXPORT CAN1_SCE_IRQHandler [WEAK] +EXPORT EINT9_5_IRQHandler [WEAK] +EXPORT TMR1_BRK_IRQHandler [WEAK] +EXPORT TMR1_UP_IRQHandler [WEAK] +EXPORT TMR1_TRG_COM_IRQHandler [WEAK] +EXPORT TMR1_CC_IRQHandler [WEAK] +EXPORT TMR2_IRQHandler [WEAK] +EXPORT TMR3_IRQHandler [WEAK] +EXPORT TMR4_IRQHandler [WEAK] +EXPORT I2C1_EV_IRQHandler [WEAK] +EXPORT I2C1_ER_IRQHandler [WEAK] +EXPORT I2C2_EV_IRQHandler [WEAK] +EXPORT I2C2_ER_IRQHandler [WEAK] +EXPORT SPI1_IRQHandler [WEAK] +EXPORT SPI2_IRQHandler [WEAK] +EXPORT USART1_IRQHandler [WEAK] +EXPORT USART2_IRQHandler [WEAK] +EXPORT USART3_IRQHandler [WEAK] +EXPORT EINT15_10_IRQHandler [WEAK] +EXPORT RTCAlarm_IRQHandler [WEAK] +EXPORT USBDWakeUp_IRQHandler [WEAK] +EXPORT TMR8_BRK_IRQHandler [WEAK] +EXPORT TMR8_UP_IRQHandler [WEAK] +EXPORT TMR8_TRG_COM_IRQHandler [WEAK] +EXPORT TMR8_CC_IRQHandler [WEAK] +EXPORT ADC3_IRQHandler [WEAK] +EXPORT EMMC_IRQHandler [WEAK] +EXPORT SDIO_IRQHandler [WEAK] +EXPORT TMR5_IRQHandler [WEAK] +EXPORT SPI3_IRQHandler [WEAK] +EXPORT UART4_IRQHandler [WEAK] +EXPORT UART5_IRQHandler [WEAK] +EXPORT TMR6_IRQHandler [WEAK] +EXPORT TMR7_IRQHandler [WEAK] +EXPORT DMA2_Channel1_IRQHandler [WEAK] +EXPORT DMA2_Channel2_IRQHandler [WEAK] +EXPORT DMA2_Channel3_IRQHandler [WEAK] +EXPORT DMA2_Channel4_5_IRQHandler [WEAK] +EXPORT USBD2_HP_CAN2_TX_IRQHandler [WEAK] +EXPORT USBD2_LP_CAN2_RX0_IRQHandler [WEAK] +EXPORT CAN2_RX1_IRQHandler [WEAK] +EXPORT CAN2_SCE_IRQHandler [WEAK] WWDT_IRQHandler PVD_IRQHandler TAMPER_IRQHandler RTC_IRQHandler -FMC_IRQHandler +FLASH_IRQHandler RCM_IRQHandler EINT0_IRQHandler EINT1_IRQHandler @@ -316,39 +421,45 @@ USBD2_HP_CAN2_TX_IRQHandler USBD2_LP_CAN2_RX0_IRQHandler CAN2_RX1_IRQHandler CAN2_SCE_IRQHandler - B . +B . - ENDP +ENDP - ALIGN +ALIGN -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB +; +******************************************************************************* +; +User Stack and Heap initialization +; +******************************************************************************* +IF : +DEF: +__MICROLIB - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit +EXPORT __initial_sp +EXPORT __heap_base +EXPORT __heap_limit - ELSE +ELSE - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap +IMPORT __use_two_region_memory +EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem - LDR R1, = (Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR +LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR - ALIGN + ALIGN - ENDIF + ENDIF - END + END -;*******************************END OF FILE************************************ + ; +*******************************END OF FILE ************************************ diff --git a/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/ARM/startup_apm32f10x_md.s b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/ARM/startup_apm32f10x_md.s index 95ea8f5f22..238be8397c 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/ARM/startup_apm32f10x_md.s +++ b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/ARM/startup_apm32f10x_md.s @@ -1,227 +1,314 @@ ;/*! -; * @file startup_apm32f10x_md.s +; * @file startup_apm32f10x_md.s ; * -; * @brief CMSIS Cortex-M3 based Core Device Startup File for Device startup_apm32f10x_md +; * @brief CMSIS Cortex-M3 based Core Device Startup File for Device startup_apm32f10x_md ; * -; * @version V1.0.1 +; * @version V1.0.2 ; * -; * @date 2021-03-23 +; * @date 2022-01-05 ; * +; * @attention +; * +; * Copyright (C) 2020-2022 Geehy Semiconductor +; * +; * You may not use this file except in compliance with the +; * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). +; * +; * The program is only for reference, which is distributed in the hope +; * that it will be usefull and instructional for customers to develop +; * their software. Unless required by applicable law or agreed to in +; * writing, the program is distributed on an "AS IS" BASIS, WITHOUT +; * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. +; * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions +; * and limitations under the License. ; */ -; Stack Configuration -; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> -; +; + Stack Configuration +; + Stack Size(in Bytes) < 0x0 - 0xFFFFFFFF: 8 > +; +< / h > Stack_Size EQU 0x00000400 - AREA STACK, NOINIT, READWRITE, ALIGN=3 -Stack_Mem SPACE Stack_Size -__initial_sp +AREA STACK, NOINIT, READWRITE, ALIGN = 3 + Stack_Mem SPACE Stack_Size + __initial_sp -; Heap Configuration -; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> -; + ; + Heap Configuration +; + Heap Size(in Bytes) < 0x0 - 0xFFFFFFFF: 8 > +; +< / h > Heap_Size EQU 0x00000200 - AREA HEAP, NOINIT, READWRITE, ALIGN=3 -__heap_base -Heap_Mem SPACE Heap_Size -__heap_limit +AREA HEAP, NOINIT, READWRITE, ALIGN = 3 + __heap_base + Heap_Mem SPACE Heap_Size + __heap_limit - PRESERVE8 - THUMB + PRESERVE8 + THUMB -; Vector Table Mapped to Address 0 at Reset - AREA RESET, DATA, READONLY - EXPORT __Vectors - EXPORT __Vectors_End - EXPORT __Vectors_Size + ; +Vector Table Mapped to Address 0 at Reset +AREA RESET, DATA, READONLY +EXPORT __Vectors +EXPORT __Vectors_End +EXPORT __Vectors_Size -__Vectors DCD __initial_sp ; Top of Stack - DCD Reset_Handler ; Reset Handler - DCD NMI_Handler ; NMI Handler - DCD HardFault_Handler ; Hard Fault Handler - DCD MemManage_Handler ; MPU Fault Handler - DCD BusFault_Handler ; Bus Fault Handler - DCD UsageFault_Handler ; Usage Fault Handler - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD 0 ; Reserved - DCD SVC_Handler ; SVCall Handler - DCD DebugMon_Handler ; Debug Monitor Handler - DCD 0 ; Reserved - DCD PendSV_Handler ; PendSV Handler - DCD SysTick_Handler ; SysTick Handler +__Vectors DCD __initial_sp ; +Top of Stack +DCD Reset_Handler ; +Reset Handler +DCD NMI_Handler ; +NMI Handler +DCD HardFault_Handler ; +Hard Fault Handler +DCD MemManage_Handler ; +MPU Fault Handler +DCD BusFault_Handler ; +Bus Fault Handler +DCD UsageFault_Handler ; +Usage Fault Handler +DCD 0 ; +Reserved +DCD 0 ; +Reserved +DCD 0 ; +Reserved +DCD 0 ; +Reserved +DCD SVC_Handler ; +SVCall Handler +DCD DebugMon_Handler ; +Debug Monitor Handler +DCD 0 ; +Reserved +DCD PendSV_Handler ; +PendSV Handler +DCD SysTick_Handler ; +SysTick Handler - ; External Interrupts - DCD WWDT_IRQHandler ; Window Watchdog - DCD PVD_IRQHandler ; PVD through EINT Line detect - DCD TAMPER_IRQHandler ; Tamper - DCD RTC_IRQHandler ; RTC - DCD FMC_IRQHandler ; Flash - DCD RCM_IRQHandler ; RCM - DCD EINT0_IRQHandler ; EINT Line 0 - DCD EINT1_IRQHandler ; EINT Line 1 - DCD EINT2_IRQHandler ; EINT Line 2 - DCD EINT3_IRQHandler ; EINT Line 3 - DCD EINT4_IRQHandler ; EINT Line 4 - DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 - DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 - DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 - DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 - DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 - DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 - DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 - DCD ADC1_2_IRQHandler ; ADC1_2 - DCD USBD1_HP_CAN1_TX_IRQHandler ; USBD1 High Priority or CAN1 TX - DCD USBD1_LP_CAN1_RX0_IRQHandler ; USBD1 Low Priority or CAN1 RX0 - DCD CAN1_RX1_IRQHandler ; CAN1 RX1 - DCD CAN1_SCE_IRQHandler ; CAN1 SCE - DCD EINT9_5_IRQHandler ; EINT Line 9..5 - DCD TMR1_BRK_IRQHandler ; TMR1 Break - DCD TMR1_UP_IRQHandler ; TMR1 Update - DCD TMR1_TRG_COM_IRQHandler ; TMR1 Trigger and Commutation - DCD TMR1_CC_IRQHandler ; TMR1 Capture Compare - DCD TMR2_IRQHandler ; TMR2 - DCD TMR3_IRQHandler ; TMR3 - DCD TMR4_IRQHandler ; TMR4 - DCD I2C1_EV_IRQHandler ; I2C1 Event - DCD I2C1_ER_IRQHandler ; I2C1 Error - DCD I2C2_EV_IRQHandler ; I2C2 Event - DCD I2C2_ER_IRQHandler ; I2C2 Error - DCD SPI1_IRQHandler ; SPI1 - DCD SPI2_IRQHandler ; SPI2 - DCD USART1_IRQHandler ; USART1 - DCD USART2_IRQHandler ; USART2 - DCD USART3_IRQHandler ; USART3 - DCD EINT15_10_IRQHandler ; EINT Line 15..10 - DCD RTCAlarm_IRQHandler ; RTC Alarm through EINT Line - DCD USBDWakeUp_IRQHandler ; USBD Wakeup from suspend - DCD FPU_IRQHandler ; FPU - DCD QSPI_IRQHandler ; QSPI - DCD USBD2_HP_IRQHandler ; USBD2 High Priority - DCD USBD2_LP_IRQHandler ; USBD2 Low Priority +; +External Interrupts +DCD WWDT_IRQHandler ; +Window Watchdog +DCD PVD_IRQHandler ; +PVD through EINT Line detect +DCD TAMPER_IRQHandler ; +Tamper +DCD RTC_IRQHandler ; +RTC +DCD FLASH_IRQHandler ; +Flash +DCD RCM_IRQHandler ; +RCM +DCD EINT0_IRQHandler ; +EINT Line 0 +DCD EINT1_IRQHandler ; +EINT Line 1 +DCD EINT2_IRQHandler ; +EINT Line 2 +DCD EINT3_IRQHandler ; +EINT Line 3 +DCD EINT4_IRQHandler ; +EINT Line 4 +DCD DMA1_Channel1_IRQHandler ; +DMA1 Channel 1 +DCD DMA1_Channel2_IRQHandler ; +DMA1 Channel 2 +DCD DMA1_Channel3_IRQHandler ; +DMA1 Channel 3 +DCD DMA1_Channel4_IRQHandler ; +DMA1 Channel 4 +DCD DMA1_Channel5_IRQHandler ; +DMA1 Channel 5 +DCD DMA1_Channel6_IRQHandler ; +DMA1 Channel 6 +DCD DMA1_Channel7_IRQHandler ; +DMA1 Channel 7 +DCD ADC1_2_IRQHandler ; +ADC1_2 +DCD USBD1_HP_CAN1_TX_IRQHandler ; +USBD1 High Priority or CAN1 TX +DCD USBD1_LP_CAN1_RX0_IRQHandler ; +USBD1 Low Priority or CAN1 RX0 +DCD CAN1_RX1_IRQHandler ; +CAN1 RX1 +DCD CAN1_SCE_IRQHandler ; +CAN1 SCE +DCD EINT9_5_IRQHandler ; +EINT Line 9..5 +DCD TMR1_BRK_IRQHandler ; +TMR1 Break +DCD TMR1_UP_IRQHandler ; +TMR1 Update +DCD TMR1_TRG_COM_IRQHandler ; +TMR1 Trigger and Commutation +DCD TMR1_CC_IRQHandler ; +TMR1 Capture Compare +DCD TMR2_IRQHandler ; +TMR2 +DCD TMR3_IRQHandler ; +TMR3 +DCD TMR4_IRQHandler ; +TMR4 +DCD I2C1_EV_IRQHandler ; +I2C1 Event +DCD I2C1_ER_IRQHandler ; +I2C1 Error +DCD I2C2_EV_IRQHandler ; +I2C2 Event +DCD I2C2_ER_IRQHandler ; +I2C2 Error +DCD SPI1_IRQHandler ; +SPI1 +DCD SPI2_IRQHandler ; +SPI2 +DCD USART1_IRQHandler ; +USART1 +DCD USART2_IRQHandler ; +USART2 +DCD USART3_IRQHandler ; +USART3 +DCD EINT15_10_IRQHandler ; +EINT Line 15..10 +DCD RTCAlarm_IRQHandler ; +RTC Alarm through EINT Line +DCD USBDWakeUp_IRQHandler ; +USBD Wakeup from suspend +DCD FPU_IRQHandler ; +FPU +DCD QSPI_IRQHandler ; +QSPI +DCD USBD2_HP_IRQHandler ; +USBD2 High Priority +DCD USBD2_LP_IRQHandler ; +USBD2 Low Priority __Vectors_End __Vectors_Size EQU __Vectors_End - __Vectors - AREA |.text|, CODE, READONLY +AREA | .text |, CODE, READONLY -; Reset handler +; +Reset handler Reset_Handler PROC - EXPORT Reset_Handler [WEAK] - IMPORT __main - IMPORT SystemInit - LDR R0, =SystemInit - BLX R0 - LDR R0, =__main - BX R0 - ENDP +EXPORT Reset_Handler [WEAK] +IMPORT __main +IMPORT SystemInit +LDR R0, = SystemInit + BLX R0 + LDR R0, = __main + BX R0 + ENDP -; Dummy Exception Handlers (infinite loops which can be modified) + ; +Dummy Exception Handlers(infinite loops which can be modified) NMI_Handler PROC - EXPORT NMI_Handler [WEAK] - B . - ENDP +EXPORT NMI_Handler [WEAK] +B . +ENDP HardFault_Handler\ - PROC - EXPORT HardFault_Handler [WEAK] - B . - ENDP +PROC +EXPORT HardFault_Handler [WEAK] +B . +ENDP MemManage_Handler\ - PROC - EXPORT MemManage_Handler [WEAK] - B . - ENDP +PROC +EXPORT MemManage_Handler [WEAK] +B . +ENDP BusFault_Handler\ - PROC - EXPORT BusFault_Handler [WEAK] - B . - ENDP +PROC +EXPORT BusFault_Handler [WEAK] +B . +ENDP UsageFault_Handler\ - PROC - EXPORT UsageFault_Handler [WEAK] - B . - ENDP +PROC +EXPORT UsageFault_Handler [WEAK] +B . +ENDP SVC_Handler PROC - EXPORT SVC_Handler [WEAK] - B . - ENDP +EXPORT SVC_Handler [WEAK] +B . +ENDP DebugMon_Handler\ - PROC - EXPORT DebugMon_Handler [WEAK] - B . - ENDP +PROC +EXPORT DebugMon_Handler [WEAK] +B . +ENDP PendSV_Handler PROC - EXPORT PendSV_Handler [WEAK] - B . - ENDP +EXPORT PendSV_Handler [WEAK] +B . +ENDP SysTick_Handler PROC - EXPORT SysTick_Handler [WEAK] - B . - ENDP +EXPORT SysTick_Handler [WEAK] +B . +ENDP Default_Handler PROC - EXPORT WWDT_IRQHandler [WEAK] - EXPORT PVD_IRQHandler [WEAK] - EXPORT TAMPER_IRQHandler [WEAK] - EXPORT RTC_IRQHandler [WEAK] - EXPORT FMC_IRQHandler [WEAK] - EXPORT RCM_IRQHandler [WEAK] - EXPORT EINT0_IRQHandler [WEAK] - EXPORT EINT1_IRQHandler [WEAK] - EXPORT EINT2_IRQHandler [WEAK] - EXPORT EINT3_IRQHandler [WEAK] - EXPORT EINT4_IRQHandler [WEAK] - EXPORT DMA1_Channel1_IRQHandler [WEAK] - EXPORT DMA1_Channel2_IRQHandler [WEAK] - EXPORT DMA1_Channel3_IRQHandler [WEAK] - EXPORT DMA1_Channel4_IRQHandler [WEAK] - EXPORT DMA1_Channel5_IRQHandler [WEAK] - EXPORT DMA1_Channel6_IRQHandler [WEAK] - EXPORT DMA1_Channel7_IRQHandler [WEAK] - EXPORT ADC1_2_IRQHandler [WEAK] - EXPORT USBD1_HP_CAN1_TX_IRQHandler [WEAK] - EXPORT USBD1_LP_CAN1_RX0_IRQHandler [WEAK] - EXPORT CAN1_RX1_IRQHandler [WEAK] - EXPORT CAN1_SCE_IRQHandler [WEAK] - EXPORT EINT9_5_IRQHandler [WEAK] - EXPORT TMR1_BRK_IRQHandler [WEAK] - EXPORT TMR1_UP_IRQHandler [WEAK] - EXPORT TMR1_TRG_COM_IRQHandler [WEAK] - EXPORT TMR1_CC_IRQHandler [WEAK] - EXPORT TMR2_IRQHandler [WEAK] - EXPORT TMR3_IRQHandler [WEAK] - EXPORT TMR4_IRQHandler [WEAK] - EXPORT I2C1_EV_IRQHandler [WEAK] - EXPORT I2C1_ER_IRQHandler [WEAK] - EXPORT I2C2_EV_IRQHandler [WEAK] - EXPORT I2C2_ER_IRQHandler [WEAK] - EXPORT SPI1_IRQHandler [WEAK] - EXPORT SPI2_IRQHandler [WEAK] - EXPORT USART1_IRQHandler [WEAK] - EXPORT USART2_IRQHandler [WEAK] - EXPORT USART3_IRQHandler [WEAK] - EXPORT EINT15_10_IRQHandler [WEAK] - EXPORT RTCAlarm_IRQHandler [WEAK] - EXPORT USBDWakeUp_IRQHandler [WEAK] - EXPORT FPU_IRQHandler [WEAK] - EXPORT QSPI_IRQHandler [WEAK] - EXPORT USBD2_HP_IRQHandler [WEAK] - EXPORT USBD2_LP_IRQHandler [WEAK] +EXPORT WWDT_IRQHandler [WEAK] +EXPORT PVD_IRQHandler [WEAK] +EXPORT TAMPER_IRQHandler [WEAK] +EXPORT RTC_IRQHandler [WEAK] +EXPORT FLASH_IRQHandler [WEAK] +EXPORT RCM_IRQHandler [WEAK] +EXPORT EINT0_IRQHandler [WEAK] +EXPORT EINT1_IRQHandler [WEAK] +EXPORT EINT2_IRQHandler [WEAK] +EXPORT EINT3_IRQHandler [WEAK] +EXPORT EINT4_IRQHandler [WEAK] +EXPORT DMA1_Channel1_IRQHandler [WEAK] +EXPORT DMA1_Channel2_IRQHandler [WEAK] +EXPORT DMA1_Channel3_IRQHandler [WEAK] +EXPORT DMA1_Channel4_IRQHandler [WEAK] +EXPORT DMA1_Channel5_IRQHandler [WEAK] +EXPORT DMA1_Channel6_IRQHandler [WEAK] +EXPORT DMA1_Channel7_IRQHandler [WEAK] +EXPORT ADC1_2_IRQHandler [WEAK] +EXPORT USBD1_HP_CAN1_TX_IRQHandler [WEAK] +EXPORT USBD1_LP_CAN1_RX0_IRQHandler [WEAK] +EXPORT CAN1_RX1_IRQHandler [WEAK] +EXPORT CAN1_SCE_IRQHandler [WEAK] +EXPORT EINT9_5_IRQHandler [WEAK] +EXPORT TMR1_BRK_IRQHandler [WEAK] +EXPORT TMR1_UP_IRQHandler [WEAK] +EXPORT TMR1_TRG_COM_IRQHandler [WEAK] +EXPORT TMR1_CC_IRQHandler [WEAK] +EXPORT TMR2_IRQHandler [WEAK] +EXPORT TMR3_IRQHandler [WEAK] +EXPORT TMR4_IRQHandler [WEAK] +EXPORT I2C1_EV_IRQHandler [WEAK] +EXPORT I2C1_ER_IRQHandler [WEAK] +EXPORT I2C2_EV_IRQHandler [WEAK] +EXPORT I2C2_ER_IRQHandler [WEAK] +EXPORT SPI1_IRQHandler [WEAK] +EXPORT SPI2_IRQHandler [WEAK] +EXPORT USART1_IRQHandler [WEAK] +EXPORT USART2_IRQHandler [WEAK] +EXPORT USART3_IRQHandler [WEAK] +EXPORT EINT15_10_IRQHandler [WEAK] +EXPORT RTCAlarm_IRQHandler [WEAK] +EXPORT USBDWakeUp_IRQHandler [WEAK] +EXPORT FPU_IRQHandler [WEAK] +EXPORT QSPI_IRQHandler [WEAK] +EXPORT USBD2_HP_IRQHandler [WEAK] +EXPORT USBD2_LP_IRQHandler [WEAK] WWDT_IRQHandler PVD_IRQHandler TAMPER_IRQHandler RTC_IRQHandler -FMC_IRQHandler +FLASH_IRQHandler RCM_IRQHandler EINT0_IRQHandler EINT1_IRQHandler @@ -264,38 +351,44 @@ FPU_IRQHandler QSPI_IRQHandler USBD2_HP_IRQHandler USBD2_LP_IRQHandler - B . +B . - ENDP +ENDP - ALIGN +ALIGN -;******************************************************************************* -; User Stack and Heap initialization -;******************************************************************************* - IF :DEF:__MICROLIB +; +******************************************************************************* +; +User Stack and Heap initialization +; +******************************************************************************* +IF : +DEF: +__MICROLIB - EXPORT __initial_sp - EXPORT __heap_base - EXPORT __heap_limit +EXPORT __initial_sp +EXPORT __heap_base +EXPORT __heap_limit - ELSE +ELSE - IMPORT __use_two_region_memory - EXPORT __user_initial_stackheap +IMPORT __use_two_region_memory +EXPORT __user_initial_stackheap __user_initial_stackheap - LDR R0, = Heap_Mem - LDR R1, = (Stack_Mem + Stack_Size) - LDR R2, = (Heap_Mem + Heap_Size) - LDR R3, = Stack_Mem - BX LR +LDR R0, = Heap_Mem + LDR R1, = (Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR - ALIGN + ALIGN - ENDIF + ENDIF - END + END -;*******************************END OF FILE************************************ + ; +*******************************END OF FILE ************************************ diff --git a/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/gcc/startup_apm32f10x_hd.s b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/gcc/startup_apm32f10x_hd.s new file mode 100644 index 0000000000..ad9c663676 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/gcc/startup_apm32f10x_hd.s @@ -0,0 +1,281 @@ +;/*! +; * @file startup_apm32f10x_hd.s +; * +; * @brief CMSIS Cortex-M3 based Core Device Startup File for Device startup_apm32f10x_hd +; * +; * @version V1.0.0 +; * +; * @date 2022-01-05 +; * +; * @attention +; * +; * Copyright (C) 2020-2022 Geehy Semiconductor +; * +; * You may not use this file except in compliance with the +; * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). +; * +; * The program is only for reference, which is distributed in the hope +; * that it will be usefull and instructional for customers to develop +; * their software. Unless required by applicable law or agreed to in +; * writing, the program is distributed on an "AS IS" BASIS, WITHOUT +; * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. +; * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions +; * and limitations under the License. +; */ + +.syntax unified +.cpu cortex - m3 +.fpu softvfp +.thumb + +.global g_pfnVectors +.global Default_Handler + +.section .isr_vector, "a", % progbits +.type g_pfnVectors, % object + +g_pfnVectors: +.word _estack // Top of Stack +.word Reset_Handler // Reset Handler +.word NMI_Handler // NMI Handler +.word HardFault_Handler // Hard Fault Handler +.word MemManage_Handler // MPU Fault Handler +.word BusFault_Handler // Bus Fault Handler +.word UsageFault_Handler // Usage Fault Handler +.word 0 // Reserved +.word 0 // Reserved +.word 0 // Reserved +.word 0 // Reserved +.word SVC_Handler // SVCall Handler +.word DebugMon_Handler // Debug Monitor Handler +.word 0 // Reserved +.word PendSV_Handler // PendSV Handler +.word SysTick_Handler // SysTick Handler + +// external interrupts handler +.word WWDT_IRQHandler // Window Watchdog +.word PVD_IRQHandler // PVD through EINT Line detect +.word TAMPER_IRQHandler // Tamper +.word RTC_IRQHandler // RTC +.word FLASH_IRQHandler // Flash +.word RCM_IRQHandler // RCM +.word EINT0_IRQHandler // EINT Line 0 +.word EINT1_IRQHandler // EINT Line 1 +.word EINT2_IRQHandler // EINT Line 2 +.word EINT3_IRQHandler // EINT Line 3 +.word EINT4_IRQHandler // EINT Line 4 +.word DMA1_Channel1_IRQHandler // DMA1 Channel 1 +.word DMA1_Channel2_IRQHandler // DMA1 Channel 2 +.word DMA1_Channel3_IRQHandler // DMA1 Channel 3 +.word DMA1_Channel4_IRQHandler // DMA1 Channel 4 +.word DMA1_Channel5_IRQHandler // DMA1 Channel 5 +.word DMA1_Channel6_IRQHandler // DMA1 Channel 6 +.word DMA1_Channel7_IRQHandler // DMA1 Channel 7 +.word ADC1_2_IRQHandler // ADC1 & ADC2 +.word USBD1_HP_CAN1_TX_IRQHandler // USBD1 High Priority or CAN1 TX +.word USBD1_LP_CAN1_RX0_IRQHandler // USBD1 Low Priority or CAN1 RX0 +.word CAN1_RX1_IRQHandler // CAN1 RX1 +.word CAN1_SCE_IRQHandler // CAN1 SCE +.word EINT9_5_IRQHandler // EINT Line 9..5 +.word TMR1_BRK_IRQHandler // TMR1 Break +.word TMR1_UP_IRQHandler // TMR1 Update +.word TMR1_TRG_COM_IRQHandler // TMR1 Trigger and Commutation +.word TMR1_CC_IRQHandler // TMR1 Capture Compare +.word TMR2_IRQHandler // TMR2 +.word TMR3_IRQHandler // TMR3 +.word TMR4_IRQHandler // TMR4 +.word I2C1_EV_IRQHandler // I2C1 Event +.word I2C1_ER_IRQHandler // I2C1 Error +.word I2C2_EV_IRQHandler // I2C2 Event +.word I2C2_ER_IRQHandler // I2C2 Error +.word SPI1_IRQHandler // SPI1 +.word SPI2_IRQHandler // SPI2 +.word USART1_IRQHandler // USART1 +.word USART2_IRQHandler // USART2 +.word USART3_IRQHandler // USART3 +.word EINT15_10_IRQHandler // EINT Line 15..10 +.word RTCAlarm_IRQHandler // RTC Alarm through EINT Line +.word USBDWakeUp_IRQHandler // USBD Wakeup from suspend +.word TMR8_BRK_IRQHandler // TMR8 Break +.word TMR8_UP_IRQHandler // TMR8 Update +.word TMR8_TRG_COM_IRQHandler // TMR8 Trigger and Commutation +.word TMR8_CC_IRQHandler // TMR8 Capture Compare +.word ADC3_IRQHandler // ADC3 +.word EMMC_IRQHandler // EMMC +.word SDIO_IRQHandler // SDIO +.word TMR5_IRQHandler // TMR5 +.word SPI3_IRQHandler // SPI3 +.word UART4_IRQHandler // UART4 +.word UART5_IRQHandler // UART5 +.word TMR6_IRQHandler // TMR6 +.word TMR7_IRQHandler // TMR7 +.word DMA2_Channel1_IRQHandler // DMA2 Channel1 +.word DMA2_Channel2_IRQHandler // DMA2 Channel2 +.word DMA2_Channel3_IRQHandler // DMA2 Channel3 +.word DMA2_Channel4_5_IRQHandler // DMA2 Channel4 & Channel5 +.word 0 // Reserved +.word USBD2_HP_CAN2_TX_IRQHandler // USBD2 High Priority or CAN2 TX +.word USBD2_LP_CAN2_RX0_IRQHandler // USBD2 Low Priority or CAN2 RX0 +.word CAN2_RX1_IRQHandler // CAN2 RX1 +.word CAN2_SCE_IRQHandler // CAN2 SCE + +.size g_pfnVectors, . - g_pfnVectors + +.section .text.Reset_Handler +.weak Reset_Handler +.type Reset_Handler, % function +Reset_Handler: +ldr r1, = _sidata + ldr r2, = _sdata + ldr r3, = _edata + + subs r3, r2 + ble fill_bss_start + + loop_copy_data: + subs r3, #4 + ldr r0, [r1, r3] + str r0, [r2, r3] + bgt loop_copy_data + + fill_bss_start: + ldr r1, = __bss_start + ldr r2, = __bss_end + movs r0, 0 + subs r2, r1 + ble startup_enter + + loop_fill_bss: + subs r2, #4 + str r0, [r1, r2] + bgt loop_fill_bss + + startup_enter: + bl SystemInit + bl entry + + /* Exception Handlers */ + .weak NMI_Handler + .type NMI_Handler, % function + NMI_Handler: + b . + .size NMI_Handler, . - NMI_Handler + + .weak MemManage_Handler + .type MemManage_Handler, % function + MemManage_Handler: + b . + .size MemManage_Handler, . - MemManage_Handler + + .weak BusFault_Handler + .type BusFault_Handler, % function + BusFault_Handler: + b . + .size BusFault_Handler, . - BusFault_Handler + + .weak UsageFault_Handler + .type UsageFault_Handler, % function + UsageFault_Handler: + b . + .size UsageFault_Handler, . - UsageFault_Handler + + .weak SVC_Handler + .type SVC_Handler, % function + SVC_Handler: + b . + .size SVC_Handler, . - SVC_Handler + + .weak DebugMon_Handler + .type DebugMon_Handler, % function + DebugMon_Handler: + b . + .size DebugMon_Handler, . - DebugMon_Handler + + .weak PendSV_Handler + .type PendSV_Handler, % function + PendSV_Handler: + b . + .size PendSV_Handler, . - PendSV_Handler + + .weak SysTick_Handler + .type SysTick_Handler, % function + SysTick_Handler: + b . + .size SysTick_Handler, . - SysTick_Handler + + /* IQR Handler */ + .section .text.Default_Handler, "ax", % progbits + .type Default_Handler, % function + Default_Handler: + b . + .size Default_Handler, . - Default_Handler + + .macro IRQ handler + .weak \handler + .set \handler, Default_Handler + .endm + + IRQ WWDT_IRQHandler + IRQ PVD_IRQHandler + IRQ TAMPER_IRQHandler + IRQ RTC_IRQHandler + IRQ FLASH_IRQHandler + IRQ RCM_IRQHandler + IRQ EINT0_IRQHandler + IRQ EINT1_IRQHandler + IRQ EINT2_IRQHandler + IRQ EINT3_IRQHandler + IRQ EINT4_IRQHandler + IRQ DMA1_Channel1_IRQHandler + IRQ DMA1_Channel2_IRQHandler + IRQ DMA1_Channel3_IRQHandler + IRQ DMA1_Channel4_IRQHandler + IRQ DMA1_Channel5_IRQHandler + IRQ DMA1_Channel6_IRQHandler + IRQ DMA1_Channel7_IRQHandler + IRQ ADC1_2_IRQHandler + IRQ USBD1_HP_CAN1_TX_IRQHandler + IRQ USBD1_LP_CAN1_RX0_IRQHandler + IRQ CAN1_RX1_IRQHandler + IRQ CAN1_SCE_IRQHandler + IRQ EINT9_5_IRQHandler + IRQ TMR1_BRK_IRQHandler + IRQ TMR1_UP_IRQHandler + IRQ TMR1_TRG_COM_IRQHandler + IRQ TMR1_CC_IRQHandler + IRQ TMR2_IRQHandler + IRQ TMR3_IRQHandler + IRQ TMR4_IRQHandler + IRQ I2C1_EV_IRQHandler + IRQ I2C1_ER_IRQHandler + IRQ I2C2_EV_IRQHandler + IRQ I2C2_ER_IRQHandler + IRQ SPI1_IRQHandler + IRQ SPI2_IRQHandler + IRQ USART1_IRQHandler + IRQ USART2_IRQHandler + IRQ USART3_IRQHandler + IRQ EINT15_10_IRQHandler + IRQ RTCAlarm_IRQHandler + IRQ USBDWakeUp_IRQHandler + IRQ TMR8_BRK_IRQHandler + IRQ TMR8_UP_IRQHandler + IRQ TMR8_TRG_COM_IRQHandler + IRQ TMR8_CC_IRQHandler + IRQ ADC3_IRQHandler + IRQ EMMC_IRQHandler + IRQ SDIO_IRQHandler + IRQ TMR5_IRQHandler + IRQ SPI3_IRQHandler + IRQ UART4_IRQHandler + IRQ UART5_IRQHandler + IRQ TMR6_IRQHandler + IRQ TMR7_IRQHandler + IRQ DMA2_Channel1_IRQHandler + IRQ DMA2_Channel2_IRQHandler + IRQ DMA2_Channel3_IRQHandler + IRQ DMA2_Channel4_5_IRQHandler + IRQ USBD2_HP_CAN2_TX_IRQHandler + IRQ USBD2_LP_CAN2_RX0_IRQHandler + IRQ CAN2_RX1_IRQHandler + IRQ CAN2_SCE_IRQHandler diff --git a/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/gcc/startup_apm32f10x_md.s b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/gcc/startup_apm32f10x_md.s new file mode 100644 index 0000000000..8ff2dfc793 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/gcc/startup_apm32f10x_md.s @@ -0,0 +1,246 @@ +;/*! +; * @file startup_apm32f10x_hd.s +; * +; * @brief CMSIS Cortex-M3 based Core Device Startup File for Device startup_apm32f10x_hd +; * +; * @version V1.0.0 +; * +; * @date 2022-01-05 +; * +; * @attention +; * +; * Copyright (C) 2020-2022 Geehy Semiconductor +; * +; * You may not use this file except in compliance with the +; * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). +; * +; * The program is only for reference, which is distributed in the hope +; * that it will be usefull and instructional for customers to develop +; * their software. Unless required by applicable law or agreed to in +; * writing, the program is distributed on an "AS IS" BASIS, WITHOUT +; * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. +; * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions +; * and limitations under the License. +; */ + +.syntax unified +.cpu cortex - m3 +.fpu softvfp +.thumb + +.global g_pfnVectors +.global Default_Handler + +.section .isr_vector, "a", % progbits +.type g_pfnVectors, % object + +g_pfnVectors: +.word _estack // Top of Stack +.word Reset_Handler // Reset Handler +.word NMI_Handler // NMI Handler +.word HardFault_Handler // Hard Fault Handler +.word MemManage_Handler // MPU Fault Handler +.word BusFault_Handler // Bus Fault Handler +.word UsageFault_Handler // Usage Fault Handler +.word 0 // Reserved +.word 0 // Reserved +.word 0 // Reserved +.word 0 // Reserved +.word SVC_Handler // SVCall Handler +.word DebugMon_Handler // Debug Monitor Handler +.word 0 // Reserved +.word PendSV_Handler // PendSV Handler +.word SysTick_Handler // SysTick Handler + +// external interrupts handler +.word WWDT_IRQHandler // Window Watchdog +.word PVD_IRQHandler // PVD through EINT Line detect +.word TAMPER_IRQHandler // Tamper +.word RTC_IRQHandler // RTC +.word FLASH_IRQHandler // Flash +.word RCM_IRQHandler // RCM +.word EINT0_IRQHandler // EINT Line 0 +.word EINT1_IRQHandler // EINT Line 1 +.word EINT2_IRQHandler // EINT Line 2 +.word EINT3_IRQHandler // EINT Line 3 +.word EINT4_IRQHandler // EINT Line 4 +.word DMA1_Channel1_IRQHandler // DMA1 Channel 1 +.word DMA1_Channel2_IRQHandler // DMA1 Channel 2 +.word DMA1_Channel3_IRQHandler // DMA1 Channel 3 +.word DMA1_Channel4_IRQHandler // DMA1 Channel 4 +.word DMA1_Channel5_IRQHandler // DMA1 Channel 5 +.word DMA1_Channel6_IRQHandler // DMA1 Channel 6 +.word DMA1_Channel7_IRQHandler // DMA1 Channel 7 +.word ADC1_2_IRQHandler // ADC1_2 +.word USBD1_HP_CAN1_TX_IRQHandler // USBD1 High Priority or CAN1 TX +.word USBD1_LP_CAN1_RX0_IRQHandler // USBD1 Low Priority or CAN1 RX0 +.word CAN1_RX1_IRQHandler // CAN1 RX1 +.word CAN1_SCE_IRQHandler // CAN1 SCE +.word EINT9_5_IRQHandler // EINT Line 9..5 +.word TMR1_BRK_IRQHandler // TMR1 Break +.word TMR1_UP_IRQHandler // TMR1 Update +.word TMR1_TRG_COM_IRQHandler // TMR1 Trigger and Commutation +.word TMR1_CC_IRQHandler // TMR1 Capture Compare +.word TMR2_IRQHandler // TMR2 +.word TMR3_IRQHandler // TMR3 +.word TMR4_IRQHandler // TMR4 +.word I2C1_EV_IRQHandler // I2C1 Event +.word I2C1_ER_IRQHandler // I2C1 Error +.word I2C2_EV_IRQHandler // I2C2 Event +.word I2C2_ER_IRQHandler // I2C2 Error +.word SPI1_IRQHandler // SPI1 +.word SPI2_IRQHandler // SPI2 +.word USART1_IRQHandler // USART1 +.word USART2_IRQHandler // USART2 +.word USART3_IRQHandler // USART3 +.word EINT15_10_IRQHandler // EINT Line 15..10 +.word RTCAlarm_IRQHandler // RTC Alarm through EINT Line +.word USBDWakeUp_IRQHandler // USBD Wakeup from suspend +.word FPU_IRQHandler // FPU +.word QSPI_IRQHandler // QSPI +.word USBD2_HP_IRQHandler // USBD2 High Priority +.word USBD2_LP_IRQHandler // USBD2 Low Priority + +.size g_pfnVectors, . - g_pfnVectors + +.section .text.Reset_Handler +.weak Reset_Handler +.type Reset_Handler, % function +Reset_Handler: +ldr r1, = _sidata + ldr r2, = _sdata + ldr r3, = _edata + + subs r3, r2 + ble fill_bss_start + + loop_copy_data: + subs r3, #4 + ldr r0, [r1, r3] + str r0, [r2, r3] + bgt loop_copy_data + + fill_bss_start: + ldr r1, = __bss_start + ldr r2, = __bss_end + movs r0, 0 + subs r2, r1 + ble startup_enter + + loop_fill_bss: + subs r2, #4 + str r0, [r1, r2] + bgt loop_fill_bss + + startup_enter: + bl SystemInit + bl entry + + /* Exception Handlers */ + .weak NMI_Handler + .type NMI_Handler, % function + NMI_Handler: + b . + .size NMI_Handler, . - NMI_Handler + + .weak MemManage_Handler + .type MemManage_Handler, % function + MemManage_Handler: + b . + .size MemManage_Handler, . - MemManage_Handler + + .weak BusFault_Handler + .type BusFault_Handler, % function + BusFault_Handler: + b . + .size BusFault_Handler, . - BusFault_Handler + + .weak UsageFault_Handler + .type UsageFault_Handler, % function + UsageFault_Handler: + b . + .size UsageFault_Handler, . - UsageFault_Handler + + .weak SVC_Handler + .type SVC_Handler, % function + SVC_Handler: + b . + .size SVC_Handler, . - SVC_Handler + + .weak DebugMon_Handler + .type DebugMon_Handler, % function + DebugMon_Handler: + b . + .size DebugMon_Handler, . - DebugMon_Handler + + .weak PendSV_Handler + .type PendSV_Handler, % function + PendSV_Handler: + b . + .size PendSV_Handler, . - PendSV_Handler + + .weak SysTick_Handler + .type SysTick_Handler, % function + SysTick_Handler: + b . + .size SysTick_Handler, . - SysTick_Handler + + /* IQR Handler */ + .section .text.Default_Handler, "ax", % progbits + .type Default_Handler, % function + Default_Handler: + b . + .size Default_Handler, . - Default_Handler + + .macro IRQ handler + .weak \handler + .set \handler, Default_Handler + .endm + + IRQ WWDT_IRQHandler + IRQ PVD_IRQHandler + IRQ TAMPER_IRQHandler + IRQ RTC_IRQHandler + IRQ FLASH_IRQHandler + IRQ RCM_IRQHandler + IRQ EINT0_IRQHandler + IRQ EINT1_IRQHandler + IRQ EINT2_IRQHandler + IRQ EINT3_IRQHandler + IRQ EINT4_IRQHandler + IRQ DMA1_Channel1_IRQHandler + IRQ DMA1_Channel2_IRQHandler + IRQ DMA1_Channel3_IRQHandler + IRQ DMA1_Channel4_IRQHandler + IRQ DMA1_Channel5_IRQHandler + IRQ DMA1_Channel6_IRQHandler + IRQ DMA1_Channel7_IRQHandler + IRQ ADC1_2_IRQHandler + IRQ USBD1_HP_CAN1_TX_IRQHandler + IRQ USBD1_LP_CAN1_RX0_IRQHandler + IRQ CAN1_RX1_IRQHandler + IRQ CAN1_SCE_IRQHandler + IRQ EINT9_5_IRQHandler + IRQ TMR1_BRK_IRQHandler + IRQ TMR1_UP_IRQHandler + IRQ TMR1_TRG_COM_IRQHandler + IRQ TMR1_CC_IRQHandler + IRQ TMR2_IRQHandler + IRQ TMR3_IRQHandler + IRQ TMR4_IRQHandler + IRQ I2C1_EV_IRQHandler + IRQ I2C1_ER_IRQHandler + IRQ I2C2_EV_IRQHandler + IRQ I2C2_ER_IRQHandler + IRQ SPI1_IRQHandler + IRQ SPI2_IRQHandler + IRQ USART1_IRQHandler + IRQ USART2_IRQHandler + IRQ USART3_IRQHandler + IRQ EINT15_10_IRQHandler + IRQ RTCAlarm_IRQHandler + IRQ USBDWakeUp_IRQHandler + IRQ FPU_IRQHandler + IRQ QSPI_IRQHandler + IRQ USBD2_HP_IRQHandler + IRQ USBD2_LP_IRQHandler diff --git a/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/iar/startup_apm32f10x_hd.s b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/iar/startup_apm32f10x_hd.s new file mode 100644 index 0000000000..672eab8977 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/iar/startup_apm32f10x_hd.s @@ -0,0 +1,813 @@ +;/*! +; * @file startup_apm32f10x_hd.s +; * +; * @brief CMSIS Cortex-M3 based Core Device Startup File for Device APM32F103 +; * +; * @version V1.0.0 +; * +; * @date 2022-01-05 +; * +; * @attention +; * +; * Copyright (C) 2020-2022 Geehy Semiconductor +; * +; * You may not use this file except in compliance with the +; * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). +; * +; * The program is only for reference, which is distributed in the hope +; * that it will be usefull and instructional for customers to develop +; * their software. Unless required by applicable law or agreed to in +; * writing, the program is distributed on an "AS IS" BASIS, WITHOUT +; * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. +; * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions +; * and limitations under the License. +; */ + +MODULE ? cstartup + +;; +Forward declaration of sections. +SECTION CSTACK: +DATA: +NOROOT(3) + +SECTION .intvec: +CODE: +NOROOT(2) + + +EXTERN __iar_program_start +EXTERN SystemInit +PUBLIC __vector_table + +DATA + +__vector_table +DCD sfe(CSTACK) +DCD Reset_Handler ; +Reset Handler +DCD NMI_Handler ; +NMI Handler +DCD HardFault_Handler ; +Hard Fault Handler +DCD MemManage_Handler ; +MPU Fault Handler +DCD BusFault_Handler ; +Bus Fault Handler +DCD UsageFault_Handler ; +Usage Fault Handler +DCD 0 ; +Reserved +DCD 0 ; +Reserved +DCD 0 ; +Reserved +DCD 0 ; +Reserved +DCD SVC_Handler ; +SVCall Handler +DCD DebugMon_Handler ; +Debug Monitor Handler +DCD 0 ; +Reserved +DCD PendSV_Handler ; +PendSV Handler +DCD SysTick_Handler ; +SysTick Handler + +; +External Interrupts +DCD WWDT_IRQHandler ; +Window Watchdog +DCD PVD_IRQHandler ; +PVD through EINT Line detect +DCD TAMPER_IRQHandler ; +Tamper +DCD RTC_IRQHandler ; +RTC +DCD FLASH_IRQHandler ; +Flash +DCD RCM_IRQHandler ; +RCM +DCD EINT0_IRQHandler ; +EINT Line 0 +DCD EINT1_IRQHandler ; +EINT Line 1 +DCD EINT2_IRQHandler ; +EINT Line 2 +DCD EINT3_IRQHandler ; +EINT Line 3 +DCD EINT4_IRQHandler ; +EINT Line 4 +DCD DMA1_Channel1_IRQHandler ; +DMA1 Channel 1 +DCD DMA1_Channel2_IRQHandler ; +DMA1 Channel 2 +DCD DMA1_Channel3_IRQHandler ; +DMA1 Channel 3 +DCD DMA1_Channel4_IRQHandler ; +DMA1 Channel 4 +DCD DMA1_Channel5_IRQHandler ; +DMA1 Channel 5 +DCD DMA1_Channel6_IRQHandler ; +DMA1 Channel 6 +DCD DMA1_Channel7_IRQHandler ; +DMA1 Channel 7 +DCD ADC1_2_IRQHandler ; +ADC1 &ADC2 +DCD USBD1_HP_CAN1_TX_IRQHandler ; +USBD1 High Priority or CAN1 TX +DCD USBD1_LP_CAN1_RX0_IRQHandler ; +USBD1 Low Priority or CAN1 RX0 +DCD CAN1_RX1_IRQHandler ; +CAN1 RX1 +DCD CAN1_SCE_IRQHandler ; +CAN1 SCE +DCD EINT9_5_IRQHandler ; +EINT Line 9..5 +DCD TMR1_BRK_IRQHandler ; +TMR1 Break +DCD TMR1_UP_IRQHandler ; +TMR1 Update +DCD TMR1_TRG_COM_IRQHandler ; +TMR1 Trigger and Commutation +DCD TMR1_CC_IRQHandler ; +TMR1 Capture Compare +DCD TMR2_IRQHandler ; +TMR2 +DCD TMR3_IRQHandler ; +TMR3 +DCD TMR4_IRQHandler ; +TMR4 +DCD I2C1_EV_IRQHandler ; +I2C1 Event +DCD I2C1_ER_IRQHandler ; +I2C1 Error +DCD I2C2_EV_IRQHandler ; +I2C2 Event +DCD I2C2_ER_IRQHandler ; +I2C2 Error +DCD SPI1_IRQHandler ; +SPI1 +DCD SPI2_IRQHandler ; +SPI2 +DCD USART1_IRQHandler ; +USART1 +DCD USART2_IRQHandler ; +USART2 +DCD USART3_IRQHandler ; +USART3 +DCD EINT15_10_IRQHandler ; +EINT Line 15..10 +DCD RTCAlarm_IRQHandler ; +RTC Alarm through EINT Line +DCD USBDWakeUp_IRQHandler ; +USBD Wakeup from suspend +DCD TMR8_BRK_IRQHandler ; +TMR8 Break +DCD TMR8_UP_IRQHandler ; +TMR8 Update +DCD TMR8_TRG_COM_IRQHandler ; +TMR8 Trigger and Commutation +DCD TMR8_CC_IRQHandler ; +TMR8 Capture Compare +DCD ADC3_IRQHandler ; +ADC3 +DCD EMMC_IRQHandler ; +EMMC +DCD SDIO_IRQHandler ; +SDIO +DCD TMR5_IRQHandler ; +TMR5 +DCD SPI3_IRQHandler ; +SPI3 +DCD UART4_IRQHandler ; +UART4 +DCD UART5_IRQHandler ; +UART5 +DCD TMR6_IRQHandler ; +TMR6 +DCD TMR7_IRQHandler ; +TMR7 +DCD DMA2_Channel1_IRQHandler ; +DMA2 Channel1 +DCD DMA2_Channel2_IRQHandler ; +DMA2 Channel2 +DCD DMA2_Channel3_IRQHandler ; +DMA2 Channel3 +DCD DMA2_Channel4_5_IRQHandler ; +DMA2 Channel4 &Channel5 +DCD 0 ; +Reserved +DCD USBD2_HP_CAN2_TX_IRQHandler ; +USBD2 High Priority or CAN2 TX +DCD USBD2_LP_CAN2_RX0_IRQHandler ; +USBD2 Low Priority or CAN2 RX0 +DCD CAN2_RX1_IRQHandler ; +CAN2 RX1 +DCD CAN2_SCE_IRQHandler ; +CAN2 SCE +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; +Default interrupt handlers. +;; +THUMB + +PUBWEAK Reset_Handler +SECTION .text: +CODE: +REORDER: +NOROOT(2) +Reset_Handler +LDR R0, = SystemInit + BLX R0 + LDR R0, = __iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDT_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + WWDT_IRQHandler + B WWDT_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCM_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + RCM_IRQHandler + B RCM_IRQHandler + + PUBWEAK EINT0_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EINT0_IRQHandler + B EINT0_IRQHandler + + PUBWEAK EINT1_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EINT1_IRQHandler + B EINT1_IRQHandler + + PUBWEAK EINT2_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EINT2_IRQHandler + B EINT2_IRQHandler + + PUBWEAK EINT3_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EINT3_IRQHandler + B EINT3_IRQHandler + + PUBWEAK EINT4_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EINT4_IRQHandler + B EINT4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_2_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + ADC1_2_IRQHandler + B ADC1_2_IRQHandler + + PUBWEAK USBD1_HP_CAN1_TX_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USBD1_HP_CAN1_TX_IRQHandler + B USBD1_HP_CAN1_TX_IRQHandler + + PUBWEAK USBD1_LP_CAN1_RX0_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USBD1_LP_CAN1_RX0_IRQHandler + B USBD1_LP_CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_SCE_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + CAN1_SCE_IRQHandler + B CAN1_SCE_IRQHandler + + PUBWEAK EINT9_5_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EINT9_5_IRQHandler + B EINT9_5_IRQHandler + + PUBWEAK TMR1_BRK_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR1_BRK_IRQHandler + B TMR1_BRK_IRQHandler + + PUBWEAK TMR1_UP_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR1_UP_IRQHandler + B TMR1_UP_IRQHandler + + PUBWEAK TMR1_TRG_COM_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR1_TRG_COM_IRQHandler + B TMR1_TRG_COM_IRQHandler + + PUBWEAK TMR1_CC_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR1_CC_IRQHandler + B TMR1_CC_IRQHandler + + PUBWEAK TMR2_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR2_IRQHandler + B TMR2_IRQHandler + + PUBWEAK TMR3_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR3_IRQHandler + B TMR3_IRQHandler + + PUBWEAK TMR4_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR4_IRQHandler + B TMR4_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK USART3_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USART3_IRQHandler + B USART3_IRQHandler + + PUBWEAK EINT15_10_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EINT15_10_IRQHandler + B EINT15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK USBDWakeUp_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USBDWakeUp_IRQHandler + B USBDWakeUp_IRQHandler + + PUBWEAK TMR8_BRK_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR8_BRK_IRQHandler + B TMR8_BRK_IRQHandler + + PUBWEAK TMR8_UP_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR8_UP_IRQHandler + B TMR8_UP_IRQHandler + + PUBWEAK TMR8_TRG_COM_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR8_TRG_COM_IRQHandler + B TMR8_TRG_COM_IRQHandler + + PUBWEAK TMR8_CC_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR8_CC_IRQHandler + B TMR8_CC_IRQHandler + + PUBWEAK ADC3_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + ADC3_IRQHandler + B ADC3_IRQHandler + + PUBWEAK EMMC_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EMMC_IRQHandler + B EMMC_IRQHandler + + PUBWEAK SDIO_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + SDIO_IRQHandler + B SDIO_IRQHandler + + PUBWEAK TMR5_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR5_IRQHandler + B TMR5_IRQHandler + + PUBWEAK SPI3_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + SPI3_IRQHandler + B SPI3_IRQHandler + + PUBWEAK UART4_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + UART4_IRQHandler + B UART4_IRQHandler + + PUBWEAK UART5_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + UART5_IRQHandler + B UART5_IRQHandler + + PUBWEAK TMR6_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR6_IRQHandler + B TMR6_IRQHandler + + PUBWEAK TMR7_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR7_IRQHandler + B TMR7_IRQHandler + + PUBWEAK DMA2_Channel1_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA2_Channel1_IRQHandler + B DMA2_Channel1_IRQHandler + + PUBWEAK DMA2_Channel2_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA2_Channel2_IRQHandler + B DMA2_Channel2_IRQHandler + + PUBWEAK DMA2_Channel3_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA2_Channel3_IRQHandler + B DMA2_Channel3_IRQHandler + + PUBWEAK DMA2_Channel4_5_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA2_Channel4_5_IRQHandler + B DMA2_Channel4_5_IRQHandler + + PUBWEAK USBD2_HP_CAN2_TX_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USBD2_HP_CAN2_TX_IRQHandler + B USBD2_HP_CAN2_TX_IRQHandler + + PUBWEAK USBD2_LP_CAN2_RX0_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USBD2_LP_CAN2_RX0_IRQHandler + B USBD2_LP_CAN2_RX0_IRQHandler + + PUBWEAK CAN2_RX1_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + CAN2_RX1_IRQHandler + B CAN2_RX1_IRQHandler + + PUBWEAK CAN2_SCE_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + CAN2_SCE_IRQHandler + B CAN2_SCE_IRQHandler + + END + diff --git a/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/iar/startup_apm32f10x_md.s b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/iar/startup_apm32f10x_md.s new file mode 100644 index 0000000000..dee619770b --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/iar/startup_apm32f10x_md.s @@ -0,0 +1,644 @@ +;/*! +; * @file startup_apm32f10x_hd.s +; * +; * @brief CMSIS Cortex-M3 based Core Device Startup File for Device APM32F103 +; * +; * @version V1.0.0 +; * +; * @date 2022-01-05 +; * +; * @attention +; * +; * Copyright (C) 2020-2022 Geehy Semiconductor +; * +; * You may not use this file except in compliance with the +; * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). +; * +; * The program is only for reference, which is distributed in the hope +; * that it will be usefull and instructional for customers to develop +; * their software. Unless required by applicable law or agreed to in +; * writing, the program is distributed on an "AS IS" BASIS, WITHOUT +; * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. +; * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions +; * and limitations under the License. +; */ + +MODULE ? cstartup + +;; +Forward declaration of sections. +SECTION CSTACK: +DATA: +NOROOT(3) + +SECTION .intvec: +CODE: +NOROOT(2) + + +EXTERN __iar_program_start +EXTERN SystemInit +PUBLIC __vector_table + +DATA + +__vector_table +DCD sfe(CSTACK) +DCD Reset_Handler ; +Reset Handler +DCD NMI_Handler ; +NMI Handler +DCD HardFault_Handler ; +Hard Fault Handler +DCD MemManage_Handler ; +MPU Fault Handler +DCD BusFault_Handler ; +Bus Fault Handler +DCD UsageFault_Handler ; +Usage Fault Handler +DCD 0 ; +Reserved +DCD 0 ; +Reserved +DCD 0 ; +Reserved +DCD 0 ; +Reserved +DCD SVC_Handler ; +SVCall Handler +DCD DebugMon_Handler ; +Debug Monitor Handler +DCD 0 ; +Reserved +DCD PendSV_Handler ; +PendSV Handler +DCD SysTick_Handler ; +SysTick Handler + +; +External Interrupts +DCD WWDT_IRQHandler ; +Window Watchdog +DCD PVD_IRQHandler ; +PVD through EINT Line detect +DCD TAMPER_IRQHandler ; +Tamper +DCD RTC_IRQHandler ; +RTC +DCD FLASH_IRQHandler ; +Flash +DCD RCM_IRQHandler ; +RCM +DCD EINT0_IRQHandler ; +EINT Line 0 +DCD EINT1_IRQHandler ; +EINT Line 1 +DCD EINT2_IRQHandler ; +EINT Line 2 +DCD EINT3_IRQHandler ; +EINT Line 3 +DCD EINT4_IRQHandler ; +EINT Line 4 +DCD DMA1_Channel1_IRQHandler ; +DMA1 Channel 1 +DCD DMA1_Channel2_IRQHandler ; +DMA1 Channel 2 +DCD DMA1_Channel3_IRQHandler ; +DMA1 Channel 3 +DCD DMA1_Channel4_IRQHandler ; +DMA1 Channel 4 +DCD DMA1_Channel5_IRQHandler ; +DMA1 Channel 5 +DCD DMA1_Channel6_IRQHandler ; +DMA1 Channel 6 +DCD DMA1_Channel7_IRQHandler ; +DMA1 Channel 7 +DCD ADC1_2_IRQHandler ; +ADC1 &ADC2 +DCD USBD1_HP_CAN1_TX_IRQHandler ; +USBD1 High Priority or CAN1 TX +DCD USBD1_LP_CAN1_RX0_IRQHandler ; +USBD1 Low Priority or CAN1 RX0 +DCD CAN1_RX1_IRQHandler ; +CAN1 RX1 +DCD CAN1_SCE_IRQHandler ; +CAN1 SCE +DCD EINT9_5_IRQHandler ; +EINT Line 9..5 +DCD TMR1_BRK_IRQHandler ; +TMR1 Break +DCD TMR1_UP_IRQHandler ; +TMR1 Update +DCD TMR1_TRG_COM_IRQHandler ; +TMR1 Trigger and Commutation +DCD TMR1_CC_IRQHandler ; +TMR1 Capture Compare +DCD TMR2_IRQHandler ; +TMR2 +DCD TMR3_IRQHandler ; +TMR3 +DCD TMR4_IRQHandler ; +TMR4 +DCD I2C1_EV_IRQHandler ; +I2C1 Event +DCD I2C1_ER_IRQHandler ; +I2C1 Error +DCD I2C2_EV_IRQHandler ; +I2C2 Event +DCD I2C2_ER_IRQHandler ; +I2C2 Error +DCD SPI1_IRQHandler ; +SPI1 +DCD SPI2_IRQHandler ; +SPI2 +DCD USART1_IRQHandler ; +USART1 +DCD USART2_IRQHandler ; +USART2 +DCD USART3_IRQHandler ; +USART3 +DCD EINT15_10_IRQHandler ; +EINT Line 15..10 +DCD RTCAlarm_IRQHandler ; +RTC Alarm through EINT Line +DCD USBDWakeUp_IRQHandler ; +USBD Wakeup from suspend +DCD FPU_IRQHandler ; +FPU +DCD QSPI_IRQHandler ; +QSPI +DCD USBD2_HP_IRQHandler ; +USBD2 High Priority +DCD USBD2_LP_IRQHandler ; +USBD2 Low Priority +__Vectors_End + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; +Default interrupt handlers. +;; +THUMB + +PUBWEAK Reset_Handler +SECTION .text: +CODE: +REORDER: +NOROOT(2) +Reset_Handler +LDR R0, = SystemInit + BLX R0 + LDR R0, = __iar_program_start + BX R0 + + PUBWEAK NMI_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + NMI_Handler + B NMI_Handler + + PUBWEAK HardFault_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + HardFault_Handler + B HardFault_Handler + + PUBWEAK MemManage_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + MemManage_Handler + B MemManage_Handler + + PUBWEAK BusFault_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + BusFault_Handler + B BusFault_Handler + + PUBWEAK UsageFault_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + UsageFault_Handler + B UsageFault_Handler + + PUBWEAK SVC_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + SysTick_Handler + B SysTick_Handler + + PUBWEAK WWDT_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + WWDT_IRQHandler + B WWDT_IRQHandler + + PUBWEAK PVD_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + PVD_IRQHandler + B PVD_IRQHandler + + PUBWEAK TAMPER_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TAMPER_IRQHandler + B TAMPER_IRQHandler + + PUBWEAK RTC_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + RTC_IRQHandler + B RTC_IRQHandler + + PUBWEAK FLASH_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + FLASH_IRQHandler + B FLASH_IRQHandler + + PUBWEAK RCM_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + RCM_IRQHandler + B RCM_IRQHandler + + PUBWEAK EINT0_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EINT0_IRQHandler + B EINT0_IRQHandler + + PUBWEAK EINT1_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EINT1_IRQHandler + B EINT1_IRQHandler + + PUBWEAK EINT2_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EINT2_IRQHandler + B EINT2_IRQHandler + + PUBWEAK EINT3_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EINT3_IRQHandler + B EINT3_IRQHandler + + PUBWEAK EINT4_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EINT4_IRQHandler + B EINT4_IRQHandler + + PUBWEAK DMA1_Channel1_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA1_Channel1_IRQHandler + B DMA1_Channel1_IRQHandler + + PUBWEAK DMA1_Channel2_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA1_Channel2_IRQHandler + B DMA1_Channel2_IRQHandler + + PUBWEAK DMA1_Channel3_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA1_Channel3_IRQHandler + B DMA1_Channel3_IRQHandler + + PUBWEAK DMA1_Channel4_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA1_Channel4_IRQHandler + B DMA1_Channel4_IRQHandler + + PUBWEAK DMA1_Channel5_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA1_Channel5_IRQHandler + B DMA1_Channel5_IRQHandler + + PUBWEAK DMA1_Channel6_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA1_Channel6_IRQHandler + B DMA1_Channel6_IRQHandler + + PUBWEAK DMA1_Channel7_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + DMA1_Channel7_IRQHandler + B DMA1_Channel7_IRQHandler + + PUBWEAK ADC1_2_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + ADC1_2_IRQHandler + B ADC1_2_IRQHandler + + PUBWEAK USBD1_HP_CAN1_TX_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USBD1_HP_CAN1_TX_IRQHandler + B USBD1_HP_CAN1_TX_IRQHandler + + PUBWEAK USBD1_LP_CAN1_RX0_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USBD1_LP_CAN1_RX0_IRQHandler + B USBD1_LP_CAN1_RX0_IRQHandler + + PUBWEAK CAN1_RX1_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + CAN1_RX1_IRQHandler + B CAN1_RX1_IRQHandler + + PUBWEAK CAN1_SCE_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + CAN1_SCE_IRQHandler + B CAN1_SCE_IRQHandler + + PUBWEAK EINT9_5_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EINT9_5_IRQHandler + B EINT9_5_IRQHandler + + PUBWEAK TMR1_BRK_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR1_BRK_IRQHandler + B TMR1_BRK_IRQHandler + + PUBWEAK TMR1_UP_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR1_UP_IRQHandler + B TMR1_UP_IRQHandler + + PUBWEAK TMR1_TRG_COM_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR1_TRG_COM_IRQHandler + B TMR1_TRG_COM_IRQHandler + + PUBWEAK TMR1_CC_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR1_CC_IRQHandler + B TMR1_CC_IRQHandler + + PUBWEAK TMR2_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR2_IRQHandler + B TMR2_IRQHandler + + PUBWEAK TMR3_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR3_IRQHandler + B TMR3_IRQHandler + + PUBWEAK TMR4_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + TMR4_IRQHandler + B TMR4_IRQHandler + + PUBWEAK I2C1_EV_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + I2C1_EV_IRQHandler + B I2C1_EV_IRQHandler + + PUBWEAK I2C1_ER_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + I2C1_ER_IRQHandler + B I2C1_ER_IRQHandler + + PUBWEAK I2C2_EV_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + I2C2_EV_IRQHandler + B I2C2_EV_IRQHandler + + PUBWEAK I2C2_ER_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + I2C2_ER_IRQHandler + B I2C2_ER_IRQHandler + + PUBWEAK SPI1_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + SPI1_IRQHandler + B SPI1_IRQHandler + + PUBWEAK SPI2_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + SPI2_IRQHandler + B SPI2_IRQHandler + + PUBWEAK USART1_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USART1_IRQHandler + B USART1_IRQHandler + + PUBWEAK USART2_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USART2_IRQHandler + B USART2_IRQHandler + + PUBWEAK USART3_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USART3_IRQHandler + B USART3_IRQHandler + + PUBWEAK EINT15_10_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + EINT15_10_IRQHandler + B EINT15_10_IRQHandler + + PUBWEAK RTCAlarm_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + RTCAlarm_IRQHandler + B RTCAlarm_IRQHandler + + PUBWEAK USBDWakeUp_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USBDWakeUp_IRQHandler + B USBDWakeUp_IRQHandler + + PUBWEAK FPU_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + FPU_IRQHandler + B FPU_IRQHandler + + PUBWEAK QSPI_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + QSPI_IRQHandler + B QSPI_IRQHandler + + PUBWEAK USBD2_HP_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USBD2_HP_IRQHandler + B USBD2_HP_IRQHandler + + PUBWEAK USBD2_LP_IRQHandler + SECTION .text: + CODE: + REORDER: + NOROOT(1) + USBD2_LP_IRQHandler + B USBD2_LP_IRQHandler + + + END + diff --git a/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/system_apm32f10x.c b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/system_apm32f10x.c index aad3575613..2fae0cb90a 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/system_apm32f10x.c +++ b/bsp/apm32/libraries/APM32F10x_Library/Device/Geehy/APM32F10x/Source/system_apm32f10x.c @@ -3,14 +3,33 @@ * * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File * - * @version V1.0.1 + * @version V1.0.2 * - * @date 2021-03-23 + * @date 2022-01-05 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ #include "apm32f10x.h" +/***************************************************************** + * If SYSCLK source is PLL,SystemCoreClock will contain the * + * HSE_VALUE or HSI_VALUE multiplied/divided by the PLL factors. * +******************************************************************/ + //#define SYSTEM_CLOCK_HSE HSE_VALUE //#define SYSTEM_CLOCK_24MHz (24000000) //#define SYSTEM_CLOCK_36MHz (36000000) @@ -20,42 +39,42 @@ //#define SYSTEM_CLOCK_96MHz (96000000) -/* #define VECT_TAB_SRAM */ +/** #define VECT_TAB_SRAM */ #define VECT_TAB_OFFSET 0x00 #ifdef SYSTEM_CLOCK_HSE -uint32_t SystemCoreClock = SYSTEM_CLOCK_HSE; + uint32_t SystemCoreClock = SYSTEM_CLOCK_HSE; #elif defined SYSTEM_CLOCK_24MHz -uint32_t SystemCoreClock = SYSTEM_CLOCK_24MHz; + uint32_t SystemCoreClock = SYSTEM_CLOCK_24MHz; #elif defined SYSTEM_CLOCK_36MHz -uint32_t SystemCoreClock = SYSTEM_CLOCK_36MHz; + uint32_t SystemCoreClock = SYSTEM_CLOCK_36MHz; #elif defined SYSTEM_CLOCK_48MHz -uint32_t SystemCoreClock = SYSTEM_CLOCK_48MHz; + uint32_t SystemCoreClock = SYSTEM_CLOCK_48MHz; #elif defined SYSTEM_CLOCK_56MHz -uint32_t SystemCoreClock = SYSTEM_CLOCK_56MHz; + uint32_t SystemCoreClock = SYSTEM_CLOCK_56MHz; #elif defined SYSTEM_CLOCK_72MHz -uint32_t SystemCoreClock = SYSTEM_CLOCK_72MHz; + uint32_t SystemCoreClock = SYSTEM_CLOCK_72MHz; #else -uint32_t SystemCoreClock = SYSTEM_CLOCK_96MHz; + uint32_t SystemCoreClock = SYSTEM_CLOCK_96MHz; #endif static void SystemClockConfig(void); #ifdef SYSTEM_CLOCK_HSE -static void SystemClockHSE(void); + static void SystemClockHSE(void); #elif defined SYSTEM_CLOCK_24MHz -static void SystemClock24M(void); + static void SystemClock24M(void); #elif defined SYSTEM_CLOCK_36MHz -static void SystemClock36M(void); + static void SystemClock36M(void); #elif defined SYSTEM_CLOCK_48MHz -static void SystemClock48M(void); + static void SystemClock48M(void); #elif defined SYSTEM_CLOCK_56MHz -static void SystemClock56M(void); + static void SystemClock56M(void); #elif defined SYSTEM_CLOCK_72MHz -static void SystemClock72M(void); + static void SystemClock72M(void); #elif defined SYSTEM_CLOCK_96MHz -static void SystemClock96M(void); + static void SystemClock96M(void); #endif /*! @@ -65,13 +84,12 @@ static void SystemClock96M(void); * * @retval None * - * @note */ -void SystemInit (void) +void SystemInit(void) { /** Set HSIEN bit */ RCM->CTRL_B.HSIEN = BIT_SET; - /** Reset SCLKSW, AHBPSC, APB1PSC, APB2PSC, ADCPSC and MCOSEL bits */ + /** Reset SCLKSEL, AHBPSC, APB1PSC, APB2PSC, ADCPSC and MCOSEL bits */ RCM->CFG &= (uint32_t)0xF8FF0000; /** Reset HSEEN, CSSEN and PLLEN bits */ RCM->CTRL &= (uint32_t)0xFEF6FFFF; @@ -99,52 +117,51 @@ void SystemInit (void) * * @retval None * - * @note */ -void SystemCoreClockUpdate (void) +void SystemCoreClockUpdate(void) { uint32_t sysClock, pllMull, pllSource, Prescaler; uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; - sysClock = RCM->CFG_B.SCLKSWSTS; + sysClock = RCM->CFG_B.SCLKSELSTS; - switch(sysClock) + switch (sysClock) { - /** sys clock is HSI */ - case 0: - SystemCoreClock = HSI_VALUE; + /** sys clock is HSI */ + case 0: + SystemCoreClock = HSI_VALUE; break; - /** sys clock is HSE */ - case 1: - SystemCoreClock = HSE_VALUE; + /** sys clock is HSE */ + case 1: + SystemCoreClock = HSE_VALUE; break; - /** sys clock is PLL */ - case 2: - pllMull = RCM->CFG_B.PLLMULCFG + 2; - pllSource = RCM->CFG_B.PLLSRCSEL; + /** sys clock is PLL */ + case 2: + pllMull = RCM->CFG_B.PLLMULCFG + 2; + pllSource = RCM->CFG_B.PLLSRCSEL; - /** PLL entry clock source is HSE */ - if(pllSource == BIT_SET) + /** PLL entry clock source is HSE */ + if (pllSource == BIT_SET) + { + SystemCoreClock = HSE_VALUE * pllMull; + + /** HSE clock divided by 2 */ + if (pllSource == RCM->CFG_B.PLLHSEPSC) { - SystemCoreClock = HSE_VALUE * pllMull; - - /** HSE clock divided by 2 */ - if(pllSource == RCM->CFG_B.PLLHSEPSC) - { - SystemCoreClock >>= 1; - } + SystemCoreClock >>= 1; } - /** PLL entry clock source is HSI/2 */ - else - { - SystemCoreClock = (HSI_VALUE >> 1) * pllMull; - } - break; + } + /** PLL entry clock source is HSI/2 */ + else + { + SystemCoreClock = (HSI_VALUE >> 1) * pllMull; + } + break; - default: - SystemCoreClock = HSI_VALUE; + default: + SystemCoreClock = HSI_VALUE; break; } @@ -159,7 +176,6 @@ void SystemCoreClockUpdate (void) * * @retval None * - * @note */ static void SystemClockConfig(void) { @@ -188,41 +204,40 @@ static void SystemClockConfig(void) * * @retval None * - * @note */ static void SystemClockHSE(void) { __IO uint32_t i; - RCM->CTRL_B.HSEEN= BIT_SET; + RCM->CTRL_B.HSEEN = BIT_SET; - for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + for (i = 0; i < HSE_STARTUP_TIMEOUT; i++) { - if(RCM->CTRL_B.HSERDYFLG) + if (RCM->CTRL_B.HSERDYFLG) { break; } } - if(RCM->CTRL_B.HSERDYFLG) + if (RCM->CTRL_B.HSERDYFLG) { - /* Enable Prefetch Buffer */ + /** Enable Prefetch Buffer */ FMC->CTRL1_B.PBEN = BIT_SET; - /* Flash 0 wait state */ + /** Flash 0 wait state */ FMC->CTRL1_B.WS = 0; - /* HCLK = SYSCLK */ - RCM->CFG_B.AHBPSC= 0X00; - /* PCLK2 = HCLK */ - RCM->CFG_B.APB2PSC= 0; - /* PCLK1 = HCLK */ + /** HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC = 0X00; + /** PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC = 0; + /** PCLK1 = HCLK */ RCM->CFG_B.APB1PSC = 0; - /* Select HSE as system clock source */ - RCM->CFG_B.SCLKSW = 1; + /** Select HSE as system clock source */ + RCM->CFG_B.SCLKSEL = 1; /** Wait till HSE is used as system clock source */ - while(RCM->CFG_B.SCLKSWSTS!= 0x01); + while (RCM->CFG_B.SCLKSELSTS != 0x01); } } @@ -235,34 +250,33 @@ static void SystemClockHSE(void) * * @retval None * - * @note */ static void SystemClock24M(void) { __IO uint32_t i; - RCM->CTRL_B.HSEEN= BIT_SET; + RCM->CTRL_B.HSEEN = BIT_SET; - for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + for (i = 0; i < HSE_STARTUP_TIMEOUT; i++) { - if(RCM->CTRL_B.HSERDYFLG) + if (RCM->CTRL_B.HSERDYFLG) { break; } } - if(RCM->CTRL_B.HSERDYFLG) + if (RCM->CTRL_B.HSERDYFLG) { - /* Enable Prefetch Buffer */ + /** Enable Prefetch Buffer */ FMC->CTRL1_B.PBEN = BIT_SET; - /* Flash 0 wait state */ + /** Flash 0 wait state */ FMC->CTRL1_B.WS = 0; - /* HCLK = SYSCLK */ - RCM->CFG_B.AHBPSC= 0X00; - /* PCLK2 = HCLK */ - RCM->CFG_B.APB2PSC= 0; - /* PCLK1 = HCLK */ + /** HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC = 0X00; + /** PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC = 0; + /** PCLK1 = HCLK */ RCM->CFG_B.APB1PSC = 0; /** PLL: (HSE / 2) * 6 */ @@ -273,12 +287,12 @@ static void SystemClock24M(void) /** Enable PLL */ RCM->CTRL_B.PLLEN = 1; /** Wait PLL Ready */ - while(RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + while (RCM->CTRL_B.PLLRDYFLG == BIT_RESET); - /* Select PLL as system clock source */ - RCM->CFG_B.SCLKSW = 2; - /* Wait till PLL is used as system clock source */ - while(RCM->CFG_B.SCLKSWSTS!= 0x02); + /** Select PLL as system clock source */ + RCM->CFG_B.SCLKSEL = 2; + /** Wait till PLL is used as system clock source */ + while (RCM->CFG_B.SCLKSELSTS != 0x02); } } @@ -290,34 +304,33 @@ static void SystemClock24M(void) * * @retval None * - * @note */ static void SystemClock36M(void) { __IO uint32_t i; - RCM->CTRL_B.HSEEN= BIT_SET; + RCM->CTRL_B.HSEEN = BIT_SET; - for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + for (i = 0; i < HSE_STARTUP_TIMEOUT; i++) { - if(RCM->CTRL_B.HSERDYFLG) + if (RCM->CTRL_B.HSERDYFLG) { break; } } - if(RCM->CTRL_B.HSERDYFLG) + if (RCM->CTRL_B.HSERDYFLG) { - /* Enable Prefetch Buffer */ + /** Enable Prefetch Buffer */ FMC->CTRL1_B.PBEN = BIT_SET; - /* Flash 1 wait state */ + /** Flash 1 wait state */ FMC->CTRL1_B.WS = 1; - /* HCLK = SYSCLK */ - RCM->CFG_B.AHBPSC= 0X00; - /* PCLK2 = HCLK */ - RCM->CFG_B.APB2PSC= 0; - /* PCLK1 = HCLK */ + /** HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC = 0X00; + /** PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC = 0; + /** PCLK1 = HCLK */ RCM->CFG_B.APB1PSC = 0; /** PLL: (HSE / 2) * 9 */ @@ -328,12 +341,12 @@ static void SystemClock36M(void) /** Enable PLL */ RCM->CTRL_B.PLLEN = 1; /** Wait PLL Ready */ - while(RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + while (RCM->CTRL_B.PLLRDYFLG == BIT_RESET); - /* Select PLL as system clock source */ - RCM->CFG_B.SCLKSW = 2; - /* Wait till PLL is used as system clock source */ - while(RCM->CFG_B.SCLKSWSTS != 0x02); + /** Select PLL as system clock source */ + RCM->CFG_B.SCLKSEL = 2; + /** Wait till PLL is used as system clock source */ + while (RCM->CFG_B.SCLKSELSTS != 0x02); } } @@ -345,34 +358,33 @@ static void SystemClock36M(void) * * @retval None * - * @note */ static void SystemClock48M(void) { __IO uint32_t i; - RCM->CTRL_B.HSEEN= BIT_SET; + RCM->CTRL_B.HSEEN = BIT_SET; - for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + for (i = 0; i < HSE_STARTUP_TIMEOUT; i++) { - if(RCM->CTRL_B.HSERDYFLG) + if (RCM->CTRL_B.HSERDYFLG) { break; } } - if(RCM->CTRL_B.HSERDYFLG) + if (RCM->CTRL_B.HSERDYFLG) { - /* Enable Prefetch Buffer */ + /** Enable Prefetch Buffer */ FMC->CTRL1_B.PBEN = BIT_SET; - /* Flash 1 wait state */ + /** Flash 1 wait state */ FMC->CTRL1_B.WS = 1; - /* HCLK = SYSCLK */ - RCM->CFG_B.AHBPSC= 0X00; - /* PCLK2 = HCLK */ - RCM->CFG_B.APB2PSC= 0; - /* PCLK1 = HCLK / 2 */ + /** HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC = 0X00; + /** PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC = 0; + /** PCLK1 = HCLK / 2 */ RCM->CFG_B.APB1PSC = 4; /** PLL: HSE * 6 */ @@ -382,12 +394,12 @@ static void SystemClock48M(void) /** Enable PLL */ RCM->CTRL_B.PLLEN = 1; /** Wait PLL Ready */ - while(RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + while (RCM->CTRL_B.PLLRDYFLG == BIT_RESET); - /* Select PLL as system clock source */ - RCM->CFG_B.SCLKSW = 2; - /* Wait till PLL is used as system clock source */ - while(RCM->CFG_B.SCLKSWSTS!= 0x02); + /** Select PLL as system clock source */ + RCM->CFG_B.SCLKSEL = 2; + /** Wait till PLL is used as system clock source */ + while (RCM->CFG_B.SCLKSELSTS != 0x02); } } @@ -399,34 +411,33 @@ static void SystemClock48M(void) * * @retval None * - * @note */ static void SystemClock56M(void) { __IO uint32_t i; - RCM->CTRL_B.HSEEN= BIT_SET; + RCM->CTRL_B.HSEEN = BIT_SET; - for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + for (i = 0; i < HSE_STARTUP_TIMEOUT; i++) { - if(RCM->CTRL_B.HSERDYFLG) + if (RCM->CTRL_B.HSERDYFLG) { break; } } - if(RCM->CTRL_B.HSERDYFLG) + if (RCM->CTRL_B.HSERDYFLG) { - /* Enable Prefetch Buffer */ + /** Enable Prefetch Buffer */ FMC->CTRL1_B.PBEN = BIT_SET; - /* Flash 2 wait state */ + /** Flash 2 wait state */ FMC->CTRL1_B.WS = 2; - /* HCLK = SYSCLK */ - RCM->CFG_B.AHBPSC= 0X00; - /* PCLK2 = HCLK */ - RCM->CFG_B.APB2PSC= 0; - /* PCLK1 = HCLK / 2 */ + /** HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC = 0X00; + /** PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC = 0; + /** PCLK1 = HCLK / 2 */ RCM->CFG_B.APB1PSC = 4; /** PLL: HSE * 7 */ @@ -436,12 +447,12 @@ static void SystemClock56M(void) /** Enable PLL */ RCM->CTRL_B.PLLEN = 1; /** Wait PLL Ready */ - while(RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + while (RCM->CTRL_B.PLLRDYFLG == BIT_RESET); - /* Select PLL as system clock source */ - RCM->CFG_B.SCLKSW = 2; - /* Wait till PLL is used as system clock source */ - while(RCM->CFG_B.SCLKSWSTS!= 0x02); + /** Select PLL as system clock source */ + RCM->CFG_B.SCLKSEL = 2; + /** Wait till PLL is used as system clock source */ + while (RCM->CFG_B.SCLKSELSTS != 0x02); } } @@ -453,34 +464,33 @@ static void SystemClock56M(void) * * @retval None * - * @note */ static void SystemClock72M(void) { __IO uint32_t i; - RCM->CTRL_B.HSEEN= BIT_SET; + RCM->CTRL_B.HSEEN = BIT_SET; - for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + for (i = 0; i < HSE_STARTUP_TIMEOUT; i++) { - if(RCM->CTRL_B.HSERDYFLG) + if (RCM->CTRL_B.HSERDYFLG) { break; } } - if(RCM->CTRL_B.HSERDYFLG) + if (RCM->CTRL_B.HSERDYFLG) { - /* Enable Prefetch Buffer */ + /** Enable Prefetch Buffer */ FMC->CTRL1_B.PBEN = BIT_SET; - /* Flash 2 wait state */ + /** Flash 2 wait state */ FMC->CTRL1_B.WS = 2; - /* HCLK = SYSCLK */ - RCM->CFG_B.AHBPSC= 0X00; - /* PCLK2 = HCLK */ - RCM->CFG_B.APB2PSC= 0; - /* PCLK1 = HCLK / 2 */ + /** HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC = 0X00; + /** PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC = 0; + /** PCLK1 = HCLK / 2 */ RCM->CFG_B.APB1PSC = 4; /** PLL: HSE * 9 */ @@ -490,12 +500,12 @@ static void SystemClock72M(void) /** Enable PLL */ RCM->CTRL_B.PLLEN = 1; /** Wait PLL Ready */ - while(RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + while (RCM->CTRL_B.PLLRDYFLG == BIT_RESET); - /* Select PLL as system clock source */ - RCM->CFG_B.SCLKSW = 2; - /* Wait till PLL is used as system clock source */ - while(RCM->CFG_B.SCLKSWSTS!= 0x02); + /** Select PLL as system clock source */ + RCM->CFG_B.SCLKSEL = 2; + /** Wait till PLL is used as system clock source */ + while (RCM->CFG_B.SCLKSELSTS != 0x02); } } @@ -508,34 +518,33 @@ static void SystemClock72M(void) * * @retval None * - * @note */ static void SystemClock96M(void) { __IO uint32_t i; - RCM->CTRL_B.HSEEN= BIT_SET; + RCM->CTRL_B.HSEEN = BIT_SET; - for(i = 0; i < HSE_STARTUP_TIMEOUT; i++) + for (i = 0; i < HSE_STARTUP_TIMEOUT; i++) { - if(RCM->CTRL_B.HSERDYFLG) + if (RCM->CTRL_B.HSERDYFLG) { break; } } - if(RCM->CTRL_B.HSERDYFLG) + if (RCM->CTRL_B.HSERDYFLG) { - /* Enable Prefetch Buffer */ + /** Enable Prefetch Buffer */ FMC->CTRL1_B.PBEN = BIT_SET; - /* Flash 3 wait state */ + /** Flash 3 wait state */ FMC->CTRL1_B.WS = 3; - /* HCLK = SYSCLK */ - RCM->CFG_B.AHBPSC= 0X00; - /* PCLK2 = HCLK */ - RCM->CFG_B.APB2PSC= 0; - /* PCLK1 = HCLK / 2 */ + /** HCLK = SYSCLK */ + RCM->CFG_B.AHBPSC = 0X00; + /** PCLK2 = HCLK */ + RCM->CFG_B.APB2PSC = 0; + /** PCLK1 = HCLK / 2 */ RCM->CFG_B.APB1PSC = 4; /** PLL: HSE * 12 */ @@ -545,12 +554,12 @@ static void SystemClock96M(void) /** Enable PLL */ RCM->CTRL_B.PLLEN = 1; /** Wait PLL Ready */ - while(RCM->CTRL_B.PLLRDYFLG == BIT_RESET); + while (RCM->CTRL_B.PLLRDYFLG == BIT_RESET); - /* Select PLL as system clock source */ - RCM->CFG_B.SCLKSW = 2; - /* Wait till PLL is used as system clock source */ - while(RCM->CFG_B.SCLKSWSTS!= 0x02); + /** Select PLL as system clock source */ + RCM->CFG_B.SCLKSEL = 2; + /** Wait till PLL is used as system clock source */ + while (RCM->CFG_B.SCLKSELSTS != 0x02); } } #endif diff --git a/bsp/apm32/libraries/APM32F10x_Library/SConscript b/bsp/apm32/libraries/APM32F10x_Library/SConscript index 84a2e5e2f6..a95e30d56a 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/SConscript +++ b/bsp/apm32/libraries/APM32F10x_Library/SConscript @@ -15,6 +15,26 @@ APM32F10x_StdPeriphDriver/src/apm32f10x_usart.c APM32F10x_StdPeriphDriver/src/apm32f10x_eint.c """) +if GetDepend(['RT_USING_ADC']): + src += ['APM32F10x_StdPeriphDriver/src/apm32f10x_adc.c'] + +if GetDepend(['RT_USING_DAC']): + src += ['APM32F10x_StdPeriphDriver/src/apm32f10x_dac.c'] + +if GetDepend(['RT_USING_RTC']): + src += ['APM32F10x_StdPeriphDriver/src/apm32f10x_rtc.c'] + src += ['APM32F10x_StdPeriphDriver/src/apm32f10x_pmu.c'] + +if GetDepend(['RT_USING_SPI']): + src += ['APM32F10x_StdPeriphDriver/src/apm32f10x_spi.c'] + +if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): + src += ['APM32F10x_StdPeriphDriver/src/apm32f10x_tmr.c'] + +if GetDepend(['RT_USING_WDT']): + src += ['APM32F10x_StdPeriphDriver/src/apm32f10x_wwdt.c'] + src += ['APM32F10x_StdPeriphDriver/src/apm32f10x_iwdt.c'] + path = [cwd + '/Device/Geehy/APM32F10x/Include', cwd + '/APM32F10x_StdPeriphDriver/inc', cwd + '/CMSIS/Include'] diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/CDC/inc/usbd_class_cdc.h b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/CDC/inc/usbd_class_cdc.h new file mode 100644 index 0000000000..0aebd68c42 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/CDC/inc/usbd_class_cdc.h @@ -0,0 +1,33 @@ +/*! + * @file usbd_class_cdc.h + * + * @brief CDC Class handler file head file + * + * @version V1.0.0 + * + * @date 2021-12-06 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#ifndef __CDC_CLASS_ +#define __CDC_CLASS_ + +#include "usbd_core.h" + +void USBD_ClassHandler(USBD_DevReqData_T *reqData); + +#endif diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/CDC/src/usbd_class_cdc.c b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/CDC/src/usbd_class_cdc.c new file mode 100644 index 0000000000..ec54feeeda --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/CDC/src/usbd_class_cdc.c @@ -0,0 +1,71 @@ +/*! + * @file usbd_class_cdc.c + * + * @brief CDC Class handler file + * + * @version V1.0.0 + * + * @date 2021-12-06 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "usbd_class_cdc.h" + +static uint8_t cmdBuf[8] = {0}; + +/*! + * @brief USB CDC Class request handler + * + * @param reqData : point to USBD_DevReqData_T structure + * + * @retval None + */ +void USBD_ClassHandler(USBD_DevReqData_T *reqData) +{ + uint16_t length = ((uint16_t)reqData->byte.wLength[1] << 8) | \ + reqData->byte.wLength[0] ; + + if (!length) + { + if (!reqData->byte.bmRequestType.bit.dir) + { + USBD_CtrlTxStatus(); + } + else + { + USBD_CtrlRxStatus(); + } + } + else + { + switch (reqData->byte.bRequest) + { + + case 0x20: + USBD_CtrlOutData(cmdBuf, length); + break; + case 0x21: + USBD_CtrlInData(cmdBuf, length); + break; + case 0x22: + USBD_CtrlOutData(cmdBuf, length); + break; + default: + break; + } + } +} diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/HID/inc/usbd_class_hid.h b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/HID/inc/usbd_class_hid.h new file mode 100644 index 0000000000..f1dc26c463 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/HID/inc/usbd_class_hid.h @@ -0,0 +1,37 @@ +/*! + * @file usbd_class_hid.h + * + * @brief HID Class handler file head file + * + * @version V1.0.0 + * + * @date 2021-12-06 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "usbd_core.h" + +#define HID_CLASS_REQ_SET_PROTOCOL 0x0B +#define HID_CLASS_REQ_GET_PROTOCOL 0x03 + +#define HID_CLASS_REQ_SET_IDLE 0x0A +#define HID_CLASS_REQ_GET_IDLE 0x02 + +#define HID_CLASS_REQ_SET_REPORT 0x09 +#define HID_CLASS_REQ_GET_REPORT 0x01 + +void USBD_ClassHandler(USBD_DevReqData_T *reqData); diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/HID/src/usbd_class_hid.c b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/HID/src/usbd_class_hid.c new file mode 100644 index 0000000000..e81462c40c --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/HID/src/usbd_class_hid.c @@ -0,0 +1,63 @@ +/*! + * @file usbd_class_hid.c + * + * @brief HID Class handler file + * + * @version V1.0.0 + * + * @date 2021-12-06 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "usbd_class_hid.h" + +static uint8_t s_hidIdleState; +static uint8_t s_hidProtocol; + +/*! + * @brief USB HID Class request handler + * + * @param reqData : point to USBD_DevReqData_T structure + * + * @retval None + */ +void USBD_ClassHandler(USBD_DevReqData_T *reqData) +{ + switch (reqData->byte.bRequest) + { + case HID_CLASS_REQ_SET_IDLE: + s_hidIdleState = reqData->byte.wValue[1]; + USBD_CtrlInData(NULL, 0); + break; + + case HID_CLASS_REQ_GET_IDLE: + USBD_CtrlInData(&s_hidIdleState, 1); + break; + + case HID_CLASS_REQ_SET_PROTOCOL: + s_hidProtocol = reqData->byte.wValue[0]; + USBD_CtrlInData(NULL, 0); + break; + + case HID_CLASS_REQ_GET_PROTOCOL: + USBD_CtrlInData(&s_hidProtocol, 1); + break; + + default: + break; + } +} diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/inc/usbd_class_msc.h b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/inc/usbd_class_msc.h new file mode 100644 index 0000000000..67cb3f293e --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/inc/usbd_class_msc.h @@ -0,0 +1,37 @@ +/*! + * @file usbd_class_msc.h + * + * @brief MSC Class handler file head file + * + * @version V1.0.0 + * + * @date 2021-12-06 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#ifndef __USBD_CLASS_MSC +#define __USBD_CLASS_MSC + +#include "usbd_core.h" + + +#define BOT_GET_MAX_LUN 0xFE +#define BOT_RESET 0xFF + +void USBD_MSC_ClassHandler(USBD_DevReqData_T *reqData); + +#endif diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/inc/usbd_msc_bot.h b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/inc/usbd_msc_bot.h new file mode 100644 index 0000000000..b44f2f6e86 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/inc/usbd_msc_bot.h @@ -0,0 +1,106 @@ +/*! + * @file usbd_msc_bot.h + * + * @brief MSC BOT protocol core functions + * + * @version V1.0.0 + * + * @date 2021-12-25 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "usbd_core.h" + +#ifndef __USBD_MSC_BOT_H +#define __USBD_MSC_BOT_H + +#define MSC_BOT_CBW_SIGNATURE (uint32_t)(0x43425355) +#define MSC_BOT_CBW_LENGTH 31 + +#define MSC_BOT_CSW_SIGNATURE (uint32_t)(0x53425355) +#define MSC_BOT_CSW_LENGTH 13 + +typedef enum +{ + BOT_STATE_IDLE, //!< Idle state + BOT_STATE_DATA_OUT, //!< Data Out state + BOT_STATE_DATA_IN, //!< Data In state + BOT_STATE_LAST_DATA_IN, //!< Last Data In Last + BOT_STATE_SEND_DATA //!< Send Immediate data +} BOT_STATE_T; + +typedef enum +{ + BOT_STATUS_NORMAL, + BOT_STATUS_RECOVERY, + BOT_STATUS_ERROR +} BOT_STATUS_T; + +typedef enum +{ + BOT_CSW_STATUS_CMD_OK, + BOT_CSW_STATUS_CMD_FAIL, + BOT_CSW_STATUS_PHASE_ERROR +} BOT_CSW_STATUS_T; + + +/** + * @brief Command Block Wrapper + */ +typedef struct +{ + uint32_t dSignature; + uint32_t dTag; + uint32_t dDataXferLen; + uint8_t bmFlags; + uint8_t bLUN; + uint8_t bCBLen; + uint8_t CB[16]; +} BOT_CBW_T; + +/** + * @brief Command Status Wrapper + */ +typedef struct +{ + uint32_t dSignature; + uint32_t dTag; + uint32_t dDataResidue; + uint8_t bStatus; +} BOT_CSW_T; + +typedef struct +{ + uint8_t state; + uint8_t status; + uint16_t dataLen; + BOT_CBW_T CBW; + BOT_CSW_T CSW; + uint8_t data[MSC_MEDIA_PACKET]; +} BOT_Info_T; + +extern BOT_Info_T g_BOTInfo; + +void USBD_MSC_BOT_Reset(void); +void USBD_MSC_BOT_Init(void); +void USBD_MSC_BOT_OutData(uint8_t ep); +void USBD_MSC_BOT_InData(uint8_t ep); +void USBD_MSC_BOT_TxCSW(uint8_t cswStatus); +void USBD_MSC_BOT_Stall(void); +void USBD_MSV_BOT_ClearFeatureHandler(void); + +#endif diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/inc/usbd_msc_scsi.h b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/inc/usbd_msc_scsi.h new file mode 100644 index 0000000000..9da491a7ce --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/inc/usbd_msc_scsi.h @@ -0,0 +1,132 @@ +/*! + * @file usbd_msc_scsi.h + * + * @brief MSC scsi + * + * @version V1.0.0 + * + * @date 2021-12-25 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "usbd_core.h" +#ifndef __USBD_MSC_SCSI_H_ +#define __USBD_MSC_SCSI_H_ + +/** + * @brief SCSI function status + */ +enum +{ + SCSI_OK, + SCSI_FAIL +}; + +/** + * @brief SCSI Sense Key + */ +typedef enum +{ + SCSI_SKEY_NO_SENSE, + SCSI_SKEY_RECOVERED_ERROR, + SCSI_SKEY_NOT_READY, + SCSI_SKEY_MEDIUM_ERROR, + SCSI_SKEY_HARDWARE_ERROR, + SCSI_SKEY_ILLEGAL_REQUEST, + SCSI_SKEY_UNIT_ATTENTION, + SCSI_SKEY_DATA_PROTECT, + SCSI_SKEY_BLANK_CHECK, + SCSI_SKEY_VENDOR_SPECIFIC, + SCSI_SKEY_COPY_ABORTED, + SCSI_SKEY_ABORTED_COMMAND, + SCSI_SKEY_VOLUME_OVERFLOW = 13, + SCSI_SKEY_MISCOMPARE = 14 +} SCSI_SKEY_T; + +/** + * @brief SCSI Sense + */ +typedef struct +{ + uint8_t sensekey; + uint8_t ASC; + uint8_t ASCQ; +} SCSI_Sense_T; + + +#define SCSI_SENSE_LIST_NUMBER 4 +#define SCSI_INQUIRY_LENGTH 36 + +/** SCSI Commands */ +#define SCSI_CMD_FORMAT_UNIT ((uint8_t)0x04) +#define SCSI_CMD_INQUIRY ((uint8_t)0x12) +#define SCSI_CMD_MODE_SELECT_6 ((uint8_t)0x15) +#define SCSI_CMD_MODE_SELECT_10 ((uint8_t)0x55) +#define SCSI_CMD_MODE_SENSE_6 ((uint8_t)0x1A) +#define SCSI_CMD_MODE_SENSE_10 ((uint8_t)0x5A) +#define SCSI_CMD_ALLOW_MEDIUM_REMOVAL ((uint8_t)0x1E) +#define SCSI_CMD_READ_6 ((uint8_t)0x08) +#define SCSI_CMD_READ_10 ((uint8_t)0x28) +#define SCSI_CMD_READ_12 ((uint8_t)0xA8) +#define SCSI_CMD_READ_16 ((uint8_t)0x88) + +#define SCSI_CMD_READ_CAPACITY_10 ((uint8_t)0x25) +#define SCSI_CMD_READ_CAPACITY_16 ((uint8_t)0x9E) + +#define SCSI_CMD_REQUEST_SENSE ((uint8_t)0x03) +#define SCSI_CMD_START_STOP_UNIT ((uint8_t)0x1B) +#define SCSI_CMD_TEST_UNIT_READY ((uint8_t)0x00) +#define SCSI_CMD_WRITE6 ((uint8_t)0x0A) +#define SCSI_CMD_WRITE10 ((uint8_t)0x2A) +#define SCSI_CMD_WRITE12 ((uint8_t)0xAA) +#define SCSI_CMD_WRITE16 ((uint8_t)0x8A) + +#define SCSI_CMD_VERIFY_10 ((uint8_t)0x2F) +#define SCSI_CMD_VERIFY_12 ((uint8_t)0xAF) +#define SCSI_CMD_VERIFY_16 ((uint8_t)0x8F) + +#define SCSI_CMD_SEND_DIAGNOSTIC ((uint8_t)0x1D) +#define SCSI_CMD_READ_FORMAT_CAPACITIES ((uint8_t)0x23) + + +#define SCSI_ASC_INVALID_CDB 0x20 +#define SCSI_ASC_INVALID_FIELED_IN_COMMAND 0x24 +#define SCSI_ASC_PARAMETER_LIST_LENGTH_ERROR 0x1A +#define SCSI_ASC_INVALID_FIELD_IN_PARAMETER_LIST 0x26 +#define SCSI_ASC_ADDRESS_OUT_OF_RANGE 0x21 +#define SCSI_ASC_MEDIUM_NOT_PRESENT 0x3A +#define SCSI_ASC_MEDIUM_HAVE_CHANGED 0x28 +#define SCSI_ASC_WRITE_PROTECTED 0x27 +#define SCSI_ASC_UNRECOVERED_READ_ERROR 0x11 +#define SCSI_ASC_WRITE_FAULT 0x03 + +#define SCSI_READ_FORMAT_CAPACITY_DATA_LEN 0x0C +#define SCSI_READ_CAPACITY10_DATA_LEN 0x08 +#define SCSI_MODE_SENSE10_DATA_LEN 0x08 +#define SCSI_MODE_SENSE6_DATA_LEN 0x04 +#define SCSI_REQUEST_SENSE_DATA_LEN 0x12 +#define SCSI_STANDARD_INQUIRY_DATA_LEN 0x24 +#define SCSI_BLKVFY 0x04 + +extern SCSI_Sense_T g_scsiSense[SCSI_SENSE_LIST_NUMBER]; +extern uint8_t g_senseTxCnt; +extern uint8_t g_sensePutCnt; + +uint8_t SCSI_CmdHandler(uint8_t lun, uint8_t *cmd); +void SCSI_PutSenseCode(uint8_t lun, uint8_t sKey, uint8_t ASC, uint8_t ASCQ); + +#endif diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/src/usbd_class_msc.c b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/src/usbd_class_msc.c new file mode 100644 index 0000000000..09c3a83a77 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/src/usbd_class_msc.c @@ -0,0 +1,79 @@ +/*! + * @file usbd_class_msc.c + * + * @brief MSC Class file + * + * @version V1.0.0 + * + * @date 2021-12-06 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "usbd_class_msc.h" +#include "usbd_msc_bot.h" + +static uint8_t s_mscMaxLen = 0; + +/*! + * @brief USB MSC Class request handler + * + * @param reqData : point to USBD_DevReqData_T structure + * + * @retval None + */ +void USBD_MSC_ClassHandler(USBD_DevReqData_T *reqData) +{ + uint16_t wValue = ((uint16_t)reqData->byte.wValue[1] << 8) | \ + reqData->byte.wValue[0]; + uint16_t wLength = ((uint16_t)reqData->byte.wLength[1] << 8) | \ + reqData->byte.wLength[0]; + + switch (reqData->byte.bRequest) + { + case BOT_GET_MAX_LUN : + if ((wValue == 0) && (wLength == 1) && \ + (reqData->byte.bmRequestType.bit.dir == 1)) + { + s_mscMaxLen = STORAGE_MAX_LUN - 1; + + USBD_CtrlInData(&s_mscMaxLen, 1); + } + else + { + USBD_SetEPTxRxStatus(USBD_EP_0, USBD_EP_STATUS_STALL, USBD_EP_STATUS_STALL); + } + break; + case BOT_RESET : + if ((wValue == 0) && (wLength == 0) && \ + (reqData->byte.bmRequestType.bit.dir == 0)) + { + USBD_CtrlInData(NULL, 0); + /** Reset */ + USBD_MSC_BOT_Reset(); + } + else + { + USBD_SetEPTxRxStatus(USBD_EP_0, USBD_EP_STATUS_STALL, USBD_EP_STATUS_STALL); + } + + break; + + default: + USBD_SetEPTxRxStatus(USBD_EP_0, USBD_EP_STATUS_STALL, USBD_EP_STATUS_STALL); + break; + } +} diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/src/usbd_msc_bot.c b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/src/usbd_msc_bot.c new file mode 100644 index 0000000000..436544e371 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/src/usbd_msc_bot.c @@ -0,0 +1,242 @@ +/*! + * @file usbd_msv_bot.c + * + * @brief MSC BOT protocol core functions + * + * @version V1.0.0 + * + * @date 2021-12-25 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "usbd_msc_bot.h" +#include "usbd_core.h" +#include "usbd_storage_disk.h" +#include "usbd_msc_scsi.h" + +BOT_Info_T g_BOTInfo; + +static void USBD_MSC_BOT_DecodeCBW(void); +static void USBD_MSC_BOT_TxData(uint8_t *txBuf, uint16_t len); +static void USBD_MSC_BOT_Stall(void); + +/*! + * @brief BOT Process Reset. + * + * @param None + * + * @retval None + */ +void USBD_MSC_BOT_Reset(void) +{ + g_BOTInfo.state = BOT_STATE_IDLE; + g_BOTInfo.status = BOT_STATUS_RECOVERY; + + USBD_RxData(MSC_OUT_EP & 0x7f, (uint8_t *)&g_BOTInfo.CBW, MSC_BOT_CBW_LENGTH); +} + +/*! + * @brief BOT Process initialization. + * + * @param None + * + * @retval None + */ +void USBD_MSC_BOT_Init(void) +{ + g_BOTInfo.state = BOT_STATE_IDLE; + g_BOTInfo.status = BOT_STATUS_NORMAL; + + g_storageCallBack.Init(0); + + USBD_RxData(MSC_OUT_EP & 0x7f, (uint8_t *)&g_BOTInfo.CBW, MSC_BOT_CBW_LENGTH); +} + +/*! + * @brief Bulk OUT data handler. + * + * @param ep : OUT endpoint + * + * @retval None + */ +void USBD_MSC_BOT_OutData(uint8_t ep) +{ + if (g_BOTInfo.state == BOT_STATE_IDLE) + { + USBD_MSC_BOT_DecodeCBW(); + } + else if (g_BOTInfo.state == BOT_STATE_DATA_OUT) + { + if (SCSI_CmdHandler(g_BOTInfo.CBW.bLUN, g_BOTInfo.CBW.CB) != SCSI_OK) + { + USBD_MSC_BOT_TxCSW(BOT_CSW_STATUS_CMD_FAIL); + } + } +} + +/*! + * @brief Bulk IN data handler. + * + * @param ep : IN endpoint + * + * @retval None + */ +void USBD_MSC_BOT_InData(uint8_t ep) +{ + if (g_BOTInfo.state == BOT_STATE_DATA_IN) + { + if (SCSI_CmdHandler(g_BOTInfo.CBW.bLUN, g_BOTInfo.CBW.CB) != SCSI_OK) + { + USBD_MSC_BOT_TxCSW(BOT_CSW_STATUS_CMD_FAIL); + } + } + else if ((g_BOTInfo.state == BOT_STATE_SEND_DATA) || \ + (g_BOTInfo.state == BOT_STATE_LAST_DATA_IN)) + { + USBD_MSC_BOT_TxCSW(BOT_CSW_STATUS_CMD_OK); + } +} + +/*! + * @brief Decode CBW. + * + * @param None + * + * @retval None + */ +static void USBD_MSC_BOT_DecodeCBW(void) +{ + uint32_t xferCnt = g_usbDev.outBuf[MSC_OUT_EP & 0x7f].xferCnt; + + g_BOTInfo.CSW.dTag = g_BOTInfo.CBW.dTag; + g_BOTInfo.CSW.dDataResidue = g_BOTInfo.CBW.dDataXferLen; + + if ((xferCnt != MSC_BOT_CBW_LENGTH) || \ + (g_BOTInfo.CBW.dSignature != MSC_BOT_CBW_SIGNATURE) || \ + (g_BOTInfo.CBW.bLUN > 1) || (g_BOTInfo.CBW.bCBLen < 1) || \ + (g_BOTInfo.CBW.bCBLen > 16)) + { + SCSI_PutSenseCode(g_BOTInfo.CBW.bLUN, SCSI_SKEY_ILLEGAL_REQUEST, + SCSI_ASC_INVALID_CDB, 0); + + g_BOTInfo.status = BOT_STATUS_ERROR; + } + else + { + if (SCSI_CmdHandler(g_BOTInfo.CBW.bLUN, g_BOTInfo.CBW.CB) != SCSI_OK) + { + USBD_MSC_BOT_Stall(); + } + else if ((g_BOTInfo.state == BOT_STATE_IDLE) || \ + (g_BOTInfo.state == BOT_STATE_SEND_DATA)) + { + if (g_BOTInfo.dataLen) + { + USBD_MSC_BOT_TxData(g_BOTInfo.data, g_BOTInfo.dataLen); + } + else + { + USBD_MSC_BOT_TxCSW(BOT_CSW_STATUS_CMD_OK); + } + } + } +} + +/*! + * @brief MSC send data. + * + * @param txBuf : buffer to send + * + * @param len : buffer length + * + * @retval None + */ +static void USBD_MSC_BOT_TxData(uint8_t *txBuf, uint16_t len) +{ + len = USB_MIN(len, g_BOTInfo.CBW.dDataXferLen); + + g_BOTInfo.CSW.dDataResidue -= len; + g_BOTInfo.CSW.bStatus = BOT_CSW_STATUS_CMD_OK; + g_BOTInfo.state = BOT_STATE_SEND_DATA; + + USBD_TxData(MSC_IN_EP & 0x7f, txBuf, len); +} + +/*! + * @brief Send CSW. + * + * @param cswStatus : status of CSW + * + * @retval None + */ +void USBD_MSC_BOT_TxCSW(uint8_t cswStatus) +{ + g_BOTInfo.CSW.dSignature = MSC_BOT_CSW_SIGNATURE; + g_BOTInfo.CSW.bStatus = cswStatus; + g_BOTInfo.state = BOT_STATE_IDLE; + + USBD_TxData(MSC_IN_EP & 0x7f, (uint8_t *)&g_BOTInfo.CSW, + MSC_BOT_CSW_LENGTH); + + USBD_RxData(MSC_OUT_EP & 0x7f, (uint8_t *)&g_BOTInfo.CBW, + MSC_BOT_CBW_LENGTH); +} + +/*! + * @brief handler clearFeature in standard request. + * + * @param None + * + * @retval None + */ +void USBD_MSV_BOT_ClearFeatureHandler(void) +{ + if (g_BOTInfo.status == BOT_STATUS_ERROR) + { + USBD_SetEPTxStatus(MSC_IN_EP & 0x7f, USBD_EP_STATUS_NAK); + g_BOTInfo.status = BOT_STATUS_NORMAL; + } + else if (((g_usbDev.reqData.byte.wIndex[0] & 0x80) == 0x80) && \ + g_BOTInfo.status != BOT_STATUS_RECOVERY) + { + USBD_MSC_BOT_TxCSW(BOT_CSW_STATUS_CMD_FAIL); + } +} + +/*! + * @brief Stall MSC. + * + * @param None + * + * @retval None + */ +static void USBD_MSC_BOT_Stall(void) +{ + if ((g_BOTInfo.CBW.bmFlags == 0) && (g_BOTInfo.CBW.dDataXferLen != 0) && \ + (g_BOTInfo.status == BOT_STATUS_NORMAL)) + { + USBD_SetEPRxStatus(MSC_OUT_EP & 0x7f, USBD_EP_STATUS_STALL); + } + + USBD_SetEPTxStatus(MSC_IN_EP & 0x7f, USBD_EP_STATUS_STALL); + + if (g_BOTInfo.status == BOT_STATUS_ERROR) + { + USBD_RxData(MSC_OUT_EP & 0x7f, (uint8_t *)&g_BOTInfo.CBW, + MSC_BOT_CBW_LENGTH); + } +} diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/src/usbd_msc_scsi.c b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/src/usbd_msc_scsi.c new file mode 100644 index 0000000000..61fb46ac1c --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Class/MSC/src/usbd_msc_scsi.c @@ -0,0 +1,701 @@ +/*! + * @file usbd_msc_scsi.c + * + * @brief MSC scsi + * + * @version V1.0.0 + * + * @date 2021-12-25 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "usbd_msc_bot.h" +#include "usbd_msc_scsi.h" +#include "usbd_storage_disk.h" + +SCSI_Sense_T g_scsiSenseCode[SCSI_SENSE_LIST_NUMBER]; +uint8_t g_senseTxCnt; +uint8_t g_sensePutCnt; + +static uint32_t s_blkSize; +static uint32_t s_blkNbr; + +static uint32_t s_blkAddr; +static uint32_t s_blkLen; + +/** USB Mass storage Page 0 Inquiry Data */ +static const uint8_t s_page00InquiryData[] = +{ + 0x00, + 0x00, + 0x00, + (7 - 4), + 0x00, + 0x80, + 0x83 +}; +/** USB Mass storage sense 6 Data */ +static const uint8_t s_modeSense6Data[] = +{ + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00 +}; +/** USB Mass storage sense 10 Data */ +static const uint8_t s_modeSense10Data[] = +{ + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00 +}; + +static uint8_t SCSI_TestUnitReady(uint8_t lun); +static uint8_t SCSI_Inquiry(uint8_t lun, uint8_t *command); +static uint8_t SCSI_RequestSense(uint8_t lun, uint8_t *command); + +static uint8_t SCSI_ReadFormatCapacity(uint8_t lun, uint8_t *command); +static uint8_t SCSI_ReadCapacity10(uint8_t lun, uint8_t *command); +static uint8_t SCSI_Read10(uint8_t lun, uint8_t *command); +static uint8_t SCSI_Write10(uint8_t lun, uint8_t *command); +static uint8_t SCSI_Verify10(uint8_t lun, uint8_t *command); + +static uint8_t SCSI_StartStopUnit(void); +static uint8_t SCSI_ModeSense6(uint8_t lun, uint8_t *command); +static uint8_t SCSI_ModeSense10(uint8_t lun, uint8_t *command); + +static uint8_t SCSI_Read(uint8_t lun); +static uint8_t SCSI_Write(uint8_t lun); +static uint8_t SCSI_CheckAddress(uint8_t lun, uint32_t blkOffset, uint16_t blkNbr); + +/*! + * @brief SCSI command handler. + * + * @param lun: Logical unit number + * + * @param command: Command pointer + * + * @retval SCSI_OK or SCSI_FAILL + */ +uint8_t SCSI_CmdHandler(uint8_t lun, uint8_t *command) +{ + uint8_t ret = SCSI_OK; + + switch (command[0]) + { + case SCSI_CMD_TEST_UNIT_READY: + ret = SCSI_TestUnitReady(lun); + break; + + case SCSI_CMD_INQUIRY: + ret = SCSI_Inquiry(lun, command); + break; + + case SCSI_CMD_REQUEST_SENSE: + ret = SCSI_RequestSense(lun, command); + break; + + case SCSI_CMD_READ_FORMAT_CAPACITIES: + ret = SCSI_ReadFormatCapacity(lun, command); + break; + + case SCSI_CMD_READ_CAPACITY_10: + ret = SCSI_ReadCapacity10(lun, command); + break; + + case SCSI_CMD_READ_10: + ret = SCSI_Read10(lun, command); + break; + + case SCSI_CMD_WRITE10: + ret = SCSI_Write10(lun, command); + break; + + case SCSI_CMD_VERIFY_10: + ret = SCSI_Verify10(lun, command); + break; + case SCSI_CMD_ALLOW_MEDIUM_REMOVAL: + case SCSI_CMD_START_STOP_UNIT: + ret = SCSI_StartStopUnit(); + break; + + case SCSI_CMD_MODE_SENSE_6: + ret = SCSI_ModeSense6(lun, command); + break; + + case SCSI_CMD_MODE_SENSE_10: + ret = SCSI_ModeSense10(lun, command); + break; + + default: + SCSI_PutSenseCode(lun, SCSI_SKEY_ILLEGAL_REQUEST, + SCSI_ASC_INVALID_CDB, 0); + ret = SCSI_FAIL; + } + + return ret; +} + +/*! + * @brief Put the sense code to array. + * + * @param sKey: sense Key + * + * @param ASC: Additional Sense Code + * + * @param ASCQ: Additional Sense Code Qualifier + * + * @retval None + */ +void SCSI_PutSenseCode(uint8_t lun, uint8_t sKey, uint8_t ASC, uint8_t ASCQ) +{ + g_scsiSenseCode[g_sensePutCnt].sensekey = sKey; + g_scsiSenseCode[g_sensePutCnt].ASC = ASC; + g_scsiSenseCode[g_sensePutCnt].ASCQ = ASCQ; + + if ((++g_sensePutCnt) == SCSI_SENSE_LIST_NUMBER) + { + g_sensePutCnt = 0; + } +} + +/*! + * @brief SCSI Test Unit Ready handler. + * + * @param lun: Logical unit number + * + * @retval SCSI_OK or SCSI_FAILL + */ +static uint8_t SCSI_TestUnitReady(uint8_t lun) +{ + if (g_BOTInfo.CBW.dDataXferLen) + { + SCSI_PutSenseCode(g_BOTInfo.CBW.bLUN, SCSI_SKEY_ILLEGAL_REQUEST, + SCSI_ASC_INVALID_CDB, 0); + + return SCSI_FAIL; + } + else if (g_storageCallBack.CheckReady(lun) != SCSI_OK) + { + SCSI_PutSenseCode(lun, SCSI_SKEY_NOT_READY, + SCSI_ASC_MEDIUM_NOT_PRESENT, 0); + + return SCSI_FAIL; + } + else + { + g_BOTInfo.dataLen = 0; + return SCSI_OK; + } +} + +/*! + * @brief SCSI Inquiry handler. + * + * @param lun: Logical unit number + * + * @param command: command pointer + * + * @retval SCSI_OK or SCSI_FAILL + */ +static uint8_t SCSI_Inquiry(uint8_t lun, uint8_t *command) +{ + uint16_t i; + uint8_t *pInquiryData; + + if (command[1] & 0x01) + { + pInquiryData = (uint8_t *)s_page00InquiryData; + g_BOTInfo.dataLen = s_page00InquiryData[3] + 4; + } + else + { + pInquiryData = &g_storageCallBack.pInquiryData[lun * SCSI_INQUIRY_LENGTH]; + + g_BOTInfo.dataLen = USB_MIN((pInquiryData[4] + 5), command[4]); + } + + for (i = 0; i < g_BOTInfo.dataLen; i++) + { + g_BOTInfo.data[i] = pInquiryData[i]; + } + + return SCSI_OK; +} + +/*! + * @brief SCSI Request Sense handler. + * + * @param lun: Logical unit number + * + * @param command: command pointer + * + * @retval SCSI_OK or SCSI_FAILL + */ +static uint8_t SCSI_RequestSense(uint8_t lun, uint8_t *command) +{ + uint8_t i = 0; + + while (i < SCSI_REQUEST_SENSE_DATA_LEN) + { + g_BOTInfo.data[i++] = 0; + } + + g_BOTInfo.data[0] = 0x70; + g_BOTInfo.data[7] = SCSI_REQUEST_SENSE_DATA_LEN - 6; + + if (g_senseTxCnt != g_sensePutCnt) + { + g_BOTInfo.data[2] = g_scsiSenseCode[g_senseTxCnt].sensekey; + g_BOTInfo.data[12] = g_scsiSenseCode[g_senseTxCnt].ASC; + g_BOTInfo.data[13] = g_scsiSenseCode[g_senseTxCnt].ASCQ; + + if ((++g_senseTxCnt) == SCSI_SENSE_LIST_NUMBER) + { + g_senseTxCnt = 0; + } + } + + g_BOTInfo.dataLen = (SCSI_REQUEST_SENSE_DATA_LEN < command[4]) ? \ + SCSI_REQUEST_SENSE_DATA_LEN : command[4]; + + return SCSI_OK; +} + +/*! + * @brief SCSI Read Format Capacity handler. + * + * @param lun: Logical unit number + * + * @param command: command pointer + * + * @retval SCSI_OK or SCSI_FAILL + */ +static uint8_t SCSI_ReadFormatCapacity(uint8_t lun, uint8_t *command) +{ + uint16_t i = 0; + uint32_t blkSize; + uint32_t blkNbr; + + while (i < 12) + { + g_BOTInfo.data[i++] = 0; + } + + if (g_storageCallBack.ReadCapacity(lun, &blkNbr, &blkSize) != SCSI_OK) + { + SCSI_PutSenseCode(lun, SCSI_SKEY_NOT_READY, + SCSI_ASC_MEDIUM_NOT_PRESENT, 0); + + return SCSI_FAIL; + } + else + { + blkNbr--; + + g_BOTInfo.data[3] = 0x08; + g_BOTInfo.data[4] = (uint8_t)(blkNbr >> 24); + g_BOTInfo.data[5] = (uint8_t)(blkNbr >> 16); + g_BOTInfo.data[6] = (uint8_t)(blkNbr >> 8); + g_BOTInfo.data[7] = (uint8_t)(blkNbr); + g_BOTInfo.data[8] = 0x02; + g_BOTInfo.data[9] = (uint8_t)(blkSize >> 16); + g_BOTInfo.data[10] = (uint8_t)(blkSize >> 8); + g_BOTInfo.data[11] = (uint8_t)blkSize; + + g_BOTInfo.dataLen = 12; + + return SCSI_OK; + } +} + +/*! + * @brief SCSI Read Capacity10 handler. + * + * @param lun: Logical unit number + * + * @param command: command pointer + * + * @retval SCSI_OK or SCSI_FAILL + */ +static uint8_t SCSI_ReadCapacity10(uint8_t lun, uint8_t *command) +{ + if (g_storageCallBack.ReadCapacity(lun, &s_blkNbr, &s_blkSize) != SCSI_OK) + { + SCSI_PutSenseCode(lun, SCSI_SKEY_NOT_READY, + SCSI_ASC_MEDIUM_NOT_PRESENT, 0); + + return SCSI_FAIL; + } + else + { + g_BOTInfo.data[0] = (uint8_t)((s_blkNbr - 1) >> 24); + g_BOTInfo.data[1] = (uint8_t)((s_blkNbr - 1) >> 16); + g_BOTInfo.data[2] = (uint8_t)((s_blkNbr - 1) >> 8); + g_BOTInfo.data[3] = (uint8_t)(s_blkNbr - 1); + g_BOTInfo.data[4] = (uint8_t)(s_blkSize >> 24); + g_BOTInfo.data[5] = (uint8_t)(s_blkSize >> 16); + g_BOTInfo.data[6] = (uint8_t)(s_blkSize >> 8); + g_BOTInfo.data[7] = (uint8_t)(s_blkSize); + + g_BOTInfo.dataLen = 8; + + return SCSI_OK; + } +} + +/*! + * @brief SCSI Read10 handler. + * + * @param lun: Logical unit number + * + * @param command: command pointer + * + * @retval SCSI_OK or SCSI_FAILL + */ +static uint8_t SCSI_Read10(uint8_t lun, uint8_t *command) +{ + uint8_t ret = SCSI_OK; + + if (g_BOTInfo.state == BOT_STATE_IDLE) + { + if ((g_BOTInfo.CBW.bmFlags & 0x80) != 0x80) + { + SCSI_PutSenseCode(g_BOTInfo.CBW.bLUN, SCSI_SKEY_ILLEGAL_REQUEST, + SCSI_ASC_INVALID_CDB, 0); + + return SCSI_FAIL; + } + + if (g_storageCallBack.CheckReady(lun) != SCSI_OK) + { + SCSI_PutSenseCode(lun, SCSI_SKEY_NOT_READY, + SCSI_ASC_MEDIUM_NOT_PRESENT, 0); + + return SCSI_FAIL; + } + + s_blkAddr = ((uint32_t)command[2] << 24) | \ + ((uint32_t)command[3] << 16) | \ + ((uint32_t)command[4] << 8) | \ + (uint32_t)command[5]; + + s_blkLen = ((uint16_t)command[7] << 8 | (uint8_t)command[8]); + + if (SCSI_CheckAddress(lun, s_blkAddr, s_blkLen) != SCSI_OK) + { + return SCSI_FAIL; + } + + g_BOTInfo.state = BOT_STATE_DATA_IN; + s_blkAddr *= s_blkSize; + s_blkLen *= s_blkSize; + + if (g_BOTInfo.CBW.dDataXferLen != s_blkLen) + { + SCSI_PutSenseCode(g_BOTInfo.CBW.bLUN, SCSI_SKEY_ILLEGAL_REQUEST, + SCSI_ASC_INVALID_CDB, 0); + + return SCSI_FAIL; + } + + } + + g_BOTInfo.dataLen = MSC_MEDIA_PACKET; + + ret = SCSI_Read(lun); + + return ret; +} + +/*! + * @brief SCSI write10 handler. + * + * @param lun: Logical unit number + * + * @param command: command pointer + * + * @retval SCSI_OK or SCSI_FAILL + */ +static uint8_t SCSI_Write10(uint8_t lun, uint8_t *command) +{ + uint8_t ret = SCSI_OK; + uint32_t len; + + if (g_BOTInfo.state == BOT_STATE_IDLE) + { + if (g_BOTInfo.CBW.bmFlags & 0x80) + { + SCSI_PutSenseCode(g_BOTInfo.CBW.bLUN, SCSI_SKEY_ILLEGAL_REQUEST, + SCSI_ASC_INVALID_CDB, 0); + + return SCSI_FAIL; + } + + if (g_storageCallBack.CheckReady(lun) != SCSI_OK) + { + SCSI_PutSenseCode(lun, SCSI_SKEY_NOT_READY, + SCSI_ASC_MEDIUM_NOT_PRESENT, 0); + + return SCSI_FAIL; + } + + if (g_storageCallBack.CheckWPR(lun) != SCSI_OK) + { + SCSI_PutSenseCode(lun, SCSI_SKEY_NOT_READY, + SCSI_ASC_WRITE_PROTECTED, 0); + + return SCSI_FAIL; + } + + s_blkAddr = ((uint32_t)command[2] << 24) | \ + ((uint32_t)command[3] << 16) | \ + ((uint32_t)command[4] << 8) | \ + (uint32_t)command[5]; + + s_blkLen = ((uint16_t)command[7] << 8 | (uint8_t)command[8]); + + if (SCSI_CheckAddress(lun, s_blkAddr, s_blkLen) != SCSI_OK) + { + return SCSI_FAIL; + } + + s_blkAddr *= s_blkSize; + s_blkLen *= s_blkSize; + + if (g_BOTInfo.CBW.dDataXferLen != s_blkLen) + { + SCSI_PutSenseCode(g_BOTInfo.CBW.bLUN, SCSI_SKEY_ILLEGAL_REQUEST, + SCSI_ASC_INVALID_CDB, 0); + + return SCSI_FAIL; + } + + g_BOTInfo.state = BOT_STATE_DATA_OUT; + len = USB_MIN(s_blkLen, MSC_MEDIA_PACKET); + + USBD_RxData(MSC_OUT_EP & 0x7F, g_BOTInfo.data, len); + + } + else + { + ret = SCSI_Write(lun); + } + + return ret; +} + +/*! + * @brief SCSI Verify10 Handler. + * + * @param lun: Logical unit number + * + * @param command: command pointer + * + * @retval SCSI_OK or SCSI_FAILL + */ +static uint8_t SCSI_Verify10(uint8_t lun, uint8_t *command) +{ + if (command[1] & 0x02) + { + SCSI_PutSenseCode(lun, SCSI_SKEY_ILLEGAL_REQUEST, + SCSI_ASC_INVALID_FIELED_IN_COMMAND, 0); + + return SCSI_FAIL; + } + + s_blkAddr = ((uint32_t)command[2] << 24) | \ + ((uint32_t)command[3] << 16) | \ + ((uint32_t)command[4] << 8) | \ + (uint32_t)command[5]; + + s_blkLen = ((uint16_t)command[7] << 8 | (uint8_t)command[8]); + + if (SCSI_CheckAddress(lun, s_blkAddr, s_blkLen) != SCSI_OK) + { + return SCSI_FAIL; + } + + g_BOTInfo.dataLen = 0; + + return SCSI_OK; +} + +/*! + * @brief SCSI Start Stop Unit Handler. + * + * @param None + * + * @retval SCSI_OK or SCSI_FAILL + */ +static uint8_t SCSI_StartStopUnit(void) +{ + g_BOTInfo.dataLen = 0; + return SCSI_OK; +} + +/*! + * @brief SCSI Mode Sense6 Handler. + * + * @param lun: Logical unit number + * + * @param command: command pointer + * + * @retval SCSI_OK or SCSI_FAILL + */ +static uint8_t SCSI_ModeSense6(uint8_t lun, uint8_t *command) +{ + for (uint16_t i = 0; i < 8; i++) + { + g_BOTInfo.data[i] = s_modeSense6Data[i]; + } + + g_BOTInfo.dataLen = 8; + + return SCSI_OK; +} + +/*! + * @brief SCSI Mode Sense10 Handler. + * + * @param lun: Logical unit number + * + * @param command: command pointer + * + * @retval SCSI_OK or SCSI_FAILL + */ +static uint8_t SCSI_ModeSense10(uint8_t lun, uint8_t *command) +{ + for (uint16_t i = 0; i < 8; i++) + { + g_BOTInfo.data[i] = s_modeSense10Data[i]; + } + + g_BOTInfo.dataLen = 8; + + return SCSI_OK; +} + +/*! + * @brief SCSI Read Process. + * + * @param lun: Logical unit number + * + * @retval SCSI_OK or SCSI_FAILL + */ +static uint8_t SCSI_Read(uint8_t lun) +{ + uint32_t len = USB_MIN(MSC_MEDIA_PACKET, s_blkLen); + + if (g_storageCallBack.ReadData(len, g_BOTInfo.data, (s_blkAddr / s_blkSize), + (len / s_blkSize)) != SCSI_OK) + { + SCSI_PutSenseCode(lun, SCSI_SKEY_HARDWARE_ERROR, + SCSI_ASC_UNRECOVERED_READ_ERROR, 0); + + return SCSI_FAIL; + } + + USBD_TxData(MSC_IN_EP & 0x7F, g_BOTInfo.data, len); + + s_blkAddr += len; + s_blkLen -= len; + + g_BOTInfo.CSW.dDataResidue -= len; + + if (s_blkLen == 0) + { + g_BOTInfo.state = BOT_STATE_LAST_DATA_IN; + } + + return SCSI_OK; +} + +/*! + * @brief SCSI Write Process. + * + * @param lun: Logical unit number + * + * @retval SCSI_OK or SCSI_FAILL + */ +static uint8_t SCSI_Write(uint8_t lun) +{ + uint32_t len = USB_MIN(MSC_MEDIA_PACKET, s_blkLen); + + if (s_blkLen - len) + { + __NOP(); + } + if (g_storageCallBack.WriteData(lun, g_BOTInfo.data, s_blkAddr / s_blkSize, + len / s_blkSize) != SCSI_OK) + { + SCSI_PutSenseCode(lun, SCSI_SKEY_HARDWARE_ERROR, SCSI_ASC_WRITE_FAULT, 0); + + return SCSI_FAIL; + } + + s_blkAddr += len; + s_blkLen -= len; + + g_BOTInfo.CSW.dDataResidue -= len; + + if (s_blkLen) + { + len = USB_MIN(MSC_MEDIA_PACKET, s_blkLen); + + USBD_RxData(MSC_OUT_EP & 0x7f, g_BOTInfo.data, len); + } + else + { + USBD_MSC_BOT_TxCSW(BOT_CSW_STATUS_CMD_OK); + } + + return SCSI_OK; +} + +/*! + * @brief SCSI Check Address Range. + * + * @param lun: Logical unit number + * + * @param blkOffset: first block address + * + * @param blkNbr: number of block to be processed + * + * @retval SCSI_OK or SCSI_FAILL + */ +static uint8_t SCSI_CheckAddress(uint8_t lun, uint32_t blkOffset, uint16_t blkNbr) +{ + if (s_blkNbr < (blkNbr + blkOffset)) + { + SCSI_PutSenseCode(lun, SCSI_SKEY_ILLEGAL_REQUEST, + SCSI_ASC_ADDRESS_OUT_OF_RANGE, 0); + + return SCSI_FAIL; + } + + return SCSI_OK; +} diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/inc/usbd_core.h b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/inc/usbd_core.h new file mode 100644 index 0000000000..9dcbd79ccb --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/inc/usbd_core.h @@ -0,0 +1,312 @@ +/*! + * @file usbd_core.h + * + * @brief USB protocol core handler head file + * + * @version V1.0.0 + * + * @date 2021-12-06 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#ifndef __USBD_CORE_H_ +#define __USBD_CORE_H_ + +#include "drv_usb_device.h" + +/** Get minimum value */ +#define USB_MIN(a, b) (a >= b ? b : a) + +/** Get maximum value */ +#define USB_MAX(a, b) (a >= b ? a : b) + +/** + * @brief USB request type + */ +enum +{ + USBD_REQ_TYPE_STANDARD = 0, + USBD_REQ_TYPE_CLASS = 1, + USBD_REQ_TYPE_VENDOR = 2, + USBD_REQ_TYPE_RESERVED = 3 +}; + +/** + * @brief USB recipient + */ +enum +{ + USBD_RECIPIENT_DEVICE = 0, + USBD_RECIPIENT_INTERFACE = 1, + USBD_RECIPIENT_ENDPOINT = 2, + USBD_RECIPIENT_OTHER = 3, +}; + +/** + * @brief USB standard device requests + */ +enum +{ + USBD_GET_STATUS = 0, + USBD_CLEAR_FEATURE = 1, + USBD_SET_FEATURE = 3, + USBD_SET_ADDRESS = 5, + USBD_GET_DESCRIPTOR = 6, + USBD_SET_DESCRIPTOR = 7, + USBD_GET_CONFIGURATION = 8, + USBD_SET_CONFIGURATION = 9, + USBD_GET_INTERFACE = 10, + USBD_SET_INTERFACE = 11, + USBD_SYNCH_FRAME = 12, +}; + +/** + * @brief USB descriptor types + */ +enum +{ + USBD_DESC_DEVICE = 1, + USBD_DESC_CONFIGURATION = 2, + USBD_DESC_STRING = 3, + USBD_DESC_INTERFACE = 4, + USBD_DESC_ENDPOINT = 5, + USBD_DESC_DEVICE_QUALIFIER = 6, + USBD_DESC_OTHER_SPEED = 7, + USBD_INTERFACE_POWER = 8, +}; + +/** + * @brief USB standard feature + */ +enum +{ + USBD_FEATURE_ENDPOINT_HALT = 0, + USBD_FEATURE_REMOTE_WAKEUP = 1, + USBD_FEATURE_TEST_MODE = 2 +}; + +/** + * @brief USB internal state machine + */ +typedef enum +{ + USBD_CTRL_STATE_WAIT_SETUP, + USBD_CTRL_STATE_DATA_IN, + USBD_CTRL_STATE_DATA_OUT, + USBD_CTRL_STATE_WAIT_STATUS_IN, + USBD_CTRL_STATE_WAIT_STATUS_OUT, + USBD_CTRL_STATE_STALLED, +} USBD_CTRL_STATE_T; + +/** + * @brief USBD Endpoint type for USB protocol + */ +typedef enum +{ + USBD_EP_TYPE_CONTROL, + USBD_EP_TYPE_ISO, + USBD_EP_TYPE_BULK, + USBD_EP_TYPE_INTERRUPT +} USBD_EP_TYPE_T; + +/** + * @brief USB request type + */ +typedef union +{ + uint8_t byte; + + struct + { + uint8_t recipient : 5; + uint8_t type : 2; + uint8_t dir : 1; + } bit; +} USBD_REQ_TYPE_T; + +/** + * @brief USB device request data + */ +typedef struct +{ + union + { + uint8_t pack[8]; + + struct + { + USBD_REQ_TYPE_T bmRequestType; + uint8_t bRequest; + uint8_t wValue[2]; + uint8_t wIndex[2]; + uint8_t wLength[2]; + } byte; + }; +} USBD_DevReqData_T; + +/** + * @brief Descriptor structure + */ +typedef struct +{ + const uint8_t *pDesc; + uint8_t size; +} USBD_Descriptor_T; + +/** USB standard request callback handler */ +typedef void (*USBD_StdReqHandler_T)(void); + +/** USB request handler */ +typedef void (*USBD_ReqHandler_T)(USBD_DevReqData_T *); + +/** Ctrl Tx Status handler function define */ +typedef void (*USBD_CtrlTxStatusHandler_T)(void); + +/** Ctrl Rx Status handler function define */ +typedef void (*USBD_CtrlRxStatusHandler_T)(void); + +/** Endpoint handler */ +typedef void (*USBD_EPHandler_T)(uint8_t ep); + +/** Reset handler */ +typedef void (*USBD_ResetHandler_T)(void); + +/** Interrupt handler function define */ +typedef void (*USBD_InterruptHandler_T)(void); + +/** + * @brief USB Class Request handler + */ +typedef struct +{ + USBD_StdReqHandler_T getConfigurationHandler; + USBD_StdReqHandler_T getDescriptorHandler; + USBD_StdReqHandler_T getInterfaceHandler; + USBD_StdReqHandler_T getStatusHandler; + USBD_StdReqHandler_T setAddressHandler; + + USBD_StdReqHandler_T setConfigurationHandler; + USBD_StdReqHandler_T setDescriptorHandler; + USBD_StdReqHandler_T setFeatureHandler; + USBD_StdReqHandler_T setInterfaceHandler; + USBD_StdReqHandler_T clearFeatureHandler; +} USBD_StdReqCallback_T; + +/** + * @brief Control transfer buffer + */ +typedef struct +{ + uint8_t *pBuf; //!< Data buffer + uint32_t bufLen; //!< Length of the data buffer + uint8_t packNum; //!< Packet number of the data + uint8_t zeroPackFill; //!< Fill a zero pack for IN transfer or not + uint16_t maxPackSize; //!< Max pack size of this endpoint + uint32_t xferCnt; //!< Data count of one pack on from tansfer +} USBD_CtrlBuf_T; + +/** + * @brief USB init parameter + */ +typedef struct +{ + USBD_Descriptor_T *pDeviceDesc; //!< Device descriptor pointer + USBD_Descriptor_T *pConfigurationDesc; //!< Configuration descriptor pointer + USBD_Descriptor_T *pStringDesc; //!< String descriptor pointer + USBD_Descriptor_T *pQualifierDesc; //!< Device Qualifier descriptor pointer + USBD_Descriptor_T *pHidReportDesc; //!< HID report descriptor pointer + + + USBD_StdReqCallback_T *pStdReqCallback; + USBD_ReqHandler_T stdReqExceptionHandler; //!< Standard request exception handler + USBD_ReqHandler_T classReqHandler; //!< Class request handler + USBD_ReqHandler_T vendorReqHandler; //!< vendor request handler + + USBD_CtrlTxStatusHandler_T txStatusHandler; //!< Send IN status early handler + USBD_CtrlRxStatusHandler_T rxStatusHandler; //!< Receive OUT status early handler + + USBD_EPHandler_T outEpHandler; //!< OUT EP transfer done handler except EP0 + USBD_EPHandler_T inEpHandler; //!< IN EP transfer done handler except EP0 + USBD_ResetHandler_T resetHandler; //!< Reset handler + USBD_InterruptHandler_T intHandler; //!< Hadler the rest of interrupt. +} USBD_InitParam_T; + +/** + * @brief USB infomation + */ +typedef struct +{ + USBD_CTRL_STATE_T ctrlState; + + uint8_t curFeature; + uint8_t curInterface; + uint8_t curAlternateSetting; + uint8_t curConfiguration; + uint8_t configurationNum; + + /** Setup request data buffer */ + USBD_DevReqData_T reqData; + + /** Endpoint buffer management */ + USBD_CtrlBuf_T inBuf[USB_EP_MAX_NUM]; + USBD_CtrlBuf_T outBuf[USB_EP_MAX_NUM]; + + /** Descriptor pointer */ + USBD_Descriptor_T *pDeviceDesc; + USBD_Descriptor_T *pConfigurationDesc; + USBD_Descriptor_T *pStringDesc; + USBD_Descriptor_T *pQualifierDesc; + USBD_Descriptor_T *pHidReportDesc; + + /** Setup request callback handler */ + USBD_StdReqCallback_T *pStdReqCallback; + USBD_ReqHandler_T stdReqExceptionHandler; + USBD_ReqHandler_T classReqHandler; + USBD_ReqHandler_T vendorReqHandler; + + /** Control transfer status stage handler */ + USBD_CtrlTxStatusHandler_T txStatusHandler; + USBD_CtrlRxStatusHandler_T rxStatusHandler; + + /** Endpoint transfer done handler */ + USBD_EPHandler_T outEpHandler; + USBD_EPHandler_T inEpHandler; + + USBD_ResetHandler_T resetHandler; + USBD_InterruptHandler_T intHandler; +} USBD_Info_T; + +extern USBD_Info_T g_usbDev; + +/** control status function */ +#define USBD_CtrlTxStatus() USBD_CtrlInData(NULL, 0); +#define USBD_CtrlRxStatus() USBD_CtrlOutData(NULL, 0) + +/** Handler Endpoint 0 control transfer */ +void USBD_SetupProcess(void); +void USBD_CtrlInProcess(void); +void USBD_CtrlOutProcess(void); +void USBD_CtrlOutData(uint8_t *buf, uint32_t len); +void USBD_CtrlInData(uint8_t *buf, uint32_t len); + +/** Handler other Endpoint data transfer */ +void USBD_DataInProcess(USBD_EP_T ep); +void USBD_DataOutProcess(USBD_EP_T ep); +void USBD_TxData(uint8_t ep, uint8_t *buf, uint32_t len); +void USBD_RxData(uint8_t ep, uint8_t *buf, uint32_t len); + +#endif diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/inc/usbd_init.h b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/inc/usbd_init.h new file mode 100644 index 0000000000..10cfc459b1 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/inc/usbd_init.h @@ -0,0 +1,64 @@ +/*! + * @file usbd_init.h + * + * @brief USB initialization management head file + * + * @version V1.0.0 + * + * @date 2021-12-06 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#ifndef USBD_INIT_H_ +#define USBD_INIT_H_ + +#include "usbd_core.h" + +/** + * @brief Endpoint Configuration Info + */ +typedef struct +{ + USBD_EP_T epNum; //!< endpoint number + USBD_EP_TYPE_T epType; //!< endpoint type + uint8_t epKind; /** + * Which could be ENABLE or DISABLE, it is valid only for + * control and bulk Endpoint. The mean of ENABLE for them like : + * 1. Control endpoint : Only for OUT status which is zero data. + * 2. Bulk endpoint : Enable the double-buffer feature + */ + USBD_EP_STATUS_T epStatus; //!< Endpoint status + uint16_t epBufAddr; //!< buffer address for the endpoint + uint16_t maxPackSize; //!< max packet size for the endpoint +} USBD_EPConfig_T; + +/** USB init */ +void USBD_Init(USBD_InitParam_T *param); +void USBD_InitParamStructInit(USBD_InitParam_T *param); + +/** power */ +void USBD_PowerOn(void); +void USBD_PowerOff(void); + +/** Endpoint init */ +void USBD_OpenOutEP(USBD_EPConfig_T *epConfig); +void USBD_OpenInEP(USBD_EPConfig_T *epConfig); + +void USBD_CloseOutEP(USBD_EP_T ep); +void USBD_CloseInEP(USBD_EP_T ep); + +#endif diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/inc/usbd_interrupt.h b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/inc/usbd_interrupt.h new file mode 100644 index 0000000000..5cdf63be88 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/inc/usbd_interrupt.h @@ -0,0 +1,31 @@ +/*! + * @file usbd_interrupt.h + * + * @brief USB interrupt service routine header file + * + * @version V1.0.0 + * + * @date 2021-12-06 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#ifndef __USBD_INTERRUPT_H_ +#define __USBD_INTERRUPT_H_ + +#include "apm32f10x.h" + +#endif diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/inc/usbd_stdReq.h b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/inc/usbd_stdReq.h new file mode 100644 index 0000000000..c832060350 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/inc/usbd_stdReq.h @@ -0,0 +1,31 @@ +/*! + * @file usbd_stdReq.h + * + * @brief USB standard request process head file + * + * @version V1.0.0 + * + * @date 2021-12-30 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#ifndef __USBD_STDREQ_H_ +#define __USBD_STDREQ_H_ + +void USBD_StandardReqeust(void); + +#endif diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/src/usbd_core.c b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/src/usbd_core.c new file mode 100644 index 0000000000..653bf5b273 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/src/usbd_core.c @@ -0,0 +1,405 @@ +/*! + * @file usbd_core.c + * + * @brief USB protocol core handler + * + * @version V1.0.0 + * + * @date 2021-12-06 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "usbd_core.h" +#include "usbd_stdReq.h" + +/** USB information */ +USBD_Info_T g_usbDev; + +/*! + * @brief Endpoint 0 Setup process + * + * @param None + * + * @retval None + */ +void USBD_SetupProcess(void) +{ + uint8_t reqType; + uint8_t dataBuf[8]; + USBD_DevReqData_T *pReqData = &g_usbDev.reqData; + uint16_t xferLen = USBD_ReadEPRxCnt(USBD_EP_0); + + if (xferLen) + { + USBD_ReadDataFromEP(USBD_EP_0, (uint8_t *)dataBuf, xferLen); + } + else + { + return; + } + + pReqData->byte.bmRequestType.byte = dataBuf[0]; + pReqData->byte.bRequest = dataBuf[1]; + pReqData->byte.wValue[0] = dataBuf[2]; + pReqData->byte.wValue[1] = dataBuf[3]; + pReqData->byte.wIndex[0] = dataBuf[4]; + pReqData->byte.wIndex[1] = dataBuf[5]; + pReqData->byte.wLength[0] = dataBuf[6]; + pReqData->byte.wLength[1] = dataBuf[7]; + + reqType = pReqData->byte.bmRequestType.bit.type; + + if (reqType == USBD_REQ_TYPE_STANDARD) + { + USBD_StandardReqeust(); + } + else if (reqType == USBD_REQ_TYPE_CLASS) + { + if (g_usbDev.classReqHandler) + { + g_usbDev.classReqHandler(pReqData); + } + } + else if (reqType == USBD_REQ_TYPE_VENDOR) + { + if (g_usbDev.vendorReqHandler) + { + g_usbDev.vendorReqHandler(pReqData); + } + } + else + { + USBD_SetEPTxRxStatus(USBD_EP_0, USBD_EP_STATUS_STALL, USBD_EP_STATUS_STALL); + } +} + + +/*! + * @brief Endpoint 0 USB Control in process + * + * @param None + * + * @retval None + */ +void USBD_CtrlInProcess(void) +{ + uint32_t tmp; + + if (g_usbDev.ctrlState == USBD_CTRL_STATE_DATA_IN) + { + if (g_usbDev.inBuf[0].packNum) + { + tmp = USB_MIN(g_usbDev.inBuf[0].bufLen, g_usbDev.inBuf[0].maxPackSize); + + USBD_WriteDataToEP(USBD_EP_0, g_usbDev.inBuf[0].pBuf, tmp); + USBD_SetEPTxCnt(USBD_EP_0, tmp); + USBD_SetEPTxRxStatus(USBD_EP_0, USBD_EP_STATUS_VALID, USBD_EP_STATUS_NAK); + + g_usbDev.inBuf[0].pBuf += tmp; + g_usbDev.inBuf[0].bufLen -= tmp; + g_usbDev.inBuf[0].packNum--; + } + else + { + if (g_usbDev.inBuf[USBD_EP_0].zeroPackFill) + { + USBD_SetEPTxCnt(USBD_EP_0, 0); + USBD_SetEPTxStatus(USBD_EP_0, USBD_EP_STATUS_VALID); + g_usbDev.inBuf[USBD_EP_0].zeroPackFill = 0; + } + else + { + if (g_usbDev.rxStatusHandler) + { + g_usbDev.rxStatusHandler(); + } + + g_usbDev.ctrlState = USBD_CTRL_STATE_WAIT_STATUS_OUT; + USBD_SetEPTxRxStatus(USBD_EP_0, USBD_EP_STATUS_NAK, USBD_EP_STATUS_VALID); + } + + } + } + else if (g_usbDev.ctrlState == USBD_CTRL_STATE_WAIT_STATUS_IN) + { + if (g_usbDev.reqData.byte.bRequest == USBD_SET_ADDRESS) + { + USBD_SetDeviceAddr(g_usbDev.reqData.byte.wValue[0]); + } + } +} + +/*! + * @brief Endpoint 0 USB Control out process + * + * @param None + * + * @retval None + */ +void USBD_CtrlOutProcess(void) +{ + uint32_t len; + + if (g_usbDev.ctrlState == USBD_CTRL_STATE_DATA_OUT) + { + if (g_usbDev.outBuf[0].packNum) + { + len = USB_MIN(g_usbDev.outBuf[0].bufLen, g_usbDev.outBuf[0].maxPackSize); + + USBD_ReadDataFromEP(USBD_EP_0, g_usbDev.outBuf[0].pBuf, len); + + g_usbDev.outBuf[0].bufLen -= len; + g_usbDev.outBuf[0].pBuf += len; + g_usbDev.outBuf[0].packNum--; + + if (g_usbDev.outBuf[0].packNum) + { + USBD_CtrlOutData(g_usbDev.outBuf[0].pBuf, g_usbDev.outBuf[0].bufLen); + } + else + { + USBD_CtrlTxStatus(); + } + } + else + { + if (g_usbDev.txStatusHandler) + { + g_usbDev.txStatusHandler(); + } + + USBD_CtrlTxStatus(); + } + } +} + +/*! + * @brief Send data or status in control in transation + * + * @param buf: Buffer pointer + * + * @param len: Buffer length + * + * @retval None + */ +void USBD_CtrlInData(uint8_t *buf, uint32_t len) +{ + uint16_t maxPackSize = g_usbDev.inBuf[0].maxPackSize; + uint16_t reqLen = *(uint16_t *)g_usbDev.reqData.byte.wLength; + + if (len) + { + if ((len < reqLen) && ((len % maxPackSize) == 0)) + { + g_usbDev.inBuf[USBD_EP_0].zeroPackFill = 1; + } + + if (len >= g_usbDev.inBuf[0].maxPackSize) + { + /** Send a packet */ + USBD_WriteDataToEP(USBD_EP_0, buf, g_usbDev.inBuf[0].maxPackSize); + USBD_SetEPTxCnt(USBD_EP_0, g_usbDev.inBuf[0].maxPackSize); + USBD_SetEPTxRxStatus(USBD_EP_0, USBD_EP_STATUS_VALID, USBD_EP_STATUS_NAK); + + /** deal with buffer */ + g_usbDev.inBuf[0].bufLen = len - g_usbDev.inBuf[0].maxPackSize; + g_usbDev.inBuf[0].pBuf = buf + g_usbDev.inBuf[0].maxPackSize; + g_usbDev.inBuf[0].packNum = (g_usbDev.inBuf[0].bufLen + (maxPackSize - 1)) / maxPackSize; + + g_usbDev.ctrlState = USBD_CTRL_STATE_DATA_IN; + } + else + { + USBD_WriteDataToEP(USBD_EP_0, buf, len); + USBD_SetEPTxCnt(USBD_EP_0, len); + USBD_SetEPTxRxStatus(USBD_EP_0, USBD_EP_STATUS_VALID, USBD_EP_STATUS_NAK); + + g_usbDev.ctrlState = g_usbDev.reqData.byte.bmRequestType.bit.dir ? \ + USBD_CTRL_STATE_DATA_IN : \ + USBD_CTRL_STATE_WAIT_STATUS_IN; + } + } + else + { + USBD_SetEPTxCnt(USBD_EP_0, 0); + USBD_SetEPTxStatus(USBD_EP_0, USBD_EP_STATUS_VALID); + + g_usbDev.ctrlState = g_usbDev.reqData.byte.bmRequestType.bit.dir ? \ + USBD_CTRL_STATE_DATA_IN : \ + USBD_CTRL_STATE_WAIT_STATUS_IN; + } +} + +/*! + * @brief Read data or status in control out transation + * + * @param buf: Buffer pointer + * + * @param len: Buffer length + * + * @retval None + */ +void USBD_CtrlOutData(uint8_t *buf, uint32_t len) +{ + uint16_t maxPackSize = g_usbDev.outBuf[USBD_EP_0].maxPackSize; + + if (len) + { + g_usbDev.outBuf[USBD_EP_0].pBuf = buf; + g_usbDev.outBuf[USBD_EP_0].bufLen = len; + g_usbDev.outBuf[USBD_EP_0].packNum = (len + (maxPackSize - 1)) / maxPackSize; + + len = USB_MIN(g_usbDev.outBuf[0].bufLen, maxPackSize); + + USBD_SetEPTxRxStatus(USBD_EP_0, USBD_EP_STATUS_NAK, USBD_EP_STATUS_VALID); + + g_usbDev.ctrlState = USBD_CTRL_STATE_DATA_OUT; + } + else + { + g_usbDev.ctrlState = USBD_CTRL_STATE_WAIT_STATUS_OUT; + } + + USBD_SetEPTxRxStatus(USBD_EP_0, USBD_EP_STATUS_NAK, USBD_EP_STATUS_VALID); +} + +/*! + * @brief USB Data in process except endpoint 0 + * + * @param ep : endpoint Number except endpoint 0 + * + * @retval None + */ +void USBD_DataInProcess(USBD_EP_T ep) +{ + uint16_t len; + + if (g_usbDev.inBuf[ep].packNum) + { + len = g_usbDev.inBuf[ep].bufLen > g_usbDev.inBuf[ep].maxPackSize ? \ + g_usbDev.inBuf[ep].maxPackSize : g_usbDev.inBuf[ep].bufLen; + + + USBD_WriteDataToEP(ep, g_usbDev.inBuf[ep].pBuf, len); + USBD_SetEPTxCnt(ep, len); + USBD_SetEPTxStatus(ep, USBD_EP_STATUS_VALID); + + g_usbDev.inBuf[ep].pBuf += len; + g_usbDev.inBuf[ep].bufLen -= len; + g_usbDev.inBuf[ep].packNum--; + } + else + { + if (g_usbDev.inEpHandler) + { + g_usbDev.inEpHandler(ep); + } + } +} + +/*! + * @brief USB Data out process except endpoint 0 + * + * @param ep : endpoint Number except endpoint 0 + * + * @retval None + */ +void USBD_DataOutProcess(USBD_EP_T ep) +{ + if (g_usbDev.outBuf[ep].packNum) + { + g_usbDev.outBuf[ep].xferCnt = USBD_ReadEPRxCnt(ep); + + if ((g_usbDev.outBuf[ep].xferCnt != 0) && (g_usbDev.outBuf[ep].pBuf != NULL)) + { + USBD_ReadDataFromEP(ep, g_usbDev.outBuf[ep].pBuf, g_usbDev.outBuf[ep].xferCnt); + + g_usbDev.outBuf[ep].bufLen -= g_usbDev.outBuf[ep].xferCnt; + g_usbDev.outBuf[ep].pBuf += g_usbDev.outBuf[ep].xferCnt; + g_usbDev.outBuf[ep].packNum--; + } + if (g_usbDev.outBuf[ep].packNum) + { + USBD_SetEPRxStatus(ep, USBD_EP_STATUS_VALID); + } + } + + if (g_usbDev.outEpHandler && !g_usbDev.outBuf[ep].packNum) + { + g_usbDev.outEpHandler(ep); + } +} + +/*! + * @brief Transfer data to host(except endpoint 0) + * + * @param ep: Endpoint number except endpoint 0 + * + * @param buf: Buffer pointer + * + * @param len: Buffer length + * + * @retval None + */ +void USBD_TxData(uint8_t ep, uint8_t *buf, uint32_t len) +{ + uint16_t maxPackSize = g_usbDev.inBuf[ep].maxPackSize; + + if (len >= maxPackSize) + { + USBD_WriteDataToEP(ep, buf, maxPackSize); + USBD_SetEPTxCnt(ep, maxPackSize); + USBD_SetEPTxStatus(ep, USBD_EP_STATUS_VALID); + + g_usbDev.inBuf[ep].pBuf = buf + maxPackSize; + g_usbDev.inBuf[ep].bufLen = len - maxPackSize; + g_usbDev.inBuf[ep].packNum = (g_usbDev.inBuf[ep].bufLen + (maxPackSize - 1)) / maxPackSize; + } + else + { + USBD_WriteDataToEP(ep, buf, len); + USBD_SetEPTxCnt(ep, len); + USBD_SetEPTxStatus(ep, USBD_EP_STATUS_VALID); + + g_usbDev.inBuf[ep].packNum = 0; + g_usbDev.inBuf[ep].bufLen = 0; + } +} + +/*! + * @brief Receive data from host(except endpoint 0) + * + * @param ep: Endpoint number except endpoint 0 + * + * @param buf: Buffer pointer + * + * @param len: Buffer length + * + * @retval None + */ +void USBD_RxData(uint8_t ep, uint8_t *buf, uint32_t len) +{ + uint16_t maxPackSize = g_usbDev.outBuf[ep].maxPackSize; + + g_usbDev.outBuf[ep].pBuf = buf; + g_usbDev.outBuf[ep].bufLen = len; + g_usbDev.outBuf[ep].packNum = (len + (maxPackSize - 1)) / maxPackSize; + + USBD_SetEPRxCnt(ep, USB_MIN(len, maxPackSize)); + + USBD_SetEPRxStatus(ep, USBD_EP_STATUS_VALID); +} diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/src/usbd_init.c b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/src/usbd_init.c new file mode 100644 index 0000000000..08a217efd2 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/src/usbd_init.c @@ -0,0 +1,237 @@ +/*! + * @file usbd_init.c + * + * @brief USB initialization management + * + * @version V1.0.0 + * + * @date 2021-12-06 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "usbd_init.h" +#include "usb_bsp.h" + +static USBD_REG_EP_TYPE_T USBD_ConvertEPType(USBD_EP_TYPE_T epType); + +/*! + * @brief USB initialization + * + * @param param: Initialization parameter + * + * @retval None + */ +void USBD_Init(USBD_InitParam_T *param) +{ + g_usbDev.pDeviceDesc = param->pDeviceDesc; + g_usbDev.pConfigurationDesc = param->pConfigurationDesc; + g_usbDev.pStringDesc = param->pStringDesc; + g_usbDev.pQualifierDesc = param->pQualifierDesc; + g_usbDev.pHidReportDesc = param->pHidReportDesc; + + g_usbDev.pStdReqCallback = param->pStdReqCallback; + g_usbDev.classReqHandler = param->classReqHandler; + g_usbDev.vendorReqHandler = param->vendorReqHandler; + g_usbDev.stdReqExceptionHandler = param->stdReqExceptionHandler; + + g_usbDev.txStatusHandler = param->txStatusHandler; + g_usbDev.rxStatusHandler = param->rxStatusHandler; + + g_usbDev.inEpHandler = param->inEpHandler; + g_usbDev.outEpHandler = param->outEpHandler; + + g_usbDev.resetHandler = param->resetHandler; + g_usbDev.intHandler = param->intHandler; + + USBD_HardWareInit(); + +#ifndef APM32F0xx_USB +#if USB_SELECT == USB1 + USBD2_Disable(); +#else + USB2_Enable(); +#endif +#endif + + USBD_PowerOn(); +} + +/*! + * @brief Init parameter in param + * + * @param param: Initialization parameter + * + * @retval None + */ +void USBD_InitParamStructInit(USBD_InitParam_T *param) +{ + param->pStdReqCallback = NULL; + param->stdReqExceptionHandler = NULL; + param->classReqHandler = NULL; + param->vendorReqHandler = NULL; + + param->txStatusHandler = NULL; + param->rxStatusHandler = NULL; + + param->outEpHandler = NULL; + param->inEpHandler = NULL; + + param->resetHandler = NULL; + param->intHandler = NULL; +} + +/*! + * @brief USB Power on + * + * @param None + * + * @retval None + */ +void USBD_PowerOn(void) +{ + USBD_ResetPowerDown(); + + USBD_SetForceReset(); + USBD_ResetForceReset(); + + USBD_DisableInterrupt(USBD_INT_ALL); + USBD_ClearIntFlag(USBD_INT_ALL); + + USBD_EnableInterrupt(USB_INT_SOURCE); +} + +/*! + * @brief USB Power off + * + * @param None + * + * @retval None + */ +void USBD_PowerOff(void) +{ + USBD_DisableInterrupt(USBD_INT_ALL); + USBD_ClearIntFlag(USBD_INT_ALL); + + /** Power down and Force USB Reset */ + USBD_SetRegCTRL(0X03); +} + + +/*! + * @brief Open OUT endpoint. + * + * @param epConfig: Point to USBD_EPConfig_T structure + * + * @retval None + */ +void USBD_OpenOutEP(USBD_EPConfig_T *epConfig) +{ + g_usbDev.outBuf[epConfig->epNum].maxPackSize = epConfig->maxPackSize; + + USBD_SetEPType(epConfig->epNum, USBD_ConvertEPType(epConfig->epType)); + + if (epConfig->epKind) + { + USBD_SetEPKind(epConfig->epNum); + } + else + { + USBD_ResetEPKind(epConfig->epNum); + } + + USBD_SetEPRxAddr(epConfig->epNum, epConfig->epBufAddr); + USBD_SetEPRxCnt(epConfig->epNum, epConfig->maxPackSize); + USBD_SetEPRxStatus(epConfig->epNum, epConfig->epStatus); +} + +/*! + * @brief Open IN endpoint. + * + * @param epConfig: Point to USBD_EPConfig_T structure + * + * @retval None + */ +void USBD_OpenInEP(USBD_EPConfig_T *epConfig) +{ + g_usbDev.inBuf[epConfig->epNum].maxPackSize = epConfig->maxPackSize; + + USBD_SetEPType(epConfig->epNum, USBD_ConvertEPType(epConfig->epType)); + + if (epConfig->epKind) + { + USBD_SetEPKind(epConfig->epNum); + } + else + { + USBD_ResetEPKind(epConfig->epNum); + } + + USBD_SetEPTxAddr(epConfig->epNum, epConfig->epBufAddr); + USBD_SetEPTxStatus(epConfig->epNum, epConfig->epStatus); +} + +/*! + * @brief Close OUT endpoint. + * + * @param ep: OUT endpoint Number + * + * @retval None + */ +void USBD_CloseOutEP(USBD_EP_T ep) +{ + g_usbDev.outBuf[ep].maxPackSize = 0; + + USBD_SetEPRxStatus(ep, USBD_EP_STATUS_DISABLE); +} + +/*! + * @brief Close IN endpoint. + * + * @param ep: IN endpoint Number + * + * @retval None + */ +void USBD_CloseInEP(USBD_EP_T ep) +{ + g_usbDev.inBuf[ep].maxPackSize = 0; + + USBD_SetEPTxStatus(ep, USBD_EP_STATUS_DISABLE); +} + +/*! + * @brief Convert endpoint Type. + * + * @param epType: endpoint type + * + * @retval Value of USBD_REG_EP_TYPE_T + */ +static USBD_REG_EP_TYPE_T USBD_ConvertEPType(USBD_EP_TYPE_T epType) +{ + switch (epType) + { + case USBD_EP_TYPE_CONTROL : + return USBD_REG_EP_TYPE_CONTROL; + case USBD_EP_TYPE_ISO : + return USBD_REG_EP_TYPE_ISO; + case USBD_EP_TYPE_BULK : + return USBD_REG_EP_TYPE_BULK; + case USBD_EP_TYPE_INTERRUPT : + return USBD_REG_EP_TYPE_INTERRUPT; + default : + return USBD_REG_EP_TYPE_CONTROL; + } +} diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/src/usbd_interrupt.c b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/src/usbd_interrupt.c new file mode 100644 index 0000000000..fff3b7c473 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/src/usbd_interrupt.c @@ -0,0 +1,349 @@ +/*! + * @file usbd_interrupt.c + * + * @brief USB interrupt service routine + * + * @version V1.0.0 + * + * @date 2021-12-06 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "usbd_init.h" + +static void USBD_LowPriorityProc(void); + +static void USBD_ResetIsrHandler(void); +static void USBD_SuspendIsrHandler(void); +static void USBD_ResumeIsrHandler(void); + +/*! + * @brief USB interrupt service routine + * + * @param None + * + * @retval None + */ +#ifdef APM32F0xx_USB + void USB_IRQHandler(void) + +#else //!< APM32F10x_USB + #if USB_SELECT == USB1 + void USBD1_LP_CAN1_RX0_IRQHandler(void) + #else + void USB2_LP_IRQHandler(void) + #endif +#endif +{ +#if (USB_INT_SOURCE & USBD_INT_CTR) + if (USBD_ReadIntFlag(USBD_INT_CTR)) + { + USBD_LowPriorityProc(); + } +#endif + +#if (USB_INT_SOURCE & USBD_INT_RST) + if (USBD_ReadIntFlag(USBD_INT_RST)) + { + USBD_ClearIntFlag(USBD_INT_RST); + USBD_ResetIsrHandler(); + } +#endif + +#if USB_INT_SOURCE & USBD_INT_PMAOU + if (USB_ReadIntFlag(USB_INT_PMAOU)) + { + USB_ClearIntFlag(USB_INT_PMAOU); + } +#endif + +#if USB_INT_SOURCE & USBD_INT_ERR + + if (USB_ReadIntFlag(USB_INT_ERROR)) + { + USB_ClearIntFlag(USB_INT_ERROR); + } +#endif + +#if USB_INT_SOURCE & USBD_INT_WKUP + if (USBD_ReadIntFlag(USBD_INT_WKUP)) + { + USBD_ResumeIsrHandler(); + USBD_ClearIntFlag(USBD_INT_WKUP); + } +#endif + +#if USB_INT_SOURCE & USBD_INT_SUS + if (USBD_ReadIntFlag(USBD_INT_SUS)) + { + USBD_SuspendIsrHandler(); + USBD_ClearIntFlag(USBD_INT_SUS); + } +#endif + +#if USB_INT_SOURCE & USBD_INT_SOF + if (USB_ReadIntFlag(USB_INT_SOF)) + { + USB_ClearIntFlag(USB_INT_SOF); + } +#endif + +#if USB_INT_SOURCE & USBD_INT_ESOF + if (USB_ReadIntFlag(USB_INT_ESOF)) + { + USB_ClearIntFlag(USB_INT_ESOF); + } +#endif +} + +/*! + * @brief USB low priority process + * + * @param None + * + * @retval None + */ +static void USBD_LowPriorityProc(void) +{ + USBD_EP_T ep; + + while (USBD_ReadIntFlag(USBD_INT_CTR)) + { + ep = (USBD_EP_T)USBD_ReadEP(); + + /** Endpoint 0 */ + if (ep == 0) + { + USBD_SetEPTxRxStatus(USBD_EP_0, USBD_EP_STATUS_NAK, USBD_EP_STATUS_NAK); + + /** Control in */ + if (USBD_ReadDir() == 0) + { + USBD_ResetEPTxFlag(USBD_EP_0); + USBD_CtrlInProcess(); + } + else + { + /** Setup */ + if (USBD_ReadEPSetup(USBD_EP_0) == SET) + { + USBD_ResetEPRxFlag(USBD_EP_0); + USBD_SetupProcess(); + } + /** Control out */ + else + { + USBD_ResetEPRxFlag(USBD_EP_0); + USBD_CtrlOutProcess(); + } + } + } + /** Transfer Handler Except endpoint 0 */ + else + { + if (USBD_ReadEPRxFlag(ep)) + { + USBD_ResetEPRxFlag(ep); + USBD_DataOutProcess(ep); + } + + if (USBD_ReadEPTxFlag(ep)) + { + USBD_ResetEPTxFlag(ep); + USBD_DataInProcess(ep); + } + } + } +} + + +/*! + * @brief USB Device Reset + * + * @param None + * + * @retval None + */ +static void USBD_ResetIsrHandler(void) +{ + uint8_t i; + USBD_EPConfig_T epConfig; + + g_usbDev.configurationNum = USB_CONFIGURATION_NUM; + g_usbDev.curConfiguration = 0; + g_usbDev.curInterface = 0; + g_usbDev.curAlternateSetting = 0; + g_usbDev.curFeature = 0; + g_usbDev.ctrlState = USBD_CTRL_STATE_WAIT_SETUP; + + g_usbDev.inBuf[USBD_EP_0].maxPackSize = USB_EP0_PACKET_SIZE; + g_usbDev.outBuf[USBD_EP_0].maxPackSize = USB_EP0_PACKET_SIZE; + + USBD_SetBufferTable(USB_BUFFER_TABLE_ADDR); + + /** Endpoint 0 IN */ + epConfig.epNum = USBD_EP_0; + epConfig.epType = USBD_EP_TYPE_CONTROL; + epConfig.epKind = DISABLE; + epConfig.epBufAddr = USB_EP0_TX_ADDR; + epConfig.maxPackSize = g_usbDev.inBuf[USBD_EP_0].maxPackSize; + epConfig.epStatus = USBD_EP_STATUS_NAK; + USBD_OpenInEP(&epConfig); + + /** Endpoint 0 OUT */ + epConfig.epBufAddr = USB_EP0_RX_ADDR; + epConfig.maxPackSize = g_usbDev.outBuf[USBD_EP_0].maxPackSize; + epConfig.epStatus = USBD_EP_STATUS_VALID; + USBD_OpenOutEP(&epConfig); + + if (g_usbDev.resetHandler) + { + g_usbDev.resetHandler(); + } + + for (i = 0; i < USB_EP_MAX_NUM; i++) + { + USBD_SetEpAddr((USBD_EP_T)i, i); + } + + USBD_SetDeviceAddr(0); + USBD_Enable(); +} + +/*! + * @brief USB Suspend + * + * @param None + * + * @retval None + */ +static void USBD_SuspendIsrHandler(void) +{ + uint8_t i; + uint16_t bakEP[8]; +#if USB_LOW_POWER_SWITCH + uint32_t bakPwrCR; + uint32_t tmp; +#endif + + for (i = 0; i < 8; i++) + { + bakEP[i] = (uint16_t)USBD->EP[i].EP; + } + + USBD_EnableInterrupt(USBD_INT_RST); + + USBD_SetForceReset(); + USBD_ResetForceReset(); + + while (USBD_ReadIntFlag(USBD_INT_RST) == RESET); + + for (i = 0; i < 8; i++) + { + USBD->EP[i].EP = bakEP[i]; + } + + USBD_SetForceSuspend(); + +#if USB_LOW_POWER_SWITCH + USBD_SetLowerPowerMode(); + + bakPwrCR = PMU->CTRL; + tmp = PMU->CTRL; + tmp &= (uint32_t)0xfffffffc; + tmp |= PMU_REGULATOR_LOWPOWER; + PMU->CTRL = tmp; + + SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; + + if (USBD_ReadIntFlag(USBD_INT_WKUP) == RESET) + { + __WFI(); + SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); + } + else + { + USBD_ClearIntFlag(USBD_INT_WKUP); + USBD_ResetForceSuspend(); + PMU->CTRL = bakPwrCR; + SCB->SCR &= (uint32_t)~((uint32_t)SCB_SCR_SLEEPDEEP_Msk); + } +#endif +} + +/*! + * @brief Resume + * + * @param None + * + * @retval None + */ +static void USBD_ResumeIsrHandler(void) +{ +#if USB_LOW_POWER_SWITCH + USBD_ResetLowerPowerMode(); +#endif + + SystemInit(); + + USBD_SetRegCTRL(USB_INT_SOURCE); +} + +#ifndef APM32F0xx_USB +/*! + * @brief USB High priority process + * + * @param None + * + * @retval None + */ +static void USBD_HighPriorityProc(void) +{ + USBD_EP_T ep; + + while (USBD_ReadIntFlag(USBD_INT_CTR)) + { + USBD_ClearIntFlag(USBD_INT_CTR); + + ep = USBD_ReadEP(); + + if (USBD_ReadEPRxFlag(ep)) + { + USBD_ResetEPRxFlag(ep); + + g_usbDev.outEpHandler(ep); + } + + if (USBD_ReadEPTxFlag(ep)) + { + USBD_ResetEPTxFlag(ep); + + g_usbDev.inEpHandler(ep); + } + } +} + +#if USB_SELECT == USB1 + void USBD1_HP_CAN1_TX_IRQHandler(void) +#else + void USB2_HP_IRQHandler(void) +#endif +{ + USBD_HighPriorityProc(); +} + +#endif diff --git a/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/src/usbd_stdReq.c b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/src/usbd_stdReq.c new file mode 100644 index 0000000000..98f50c3743 --- /dev/null +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Core_Device/Standard/src/usbd_stdReq.c @@ -0,0 +1,369 @@ +/*! + * @file usbd_stdReq.c + * + * @brief USB standard request process + * + * @version V1.0.0 + * + * @date 2021-12-30 + * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. + */ + +#include "usbd_stdReq.h" +#include "usbd_core.h" +#include "usbd_descriptor.h" + +static uint8_t USBD_StandardGetConfiguration(void); +static uint8_t USBD_StandardGetDescriptor(void); +static uint8_t USBD_StandardGetInterface(void); +static uint8_t USBD_StandardGetStatus(void); + +static uint8_t USBD_StandardSetAddress(void); +static uint8_t USBD_StandardSetConfiguration(void); +static uint8_t USBD_StandardSetDescriptor(void); +static uint8_t USBD_StandardSetFeature(void); +static uint8_t USBD_StandardSetInterface(void); + +static uint8_t USBD_StandardClearFeature(void); + + +/*! + * @brief USB request standard request + * + * @param None + * + * @retval None + */ +void USBD_StandardReqeust(void) +{ + uint8_t result = 1; + + uint8_t bRequest = g_usbDev.reqData.byte.bRequest; + + switch (bRequest) + { + case USBD_GET_CONFIGURATION: + result = USBD_StandardGetConfiguration(); + break; + + case USBD_GET_DESCRIPTOR: + result = USBD_StandardGetDescriptor(); + break; + + case USBD_GET_INTERFACE: + result = USBD_StandardGetInterface(); + break; + + case USBD_GET_STATUS: + result = USBD_StandardGetStatus(); + break; + + case USBD_SET_ADDRESS: + result = USBD_StandardSetAddress(); + break; + + case USBD_SET_CONFIGURATION: + result = USBD_StandardSetConfiguration(); + break; + + case USBD_SET_DESCRIPTOR: + result = USBD_StandardSetDescriptor(); + break; + + case USBD_SET_FEATURE: + result = USBD_StandardSetFeature(); + break; + + case USBD_SET_INTERFACE: + result = USBD_StandardSetInterface(); + + break; + + case USBD_CLEAR_FEATURE: + result = USBD_StandardClearFeature(); + break; + + default: + + break; + } + + if (!result) + { + if (g_usbDev.stdReqExceptionHandler != NULL) + { + g_usbDev.stdReqExceptionHandler(&g_usbDev.reqData); + } + } +} + +/*! + * @brief Standard request get configuration + * + * @param None + * + * @retval ERROR: 0; SUCCESS : 1 + */ +static uint8_t USBD_StandardGetConfiguration(void) +{ + uint8_t recipient = g_usbDev.reqData.byte.bmRequestType.bit.recipient; + + if (recipient == USBD_RECIPIENT_DEVICE) + { + USBD_CtrlInData(&g_usbDev.curConfiguration, 1); + + if (g_usbDev.pStdReqCallback->getConfigurationHandler) + { + g_usbDev.pStdReqCallback->getConfigurationHandler(); + } + + + return SUCCESS; + } + + return ERROR; +} + +/*! + * @brief Standard request get descriptor + * + * @param None + * + * @retval ERROR: 0; SUCCESS : 1 + */ +static uint8_t USBD_StandardGetDescriptor(void) +{ + uint8_t ret = SUCCESS; + uint32_t len = 0; + uint8_t wValue0 = g_usbDev.reqData.byte.wValue[0]; + uint8_t wValue1 = g_usbDev.reqData.byte.wValue[1]; + + if (wValue1 == USBD_DESC_DEVICE) + { + len = USB_MIN(*(uint16_t *)g_usbDev.reqData.byte.wLength, g_usbDev.pDeviceDesc->size); + USBD_CtrlInData((uint8_t *)g_usbDev.pDeviceDesc->pDesc, len); + } + else if (wValue1 == USBD_DESC_CONFIGURATION) + { + len = USB_MIN(*(uint16_t *)g_usbDev.reqData.byte.wLength, g_usbDev.pConfigurationDesc->size); + USBD_CtrlInData((uint8_t *)g_usbDev.pConfigurationDesc->pDesc, len); + } + else if (wValue1 == USBD_DESC_STRING) + { + if (wValue0 < SRTING_DESC_NUM) + { + len = USB_MIN(*(uint16_t *)g_usbDev.reqData.byte.wLength, g_usbDev.pStringDesc[wValue0].size); + USBD_CtrlInData((uint8_t *)g_usbDev.pStringDesc[wValue0].pDesc, len); + } + else + { + ret = ERROR; + USBD_SetEPTxRxStatus(USBD_EP_0, USBD_EP_STATUS_STALL, USBD_EP_STATUS_STALL); + } + + } + else + { + ret = ERROR; + USBD_SetEPTxRxStatus(USBD_EP_0, USBD_EP_STATUS_STALL, USBD_EP_STATUS_STALL); + } + + return ret; +} + +/*! + * @brief Standard request get interface + * + * @param None + * + * @retval ERROR: 0; SUCCESS : 1 + */ +static uint8_t USBD_StandardGetInterface(void) +{ + + return ERROR; +} + +/*! + * @brief Standard request get status + * + * @param None + * + * @retval ERROR: 0; SUCCESS : 1 + */ +static uint8_t USBD_StandardGetStatus(void) +{ + uint8_t ret = 1; + + + uint8_t status[2] = {0, 0}; + + if ((g_usbDev.reqData.byte.bmRequestType.bit.recipient) == USBD_RECIPIENT_DEVICE) + { + if (g_usbDev.curFeature & (1 << 5)) + { + status[0] |= 0x02; + } + + if (g_usbDev.curFeature & (1 << 6)) + { + status[0] |= 0x01; + } + + USBD_CtrlInData(status, 2); + + + } + + else if ((g_usbDev.reqData.byte.bmRequestType.bit.recipient) == USBD_RECIPIENT_INTERFACE) + { + USBD_CtrlInData(status, 2); + + + } + + else if ((g_usbDev.reqData.byte.bmRequestType.bit.recipient) == USBD_RECIPIENT_ENDPOINT) + { + + if (g_usbDev.reqData.byte.wIndex[0] & 0x80) + { + if (USBD_ReadEPTxStatus(g_usbDev.reqData.byte.wIndex[0] & 0x0f) == USBD_EP_STATUS_STALL) + { + status[0] |= 0x01; + } + } + else + { + if (USBD_ReadEPRxStatus(g_usbDev.reqData.byte.wIndex[0] & 0x0f) == USBD_EP_STATUS_STALL) + { + status[0] |= 0x01; + } + + } + USBD_CtrlInData(status, 2); + + } + else + { + ret = 0; + } + + return ret; +} + +/*! + * @brief Standard request set address + * + * @param None + * + * @retval ERROR: 0; SUCCESS : 1 + */ +static uint8_t USBD_StandardSetAddress(void) +{ + USBD_DevReqData_T *reqData = &g_usbDev.reqData; + + if ((reqData->byte.wValue[0] < 127) && (reqData->byte.wValue[1] == 0) && + (reqData->byte.bmRequestType.bit.recipient == USBD_RECIPIENT_DEVICE)) + { + USBD_CtrlInData((void *)0, 0); + + return 1; + } + + return 0; +} + +/*! + * @brief Standard request set configuration + * + * @param None + * + * @retval ERROR: 0; SUCCESS : 1 + */ +static uint8_t USBD_StandardSetConfiguration(void) +{ + USBD_DevReqData_T *reqData = &g_usbDev.reqData; + + if ((reqData->byte.wValue[0] <= g_usbDev.configurationNum) && \ + (reqData->byte.bmRequestType.bit.recipient == USBD_RECIPIENT_DEVICE)) + { + g_usbDev.curConfiguration = reqData->byte.wValue[0]; + + if (g_usbDev.pStdReqCallback->setConfigurationHandler) + { + g_usbDev.pStdReqCallback->setConfigurationHandler(); + } + + USBD_CtrlInData((void *)0, 0); + + return 1; + } + + return 0; +} + +/*! + * @brief Standard request set descriptor + * + * @param None + * + * @retval 0: Failed; 1: Success + */ +static uint8_t USBD_StandardSetDescriptor(void) +{ + + return ERROR; +} + +/*! + * @brief Standard request set feature + * + * @param None + * + * @retval 0: Failed; 1: Success + */ +static uint8_t USBD_StandardSetFeature(void) +{ + uint8_t ret = 1; + + return ret; +} + +/*! + * @brief Standard request set interface + * + * @param None + * + * @retval 0: Failed; 1: Success + */ +static uint8_t USBD_StandardSetInterface(void) +{ + + return 0; +} + +/*! + * @brief Standard request clear feature + * + * @param None + * + * @retval 0: Failed; 1: Success + */ +static uint8_t USBD_StandardClearFeature(void) +{ + return 0; +} diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_usb.h b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Driver/inc/drv_usb_device.h similarity index 53% rename from bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_usb.h rename to bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Driver/inc/drv_usb_device.h index 570c0e30a1..96aacf6fa9 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/inc/apm32f10x_usb.h +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Driver/inc/drv_usb_device.h @@ -1,22 +1,59 @@ /*! - * @file apm32f10x_usb.h + * @file drv_usb_device.h * * @brief This file contains all the prototypes,enumeration and macros for USBD peripheral * - * @version V1.0.1 + * @version V1.0.0 * - * @date 2021-03-23 + * @date 2021-12-06 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ -#ifndef __APM32F10X_USBD_H_ -#define __APM32F10X_USBD_H_ -#include "apm32f10x.h" +#ifndef __DRV_USB_DEVICE_H_ +#define __DRV_USB_DEVICE_H_ #ifdef __cplusplus extern "C" { #endif +#if defined(APM32F070xB) || defined(APM32F072x8) || defined(APM32F072xB) +#define APM32F0xx_USB +#else +#define APM32F10x_USB +#endif + +#ifdef APM32F0xx_USB +#include "apm32f0xx.h" +#include "apm32f0xx_pmu.h" +#include "apm32f0xx_eint.h" +#include "apm32f0xx_gpio.h" +#include "apm32f0xx_rcm.h" +#include "apm32f0xx_misc.h" +#include "usb_config.h" +#else +#include "apm32f10x.h" +#include "apm32f10x_pmu.h" +#include "apm32f10x_eint.h" +#include "apm32f10x_gpio.h" +#include "apm32f10x_rcm.h" +#include "apm32f10x_misc.h" +#include "usb_config.h" +#endif + /** @addtogroup Peripherals_Library Standard Peripheral Library @{ */ @@ -44,7 +81,7 @@ typedef enum USBD_EP_BIT_RXSTS = (uint32_t)(BIT12 | BIT13), USBD_EP_BIT_RXDTOG = (uint32_t)(BIT14), USBD_EP_BIT_CTFR = (uint32_t)(BIT15) -}USBD_EP_BIT_T; +} USBD_EP_BIT_T; /** * @brief Endpoint id @@ -59,7 +96,7 @@ typedef enum USBD_EP_5, USBD_EP_6, USBD_EP_7, -}USBD_EP_T; +} USBD_EP_T; /** * @brief Endpoint status @@ -70,18 +107,18 @@ typedef enum USBD_EP_STATUS_STALL = ((uint32_t)1), USBD_EP_STATUS_NAK = ((uint32_t)2), USBD_EP_STATUS_VALID = ((uint32_t)3), -}USBD_EP_STATUS_T; +} USBD_EP_STATUS_T; /** - * @brief USBD Endpoint type + * @brief USBD Endpoint type for register */ typedef enum { - USBD_EP_TYPE_BULK, - USBD_EP_TYPE_CONTROL, - USBD_EP_TYPE_ISO, - USBD_EP_TYPE_INTERRUPT -}USBD_EP_TYPE_T; + USBD_REG_EP_TYPE_BULK, + USBD_REG_EP_TYPE_CONTROL, + USBD_REG_EP_TYPE_ISO, + USBD_REG_EP_TYPE_INTERRUPT +} USBD_REG_EP_TYPE_T; /**@} end of group USBD_Enumerations*/ @@ -315,112 +352,6 @@ typedef enum */ #define USBD_ReadEPRxStatus(ep) ((USBD_EP_STATUS_T)(USBD->EP[ep].EP_B.RXSTS)) -/*! - * @brief Read EP Tx address pointer - * - * @param ep: EP number - * - * @retval EP Tx address pointer - */ -#define USBD_ReadEPTxAddrPointer(ep) (uint32_t *)((USBD->BUFFTB + ep * 8) * 2 + USBD_PMA_ADDR) - - -/*! - * @brief Read EP Tx count pointer - * - * @param ep: EP number - * - * @retval EP Tx count pointer - */ -#define USBD_ReadEPTxCntPointer(ep) (uint32_t *)((USBD->BUFFTB + ep * 8 + 2) * 2 + USBD_PMA_ADDR) - -/*! - * @brief Read EP Rx address pointer - * - * @param ep: EP number - * - * @retval EP Rx address pointer - */ -#define USBD_ReadEPRxAddrPointer(ep) (uint32_t *)((USBD->BUFFTB + ep * 8 + 4) * 2 + USBD_PMA_ADDR) - -/*! - * @brief Read EP Rx count pointer - * - * @param ep: EP number - * - * @retval EP Rx count pointer - */ -#define USBD_ReadEPRxCntPointer(ep) (uint32_t *)((USBD->BUFFTB + ep * 8 + 6) * 2 + USBD_PMA_ADDR) - -/*! - * @brief Set EP Tx addr - * - * @param ep: EP number - * - * @param addr: Tx addr - * - * @retval None - */ -#define USBD_SetEPTxAddr(ep, addr) (*USBD_ReadEPTxAddrPointer(ep) = (addr >> 1) << 1) - -/*! - * @brief Set EP Rx addr - * - * @param ep: EP number - * - * @param addr: Rx addr - * - * @retval None - */ -#define USBD_SetEPRxAddr(ep, addr) (*USBD_ReadEPRxAddrPointer(ep) = (addr >> 1) << 1) - -/*! - * @brief Read EP Tx addr - * - * @param ep: EP number - * - * @retval EP Tx addr - */ -#define USBD_ReadEPTxAddr(ep) ((uint16_t)*USBD_ReadEPTxAddrPointer(ep)) - -/*! - * @brief Read EP Rx addr - * - * @param ep: EP number - * - * @retval EP Rx addr - */ -#define USBD_ReadEPRxAddr(ep) ((uint16_t)*USBD_ReadEPRxAddrPointer(ep)) - -/*! - * @brief Set EP Rx Count - * - * @param ep: EP number - * - * @param cnt: Tx count - * - * @retval None - */ -#define USBD_SetEPTxCnt(ep, cnt) (*USBD_ReadEPTxCntPointer(ep) = cnt) - -/*! - * @brief Read EP Tx count - * - * @param ep: EP number - * - * @retval EP Tx count - */ -#define USBD_ReadEPTxCnt(ep) ((uint16_t)*USBD_ReadEPTxCntPointer(ep) & 0x3ff) - -/*! - * @brief Read EP Rx count - * - * @param ep: EP number - * - * @retval EP Rx count - */ -#define USBD_ReadEPRxCnt(ep) ((uint16_t)*USBD_ReadEPRxCntPointer(ep) & 0x3ff) - /*! * @brief Read SETUP field value in EP register * @@ -547,29 +478,458 @@ typedef enum */ #define USBD_ReadFRANUM() (USBD->FRANUM_B.FRANUM) -void USBD_SetEPType(USBD_EP_T ep, USBD_EP_TYPE_T type); +#ifdef APM32F0xx_USB +/*! + * @brief Read EP Tx address pointer + * + * @param ep: EP number + * + * @retval EP Tx address pointer + */ +#define USBD_ReadEPTxAddrPointer(ep) (uint16_t *)((USBD->BUFFTB + ep * 8) + USBD_PMA_ADDR) -void USBD_SetEPKind(USBD_EP_T ep); -void USBD_ResetEPKind(USBD_EP_T ep); +/*! + * @brief Read EP Tx count pointer + * + * @param ep: EP number + * + * @retval EP Tx count pointer + */ +#define USBD_ReadEPTxCntPointer(ep) (uint16_t *)((USBD->BUFFTB + ep * 8 + 2) + USBD_PMA_ADDR) -void USBD_ResetEPRxFlag(USBD_EP_T ep); -void USBD_ResetEPTxFlag(USBD_EP_T ep); +/*! + * @brief Read EP Rx address pointer + * + * @param ep: EP number + * + * @retval EP Rx address pointer + */ +#define USBD_ReadEPRxAddrPointer(ep) (uint16_t *)((USBD->BUFFTB + ep * 8 + 4) + USBD_PMA_ADDR) -void USBD_ToggleTx(USBD_EP_T ep); -void USBD_ToggleRx(USBD_EP_T ep); -void USBD_ResetTxToggle(USBD_EP_T ep); -void USBD_ResetRxToggle(USBD_EP_T ep); +/*! + * @brief Read EP Rx count pointer + * + * @param ep: EP number + * + * @retval EP Rx count pointer + */ +#define USBD_ReadEPRxCntPointer(ep) (uint16_t *)((USBD->BUFFTB + ep * 8 + 6) + USBD_PMA_ADDR) -void USBD_SetEpAddr(USBD_EP_T ep, uint8_t addr); +/*! + * @brief Set EP Tx addr + * + * @param ep: EP number + * + * @param addr: Tx addr + * + * @retval None + */ +#define USBD_SetEPTxAddr(ep, addr) (*USBD_ReadEPTxAddrPointer(ep) = (addr >> 1) << 1) -void USBD_SetEPTxStatus(USBD_EP_T ep, USBD_EP_STATUS_T status); -void USBD_SetEPRxStatus(USBD_EP_T ep, USBD_EP_STATUS_T status); -void USBD_SetEPRxTxStatus(USBD_EP_T ep, USBD_EP_STATUS_T txStatus, USBD_EP_STATUS_T rxStatus); +/*! + * @brief Set EP Rx addr + * + * @param ep: EP number + * + * @param addr: Rx addr + * + * @retval None + */ +#define USBD_SetEPRxAddr(ep, addr) (*USBD_ReadEPRxAddrPointer(ep) = (addr >> 1) << 1) -void USBD_SetEPRxCnt(USBD_EP_T ep, uint32_t cnt); +/*! + * @brief Read EP Tx addr + * + * @param ep: EP number + * + * @retval EP Tx addr + */ +#define USBD_ReadEPTxAddr(ep) ((uint16_t)*USBD_ReadEPTxAddrPointer(ep)) -void USBD_WriteDataToEP(USBD_EP_T ep, uint8_t *wBuf, uint32_t wLen); -void USBD_ReadDataFromEP(USBD_EP_T ep, uint8_t *rBuf, uint32_t rLen); +/*! + * @brief Read EP Rx addr + * + * @param ep: EP number + * + * @retval EP Rx addr + */ +#define USBD_ReadEPRxAddr(ep) ((uint16_t)*USBD_ReadEPRxAddrPointer(ep)) + +/*! + * @brief Read EP Tx Buffer Pointer + * + * @param ep: EP number + * + * @retval EP Tx Buffer Pointer + */ +#define USBD_ReadEPTxBufferPointer(ep) (uint16_t *)(USBD_ReadEPTxAddr(ep) + USBD_PMA_ADDR) + +/*! + * @brief Read EP Rx Buffer Pointer + * + * @param ep: EP number + * + * @retval EP Rx Buffer Pointer + */ +#define USBD_ReadEPRxBufferPointer(ep) (uint16_t *)(USBD_ReadEPRxAddr(ep) + USBD_PMA_ADDR) + +/*! + * @brief Set EP Tx Count + * + * @param ep: EP number + * + * @param cnt: Tx count + * + * @retval None + */ +#define USBD_SetEPTxCnt(ep, cnt) (*USBD_ReadEPTxCntPointer(ep) = cnt) + +/*! + * @brief Read EP Tx count + * + * @param ep: EP number + * + * @retval EP Tx count + */ +#define USBD_ReadEPTxCnt(ep) ((uint16_t)*USBD_ReadEPTxCntPointer(ep) & 0x3ff) + +/*! + * @brief Read EP Rx count + * + * @param ep: EP number + * + * @retval EP Rx count + */ +#define USBD_ReadEPRxCnt(ep) ((uint16_t)*USBD_ReadEPRxCntPointer(ep) & 0x3ff) + +/*! + * @brief Set BESL Value + * + * @param val: 4-bits BESL Value to be set + * + * @retval None + */ +#define USBD_SetBESL(val) (USBD->LPMCTRLSTS_B.BESL = val) + +/*! + * @brief Set bRemoteWakew Value + * + * @param val: 1-bit bRemoteWakew Value to be set + * + * @retval None + */ +#define USBD_SetRemoteWakeVal(val) (USBD->LPMCTRLSTS_B.REMWAKE = val) + +/*! + * @brief Enable LPM ACK + * + * @param None + * + * @retval None + */ +#define USBD_EnableAckLPM() (USBD->LPMCTRLSTS_B.LPMACKEN = 1) + +/*! + * @brief Disable LPM ACK + * + * @param None + * + * @retval None + */ +#define USBD_DisableAckLPM() (USBD->LPMCTRLSTS_B.LPMACKEN = 0) + +/*! + * @brief Disable LPM + * + * @param None + * + * @retval None + */ +#define USBD_EnableLPM() (USBD->LPMCTRLSTS_B.LPMEN = 1) + +/*! + * @brief Disable LPM + * + * @param None + * + * @retval None + */ +#define USBD_DisableLPM() (USBD->LPMCTRLSTS_B.LPMEN = 0) + +/*! + * @brief Enable Pull-up of DP line + * + * @param None + * + * @retval None + */ +#define USBD_EnablePullUpDP() (USBD->BCD_B.DPPUCTRL = 1) + +/*! + * @brief Disable Pull-up of DP line + * + * @param None + * + * @retval None + */ +#define USBD_DisablePullUpDP() (USBD->BCD_B.DPPUCTRL = 0) + +/*! + * @brief Read DM Pull-up Detection Status Flag + * + * @param None + * + * @retval DM Pull-up Detection Status Flag + */ +#define USBD_DMPullUpStatus() (USBD->BCD_B.DMPUDFLG) + +/*! + * @brief Read Secondary Detection Status Flag + * + * @param None + * + * @retval Secondary Detection Status Flag + */ +#define USBD_SDStatus() (USBD->BCD_B.SDFLG) + +/*! + * @brief Read Primary Detection Status Flag + * + * @param None + * + * @retval Primary Detection Status Flag + */ +#define USBD_PDStatus() (USBD->BCD_B.PDFLG) + +/*! + * @brief Read Data Contact Detection Status Flag + * + * @param None + * + * @retval Data Contact Detection Status Flag + */ +#define USBD_DCDStatus() (USBD->BCD_B.DCDFLG) + +/*! + * @brief Enable Secondary Detection Mode + * + * @param None + * + * @retval None + */ +#define USBD_EnableSDMode() (USBD->BCD_B.SDEN = 1) + +/*! + * @brief Disable Secondary Detection Mode + * + * @param None + * + * @retval None + */ +#define USBD_DisableSDMode() (USBD->BCD_B.SDEN = 0) + +/*! + * @brief Enable Primary Detection Mode + * + * @param None + * + * @retval None + */ +#define USBD_EnablePDMode() (USBD->BCD_B.PDEN = 1) + +/*! + * @brief Disable Primary Detection Mode + * + * @param None + * + * @retval None + */ +#define USBD_DisablePDMode() (USBD->BCD_B.PDEN = 0) + +/*! + * @brief Enable Data Contact Detection Mode + * + * @param None + * + * @retval None + */ +#define USBD_EnableDCDMode() (USBD->BCD_B.DCDEN = 1) + +/*! + * @brief Disable Data Contact Detection Mode + * + * @param None + * + * @retval None + */ +#define USBD_DisableDCDMode() (USBD->BCD_B.DCDEN = 0) + +/*! + * @brief Enable Battery Charging Detector + * + * @param None + * + * @retval None + */ +#define USBD_EnableBCD() (USBD->BCD_B.BCDEN = 1) + +/*! + * @brief Disable Battery Charging Detector + * + * @param None + * + * @retval None + */ +#define USBD_DisableBCD() (USBD->BCD_B.BCDEN = 0) + +#else //!< APM32F10x_USB +/*! + * @brief Read EP Tx address pointer + * + * @param ep: EP number + * + * @retval EP Tx address pointer + */ +#define USBD_ReadEPTxAddrPointer(ep) (uint16_t *)((USBD->BUFFTB + ep * 8) * 2 + USBD_PMA_ADDR) + +/*! + * @brief Read EP Tx count pointer + * + * @param ep: EP number + * + * @retval EP Tx count pointer + */ +#define USBD_ReadEPTxCntPointer(ep) (uint16_t *)((USBD->BUFFTB + ep * 8 + 2) * 2 + USBD_PMA_ADDR) + +/*! + * @brief Read EP Rx address pointer + * + * @param ep: EP number + * + * @retval EP Rx address pointer + */ +#define USBD_ReadEPRxAddrPointer(ep) (uint16_t *)((USBD->BUFFTB + ep * 8 + 4) * 2 + USBD_PMA_ADDR) + +/*! + * @brief Read EP Rx count pointer + * + * @param ep: EP number + * + * @retval EP Rx count pointer + */ +#define USBD_ReadEPRxCntPointer(ep) (uint16_t *)((USBD->BUFFTB + ep * 8 + 6) * 2 + USBD_PMA_ADDR) + +/*! + * @brief Set EP Tx addr + * + * @param ep: EP number + * + * @param addr: Tx addr + * + * @retval None + */ +#define USBD_SetEPTxAddr(ep, addr) (*USBD_ReadEPTxAddrPointer(ep) = (addr >> 1) << 1) + +/*! + * @brief Set EP Rx addr + * + * @param ep: EP number + * + * @param addr: Rx addr + * + * @retval None + */ +#define USBD_SetEPRxAddr(ep, addr) (*USBD_ReadEPRxAddrPointer(ep) = (addr >> 1) << 1) + +/*! + * @brief Read EP Tx addr + * + * @param ep: EP number + * + * @retval EP Tx addr + */ +#define USBD_ReadEPTxAddr(ep) ((uint16_t)*USBD_ReadEPTxAddrPointer(ep)) + +/*! + * @brief Read EP Rx addr + * + * @param ep: EP number + * + * @retval EP Rx addr + */ +#define USBD_ReadEPRxAddr(ep) ((uint16_t)*USBD_ReadEPRxAddrPointer(ep)) + +/*! + * @brief Read EP Tx Buffer Pointer + * + * @param ep: EP number + * + * @retval EP Tx Buffer Pointer + */ +#define USBD_ReadEPTxBufferPointer(ep) (uint32_t *)(((uint32_t)USBD_ReadEPTxAddr(ep) << 1) + USBD_PMA_ADDR) + +/*! + * @brief Read EP Rx Buffer Pointer + * + * @param ep: EP number + * + * @retval EP Rx Buffer Pointer + */ +#define USBD_ReadEPRxBufferPointer(ep) (uint32_t *)(((uint32_t)USBD_ReadEPRxAddr(ep) << 1) + USBD_PMA_ADDR) + +/*! + * @brief Set EP Tx Count + * + * @param ep: EP number + * + * @param cnt: Tx count + * + * @retval None + */ +#define USBD_SetEPTxCnt(ep, cnt) (*USBD_ReadEPTxCntPointer(ep) = cnt) + +/*! + * @brief Read EP Tx count + * + * @param ep: EP number + * + * @retval EP Tx count + */ +#define USBD_ReadEPTxCnt(ep) ((uint16_t)*USBD_ReadEPTxCntPointer(ep) & 0x3ff) + +/*! + * @brief Read EP Rx count + * + * @param ep: EP number + * + * @retval EP Rx count + */ +#define USBD_ReadEPRxCnt(ep) ((uint16_t)*USBD_ReadEPRxCntPointer(ep) & 0x3ff) + +#endif +void USBD_SetEPType(uint8_t ep, USBD_REG_EP_TYPE_T type); + +void USBD_SetEPKind(uint8_t ep); +void USBD_ResetEPKind(uint8_t ep); + +void USBD_ResetEPRxFlag(uint8_t ep); +void USBD_ResetEPTxFlag(uint8_t ep); + +void USBD_ToggleTx(uint8_t ep); +void USBD_ToggleRx(uint8_t ep); +void USBD_ResetTxToggle(uint8_t ep); +void USBD_ResetRxToggle(uint8_t ep); + +void USBD_SetEpAddr(uint8_t ep, uint8_t addr); + +void USBD_SetEPTxStatus(uint8_t ep, USBD_EP_STATUS_T status); +void USBD_SetEPRxStatus(uint8_t ep, USBD_EP_STATUS_T status); +void USBD_SetEPTxRxStatus(uint8_t ep, USBD_EP_STATUS_T txStatus, USBD_EP_STATUS_T rxStatus); + +void USBD_SetEPRxCnt(uint8_t ep, uint32_t cnt); + +void USBD_WriteDataToEP(uint8_t ep, uint8_t *wBuf, uint32_t wLen); +void USBD_ReadDataFromEP(uint8_t ep, uint8_t *rBuf, uint32_t rLen); /**@} end of group USBD_Fuctions*/ /**@} end of group USBD_Driver*/ @@ -579,4 +939,4 @@ void USBD_ReadDataFromEP(USBD_EP_T ep, uint8_t *rBuf, uint32_t rLen); } #endif -#endif /* __APM32F10X_USBD_H */ +#endif /* __DRV_USB_DEVICE_H */ diff --git a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_usb.c b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Driver/src/drv_usb_device.c similarity index 67% rename from bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_usb.c rename to bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Driver/src/drv_usb_device.c index fb8fee5481..169d7024ac 100644 --- a/bsp/apm32/libraries/APM32F10x_Library/APM32F10x_StdPeriphDriver/src/apm32f10x_usb.c +++ b/bsp/apm32/libraries/APM32F10x_Library/USB_Device_Lib/Driver/src/drv_usb_device.c @@ -1,15 +1,29 @@ /*! - * @file apm32f10x_usb.c + * @file drv_usb_device.c * * @brief This file contains all the functions for the USBD peripheral * - * @version V1.0.1 + * @version V1.0.0 * - * @date 2021-03-23 + * @date 2021-12-06 * + * @attention + * + * Copyright (C) 2020-2022 Geehy Semiconductor + * + * You may not use this file except in compliance with the + * GEEHY COPYRIGHT NOTICE (GEEHY SOFTWARE PACKAGE LICENSE). + * + * The program is only for reference, which is distributed in the hope + * that it will be usefull and instructional for customers to develop + * their software. Unless required by applicable law or agreed to in + * writing, the program is distributed on an "AS IS" BASIS, WITHOUT + * ANY WARRANTY OR CONDITIONS OF ANY KIND, either express or implied. + * See the GEEHY SOFTWARE PACKAGE LICENSE for the governing permissions + * and limitations under the License. */ -#include "apm32f10x_usb.h" +#include "drv_usb_device.h" /*! * @brief Set Endpoint type @@ -20,7 +34,7 @@ * * @retval None */ -void USBD_SetEPType(USBD_EP_T ep, USBD_EP_TYPE_T type) +void USBD_SetEPType(uint8_t ep, USBD_REG_EP_TYPE_T type) { __IOM uint32_t reg; @@ -40,7 +54,7 @@ void USBD_SetEPType(USBD_EP_T ep, USBD_EP_TYPE_T type) * * @retval None */ -void USBD_SetEPKind(USBD_EP_T ep) +void USBD_SetEPKind(uint8_t ep) { __IOM uint32_t reg; @@ -59,7 +73,7 @@ void USBD_SetEPKind(USBD_EP_T ep) * * @retval None */ -void USBD_ResetEPKind(USBD_EP_T ep) +void USBD_ResetEPKind(uint8_t ep) { __IOM uint32_t reg; @@ -79,7 +93,7 @@ void USBD_ResetEPKind(USBD_EP_T ep) * * @retval None */ -void USBD_ResetEPRxFlag(USBD_EP_T ep) +void USBD_ResetEPRxFlag(uint8_t ep) { __IOM uint32_t reg; @@ -98,7 +112,7 @@ void USBD_ResetEPRxFlag(USBD_EP_T ep) * * @retval None */ -void USBD_ResetEPTxFlag(USBD_EP_T ep) +void USBD_ResetEPTxFlag(uint8_t ep) { __IOM uint32_t reg; @@ -117,7 +131,7 @@ void USBD_ResetEPTxFlag(USBD_EP_T ep) * * @retval None */ -void USBD_ToggleTx(USBD_EP_T ep) +void USBD_ToggleTx(uint8_t ep) { __IOM uint32_t reg; @@ -136,7 +150,7 @@ void USBD_ToggleTx(USBD_EP_T ep) * * @retval None */ -void USBD_ToggleRx(USBD_EP_T ep) +void USBD_ToggleRx(uint8_t ep) { __IOM uint32_t reg; @@ -155,9 +169,9 @@ void USBD_ToggleRx(USBD_EP_T ep) * * @retval None */ -void USBD_ResetTxToggle(USBD_EP_T ep) +void USBD_ResetTxToggle(uint8_t ep) { - if(USBD->EP[ep].EP_B.TXDTOG) + if (USBD->EP[ep].EP_B.TXDTOG) { USBD_ToggleTx(ep); } @@ -170,9 +184,9 @@ void USBD_ResetTxToggle(USBD_EP_T ep) * * @retval None */ -void USBD_ResetRxToggle(USBD_EP_T ep) +void USBD_ResetRxToggle(uint8_t ep) { - if(USBD->EP[ep].EP_B.RXDTOG) + if (USBD->EP[ep].EP_B.RXDTOG) { USBD_ToggleRx(ep); } @@ -187,7 +201,7 @@ void USBD_ResetRxToggle(USBD_EP_T ep) * * @retval None */ -void USBD_SetEpAddr(USBD_EP_T ep, uint8_t addr) +void USBD_SetEpAddr(uint8_t ep, uint8_t addr) { __IOM uint32_t reg; @@ -209,7 +223,7 @@ void USBD_SetEpAddr(USBD_EP_T ep, uint8_t addr) * * @retval None */ -void USBD_SetEPTxStatus(USBD_EP_T ep, USBD_EP_STATUS_T status) +void USBD_SetEPTxStatus(uint8_t ep, USBD_EP_STATUS_T status) { __IOM uint32_t reg; @@ -218,7 +232,7 @@ void USBD_SetEPTxStatus(USBD_EP_T ep, USBD_EP_STATUS_T status) reg = USBD->EP[ep].EP; reg &= (uint32_t)(USBD_EP_MASK_DEFAULT | USBD_EP_BIT_TXSTS); - reg ^= (status & USBD_EP_BIT_TXSTS); + reg ^= ((uint32_t)status & (uint32_t)USBD_EP_BIT_TXSTS); USBD->EP[ep].EP = reg; } @@ -232,7 +246,7 @@ void USBD_SetEPTxStatus(USBD_EP_T ep, USBD_EP_STATUS_T status) * * @retval None */ -void USBD_SetEPRxStatus(USBD_EP_T ep, USBD_EP_STATUS_T status) +void USBD_SetEPRxStatus(uint8_t ep, USBD_EP_STATUS_T status) { __IOM uint32_t reg; uint32_t tmp; @@ -249,7 +263,7 @@ void USBD_SetEPRxStatus(USBD_EP_T ep, USBD_EP_STATUS_T status) /*! - * @brief Set EP Rx and Txstatus + * @brief Set EP Tx and Rx status * * @param ep: Endpoint number * @@ -257,7 +271,7 @@ void USBD_SetEPRxStatus(USBD_EP_T ep, USBD_EP_STATUS_T status) * * @retval None */ -void USBD_SetEPRxTxStatus(USBD_EP_T ep, USBD_EP_STATUS_T txStatus, USBD_EP_STATUS_T rxStatus) +void USBD_SetEPTxRxStatus(uint8_t ep, USBD_EP_STATUS_T txStatus, USBD_EP_STATUS_T rxStatus) { __IOM uint32_t reg; uint32_t tmp; @@ -284,18 +298,18 @@ void USBD_SetEPRxTxStatus(USBD_EP_T ep, USBD_EP_STATUS_T txStatus, USBD_EP_STATU * * @retval None */ -void USBD_SetEPRxCnt(USBD_EP_T ep, uint32_t cnt) +void USBD_SetEPRxCnt(uint8_t ep, uint32_t cnt) { - __IOM uint32_t *p; - __IOM uint32_t block = 0; + __IOM uint16_t *p; + __IOM uint16_t block = 0; p = USBD_ReadEPRxCntPointer(ep); - if(cnt > 62) + if (cnt > 62) { block = cnt >> 5; - if(!(cnt & 0x1f)) + if (!(cnt & 0x1f)) { block -= 1; } @@ -306,7 +320,7 @@ void USBD_SetEPRxCnt(USBD_EP_T ep, uint32_t cnt) { block = cnt >> 1; - if(cnt & 0x01) + if (cnt & 0x01) { block += 1; } @@ -326,23 +340,27 @@ void USBD_SetEPRxCnt(USBD_EP_T ep, uint32_t cnt) * * @retval None */ -void USBD_WriteDataToEP(USBD_EP_T ep, uint8_t *wBuf, uint32_t wLen) +void USBD_WriteDataToEP(uint8_t ep, uint8_t *wBuf, uint32_t wLen) { uint32_t i; - uint32_t *addrEP; +#ifdef APM32F0xx_USB + uint16_t *epAddr; + uint16_t tmp; +#else + uint32_t *epAddr; uint32_t tmp; +#endif wLen = (wLen + 1) >> 1; - addrEP = (uint32_t *)USBD_ReadEPTxAddr(ep); - addrEP = (uint32_t *)(((uint32_t)addrEP << 1) + USBD_PMA_ADDR); + epAddr = USBD_ReadEPTxBufferPointer(ep); - for(i = 0; i < wLen; i++) + for (i = 0; i < wLen; i++) { tmp = *wBuf++; tmp = ((*wBuf++) << 8) | tmp; - *addrEP++ = tmp; + *epAddr++ = tmp; } } @@ -357,22 +375,29 @@ void USBD_WriteDataToEP(USBD_EP_T ep, uint8_t *wBuf, uint32_t wLen) * * @retval None */ -void USBD_ReadDataFromEP(USBD_EP_T ep, uint8_t *rBuf, uint32_t rLen) +void USBD_ReadDataFromEP(uint8_t ep, uint8_t *rBuf, uint32_t rLen) { - uint32_t i; - uint32_t *addrEP; - uint32_t tmp; +#ifdef APM32F0xx_USB + uint16_t *epAddr; +#else + uint32_t *epAddr; +#endif + uint32_t i, tmp, cnt; - rLen = (rLen + 1) >> 1; + cnt = rLen >> 1; - addrEP = (uint32_t *)USBD_ReadEPRxAddr(ep); - addrEP = (uint32_t *)(((uint32_t)addrEP << 1) + USBD_PMA_ADDR); + epAddr = USBD_ReadEPRxBufferPointer(ep); - for(i = 0; i < rLen; i++) + for (i = 0; i < cnt; i++) { - tmp = *addrEP++; - *rBuf++ = tmp & 0XFF; - *rBuf++ = (tmp >> 8) & 0xff; + tmp = *epAddr++; + *rBuf++ = tmp & 0xFF; + *rBuf++ = (tmp >> 8) & 0xFF; + } + + if (rLen & 1) + { + tmp = *epAddr; + *rBuf = tmp & 0xFF; } } - diff --git a/bsp/apm32/libraries/Drivers/SConscript b/bsp/apm32/libraries/Drivers/SConscript index aa3dcad878..61cdb7ab9b 100644 --- a/bsp/apm32/libraries/Drivers/SConscript +++ b/bsp/apm32/libraries/Drivers/SConscript @@ -17,6 +17,30 @@ if GetDepend(['RT_USING_SERIAL']): else: src += ['drv_usart.c'] +if GetDepend(['RT_USING_ADC']): + src += ['drv_adc.c'] + +if GetDepend(['RT_USING_DAC']): + src += ['drv_dac.c'] + +if GetDepend('BSP_USING_ONCHIP_RTC'): + src += ['drv_rtc.c'] + +if GetDepend(['RT_USING_I2C']): + src += ['drv_soft_i2c.c'] + +if GetDepend(['RT_USING_SPI']): + src += ['drv_spi.c'] + +if GetDepend(['RT_USING_HWTIMER']): + src += ['drv_hwtimer.c'] + +if GetDepend(['RT_USING_PWM']): + src += ['drv_pwm.c'] + +if GetDepend(['RT_USING_WDT']): + src += ['drv_wdt.c'] + src += ['drv_common.c'] path = [cwd] diff --git a/bsp/apm32/libraries/Drivers/drv_adc.c b/bsp/apm32/libraries/Drivers/drv_adc.c new file mode 100644 index 0000000000..162f5afbdd --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_adc.c @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-03-04 stevetong459 first version + */ + +#include + +#if defined(BSP_USING_ADC1) || defined(BSP_USING_ADC2) || defined(BSP_USING_ADC3) + +#define LOG_TAG "drv.adc" +#define DBG_LVL DBG_INFO +#include + +#define DRV_ADC_CHANNEL_MAX_NUM 14 +#define DRV_ADC_TIME_OUT 0xFFF + +#define _ADC_GET_PORT(pin_num) ((GPIO_T *)(GPIOA_BASE + (0x400u * (((pin_num) >> 4) & 0xFu)))) +#define _ADC_GET_PIN(pin_num) ((uint16_t)(1u << ((pin_num) & 0xFu))) + +struct apm32_adc +{ + const char *name; + ADC_T *adc; + ADC_Config_T adc_config; + rt_base_t channel_pin[DRV_ADC_CHANNEL_MAX_NUM]; + struct rt_adc_device adc_dev; +}; + +static struct apm32_adc adc_config[] = +{ +#ifdef BSP_USING_ADC1 + { + "adc1", + ADC1, + { + ADC_MODE_INDEPENDENT, + DISABLE, + DISABLE, + ADC_EXT_TRIG_CONV_None, + ADC_DATA_ALIGN_RIGHT, + 1 + }, + { + GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), GET_PIN(A, 4), + GET_PIN(A, 5), GET_PIN(A, 6), GET_PIN(A, 7), GET_PIN(B, 0), GET_PIN(B, 1), + GET_PIN(C, 0), GET_PIN(C, 1), GET_PIN(C, 2), GET_PIN(C, 3) + }, + RT_NULL + }, +#endif +#ifdef BSP_USING_ADC2 + { + "adc2", + ADC2, + { + ADC_MODE_INDEPENDENT, + DISABLE, + DISABLE, + ADC_EXT_TRIG_CONV_None, + ADC_DATA_ALIGN_RIGHT, + 1 + }, + { + GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), GET_PIN(A, 4), + GET_PIN(A, 5), GET_PIN(A, 6), GET_PIN(A, 7), GET_PIN(B, 0), GET_PIN(B, 1), + GET_PIN(C, 0), GET_PIN(C, 1), GET_PIN(C, 2), GET_PIN(C, 3) + }, + RT_NULL + }, +#endif +#ifdef BSP_USING_ADC3 + { + "adc3", + ADC3, + { + ADC_MODE_INDEPENDENT, + DISABLE, + DISABLE, + ADC_EXT_TRIG_CONV_None, + ADC_DATA_ALIGN_RIGHT, + 1 + }, + { + GET_PIN(A, 0), GET_PIN(A, 1), GET_PIN(A, 2), GET_PIN(A, 3), GET_PIN(F, 6), + GET_PIN(F, 7), GET_PIN(F, 8), GET_PIN(F, 9), GET_PIN(F, 10) + }, + RT_NULL + }, +#endif +}; + +static rt_err_t _adc_channel_check(struct rt_adc_device *device, rt_uint32_t channel) +{ + struct apm32_adc *adc_cfg = ((struct apm32_adc *)device->parent.user_data); + + if (adc_cfg->adc == ADC3) + { + if (channel <= 8) + { + return RT_EOK; + } + } + else + { + if (channel <= 13) + { + return RT_EOK; + } + } + + LOG_E("channel %d of %s is not supported.", channel, adc_cfg->name); + return -RT_ERROR; +} + +static rt_err_t _adc_gpio_init(struct rt_adc_device *device, rt_uint32_t channel) +{ + struct apm32_adc *adc_cfg = ((struct apm32_adc *)device->parent.user_data); + GPIO_Config_T hw_gpio_config; + + if (_adc_channel_check(device, channel) != RT_EOK) + { + return -RT_ERROR; + } + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA << ((adc_cfg->channel_pin[channel] >> 4) & 0xFu)); + + hw_gpio_config.mode = GPIO_MODE_ANALOG; + hw_gpio_config.pin = _ADC_GET_PIN(adc_cfg->channel_pin[channel]); + GPIO_Config(_ADC_GET_PORT(adc_cfg->channel_pin[channel]), &hw_gpio_config); + + return RT_EOK; +} + +/** + * @brief This function will control the adc to enable or disable. + * + * @param device is a pointer to adc device. + * + * @param channel is the adc channel. + * + * @param enabled is the status to indicate enable or disable. + * + * @return RT_EOK indicates successful enable or disable adc, other value indicates failed. + */ +static rt_err_t _adc_enabled(struct rt_adc_device *device, rt_uint32_t channel, rt_bool_t enabled) +{ + struct apm32_adc *adc_cfg = ((struct apm32_adc *)device->parent.user_data); + + RT_ASSERT(device != RT_NULL); + + if (enabled) + { + if (adc_cfg->adc == ADC1) + { + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1); + } + else if (adc_cfg->adc == ADC2) + { + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC2); + } + else + { + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC3); + } + if (_adc_gpio_init(device, channel) != RT_EOK) + { + return -RT_ERROR; + } + + ADC_Config(adc_cfg->adc, &adc_cfg->adc_config); + + ADC_Enable(adc_cfg->adc); + } + else + { + ADC_Disable(adc_cfg->adc); + } + + return RT_EOK; +} + +/** + * @brief This function will get the adc conversion value. + * + * @param device is a pointer to adc device. + * + * @param channel is the adc channel. + * + * @param value is a pointer to the adc conversion value. + * + * @return RT_EOK indicates successful get adc value, other value indicates failed. + */ +static rt_err_t _adc_get_value(struct rt_adc_device *device, rt_uint32_t channel, rt_uint32_t *value) +{ + struct apm32_adc *adc_cfg = ((struct apm32_adc *)device->parent.user_data); + volatile rt_uint32_t counter = 0; + + RT_ASSERT(device != RT_NULL); + RT_ASSERT(value != RT_NULL); + + if (_adc_channel_check(device, channel) != RT_EOK) + { + return -RT_ERROR; + } + ADC_ConfigRegularChannel(adc_cfg->adc, channel, 1, ADC_SAMPLETIME_13CYCLES5); + + ADC_StartCalibration(adc_cfg->adc); + /* Check the end of ADC calibration */ + while (ADC_ReadCalibrationStartFlag(adc_cfg->adc)) + { + if (++counter > DRV_ADC_TIME_OUT) + { + return RT_ETIMEOUT; + } + } + + ADC_EnableSoftwareStartConv(adc_cfg->adc); + + counter = 0; + while (!ADC_ReadStatusFlag(adc_cfg->adc, ADC_FLAG_EOC)) + { + if (++counter > DRV_ADC_TIME_OUT) + { + return RT_ETIMEOUT; + } + } + + *value = ADC_ReadConversionValue(adc_cfg->adc); + + return RT_EOK; +} + +static const struct rt_adc_ops _adc_ops = +{ + .enabled = _adc_enabled, + .convert = _adc_get_value, +}; + +/** + * @brief ADC initialization function. + * + * @return RT_EOK indicates successful initialization, other value indicates failed; + */ +static int rt_hw_adc_init(void) +{ + rt_err_t result = RT_EOK; + rt_size_t obj_num = sizeof(adc_config) / sizeof(struct apm32_adc); + rt_uint32_t i = 0; + + for (i = 0; i < obj_num; i++) + { + /* register ADC device */ + if (rt_hw_adc_register(&adc_config[i].adc_dev, adc_config[i].name, &_adc_ops, adc_config)) + { + LOG_D("%s init success", adc_config[i].name); + } + else + { + LOG_D("%s init failed", adc_config[i].name); + result = -RT_ERROR; + } + } + + return result; +} +INIT_BOARD_EXPORT(rt_hw_adc_init); + +#endif /* BSP_USING_ADCX */ diff --git a/bsp/apm32/libraries/Drivers/drv_common.c b/bsp/apm32/libraries/Drivers/drv_common.c index dd029321f8..f6caf333db 100644 --- a/bsp/apm32/libraries/Drivers/drv_common.c +++ b/bsp/apm32/libraries/Drivers/drv_common.c @@ -1,22 +1,23 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2020-08-20 Abbcc first version + * 2022-03-04 stevetong459 FINSH_FUNCTION_EXPORT_ALIAS change to MSH_CMD_EXPORT for reboot function. */ #include "drv_common.h" #include "board.h" #ifdef RT_USING_SERIAL -#ifdef RT_USING_SERIAL_V2 -#include "drv_usart_v2.h" -#else -#include "drv_usart.h" -#endif + #ifdef RT_USING_SERIAL_V2 + #include "drv_usart_v2.h" + #else + #include "drv_usart.h" + #endif #endif #ifdef RT_USING_FINSH @@ -25,17 +26,17 @@ static void reboot(uint8_t argc, char **argv) { rt_hw_cpu_reset(); } -FINSH_FUNCTION_EXPORT_ALIAS(reboot, __cmd_reboot, Reboot System); +MSH_CMD_EXPORT(reboot, Reboot System); #endif /* RT_USING_FINSH */ /* SysTick configuration */ void rt_hw_systick_init(void) { - SysTick_Config(RCM_ReadHCLKFreq()/RT_TICK_PER_SECOND); - + SysTick_Config(RCM_ReadHCLKFreq() / RT_TICK_PER_SECOND); + /* AHB clock selected as SysTick clock source. */ SysTick->CTRL |= 0x00000004U; - + NVIC_SetPriority(SysTick_IRQn, 0xFF); } diff --git a/bsp/apm32/libraries/Drivers/drv_common.h b/bsp/apm32/libraries/Drivers/drv_common.h index 5218b1189b..9e5dedddac 100644 --- a/bsp/apm32/libraries/Drivers/drv_common.h +++ b/bsp/apm32/libraries/Drivers/drv_common.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -14,7 +14,7 @@ #include #include #ifdef RT_USING_DEVICE -#include + #include #endif diff --git a/bsp/apm32/libraries/Drivers/drv_dac.c b/bsp/apm32/libraries/Drivers/drv_dac.c new file mode 100644 index 0000000000..6c49a47ea3 --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_dac.c @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-03-04 stevetong459 first version + */ + +#include + +#if defined(BSP_USING_DAC1) + +#define LOG_TAG "drv.dac" +#define DBG_LVL DBG_INFO +#include + +struct apm32_dac +{ + const char *name; + DAC_T *dac; + DAC_Config_T dac_conf; + struct rt_dac_device dac_dev; +}; + +static struct apm32_dac dac_config[] = +{ +#if defined(BSP_USING_DAC1) + { + "dac1", + DAC, + { + DAC_TRIGGER_SOFT, + DAC_OUTPUT_BUFFER_DISABLE, + DAC_WAVE_GENERATION_NONE, + DAC_TRIANGLE_AMPLITUDE_4095, + }, + RT_NULL + } +#endif +}; + +/** + * @brief This function will enable dac. + * + * @param device is a pointer to dac device. + * + * @param channel is the dac channel. + * + * @return RT_EOK indicates successful enable dac, other value indicates failed. + */ +static rt_err_t _dac_enabled(struct rt_dac_device *device, rt_uint32_t channel) +{ + GPIO_Config_T GPIO_ConfigStruct; + struct apm32_dac *cfg = (struct apm32_dac *)device->parent.user_data; + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA); + GPIO_ConfigStruct.mode = GPIO_MODE_ANALOG; + + if (channel == 1) + { + GPIO_ConfigStruct.pin = GPIO_PIN_4; + GPIO_Config(GPIOA, &GPIO_ConfigStruct); + + DAC_Config(DAC_CHANNEL_1, &cfg->dac_conf); + DAC_Enable(DAC_CHANNEL_1); + } + else if (channel == 2) + { + GPIO_ConfigStruct.pin = GPIO_PIN_5; + GPIO_Config(GPIOA, &GPIO_ConfigStruct); + + DAC_Config(DAC_CHANNEL_2, &cfg->dac_conf); + DAC_Enable(DAC_CHANNEL_2); + } + else + { + LOG_E("dac channel must be 1 or 2."); + return -RT_ERROR; + } + + return RT_EOK; +} + +/** + * @brief This function will disable dac. + * + * @param device is a pointer to dac device. + * + * @param channel is the dac channel. + * + * @return RT_EOK indicates successful disable dac, other value indicates failed. + */ +static rt_err_t _dac_disabled(struct rt_dac_device *device, rt_uint32_t channel) +{ + if (channel == 1) + { + DAC_Disable(DAC_CHANNEL_1); + } + else if (channel == 2) + { + DAC_Disable(DAC_CHANNEL_2); + } + else + { + LOG_E("dac channel must be 1 or 2."); + return -RT_ERROR; + } + + return RT_EOK; +} + +/** + * @brief This function will set the vaule of dac. + * + * @param device is a pointer to dac device. + * + * @param channel is the dac channel. + * + * @param value is a pointer to dac value to be convert. + * + * @return RT_EOK indicates successful set dac value, other value indicates failed. + */ +static rt_err_t _dac_set_value(struct rt_dac_device *device, rt_uint32_t channel, rt_uint32_t *value) +{ + if (channel == 1) + { + DAC_ConfigChannel1Data(DAC_ALIGN_12BIT_R, *value); + DAC_EnableSoftwareTrigger(DAC_CHANNEL_1); + } + else if (channel == 2) + { + DAC_ConfigChannel2Data(DAC_ALIGN_12BIT_R, *value); + DAC_EnableSoftwareTrigger(DAC_CHANNEL_2); + } + else + { + LOG_E("dac channel must be 1 or 2."); + return -RT_ERROR; + } + + return RT_EOK; +} + +static const struct rt_dac_ops _dac_ops = +{ + .disabled = _dac_disabled, + .enabled = _dac_enabled, + .convert = _dac_set_value, +}; + +/** + * @brief DAC initialization function. + * + * @return RT_EOK indicates successful initialization, other value indicates failed; + */ +static int rt_hw_dac_init(void) +{ + rt_err_t result = RT_EOK; + rt_size_t obj_num = sizeof(dac_config) / sizeof(struct apm32_dac); + rt_uint32_t i = 0; + + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_DAC); + + for (i = 0; i < obj_num; i++) + { + /* register dac device */ + if (rt_hw_dac_register(&dac_config[i].dac_dev, dac_config[i].name, &_dac_ops, dac_config) == RT_EOK) + { + LOG_D("%s init success", dac_config[i].name); + } + else + { + LOG_E("%s init failed", dac_config[i].name); + result = -RT_ERROR; + } + } + + return result; +} +INIT_DEVICE_EXPORT(rt_hw_dac_init); + +#endif /* BSP_USING_DACX */ diff --git a/bsp/apm32/libraries/Drivers/drv_gpio.c b/bsp/apm32/libraries/Drivers/drv_gpio.c index 7f8413d7fb..d45f2f71b3 100644 --- a/bsp/apm32/libraries/Drivers/drv_gpio.c +++ b/bsp/apm32/libraries/Drivers/drv_gpio.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * diff --git a/bsp/apm32/libraries/Drivers/drv_gpio.h b/bsp/apm32/libraries/Drivers/drv_gpio.h index 1da4fdb97b..6278d1924d 100644 --- a/bsp/apm32/libraries/Drivers/drv_gpio.h +++ b/bsp/apm32/libraries/Drivers/drv_gpio.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * diff --git a/bsp/apm32/libraries/Drivers/drv_hwtimer.c b/bsp/apm32/libraries/Drivers/drv_hwtimer.c new file mode 100644 index 0000000000..3cf7d1580b --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_hwtimer.c @@ -0,0 +1,402 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-03-04 stevetong459 first version + */ + +#include + +#define LOG_TAG "drv.hwtimer" +#define DBG_LVL DBG_INFO +#include + +#ifdef RT_USING_HWTIMER + +static const struct rt_hwtimer_info _info = +{ + .maxfreq = 1000000, + .minfreq = 2000, + .maxcnt = 0xFFFF, + .cntmode = HWTIMER_CNTMODE_UP, +}; + +/* apm32 config class */ +struct apm32_timer +{ + char *name; + TMR_T *tmr; + IRQn_Type irqn; + rt_hwtimer_t device; +}; + +enum +{ +#ifdef BSP_USING_TMR1 + TMR1_INDEX, +#endif +#ifdef BSP_USING_TMR2 + TMR2_INDEX, +#endif +#ifdef BSP_USING_TMR3 + TMR3_INDEX, +#endif +#ifdef BSP_USING_TMR4 + TMR4_INDEX, +#endif +#ifdef BSP_USING_TMR5 + TMR5_INDEX, +#endif +#ifdef BSP_USING_TMR6 + TMR6_INDEX, +#endif +#ifdef BSP_USING_TMR7 + TMR7_INDEX, +#endif +#ifdef BSP_USING_TMR8 + TMR8_INDEX, +#endif +}; + +static struct apm32_timer tmr_config[] = +{ +#ifdef BSP_USING_TMR1 + { + "timer1", + TMR1, + TMR1_UP_IRQn, + }, +#endif +#ifdef BSP_USING_TMR2 + { + "timer2", + TMR2, + TMR2_IRQn, + }, +#endif +#ifdef BSP_USING_TMR3 + { + "timer3", + TMR3, + TMR3_IRQn, + }, +#endif +#ifdef BSP_USING_TMR4 + { + "timer4", + TMR4, + TMR4_IRQn, + }, +#endif +#ifdef BSP_USING_TMR5 + { + "timer5", + TMR5, + TMR5_IRQn, + }, +#endif +#ifdef BSP_USING_TMR6 + { + "timer6", + TMR6, + TMR6_IRQn, + }, +#endif +#ifdef BSP_USING_TMR7 + { + "timer7", + TMR7, + TMR7_IRQn, + }, +#endif +#ifdef BSP_USING_TMR8 + { + "timer8", + TMR8, + TMR8_UP_IRQn, + }, +#endif +}; + +static rt_uint32_t _hwtimer_clock_get(TMR_T *tmr) +{ + uint32_t pclk1; + + RCM_ReadPCLKFreq(&pclk1, NULL); + + return (rt_uint32_t)(pclk1 * ((RCM->CFG_B.APB1PSC != RCM_APB_DIV_1) ? 2 : 1)); +} + +static void _hwtimer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +{ + TMR_BaseConfig_T base_config; + uint32_t prescaler = 0; + struct apm32_timer *timer_config; + + RT_ASSERT(timer != RT_NULL); + + if (state) + { + timer_config = (struct apm32_timer *)timer->parent.user_data; + if (timer_config->tmr == TMR1) + { + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR1); + } + else if (timer_config->tmr == TMR8) + { + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR8); + } + else if (timer_config->tmr == TMR2) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR2); + } + else if (timer_config->tmr == TMR3) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR3); + } + else if (timer_config->tmr == TMR4) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR4); + } + else if (timer_config->tmr == TMR5) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR5); + } + else if (timer_config->tmr == TMR6) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR6); + } + else if (timer_config->tmr == TMR7) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR7); + } + + prescaler = (uint32_t)(_hwtimer_clock_get(timer_config->tmr) / 10000) - 1; + + base_config.period = 10000 - 1; + base_config.division = prescaler; + base_config.clockDivision = TMR_CLOCK_DIV_1; + if (timer->info->cntmode == HWTIMER_CNTMODE_UP) + { + base_config.countMode = TMR_COUNTER_MODE_UP; + } + else + { + base_config.countMode = TMR_COUNTER_MODE_DOWN; + } + base_config.repetitionCounter = 0; + TMR_ConfigTimeBase(timer_config->tmr, &base_config); + + /* set the TIMx priority */ + NVIC_EnableIRQRequest(timer_config->irqn, 3, 0); + + /* clear update flag */ + TMR_ClearStatusFlag(timer_config->tmr, TMR_FLAG_UPDATE); + /* enable update request source */ + TMR_ConfigUpdateRequest(timer_config->tmr, TMR_UPDATE_SOURCE_REGULAR); + LOG_D("%s init success", timer_config->name); + } +} + +static rt_err_t _hwtimer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_t opmode) +{ + rt_err_t result = RT_EOK; + struct apm32_timer *timer_config = RT_NULL; + + RT_ASSERT(timer != RT_NULL); + + timer_config = (struct apm32_timer *)timer->parent.user_data; + + /* set timer_config counter */ + TMR_ConfigCounter(timer_config->tmr, 0); + /* set timer_config autoReload */ + TMR_ConfigAutoreload(timer_config->tmr, t - 1); + + if (opmode == HWTIMER_MODE_ONESHOT) + { + /* set timer to single mode */ + TMR_ConfigSinglePulseMode(timer_config->tmr, TMR_SPM_SINGLE); + } + else + { + TMR_ConfigSinglePulseMode(timer_config->tmr, TMR_SPM_REPETITIVE); + } + + TMR_EnableInterrupt(timer_config->tmr, TMR_INT_UPDATE); + + if (timer_config->tmr == TMR1 || timer_config->tmr == TMR8 || timer_config->tmr == TMR2 || + timer_config->tmr == TMR3 || timer_config->tmr == TMR4 || timer_config->tmr == TMR5) + { + if (timer_config->tmr->SMCTRL_B.SMFSEL != TMR_SLAVE_MODE_TRIGGER) + { + TMR_Enable(timer_config->tmr); + result = -RT_EOK; + } + } + else + { + TMR_Enable(timer_config->tmr); + result = -RT_EOK; + } + return result; +} + +static void _hwtimer_stop(rt_hwtimer_t *timer) +{ + struct apm32_timer *timer_config = RT_NULL; + RT_ASSERT(timer != RT_NULL); + timer_config = (struct apm32_timer *)timer->parent.user_data; + + TMR_DisableInterrupt(timer_config->tmr, TMR_INT_UPDATE); + TMR_Enable(timer_config->tmr); + TMR_ConfigCounter(timer_config->tmr, 0); +} + +static rt_err_t _hwtimer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +{ + struct apm32_timer *timer_config = RT_NULL; + rt_err_t result = RT_EOK; + rt_uint32_t freq; + rt_uint16_t val; + + RT_ASSERT(timer != RT_NULL); + RT_ASSERT(arg != RT_NULL); + + timer_config = (struct apm32_timer *)timer->parent.user_data; + + switch (cmd) + { + case HWTIMER_CTRL_FREQ_SET: + /* set timer frequence */ + freq = *((rt_uint32_t *)arg); + + val = _hwtimer_clock_get(timer_config->tmr) / freq; + + TMR_ConfigPrescaler(timer_config->tmr, val - 1, TMR_PSC_RELOAD_IMMEDIATE); + break; + default: + result = -RT_ENOSYS; + break; + } + return result; +} + +static rt_uint32_t _hwtimer_counter_get(rt_hwtimer_t *timer) +{ + struct apm32_timer *timer_config = RT_NULL; + RT_ASSERT(timer != RT_NULL); + timer_config = (struct apm32_timer *)timer->parent.user_data; + + return timer_config->tmr->CNT; +} + +static const struct rt_hwtimer_ops _hwtimer_ops = +{ + .init = _hwtimer_init, + .start = _hwtimer_start, + .stop = _hwtimer_stop, + .count_get = _hwtimer_counter_get, + .control = _hwtimer_ctrl, +}; + +#ifdef BSP_USING_TMR1 +void TMR1_UP_IRQHandler(void) +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&tmr_config[TMR1_INDEX].device); + TMR_ClearIntFlag(TMR1, TMR_INT_UPDATE); + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TMR2 +void TMR2_IRQHandler(void) +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&tmr_config[TMR2_INDEX].device); + TMR_ClearIntFlag(TMR2, TMR_INT_UPDATE); + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TMR3 +void TMR3_IRQHandler(void) +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&tmr_config[TMR3_INDEX].device); + TMR_ClearIntFlag(TMR3, TMR_INT_UPDATE); + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TMR4 +void TMR4_IRQHandler(void) +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&tmr_config[TMR4_INDEX].device); + TMR_ClearIntFlag(TMR4, TMR_INT_UPDATE); + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TMR5 +void TMR5_IRQHandler(void) +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&tmr_config[TMR5_INDEX].device); + TMR_ClearIntFlag(TMR5, TMR_INT_UPDATE); + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TMR6 +void TMR6_IRQHandler(void) +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&tmr_config[TMR6_INDEX].device); + TMR_ClearIntFlag(TMR6, TMR_INT_UPDATE); + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TMR7 +void TMR7_IRQHandler(void) +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&tmr_config[TMR7_INDEX].device); + TMR_ClearIntFlag(TMR7, TMR_INT_UPDATE); + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TMR8 +void TMR8_UP_IRQHandler(void) +{ + rt_interrupt_enter(); + rt_device_hwtimer_isr(&tmr_config[TMR8_INDEX].device); + TMR_ClearIntFlag(TMR8, TMR_INT_UPDATE); + rt_interrupt_leave(); +} +#endif + +static int rt_hw_hwtimer_init(void) +{ + int i = 0; + int result = RT_EOK; + + for (i = 0; i < sizeof(tmr_config) / sizeof(tmr_config[0]); i++) + { + tmr_config[i].device.info = &_info; + tmr_config[i].device.ops = &_hwtimer_ops; + if (rt_device_hwtimer_register(&tmr_config[i].device, tmr_config[i].name, &tmr_config[i]) == RT_EOK) + { + LOG_D("%s register success", tmr_config[i].name); + } + else + { + LOG_E("%s register failed", tmr_config[i].name); + result = -RT_ERROR; + } + } + + return result; +} +INIT_BOARD_EXPORT(rt_hw_hwtimer_init); + +#endif /* RT_USING_HWTIMER */ diff --git a/bsp/apm32/libraries/Drivers/drv_pwm.c b/bsp/apm32/libraries/Drivers/drv_pwm.c new file mode 100644 index 0000000000..5ddef39e42 --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_pwm.c @@ -0,0 +1,484 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-03-04 stevetong459 first version + */ + +#include + +#ifdef RT_USING_PWM +#include + +#define LOG_TAG "drv.pwm" +#define DBG_LVL DBG_INFO +#include + +#define MAX_PERIOD 65535 +#define MIN_PERIOD 3 +#define MIN_PULSE 2 + +#define _PWM_GPIO_INIT(port_num, pin_num) \ +do \ +{ \ + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIO##port_num); \ + gpio_config->pin = GPIO_PIN_##pin_num; \ + gpio_config->mode = GPIO_MODE_AF_PP; \ + gpio_config->speed = GPIO_SPEED_50MHz; \ + GPIO_Config(GPIO##port_num, gpio_config); \ +} while (0) + +enum +{ +#ifdef BSP_USING_PWM1 + PWM1_INDEX, +#endif +#ifdef BSP_USING_PWM2 + PWM2_INDEX, +#endif +#ifdef BSP_USING_PWM3 + PWM3_INDEX, +#endif +#ifdef BSP_USING_PWM4 + PWM4_INDEX, +#endif +#ifdef BSP_USING_PWM5 + PWM5_INDEX, +#endif +#ifdef BSP_USING_PWM8 + PWM8_INDEX, +#endif +}; + +struct apm32_pwm +{ + char *name; + TMR_T *tmr; + rt_uint8_t channel; + struct rt_device_pwm pwm_device; +}; + +static struct apm32_pwm pwm_config[] = +{ +#ifdef BSP_USING_PWM1 + { + "pwm1", + TMR1, + 0, + }, +#endif +#ifdef BSP_USING_PWM2 + { + "pwm2", + TMR2, + 0, + }, +#endif +#ifdef BSP_USING_PWM3 + { + "pwm3", + TMR3, + 0, + }, +#endif +#ifdef BSP_USING_PWM4 + { + "pwm4", + TMR4, + 0, + }, +#endif +#ifdef BSP_USING_PWM5 + { + "pwm5", + TMR5, + 0, + }, +#endif +#ifdef BSP_USING_PWM8 + { + "pwm8", + TMR8, + 0, + }, +#endif +}; + +static void _pwm_channel_init(GPIO_Config_T *gpio_config) +{ +#ifdef BSP_USING_PWM1_CH1 + pwm_config[PWM1_INDEX].channel |= 1 << 0; + _PWM_GPIO_INIT(A, 8); +#endif +#ifdef BSP_USING_PWM1_CH2 + pwm_config[PWM1_INDEX].channel |= 1 << 1; + _PWM_GPIO_INIT(A, 9); +#endif +#ifdef BSP_USING_PWM1_CH3 + pwm_config[PWM1_INDEX].channel |= 1 << 2; + _PWM_GPIO_INIT(A, 10); +#endif +#ifdef BSP_USING_PWM1_CH4 + pwm_config[PWM1_INDEX].channel |= 1 << 3; + _PWM_GPIO_INIT(A, 11); +#endif +#ifdef BSP_USING_PWM2_CH1 + pwm_config[PWM2_INDEX].channel |= 1 << 0; + _PWM_GPIO_INIT(A, 0); +#endif +#ifdef BSP_USING_PWM2_CH2 + pwm_config[PWM2_INDEX].channel |= 1 << 1; + _PWM_GPIO_INIT(A, 1); +#endif +#ifdef BSP_USING_PWM2_CH3 + pwm_config[PWM2_INDEX].channel |= 1 << 2; + _PWM_GPIO_INIT(A, 2); +#endif +#ifdef BSP_USING_PWM2_CH4 + pwm_config[PWM2_INDEX].channel |= 1 << 3; + _PWM_GPIO_INIT(A, 3); +#endif +#ifdef BSP_USING_PWM3_CH1 + pwm_config[PWM3_INDEX].channel |= 1 << 0; + GPIO_ConfigPinRemap(GPIO_FULL_REMAP_TMR3); + _PWM_GPIO_INIT(C, 6); +#endif +#ifdef BSP_USING_PWM3_CH2 + pwm_config[PWM3_INDEX].channel |= 1 << 1; + GPIO_ConfigPinRemap(GPIO_FULL_REMAP_TMR3); + _PWM_GPIO_INIT(C, 7); +#endif +#ifdef BSP_USING_PWM3_CH3 + pwm_config[PWM3_INDEX].channel |= 1 << 2; + GPIO_ConfigPinRemap(GPIO_FULL_REMAP_TMR3); + _PWM_GPIO_INIT(C, 8); +#endif +#ifdef BSP_USING_PWM3_CH4 + pwm_config[PWM3_INDEX].channel |= 1 << 3; + GPIO_ConfigPinRemap(GPIO_FULL_REMAP_TMR3); + _PWM_GPIO_INIT(C, 9); +#endif +#ifdef BSP_USING_PWM4_CH1 + pwm_config[PWM4_INDEX].channel |= 1 << 0; + _PWM_GPIO_INIT(B, 6); +#endif +#ifdef BSP_USING_PWM4_CH2 + pwm_config[PWM4_INDEX].channel |= 1 << 1; + _PWM_GPIO_INIT(B, 7); +#endif +#ifdef BSP_USING_PWM4_CH3 + pwm_config[PWM4_INDEX].channel |= 1 << 2; + _PWM_GPIO_INIT(B, 8); +#endif +#ifdef BSP_USING_PWM4_CH4 + pwm_config[PWM4_INDEX].channel |= 1 << 3; + _PWM_GPIO_INIT(B, 9); +#endif +#ifdef BSP_USING_PWM5_CH1 + pwm_config[PWM5_INDEX].channel |= 1 << 0; + _PWM_GPIO_INIT(A, 0); +#endif +#ifdef BSP_USING_PWM5_CH2 + pwm_config[PWM5_INDEX].channel |= 1 << 1; + _PWM_GPIO_INIT(A, 1); +#endif +#ifdef BSP_USING_PWM5_CH3 + pwm_config[PWM5_INDEX].channel |= 1 << 2; + _PWM_GPIO_INIT(A, 2); +#endif +#ifdef BSP_USING_PWM5_CH4 + pwm_config[PWM5_INDEX].channel |= 1 << 3; + _PWM_GPIO_INIT(A, 3); +#endif +#ifdef BSP_USING_PWM8_CH1 + pwm_config[PWM8_INDEX].channel |= 1 << 0; + _PWM_GPIO_INIT(C, 6); +#endif +#ifdef BSP_USING_PWM8_CH2 + pwm_config[PWM8_INDEX].channel |= 1 << 1; + _PWM_GPIO_INIT(C, 7); +#endif +#ifdef BSP_USING_PWM8_CH3 + pwm_config[PWM8_INDEX].channel |= 1 << 2; + _PWM_GPIO_INIT(C, 8); +#endif +#ifdef BSP_USING_PWM8_CH4 + pwm_config[PWM8_INDEX].channel |= 1 << 3; + _PWM_GPIO_INIT(C, 9); +#endif +} + +static rt_err_t _pwm_hw_init(struct apm32_pwm *device) +{ + rt_err_t result = RT_EOK; + TMR_T *tmr = RT_NULL; + TMR_BaseConfig_T base_config; + TMR_OCConfig_T oc_config; + + RT_ASSERT(device != RT_NULL); + + tmr = (TMR_T *)device->tmr; + + if (tmr == TMR1) + { + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR1); + } + else if (tmr == TMR8) + { + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR8); + } + else if (tmr == TMR2) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR2); + } + else if (tmr == TMR3) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR3); + } + else if (tmr == TMR4) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR4); + } + else if (tmr == TMR5) + { + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_TMR5); + } + + /* configure the tmrer to pwm mode */ + base_config.division = 0; + base_config.countMode = TMR_COUNTER_MODE_UP; + base_config.period = 0; + base_config.clockDivision = TMR_CLOCK_DIV_1; + TMR_ConfigTimeBase(tmr, &base_config); + + TMR_SelectOutputTrigger(tmr, TMR_TRGO_SOURCE_RESET); + TMR_DisableMasterSlaveMode(tmr); + + oc_config.mode = TMR_OC_MODE_PWM1; + oc_config.pulse = 0; + oc_config.polarity = TMR_OC_POLARITY_HIGH; + oc_config.nIdleState = TMR_OC_NIDLE_STATE_RESET; + oc_config.idleState = TMR_OC_IDLE_STATE_RESET; + oc_config.outputState = TMR_OC_STATE_ENABLE; + + /* config pwm channel */ + if (device->channel & 0x01) + { + TMR_ConfigOC1(tmr, &oc_config); + } + + if (device->channel & 0x02) + { + TMR_ConfigOC2(tmr, &oc_config); + } + + if (device->channel & 0x04) + { + TMR_ConfigOC3(tmr, &oc_config); + } + + if (device->channel & 0x08) + { + TMR_ConfigOC4(tmr, &oc_config); + } + + /* enable update request source */ + TMR_ConfigUpdateRequest(tmr, TMR_UPDATE_SOURCE_REGULAR); + + return result; +} + +static rt_uint32_t _pwm_timer_clock_get(TMR_T *tmr) +{ + uint32_t pclk1; + + RCM_ReadPCLKFreq(&pclk1, NULL); + + return (rt_uint32_t)(pclk1 * ((RCM->CFG_B.APB1PSC != RCM_APB_DIV_1) ? 2 : 1)); +} + +static rt_err_t _pwm_enable(TMR_T *tmr, struct rt_pwm_configuration *configuration, rt_bool_t enable) +{ + rt_uint32_t channel = (configuration->channel - 1) << 2; + + if (enable) + { + if (configuration->complementary) + { + TMR_EnableCCxNChannel(tmr, (TMR_CHANNEL_T)(0x01 << (channel & 0x1FU))); + } + else + { + TMR_EnableCCxChannel(tmr, (TMR_CHANNEL_T)(0x01 << (channel & 0x1FU))); + } + if (tmr == TMR1 || tmr == TMR8) + { + TMR_EnablePWMOutputs(tmr); + } + TMR_Enable(tmr); + } + else + { + if (configuration->complementary) + { + TMR_DisableCCxNChannel(tmr, (TMR_CHANNEL_T)(0x01 << (channel & 0x1FU))); + } + else + { + TMR_DisableCCxChannel(tmr, (TMR_CHANNEL_T)(0x01 << (channel & 0x1FU))); + } + if (tmr == TMR1 || tmr == TMR8) + { + TMR_DisablePWMOutputs(tmr); + } + TMR_Disable(tmr); + } + + return RT_EOK; +} + +static rt_err_t _pwm_get(TMR_T *tmr, struct rt_pwm_configuration *configuration) +{ + /* Converts the channel number to the channel number of library */ + rt_uint32_t channel = (configuration->channel - 1) << 2; + rt_uint64_t timer_clock; + rt_uint32_t timer_reload, timer_psc; + + timer_clock = _pwm_timer_clock_get(tmr); + + if (tmr->CTRL1_B.CLKDIV == TMR_CLOCK_DIV_2) + { + timer_clock <<= 1; + } + else if (tmr->CTRL1_B.CLKDIV == TMR_CLOCK_DIV_4) + { + timer_clock <<= 2; + } + + uint32_t temp; + temp = (uint32_t)tmr; + temp += (uint32_t)(0x34 + channel); + /* Convert nanosecond to frequency and duty cycle.*/ + timer_clock /= 1000000UL; + + timer_reload = tmr->AUTORLD; + timer_psc = tmr->PSC; + configuration->period = (timer_reload + 1) * (timer_psc + 1) * 1000UL / timer_clock; + configuration->pulse = ((*(__IO uint32_t *)temp) + 1) * (timer_psc + 1) * 1000UL / timer_clock; + + return RT_EOK; +} + +static rt_err_t _pwm_set(TMR_T *tmr, struct rt_pwm_configuration *configuration) +{ + rt_uint32_t period, pulse; + rt_uint64_t timer_clock, psc; + rt_uint32_t channel = 0x04 * (configuration->channel - 1); + uint32_t temp = (uint32_t)tmr; + + timer_clock = _pwm_timer_clock_get(tmr); + + /* Convert nanosecond to frequency and duty cycle. */ + timer_clock /= 1000000UL; + period = (unsigned long long)configuration->period * timer_clock / 1000ULL ; + psc = period / MAX_PERIOD + 1; + period = period / psc; + tmr->PSC = (uint16_t)(psc - 1); + + if (period < MIN_PERIOD) + { + period = MIN_PERIOD; + } + tmr->AUTORLD = (uint16_t)(period - 1); + + pulse = (unsigned long long)configuration->pulse * timer_clock / psc / 1000ULL; + if (pulse < MIN_PULSE) + { + pulse = MIN_PULSE; + } + else if (pulse > period) + { + pulse = period; + } + + temp += (uint32_t)(0x34 + channel); + *(__IO uint32_t *)temp = pulse - 1; + + tmr->CNT = 0; + + /* Update frequency value */ + TMR_GenerateEvent(tmr, TMR_EVENT_UPDATE); + + return RT_EOK; +} + +static rt_err_t _pwm_control(struct rt_device_pwm *device, int cmd, void *arg) +{ + struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg; + TMR_T *tmr = (TMR_T *)device->parent.user_data; + + switch (cmd) + { + case PWMN_CMD_ENABLE: + configuration->complementary = RT_TRUE; + case PWM_CMD_ENABLE: + return _pwm_enable(tmr, configuration, RT_TRUE); + case PWMN_CMD_DISABLE: + configuration->complementary = RT_FALSE; + case PWM_CMD_DISABLE: + return _pwm_enable(tmr, configuration, RT_FALSE); + case PWM_CMD_SET: + return _pwm_set(tmr, configuration); + case PWM_CMD_GET: + return _pwm_get(tmr, configuration); + default: + return RT_EINVAL; + } +} + +static const struct rt_pwm_ops _pwm_ops = +{ + _pwm_control +}; + +static int rt_hw_pwm_init(void) +{ + rt_uint32_t i = 0; + rt_err_t result = RT_EOK; + GPIO_Config_T gpio_config; + + _pwm_channel_init(&gpio_config); + + for (i = 0; i < sizeof(pwm_config) / sizeof(pwm_config[0]); i++) + { + /* pwm init */ + if (_pwm_hw_init(&pwm_config[i]) != RT_EOK) + { + LOG_E("%s init failed", pwm_config[i].name); + return -RT_ERROR; + } + else + { + LOG_D("%s init success", pwm_config[i].name); + + /* register pwm device */ + if (rt_device_pwm_register(&pwm_config[i].pwm_device, pwm_config[i].name, &_pwm_ops, pwm_config[i].tmr) == RT_EOK) + { + LOG_D("%s register success", pwm_config[i].name); + } + else + { + LOG_E("%s register failed", pwm_config[i].name); + result = -RT_ERROR; + } + } + } + + return result; +} +INIT_DEVICE_EXPORT(rt_hw_pwm_init); + +#endif /* RT_USING_PWM */ diff --git a/bsp/apm32/libraries/Drivers/drv_rtc.c b/bsp/apm32/libraries/Drivers/drv_rtc.c new file mode 100644 index 0000000000..5eee7d29ed --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_rtc.c @@ -0,0 +1,170 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-03-04 stevetong459 first version + */ + +#include "board.h" +#include + +#ifdef BSP_USING_ONCHIP_RTC + +#define LOG_TAG "drv.rtc" +#define DBG_LVL DBG_INFO +#include + +#ifndef LSI_VALUE + #define LSI_VALUE ((uint32_t)40000) +#endif +#ifndef LSE_VALUE + #define LSE_VALUE ((uint32_t)32768) +#endif + +#define DRV_RTC_TIME_OUT 0xFFF + +static rt_rtc_dev_t apm32_rtc_dev; + +/** + * @brief This function will initialize the rtc on chip. + * + * @return RT_EOK indicates successful initialize, other value indicates failed; + */ +static rt_err_t _rtc_init(void) +{ + volatile rt_uint32_t counter = 0; + + /* Enable RTC Clock */ + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_PMU | RCM_APB1_PERIPH_BAKR); + PMU_EnableBackupAccess(); + + /* Config RTC clock */ +#ifdef BSP_RTC_USING_LSI + RCM_EnableLSI(); + while (!RCM_ReadStatusFlag(RCM_FLAG_LSIRDY)) + { + if (++counter > DRV_RTC_TIME_OUT) + { + return RT_ETIMEOUT; + } + } + RCM_ConfigRTCCLK(RCM_RTCCLK_LSI); +#else + RCM_ConfigLSE(RCM_LSE_OPEN); + while (!RCM_ReadStatusFlag(RCM_FLAG_LSERDY)) + { + if (++counter > DRV_RTC_TIME_OUT) + { + return RT_ETIMEOUT; + } + } + RCM_ConfigRTCCLK(RCM_RTCCLK_LSE); +#endif + + RCM_EnableRTCCLK(); + + RTC_WaitForSynchor(); + + counter = 0; + while (!RTC_ReadStatusFlag(RTC_FLAG_OC)) + { + if (++counter > DRV_RTC_TIME_OUT) + { + return RT_ETIMEOUT; + } + } + + RTC_EnableConfigMode(); + + RTC_ClearStatusFlag(RTC_FLAG_OVR | RTC_FLAG_ALR | RTC_FLAG_SEC); + +#ifdef BSP_RTC_USING_LSI + RTC_ConfigPrescaler(LSI_VALUE - 1); +#else + RTC_ConfigPrescaler(LSE_VALUE - 1); +#endif + + return RT_EOK; +} + +/** + * @brief This function will initialize the rtc on chip. + * + * @return RT_EOK indicates successful initialize, other value indicates failed; + */ +static rt_err_t _rtc_get_secs(void *args) +{ + volatile rt_uint32_t counter = 0; + + while (!RTC_ReadStatusFlag(RTC_FLAG_OC)) + { + if (++counter > DRV_RTC_TIME_OUT) + { + return RT_ETIMEOUT; + } + } + + *(rt_uint32_t *) args = RTC_ReadCounter(); + + return RT_EOK; +} + +static rt_err_t _rtc_set_secs(void *args) +{ + volatile rt_uint32_t counter = 0; + + while (!RTC_ReadStatusFlag(RTC_FLAG_OC)) + { + if (++counter > DRV_RTC_TIME_OUT) + { + return RT_ETIMEOUT; + } + } + + RTC_ConfigCounter(*(rt_uint32_t *)args); + + return RT_EOK; +} + + +static const struct rt_rtc_ops _rtc_ops = +{ + _rtc_init, + _rtc_get_secs, + _rtc_set_secs, + RT_NULL, + RT_NULL, + RT_NULL, + RT_NULL, +}; + +/** + * @brief RTC initialization function. + * + * @return RT_EOK indicates successful initialization, other value indicates failed; + */ +static int rt_hw_rtc_init(void) +{ + rt_err_t result = RT_EOK; + + apm32_rtc_dev.ops = &_rtc_ops; + + if (rt_hw_rtc_register(&apm32_rtc_dev, "rtc", RT_DEVICE_FLAG_RDWR, RT_NULL) != RT_EOK) + { + LOG_E("rtc init failed"); + result = RT_ERROR; + } + else + { + LOG_D("rtc init success"); + } + + return result; +} + +INIT_DEVICE_EXPORT(rt_hw_rtc_init); + +#endif /* BSP_USING_ONCHIP_RTC */ diff --git a/bsp/apm32/libraries/Drivers/drv_soft_i2c.c b/bsp/apm32/libraries/Drivers/drv_soft_i2c.c new file mode 100644 index 0000000000..8911da89ad --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_soft_i2c.c @@ -0,0 +1,244 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-03-04 stevetong459 first version + */ + +#include "board.h" +#include + +#ifdef RT_USING_I2C + +#define LOG_TAG "drv.i2c" +#define DBG_LVL DBG_INFO +#include + +#if !defined(BSP_USING_I2C1) && !defined(BSP_USING_I2C2) && !defined(BSP_USING_I2C3) && !defined(BSP_USING_I2C4) + #error "Please define at least one BSP_USING_I2Cx" +#endif + +/* apm32 i2c config class */ +struct apm32_soft_i2c_config +{ + rt_uint8_t scl_pin; + rt_uint8_t sda_pin; + const char *bus_name; +}; + +/* apm32 i2c dirver class */ +struct apm32_soft_i2c +{ + struct rt_i2c_bit_ops ops; + struct rt_i2c_bus_device i2c2_bus; +}; + +static const struct apm32_soft_i2c_config soft_i2c_config[] = +{ +#ifdef BSP_USING_I2C1 + { + BSP_I2C1_SCL_PIN, + BSP_I2C1_SDA_PIN, + "i2c1" + } +#endif +#ifdef BSP_USING_I2C2 + { + BSP_I2C2_SCL_PIN, + BSP_I2C2_SDA_PIN, + "i2c2" + } +#endif +#ifdef BSP_USING_I2C3 + { + BSP_I2C3_SCL_PIN, + BSP_I2C3_SDA_PIN, + "i2c3" + } +#endif +#ifdef BSP_USING_I2C4 + { + BSP_I2C4_SCL_PIN, + BSP_I2C4_SDA_PIN, + "i2c4" + } +#endif +}; + +static struct apm32_soft_i2c i2c_obj[sizeof(soft_i2c_config) / sizeof(soft_i2c_config[0])]; + +/** + * @brief This function will config gpio of soft i2c. + * + * @param i2c is a pointer to the object of soft i2c. + */ +static void _soft_i2c_gpio_init(struct apm32_soft_i2c *i2c) +{ + struct apm32_soft_i2c_config *cfg = (struct apm32_soft_i2c_config *)i2c->ops.data; + + rt_pin_mode(cfg->scl_pin, PIN_MODE_OUTPUT_OD); + rt_pin_mode(cfg->sda_pin, PIN_MODE_OUTPUT_OD); + + rt_pin_write(cfg->scl_pin, PIN_HIGH); + rt_pin_write(cfg->sda_pin, PIN_HIGH); +} + +/** + * @brief This function sets the sda pin. + * + * @param data is a pointer to the i2c config class. + * + * @param state is the level of sda pin. + */ +static void _soft_i2c_set_sda(void *data, rt_int32_t state) +{ + struct apm32_soft_i2c_config *cfg = (struct apm32_soft_i2c_config *)data; + + rt_pin_write(cfg->sda_pin, state ? PIN_HIGH : PIN_LOW); +} + +/** + * @brief This function sets the scl pin. + * + * @param data is a pointer to the i2c config class. + * + * @param state is the level of scl pin. + */ +static void _soft_i2c_set_scl(void *data, rt_int32_t state) +{ + struct apm32_soft_i2c_config *cfg = (struct apm32_soft_i2c_config *)data; + + rt_pin_write(cfg->scl_pin, state ? PIN_HIGH : PIN_LOW); +} + +/** + * @brief This function gets the sda pin state. + * + * @param data is a pointer to the i2c config class. + */ +static rt_int32_t _soft_i2c_get_sda(void *data) +{ + struct apm32_soft_i2c_config *cfg = (struct apm32_soft_i2c_config *)data; + return rt_pin_read(cfg->sda_pin); +} + +/** + * @brief This function gets the scl pin state. + * + * @param data is a pointer to the i2c config class. + */ +static rt_int32_t _soft_i2c_get_scl(void *data) +{ + struct apm32_soft_i2c_config *cfg = (struct apm32_soft_i2c_config *)data; + return rt_pin_read(cfg->scl_pin); +} + +/** + * @brief The time delay function in microseconds. + * + * @param us is the microseconds to delay. + */ +static void _soft_i2c_udelay(rt_uint32_t us) +{ + rt_uint32_t count_old = SysTick->VAL; + rt_uint32_t count_now; + rt_uint32_t count = 0; + rt_uint32_t reload = SysTick->LOAD; + rt_uint32_t count_pre_us = (reload * RT_TICK_PER_SECOND) / 1000000; + + while (count_pre_us * us > count) + { + count_now = SysTick->VAL; + if (count_now != count_old) + { + if (count_now < count_old) + { + count += count_old - count_now; + } + else + { + count += reload - count_now + count_old; + } + count_old = count_now; + } + } +} + +/** + * @brief This function will unlock i2c, if it is locked. + * + * @param cfg is a pointer to i2c config class. + * + * @return RT_EOK indicates successful unlock, other value indicates failed. + */ +static rt_err_t apm32_i2c_bus_unlock(const struct apm32_soft_i2c_config *cfg) +{ + rt_int32_t i = 0; + + if (PIN_LOW == rt_pin_read(cfg->sda_pin)) + { + while (i++ < 9) + { + rt_pin_write(cfg->scl_pin, PIN_HIGH); + _soft_i2c_udelay(100); + rt_pin_write(cfg->scl_pin, PIN_LOW); + _soft_i2c_udelay(100); + } + } + if (PIN_LOW == rt_pin_read(cfg->sda_pin)) + { + return -RT_ERROR; + } + + return RT_EOK; +} + +static const struct rt_i2c_bit_ops apm32_bit_ops_default = +{ + .data = RT_NULL, + .set_sda = _soft_i2c_set_sda, + .set_scl = _soft_i2c_set_scl, + .get_sda = _soft_i2c_get_sda, + .get_scl = _soft_i2c_get_scl, + .udelay = _soft_i2c_udelay, + .delay_us = 1, + .timeout = 100 +}; + +/** + * @brief I2C initialization function. + * + * @return RT_EOK indicates successful initialization, other value indicates failed; + */ +int rt_hw_i2c_init(void) +{ + rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct apm32_soft_i2c); + rt_err_t result; + + for (int i = 0; i < obj_num; i++) + { + i2c_obj[i].ops = apm32_bit_ops_default; + i2c_obj[i].ops.data = (void *)&soft_i2c_config[i]; + i2c_obj[i].i2c2_bus.priv = &i2c_obj[i].ops; + _soft_i2c_gpio_init(&i2c_obj[i]); + + result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c2_bus, soft_i2c_config[i].bus_name); + + RT_ASSERT(result == RT_EOK); + + apm32_i2c_bus_unlock(&soft_i2c_config[i]); + + LOG_D("software simulation %s init done, pin scl: %s, pin sda: %s", + soft_i2c_config[i].bus_name, + soft_i2c_config[i].scl_pin_name, + soft_i2c_config[i].sda_pin_name); + } + + return RT_EOK; +} +INIT_BOARD_EXPORT(rt_hw_i2c_init); + +#endif /* RT_USING_I2C */ diff --git a/bsp/apm32/libraries/Drivers/drv_spi.c b/bsp/apm32/libraries/Drivers/drv_spi.c new file mode 100644 index 0000000000..db4dc734e0 --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_spi.c @@ -0,0 +1,264 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-03-04 stevetong459 first version + */ + +#include "drv_spi.h" + +#define LOG_TAG "drv.spi" +#define DBG_LVL DBG_INFO +#include + +#if defined(BSP_USING_SPI1) || defined(BSP_USING_SPI2) || defined(BSP_USING_SPI3) + +static rt_err_t _spi_configure(struct rt_spi_device *spi_drv, struct rt_spi_configuration *cfg) +{ + RT_ASSERT(spi_drv != RT_NULL); + RT_ASSERT(cfg != RT_NULL); + SPI_Config_T hw_spi_config; + SPI_T *spi = (SPI_T *)spi_drv->bus->parent.user_data; + uint32_t hw_spi_apb_clock; +#if (DBG_LVL == DBG_LOG) + uint32_t hw_spi_sys_clock = RCM_ReadSYSCLKFreq(); +#endif + + hw_spi_config.mode = (cfg->mode & RT_SPI_SLAVE) ? SPI_MODE_SLAVE : SPI_MODE_MASTER; + hw_spi_config.direction = (cfg->mode & RT_SPI_3WIRE) ? SPI_DIRECTION_1LINE_RX : SPI_DIRECTION_2LINES_FULLDUPLEX; + hw_spi_config.phase = (cfg->mode & RT_SPI_CPHA) ? SPI_CLKPHA_2EDGE : SPI_CLKPHA_1EDGE; + hw_spi_config.polarity = (cfg->mode & RT_SPI_CPOL) ? SPI_CLKPOL_HIGH : SPI_CLKPOL_LOW; + hw_spi_config.nss = (cfg->mode & RT_SPI_NO_CS) ? SPI_NSS_HARD : SPI_NSS_SOFT; + hw_spi_config.firstBit = (cfg->mode & RT_SPI_MSB) ? SPI_FIRSTBIT_MSB : SPI_FIRSTBIT_LSB; + + if (cfg->data_width == 8) + { + hw_spi_config.length = SPI_DATA_LENGTH_8B; + } + else if (cfg->data_width == 16) + { + hw_spi_config.length = SPI_DATA_LENGTH_16B; + } + else + { + return RT_EIO; + } + + RCM_ReadPCLKFreq(NULL, &hw_spi_apb_clock); + + if (cfg->max_hz >= hw_spi_apb_clock / 2) + { + hw_spi_config.baudrateDiv = SPI_BAUDRATE_DIV_2; + } + else if (cfg->max_hz >= hw_spi_apb_clock / 4) + { + hw_spi_config.baudrateDiv = SPI_BAUDRATE_DIV_4; + } + else if (cfg->max_hz >= hw_spi_apb_clock / 8) + { + hw_spi_config.baudrateDiv = SPI_BAUDRATE_DIV_8; + } + else if (cfg->max_hz >= hw_spi_apb_clock / 16) + { + hw_spi_config.baudrateDiv = SPI_BAUDRATE_DIV_16; + } + else if (cfg->max_hz >= hw_spi_apb_clock / 32) + { + hw_spi_config.baudrateDiv = SPI_BAUDRATE_DIV_32; + } + else if (cfg->max_hz >= hw_spi_apb_clock / 64) + { + hw_spi_config.baudrateDiv = SPI_BAUDRATE_DIV_64; + } + else if (cfg->max_hz >= hw_spi_apb_clock / 128) + { + hw_spi_config.baudrateDiv = SPI_BAUDRATE_DIV_128; + } + else + { + /* min prescaler 256 */ + hw_spi_config.baudrateDiv = SPI_BAUDRATE_DIV_256; + } + + LOG_D("sys freq: %d, pclk2 freq: %d, SPI limiting freq: %d, BaudRatePrescaler: %d", + hw_spi_sys_clock, hw_spi_apb_clock, cfg->max_hz, hw_spi_config.baudrateDiv); + + SPI_Config(spi, &hw_spi_config); + SPI_Enable(spi); + + return RT_EOK; +} + +static rt_uint32_t _spi_xfer(struct rt_spi_device *device, struct rt_spi_message *message) +{ + RT_ASSERT(device != NULL); + RT_ASSERT(message != NULL); + + rt_base_t cs_pin = (rt_base_t)device->parent.user_data; + SPI_T *spi = (SPI_T *)device->bus->parent.user_data; + struct rt_spi_configuration *config = &device->config; + + /* take CS */ + if (message->cs_take) + { + rt_pin_write(cs_pin, PIN_LOW); + LOG_D("spi take cs\n"); + } + + if (config->data_width <= 8) + { + const rt_uint8_t *send_ptr = message->send_buf; + rt_uint8_t *recv_ptr = message->recv_buf; + rt_uint32_t size = message->length; + + LOG_D("spi poll transfer start: %d\n", size); + + while (size--) + { + rt_uint8_t data = 0xFF; + + if (send_ptr != RT_NULL) + { + data = *send_ptr++; + } + + /* Wait until the transmit buffer is empty */ + while (SPI_I2S_ReadStatusFlag(spi, SPI_FLAG_TXBE) == RESET); + + SPI_I2S_TxData(spi, data); + + /* Wait until a data is received */ + while (SPI_I2S_ReadStatusFlag(spi, SPI_FLAG_RXBNE) == RESET); + + data = SPI_I2S_RxData(spi); + + if (recv_ptr != RT_NULL) + { + *recv_ptr++ = data; + } + } + LOG_D("spi poll transfer finsh\n"); + } + else if (config->data_width <= 16) + { + const rt_uint16_t *send_ptr = message->send_buf; + rt_uint16_t *recv_ptr = message->recv_buf; + rt_uint32_t size = message->length; + + while (size--) + { + rt_uint16_t data = 0xFF; + + if (send_ptr != RT_NULL) + { + data = *send_ptr++; + } + + /*Wait until the transmit buffer is empty */ + while (SPI_I2S_ReadStatusFlag(spi, SPI_FLAG_TXBE) == RESET); + /* Send the byte */ + SPI_I2S_TxData(spi, data); + + /*Wait until a data is received */ + while (SPI_I2S_ReadStatusFlag(spi, SPI_FLAG_RXBNE) == RESET); + /* Get the received data */ + data = SPI_I2S_RxData(spi); + + if (recv_ptr != RT_NULL) + { + *recv_ptr++ = data; + } + } + } + + /* release CS */ + if (message->cs_release) + { + rt_pin_write(cs_pin, PIN_HIGH); + LOG_D("spi release cs\n"); + } + + return message->length; +}; + +static const struct rt_spi_ops _spi_ops = +{ + _spi_configure, + _spi_xfer +}; + +static int rt_hw_spi_init(void) +{ + int result = 0; + GPIO_Config_T gpio_config; + +#ifdef BSP_USING_SPI1 + static struct rt_spi_bus spi_bus1; + spi_bus1.parent.user_data = (void *)SPI1; + + result = rt_spi_bus_register(&spi_bus1, "spi1", &_spi_ops); + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA); + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SPI1); + + /* SPI1_SCK(PA5) SPI1_MOSI(PA7) */ + gpio_config.mode = GPIO_MODE_AF_PP; + gpio_config.speed = GPIO_SPEED_50MHz; + gpio_config.pin = (GPIO_PIN_5 | GPIO_PIN_7); + GPIO_Config(GPIOA, &gpio_config); + /* SPI1_MISO(PA6) */ + gpio_config.mode = GPIO_MODE_IN_FLOATING; + gpio_config.speed = GPIO_SPEED_50MHz; + gpio_config.pin = GPIO_PIN_6; + GPIO_Config(GPIOA, &gpio_config); +#endif + +#ifdef BSP_USING_SPI2 + static struct rt_spi_bus spi_bus2; + spi_bus2.parent.user_data = (void *)SPI2; + + result = rt_spi_bus_register(&spi_bus2, "spi2", &_spi_ops); + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_SPI2); + + /* SPI2_SCK(PB13) SPI2_MOSI(PB15) */ + gpio_config.mode = GPIO_MODE_AF_PP; + gpio_config.speed = GPIO_SPEED_50MHz; + gpio_config.pin = (GPIO_PIN_13 | GPIO_PIN_15); + GPIO_Config(GPIOB, &gpio_config); + /* SPI2_MISO(PB14) */ + gpio_config.mode = GPIO_MODE_IN_FLOATING; + gpio_config.speed = GPIO_SPEED_50MHz; + gpio_config.pin = GPIO_PIN_14; + GPIO_Config(GPIOB, &gpio_config); +#endif + +#ifdef BSP_USING_SPI3 + static struct rt_spi_bus spi_bus3; + spi_bus3.parent.user_data = (void *)SPI3; + + result = rt_spi_bus_register(&spi_bus3, "spi3", &_spi_ops); + + RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB); + RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_SPI3); + + /* SPI3_SCK(PB3) SPI3_MOSI(PB5) */ + gpio_config.mode = GPIO_MODE_AF_PP; + gpio_config.speed = GPIO_SPEED_50MHz; + gpio_config.pin = (GPIO_PIN_3 | GPIO_PIN_5); + GPIO_Config(GPIOB, &gpio_config); + /* SPI3_MISO(PB4) */ + gpio_config.mode = GPIO_MODE_IN_FLOATING; + gpio_config.speed = GPIO_SPEED_50MHz; + gpio_config.pin = GPIO_PIN_4; + GPIO_Config(GPIOB, &gpio_config); +#endif + return result; +} +INIT_BOARD_EXPORT(rt_hw_spi_init); + +#endif /* RT_USING_SPI */ diff --git a/bsp/apm32/libraries/Drivers/drv_spi.h b/bsp/apm32/libraries/Drivers/drv_spi.h new file mode 100644 index 0000000000..e4591352f5 --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_spi.h @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-03-04 stevetong459 first version + */ + +#ifndef __DRV_SPI_H__ +#define __DRV_SPI_H__ + +#include "board.h" + +struct apm32_spi_cs +{ + GPIO_T *GPIOx; + uint16_t GPIO_Pin; +}; + +#endif /*__DRV_SPI_H__ */ diff --git a/bsp/apm32/libraries/Drivers/drv_usart.c b/bsp/apm32/libraries/Drivers/drv_usart.c index c3141be55c..174bd8ebba 100644 --- a/bsp/apm32/libraries/Drivers/drv_usart.c +++ b/bsp/apm32/libraries/Drivers/drv_usart.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -18,7 +18,6 @@ /* this driver can be disabled at menuconfig -> RT-Thread Components -> Device Drivers */ #endif -/* stm32 config class */ struct apm32_usart { const char *name; @@ -204,7 +203,7 @@ static void usart_isr(struct rt_serial_device *serial) RT_ASSERT(usart != RT_NULL); - /* UART in mode Receiver -------------------------------------------------*/ + /* UART in mode Receiver */ if ((USART_ReadStatusFlag(usart->usartx, USART_FLAG_RXBNE) != RESET) && (USART_ReadIntFlag(usart->usartx, USART_INT_RXBNE) != RESET)) { diff --git a/bsp/apm32/libraries/Drivers/drv_usart.h b/bsp/apm32/libraries/Drivers/drv_usart.h index a9040cc14c..727772671a 100644 --- a/bsp/apm32/libraries/Drivers/drv_usart.h +++ b/bsp/apm32/libraries/Drivers/drv_usart.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * diff --git a/bsp/apm32/libraries/Drivers/drv_wdt.c b/bsp/apm32/libraries/Drivers/drv_wdt.c new file mode 100644 index 0000000000..829ba48ca5 --- /dev/null +++ b/bsp/apm32/libraries/Drivers/drv_wdt.c @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2022-03-04 stevetong459 first version + */ + +#include +#include + +#ifdef RT_USING_WDT + +#define DBG_TAG "drv.wdt" +#define DBG_LVL DBG_INFO +#include + +#ifndef LSI_VALUE + #define LSI_VALUE ((uint32_t)40000) +#endif + +#define DRV_WDT_TIME_OUT 0xFFFF + +typedef struct +{ + struct rt_watchdog_device wdt; + rt_uint32_t min_threshold; + rt_uint32_t max_threshold; + rt_uint32_t current_threshold; +} apm32_wdt_t; + +static apm32_wdt_t wdt_config; + +static rt_err_t _iwdt_init(rt_watchdog_t *wdt) +{ + rt_uint32_t counter = 0; + + RCM_EnableLSI(); + + while (!RCM_ReadStatusFlag(RCM_FLAG_LSIRDY)) + { + if (++counter > DRV_WDT_TIME_OUT) + { + LOG_E("LSI clock open failed."); + return -RT_ERROR; + } + } + + wdt_config.min_threshold = 1; + wdt_config.max_threshold = (0xfff << 8) / LSI_VALUE; + LOG_I("threshold section [%u, %d]", \ + wdt_config.min_threshold, + wdt_config.max_threshold); + + while (IWDT_ReadStatusFlag(IWDT_FLAG_PSCU)) + { + if (++counter > DRV_WDT_TIME_OUT) + { + LOG_E("watchdog prescaler init failed."); + return -RT_ERROR; + } + } + IWDT_EnableWriteAccess(); + IWDT_ConfigDivider(IWDT_DIVIDER_256); + IWDT_DisableWriteAccess(); + + return RT_EOK; +} + +/** + * @brief This function will control watchdog device. + * + * @param wdt is a pointer to i2c config class. + * + * @return RT_EOK indicates successful , other value indicates failed. + */ +static rt_err_t _iwdt_control(rt_watchdog_t *wdt, int cmd, void *arg) +{ + volatile rt_uint32_t param, counter = 0; + + switch (cmd) + { + case RT_DEVICE_CTRL_WDT_KEEPALIVE: + IWDT_Refresh(); + break; + case RT_DEVICE_CTRL_WDT_SET_TIMEOUT: + param = *(rt_uint32_t *) arg; + if ((param > wdt_config.max_threshold) || \ + (param < wdt_config.min_threshold)) + { + LOG_E("invalid param@%u.", param); + return -RT_ERROR; + } + else + { + wdt_config.current_threshold = param; + } + while (IWDT_ReadStatusFlag(IWDT_FLAG_CNTU)) + { + if (++counter > DRV_WDT_TIME_OUT) + { + LOG_E("Update watchdog reload value complete."); + return -RT_ERROR; + } + } + IWDT_Refresh(); + IWDT_EnableWriteAccess(); + IWDT_ConfigReload(param * LSI_VALUE >> 8); + IWDT_DisableWriteAccess(); + break; + case RT_DEVICE_CTRL_WDT_GET_TIMEOUT: + *(rt_uint32_t *)arg = wdt_config.current_threshold; + break; + case RT_DEVICE_CTRL_WDT_START: + IWDT_Enable(); + IWDT_Refresh(); + break; + default: + LOG_W("This command is not supported."); + return -RT_ERROR; + } + + return RT_EOK; +} + +static struct rt_watchdog_ops _wdt_ops = +{ + _iwdt_init, + _iwdt_control, +}; + +static int rt_hw_wdt_init(void) +{ + wdt_config.wdt.ops = &_wdt_ops; + /* register watchdog device */ + if (rt_hw_watchdog_register(&wdt_config.wdt, "wdt", \ + RT_DEVICE_FLAG_DEACTIVATE, RT_NULL) != RT_EOK) + { + LOG_E("wdt device register failed."); + return -RT_ERROR; + } + LOG_D("wdt device register success."); + + return RT_EOK; +} +INIT_BOARD_EXPORT(rt_hw_wdt_init); + +#endif