Initial commit
This commit is contained in:
commit
98daae9ea3
6
AtmelStart.env_conf
Normal file
6
AtmelStart.env_conf
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<environment>
|
||||||
|
<configurations/>
|
||||||
|
<device-packs>
|
||||||
|
<device-pack device="ATSAMD21E17A" name="SAMD21_DFP" vendor="Atmel" version="1.3.395"/>
|
||||||
|
</device-packs>
|
||||||
|
</environment>
|
||||||
179
AtmelStart.gpdsc
Normal file
179
AtmelStart.gpdsc
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
<package xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" schemaVersion="1.0" xs:noNamespaceSchemaLocation="PACK.xsd">
|
||||||
|
<vendor>Atmel</vendor>
|
||||||
|
<name>My Project</name>
|
||||||
|
<description>Project generated by Atmel Start</description>
|
||||||
|
<url>http://start.atmel.com/</url>
|
||||||
|
<releases>
|
||||||
|
<release version="1.0.1">Initial version</release>
|
||||||
|
</releases>
|
||||||
|
<taxonomy>
|
||||||
|
<description Cclass="AtmelStart" generator="AtmelStart">Configuration Files generated by Atmel Start</description>
|
||||||
|
</taxonomy>
|
||||||
|
<generators>
|
||||||
|
<generator id="AtmelStart">
|
||||||
|
<description>Atmel Start</description>
|
||||||
|
<select Dname="ATSAMD21E17A" Dvendor="Atmel:3"/>
|
||||||
|
<command>http://start.atmel.com/</command>
|
||||||
|
<files>
|
||||||
|
<file category="generator" name="atmel_start_config.atstart"/>
|
||||||
|
<file attr="template" category="other" name="AtmelStart.env_conf" select="Environment configuration"/>
|
||||||
|
</files>
|
||||||
|
</generator>
|
||||||
|
</generators>
|
||||||
|
<conditions>
|
||||||
|
<condition id="CMSIS Device Startup">
|
||||||
|
<description>Dependency on CMSIS core and Device Startup components</description>
|
||||||
|
<require Cclass="CMSIS" Cgroup="CORE" Cversion="5.1.2"/>
|
||||||
|
<require Cclass="Device" Cgroup="Startup" Cversion="1.3.0"/>
|
||||||
|
</condition>
|
||||||
|
<condition id="ARMCC, GCC, IAR">
|
||||||
|
<require Dname="ATSAMD21E17A"/>
|
||||||
|
<accept Tcompiler="ARMCC"/>
|
||||||
|
<accept Tcompiler="GCC"/>
|
||||||
|
<accept Tcompiler="IAR"/>
|
||||||
|
</condition>
|
||||||
|
<condition id="GCC">
|
||||||
|
<require Dname="ATSAMD21E17A"/>
|
||||||
|
<accept Tcompiler="GCC"/>
|
||||||
|
</condition>
|
||||||
|
</conditions>
|
||||||
|
<components generator="AtmelStart">
|
||||||
|
<component Cclass="AtmelStart" Cgroup="Framework" Cversion="1.0.0" condition="CMSIS Device Startup">
|
||||||
|
<description>Atmel Start Framework</description>
|
||||||
|
<RTE_Components_h>#define ATMEL_START</RTE_Components_h>
|
||||||
|
<files>
|
||||||
|
<file category="doc" condition="ARMCC, GCC, IAR" name="hal/documentation/ext_irq.rst"/>
|
||||||
|
<file category="doc" condition="ARMCC, GCC, IAR" name="hal/documentation/spi_master_sync.rst"/>
|
||||||
|
<file category="doc" condition="ARMCC, GCC, IAR" name="hal/documentation/usart_async.rst"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hal_atomic.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hal_delay.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hal_ext_irq.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hal_gpio.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hal_init.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hal_io.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hal_sleep.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hal_spi_m_sync.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_core.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_delay.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_dma.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_ext_irq.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_gpio.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_i2c_m_async.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_i2c_m_sync.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_i2c_s_async.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_i2c_s_sync.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_init.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_irq.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_sleep.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_spi.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_spi_async.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_spi_dma.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_spi_sync.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_usart.h"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hal/src/hal_atomic.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hal/src/hal_delay.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hal/src/hal_gpio.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hal/src/hal_init.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hal/src/hal_io.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hal/src/hal_sleep.c"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/compiler.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/err_codes.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/events.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/utils.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/utils_assert.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/utils_event.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/utils_increment_macro.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/utils_list.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/utils_repeat_macro.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/utils_ringbuffer.h"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hal/utils/src/utils_assert.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hal/utils/src/utils_event.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hal/utils/src/utils_list.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hal/utils/src/utils_ringbuffer.c"/>
|
||||||
|
<file category="source" condition="GCC" name="hal/utils/src/utils_syscalls.c"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_ac_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_adc_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_dac_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_dmac_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_dsu_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_eic_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_evsys_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_gclk_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_hmatrixb_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_i2s_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_mtb_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_nvic_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_nvmctrl_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_pac_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_pm_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_port_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_rtc_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_sercom_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_sysctrl_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_systemcontrol_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_systick_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_tc_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_tcc_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_usb_d21.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hri/hri_wdt_d21.h"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="main.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="driver_init.c"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="driver_init.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="atmel_start_pins.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="examples/driver_examples.h"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="examples/driver_examples.c"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hal_usart_async.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_missing_features.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_reset.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_spi_m_async.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_spi_m_dma.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_spi_m_sync.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_spi_s_async.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_spi_s_sync.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_usart_async.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/include/hpl_usart_sync.h"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hal/src/hal_ext_irq.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hal/src/hal_spi_m_sync.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hal/src/hal_usart_async.c"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hal/utils/include/parts.h"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hpl/core/hpl_core_m0plus_base.c"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hpl/core/hpl_core_port.h"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hpl/core/hpl_init.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hpl/dmac/hpl_dmac.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hpl/eic/hpl_eic.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hpl/gclk/hpl_gclk.c"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hpl/gclk/hpl_gclk_base.h"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hpl/pm/hpl_pm.c"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hpl/pm/hpl_pm_base.h"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="hpl/port/hpl_gpio_base.h"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hpl/sercom/hpl_sercom.c"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="hpl/sysctrl/hpl_sysctrl.c"/>
|
||||||
|
<file category="header" condition="ARMCC, GCC, IAR" name="atmel_start.h"/>
|
||||||
|
<file category="source" condition="ARMCC, GCC, IAR" name="atmel_start.c"/>
|
||||||
|
<file attr="config" category="header" condition="ARMCC, GCC, IAR" name="config/hpl_dmac_config.h"/>
|
||||||
|
<file attr="config" category="header" condition="ARMCC, GCC, IAR" name="config/hpl_eic_config.h"/>
|
||||||
|
<file attr="config" category="header" condition="ARMCC, GCC, IAR" name="config/hpl_gclk_config.h"/>
|
||||||
|
<file attr="config" category="header" condition="ARMCC, GCC, IAR" name="config/hpl_pm_config.h"/>
|
||||||
|
<file attr="config" category="header" condition="ARMCC, GCC, IAR" name="config/hpl_sercom_config.h"/>
|
||||||
|
<file attr="config" category="header" condition="ARMCC, GCC, IAR" name="config/hpl_sysctrl_config.h"/>
|
||||||
|
<file attr="config" category="header" condition="ARMCC, GCC, IAR" name="config/peripheral_clk_config.h"/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name=""/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name="config"/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name="examples"/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name="hal/include"/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name="hal/utils/include"/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name="hpl/core"/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name="hpl/dmac"/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name="hpl/eic"/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name="hpl/gclk"/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name="hpl/pm"/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name="hpl/port"/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name="hpl/sercom"/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name="hpl/sysctrl"/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name="hri"/>
|
||||||
|
<file category="include" condition="ARMCC, GCC, IAR" name=""/>
|
||||||
|
</files>
|
||||||
|
</component>
|
||||||
|
</components>
|
||||||
|
</package>
|
||||||
865
CMSIS/Core/Include/cmsis_armcc.h
Normal file
865
CMSIS/Core/Include/cmsis_armcc.h
Normal file
@ -0,0 +1,865 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file cmsis_armcc.h
|
||||||
|
* @brief CMSIS compiler ARMCC (Arm Compiler 5) header file
|
||||||
|
* @version V5.0.4
|
||||||
|
* @date 10. January 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_ARMCC_H
|
||||||
|
#define __CMSIS_ARMCC_H
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677)
|
||||||
|
#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
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1))
|
||||||
|
#define __ARM_ARCH_7M__ 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1))
|
||||||
|
#define __ARM_ARCH_7EM__ 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* __ARM_ARCH_8M_BASE__ not applicable */
|
||||||
|
/* __ARM_ARCH_8M_MAIN__ not applicable */
|
||||||
|
|
||||||
|
|
||||||
|
/* 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 static __forceinline
|
||||||
|
#endif
|
||||||
|
#ifndef __NO_RETURN
|
||||||
|
#define __NO_RETURN __declspec(noreturn)
|
||||||
|
#endif
|
||||||
|
#ifndef __USED
|
||||||
|
#define __USED __attribute__((used))
|
||||||
|
#endif
|
||||||
|
#ifndef __WEAK
|
||||||
|
#define __WEAK __attribute__((weak))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED
|
||||||
|
#define __PACKED __attribute__((packed))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_STRUCT
|
||||||
|
#define __PACKED_STRUCT __packed struct
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_UNION
|
||||||
|
#define __PACKED_UNION __packed union
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32 /* deprecated */
|
||||||
|
#define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x)))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT16_WRITE
|
||||||
|
#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)))
|
||||||
|
#endif
|
||||||
|
#ifndef __UNALIGNED_UINT32_WRITE
|
||||||
|
#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)))
|
||||||
|
#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.
|
||||||
|
*/
|
||||||
|
/* intrinsic void __enable_irq(); */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Disable IRQ Interrupts
|
||||||
|
\details Disables IRQ interrupts by setting the I-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
/* intrinsic void __disable_irq(); */
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Control Register
|
||||||
|
\details Returns the content of the Control Register.
|
||||||
|
\return Control Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_CONTROL(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regControl __ASM("control");
|
||||||
|
return(__regControl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Control Register
|
||||||
|
\details Writes the given value to the Control Register.
|
||||||
|
\param [in] control Control Register value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_CONTROL(uint32_t control)
|
||||||
|
{
|
||||||
|
register uint32_t __regControl __ASM("control");
|
||||||
|
__regControl = control;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get IPSR Register
|
||||||
|
\details Returns the content of the IPSR Register.
|
||||||
|
\return IPSR Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_IPSR(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regIPSR __ASM("ipsr");
|
||||||
|
return(__regIPSR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get APSR Register
|
||||||
|
\details Returns the content of the APSR Register.
|
||||||
|
\return APSR Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_APSR(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regAPSR __ASM("apsr");
|
||||||
|
return(__regAPSR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get xPSR Register
|
||||||
|
\details Returns the content of the xPSR Register.
|
||||||
|
\return xPSR Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_xPSR(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regXPSR __ASM("xpsr");
|
||||||
|
return(__regXPSR);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Process Stack Pointer
|
||||||
|
\details Returns the current value of the Process Stack Pointer (PSP).
|
||||||
|
\return PSP Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_PSP(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regProcessStackPointer __ASM("psp");
|
||||||
|
return(__regProcessStackPointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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_INLINE void __set_PSP(uint32_t topOfProcStack)
|
||||||
|
{
|
||||||
|
register uint32_t __regProcessStackPointer __ASM("psp");
|
||||||
|
__regProcessStackPointer = topOfProcStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Main Stack Pointer
|
||||||
|
\details Returns the current value of the Main Stack Pointer (MSP).
|
||||||
|
\return MSP Register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_MSP(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regMainStackPointer __ASM("msp");
|
||||||
|
return(__regMainStackPointer);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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_INLINE void __set_MSP(uint32_t topOfMainStack)
|
||||||
|
{
|
||||||
|
register uint32_t __regMainStackPointer __ASM("msp");
|
||||||
|
__regMainStackPointer = topOfMainStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Priority Mask
|
||||||
|
\details Returns the current state of the priority mask bit from the Priority Mask Register.
|
||||||
|
\return Priority Mask value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_PRIMASK(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regPriMask __ASM("primask");
|
||||||
|
return(__regPriMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Priority Mask
|
||||||
|
\details Assigns the given value to the Priority Mask Register.
|
||||||
|
\param [in] priMask Priority Mask
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
|
||||||
|
{
|
||||||
|
register uint32_t __regPriMask __ASM("primask");
|
||||||
|
__regPriMask = (priMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Enable FIQ
|
||||||
|
\details Enables FIQ interrupts by clearing the F-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
#define __enable_fault_irq __enable_fiq
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Disable FIQ
|
||||||
|
\details Disables FIQ interrupts by setting the F-bit in the CPSR.
|
||||||
|
Can only be executed in Privileged modes.
|
||||||
|
*/
|
||||||
|
#define __disable_fault_irq __disable_fiq
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Base Priority
|
||||||
|
\details Returns the current value of the Base Priority register.
|
||||||
|
\return Base Priority register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_BASEPRI(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regBasePri __ASM("basepri");
|
||||||
|
return(__regBasePri);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Base Priority
|
||||||
|
\details Assigns the given value to the Base Priority register.
|
||||||
|
\param [in] basePri Base Priority value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
|
||||||
|
{
|
||||||
|
register uint32_t __regBasePri __ASM("basepri");
|
||||||
|
__regBasePri = (basePri & 0xFFU);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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_INLINE void __set_BASEPRI_MAX(uint32_t basePri)
|
||||||
|
{
|
||||||
|
register uint32_t __regBasePriMax __ASM("basepri_max");
|
||||||
|
__regBasePriMax = (basePri & 0xFFU);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Fault Mask
|
||||||
|
\details Returns the current value of the Fault Mask register.
|
||||||
|
\return Fault Mask register value
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __get_FAULTMASK(void)
|
||||||
|
{
|
||||||
|
register uint32_t __regFaultMask __ASM("faultmask");
|
||||||
|
return(__regFaultMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Fault Mask
|
||||||
|
\details Assigns the given value to the Fault Mask register.
|
||||||
|
\param [in] faultMask Fault Mask value to set
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
|
||||||
|
{
|
||||||
|
register uint32_t __regFaultMask __ASM("faultmask");
|
||||||
|
__regFaultMask = (faultMask & (uint32_t)1U);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get FPSCR
|
||||||
|
\details Returns the current value of the Floating Point Status/Control register.
|
||||||
|
\return Floating Point Status/Control register value
|
||||||
|
*/
|
||||||
|
__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);
|
||||||
|
#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_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);
|
||||||
|
#else
|
||||||
|
(void)fpscr;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_RegAccFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## Core Instruction Access ######################### */
|
||||||
|
/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
|
||||||
|
Access to dedicated instructions
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief No Operation
|
||||||
|
\details No Operation does nothing. This instruction can be used for code alignment purposes.
|
||||||
|
*/
|
||||||
|
#define __NOP __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 __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 __wfe
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Send Event
|
||||||
|
\details Send Event is a hint instruction. It causes an event to be signaled to the CPU.
|
||||||
|
*/
|
||||||
|
#define __SEV __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.
|
||||||
|
*/
|
||||||
|
#define __ISB() do {\
|
||||||
|
__schedule_barrier();\
|
||||||
|
__isb(0xF);\
|
||||||
|
__schedule_barrier();\
|
||||||
|
} while (0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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() do {\
|
||||||
|
__schedule_barrier();\
|
||||||
|
__dsb(0xF);\
|
||||||
|
__schedule_barrier();\
|
||||||
|
} while (0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Data Memory Barrier
|
||||||
|
\details Ensures the apparent order of the explicit memory operations before
|
||||||
|
and after the instruction, without ensuring their completion.
|
||||||
|
*/
|
||||||
|
#define __DMB() do {\
|
||||||
|
__schedule_barrier();\
|
||||||
|
__dmb(0xF);\
|
||||||
|
__schedule_barrier();\
|
||||||
|
} while (0U)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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
|
||||||
|
*/
|
||||||
|
#define __REV __rev
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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
|
||||||
|
*/
|
||||||
|
#ifndef __NO_EMBEDDED_ASM
|
||||||
|
__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
|
||||||
|
{
|
||||||
|
rev16 r0, r0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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
|
||||||
|
*/
|
||||||
|
#ifndef __NO_EMBEDDED_ASM
|
||||||
|
__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value)
|
||||||
|
{
|
||||||
|
revsh r0, r0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
#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
|
||||||
|
*/
|
||||||
|
#define __ROR __ror
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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) __breakpoint(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
|
||||||
|
*/
|
||||||
|
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
|
||||||
|
#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 */
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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 __clz
|
||||||
|
|
||||||
|
|
||||||
|
#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 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)
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr))
|
||||||
|
#else
|
||||||
|
#define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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)
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr))
|
||||||
|
#else
|
||||||
|
#define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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)
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr))
|
||||||
|
#else
|
||||||
|
#define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __STREXB(value, ptr) __strex(value, ptr)
|
||||||
|
#else
|
||||||
|
#define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __STREXH(value, ptr) __strex(value, ptr)
|
||||||
|
#else
|
||||||
|
#define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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
|
||||||
|
*/
|
||||||
|
#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020)
|
||||||
|
#define __STREXW(value, ptr) __strex(value, ptr)
|
||||||
|
#else
|
||||||
|
#define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Remove the exclusive lock
|
||||||
|
\details Removes the exclusive lock which is created by LDREX.
|
||||||
|
*/
|
||||||
|
#define __CLREX __clrex
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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
|
||||||
|
*/
|
||||||
|
#define __SSAT __ssat
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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
|
||||||
|
*/
|
||||||
|
#define __USAT __usat
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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
|
||||||
|
*/
|
||||||
|
#ifndef __NO_EMBEDDED_ASM
|
||||||
|
__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value)
|
||||||
|
{
|
||||||
|
rrx r0, r0
|
||||||
|
bx lr
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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)
|
||||||
|
*/
|
||||||
|
#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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)
|
||||||
|
*/
|
||||||
|
#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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)
|
||||||
|
*/
|
||||||
|
#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr))
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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
|
||||||
|
*/
|
||||||
|
#define __STRBT(value, ptr) __strt(value, ptr)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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
|
||||||
|
*/
|
||||||
|
#define __STRHT(value, ptr) __strt(value, ptr)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\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
|
||||||
|
*/
|
||||||
|
#define __STRT(value, ptr) __strt(value, ptr)
|
||||||
|
|
||||||
|
#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \
|
||||||
|
(defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 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
|
||||||
|
*/
|
||||||
|
__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)
|
||||||
|
{
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
__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)
|
||||||
|
{
|
||||||
|
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)) ) */
|
||||||
|
|
||||||
|
/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
|
||||||
|
|
||||||
|
|
||||||
|
/* ################### Compiler specific Intrinsics ########################### */
|
||||||
|
/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics
|
||||||
|
Access to dedicated SIMD instructions
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) )
|
||||||
|
|
||||||
|
#define __SADD8 __sadd8
|
||||||
|
#define __QADD8 __qadd8
|
||||||
|
#define __SHADD8 __shadd8
|
||||||
|
#define __UADD8 __uadd8
|
||||||
|
#define __UQADD8 __uqadd8
|
||||||
|
#define __UHADD8 __uhadd8
|
||||||
|
#define __SSUB8 __ssub8
|
||||||
|
#define __QSUB8 __qsub8
|
||||||
|
#define __SHSUB8 __shsub8
|
||||||
|
#define __USUB8 __usub8
|
||||||
|
#define __UQSUB8 __uqsub8
|
||||||
|
#define __UHSUB8 __uhsub8
|
||||||
|
#define __SADD16 __sadd16
|
||||||
|
#define __QADD16 __qadd16
|
||||||
|
#define __SHADD16 __shadd16
|
||||||
|
#define __UADD16 __uadd16
|
||||||
|
#define __UQADD16 __uqadd16
|
||||||
|
#define __UHADD16 __uhadd16
|
||||||
|
#define __SSUB16 __ssub16
|
||||||
|
#define __QSUB16 __qsub16
|
||||||
|
#define __SHSUB16 __shsub16
|
||||||
|
#define __USUB16 __usub16
|
||||||
|
#define __UQSUB16 __uqsub16
|
||||||
|
#define __UHSUB16 __uhsub16
|
||||||
|
#define __SASX __sasx
|
||||||
|
#define __QASX __qasx
|
||||||
|
#define __SHASX __shasx
|
||||||
|
#define __UASX __uasx
|
||||||
|
#define __UQASX __uqasx
|
||||||
|
#define __UHASX __uhasx
|
||||||
|
#define __SSAX __ssax
|
||||||
|
#define __QSAX __qsax
|
||||||
|
#define __SHSAX __shsax
|
||||||
|
#define __USAX __usax
|
||||||
|
#define __UQSAX __uqsax
|
||||||
|
#define __UHSAX __uhsax
|
||||||
|
#define __USAD8 __usad8
|
||||||
|
#define __USADA8 __usada8
|
||||||
|
#define __SSAT16 __ssat16
|
||||||
|
#define __USAT16 __usat16
|
||||||
|
#define __UXTB16 __uxtb16
|
||||||
|
#define __UXTAB16 __uxtab16
|
||||||
|
#define __SXTB16 __sxtb16
|
||||||
|
#define __SXTAB16 __sxtab16
|
||||||
|
#define __SMUAD __smuad
|
||||||
|
#define __SMUADX __smuadx
|
||||||
|
#define __SMLAD __smlad
|
||||||
|
#define __SMLADX __smladx
|
||||||
|
#define __SMLALD __smlald
|
||||||
|
#define __SMLALDX __smlaldx
|
||||||
|
#define __SMUSD __smusd
|
||||||
|
#define __SMUSDX __smusdx
|
||||||
|
#define __SMLSD __smlsd
|
||||||
|
#define __SMLSDX __smlsdx
|
||||||
|
#define __SMLSLD __smlsld
|
||||||
|
#define __SMLSLDX __smlsldx
|
||||||
|
#define __SEL __sel
|
||||||
|
#define __QADD __qadd
|
||||||
|
#define __QSUB __qsub
|
||||||
|
|
||||||
|
#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) )
|
||||||
|
|
||||||
|
#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \
|
||||||
|
((int64_t)(ARG3) << 32U) ) >> 32U))
|
||||||
|
|
||||||
|
#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */
|
||||||
|
/*@} end of group CMSIS_SIMD_intrinsics */
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __CMSIS_ARMCC_H */
|
||||||
1869
CMSIS/Core/Include/cmsis_armclang.h
Normal file
1869
CMSIS/Core/Include/cmsis_armclang.h
Normal file
File diff suppressed because it is too large
Load Diff
266
CMSIS/Core/Include/cmsis_compiler.h
Normal file
266
CMSIS/Core/Include/cmsis_compiler.h
Normal file
@ -0,0 +1,266 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file cmsis_compiler.h
|
||||||
|
* @brief CMSIS compiler generic header file
|
||||||
|
* @version V5.0.4
|
||||||
|
* @date 10. January 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_COMPILER_H
|
||||||
|
#define __CMSIS_COMPILER_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Arm Compiler 4/5
|
||||||
|
*/
|
||||||
|
#if defined ( __CC_ARM )
|
||||||
|
#include "cmsis_armcc.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Arm Compiler 6 (armclang)
|
||||||
|
*/
|
||||||
|
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
||||||
|
#include "cmsis_armclang.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GNU Compiler
|
||||||
|
*/
|
||||||
|
#elif defined ( __GNUC__ )
|
||||||
|
#include "cmsis_gcc.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* IAR Compiler
|
||||||
|
*/
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#include <cmsis_iccarm.h>
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TI Arm Compiler
|
||||||
|
*/
|
||||||
|
#elif defined ( __TI_ARM__ )
|
||||||
|
#include <cmsis_ccs.h>
|
||||||
|
|
||||||
|
#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 __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))
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_STRUCT
|
||||||
|
#define __PACKED_STRUCT struct __attribute__((packed))
|
||||||
|
#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
|
||||||
|
#define __ALIGNED(x) __attribute__((aligned(x)))
|
||||||
|
#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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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 __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 __packed__
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_STRUCT
|
||||||
|
#define __PACKED_STRUCT struct __packed__
|
||||||
|
#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
|
||||||
|
#define __ALIGNED(x) __align(x)
|
||||||
|
#endif
|
||||||
|
#ifndef __RESTRICT
|
||||||
|
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.
|
||||||
|
#define __RESTRICT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* COSMIC Compiler
|
||||||
|
*/
|
||||||
|
#elif defined ( __CSMC__ )
|
||||||
|
#include <cmsis_csm.h>
|
||||||
|
|
||||||
|
#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 __STATIC_INLINE
|
||||||
|
#endif
|
||||||
|
#ifndef __NO_RETURN
|
||||||
|
// NO RETURN is automatically detected hence no warning here
|
||||||
|
#define __NO_RETURN
|
||||||
|
#endif
|
||||||
|
#ifndef __USED
|
||||||
|
#warning No compiler specific solution for __USED. __USED is ignored.
|
||||||
|
#define __USED
|
||||||
|
#endif
|
||||||
|
#ifndef __WEAK
|
||||||
|
#define __WEAK __weak
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED
|
||||||
|
#define __PACKED @packed
|
||||||
|
#endif
|
||||||
|
#ifndef __PACKED_STRUCT
|
||||||
|
#define __PACKED_STRUCT @packed struct
|
||||||
|
#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
|
||||||
|
#warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored.
|
||||||
|
#define __ALIGNED(x)
|
||||||
|
#endif
|
||||||
|
#ifndef __RESTRICT
|
||||||
|
#warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.
|
||||||
|
#define __RESTRICT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error Unknown compiler.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __CMSIS_COMPILER_H */
|
||||||
|
|
||||||
2085
CMSIS/Core/Include/cmsis_gcc.h
Normal file
2085
CMSIS/Core/Include/cmsis_gcc.h
Normal file
File diff suppressed because it is too large
Load Diff
935
CMSIS/Core/Include/cmsis_iccarm.h
Normal file
935
CMSIS/Core/Include/cmsis_iccarm.h
Normal file
@ -0,0 +1,935 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @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 <intrinsics.h>
|
||||||
|
|
||||||
|
#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__ */
|
||||||
39
CMSIS/Core/Include/cmsis_version.h
Normal file
39
CMSIS/Core/Include/cmsis_version.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file cmsis_version.h
|
||||||
|
* @brief CMSIS Core(M) Version definitions
|
||||||
|
* @version V5.0.2
|
||||||
|
* @date 19. April 2017
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2009-2017 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#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 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __CMSIS_VERSION_H
|
||||||
|
#define __CMSIS_VERSION_H
|
||||||
|
|
||||||
|
/* CMSIS Version definitions */
|
||||||
|
#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */
|
||||||
|
#define __CM_CMSIS_VERSION_SUB ( 1U) /*!< [15:0] CMSIS Core(M) sub version */
|
||||||
|
#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \
|
||||||
|
__CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */
|
||||||
|
#endif
|
||||||
1918
CMSIS/Core/Include/core_armv8mbl.h
Normal file
1918
CMSIS/Core/Include/core_armv8mbl.h
Normal file
File diff suppressed because it is too large
Load Diff
2927
CMSIS/Core/Include/core_armv8mml.h
Normal file
2927
CMSIS/Core/Include/core_armv8mml.h
Normal file
File diff suppressed because it is too large
Load Diff
949
CMSIS/Core/Include/core_cm0.h
Normal file
949
CMSIS/Core/Include/core_cm0.h
Normal file
@ -0,0 +1,949 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file core_cm0.h
|
||||||
|
* @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File
|
||||||
|
* @version V5.0.5
|
||||||
|
* @date 28. May 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#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 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __CORE_CM0_H_GENERIC
|
||||||
|
#define __CORE_CM0_H_GENERIC
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
\page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions
|
||||||
|
CMSIS violates the following MISRA-C:2004 rules:
|
||||||
|
|
||||||
|
\li Required Rule 8.5, object/function definition in header file.<br>
|
||||||
|
Function definitions in header files are used to allow 'inlining'.
|
||||||
|
|
||||||
|
\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>
|
||||||
|
Unions are used for effective representation of core registers.
|
||||||
|
|
||||||
|
\li Advisory Rule 19.7, Function-like macro defined.<br>
|
||||||
|
Function-like macros are used to allow more efficient code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* CMSIS definitions
|
||||||
|
******************************************************************************/
|
||||||
|
/**
|
||||||
|
\ingroup Cortex_M0
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cmsis_version.h"
|
||||||
|
|
||||||
|
/* CMSIS CM0 definitions */
|
||||||
|
#define __CM0_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */
|
||||||
|
#define __CM0_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */
|
||||||
|
#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16U) | \
|
||||||
|
__CM0_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */
|
||||||
|
|
||||||
|
#define __CORTEX_M (0U) /*!< Cortex-M Core */
|
||||||
|
|
||||||
|
/** __FPU_USED indicates whether an FPU is used or not.
|
||||||
|
This core does not support an FPU at all
|
||||||
|
*/
|
||||||
|
#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
|
||||||
|
|
||||||
|
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
||||||
|
#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
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#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
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
#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
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "cmsis_compiler.h" /* CMSIS compiler specific defines */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_CM0_H_GENERIC */
|
||||||
|
|
||||||
|
#ifndef __CMSIS_GENERIC
|
||||||
|
|
||||||
|
#ifndef __CORE_CM0_H_DEPENDANT
|
||||||
|
#define __CORE_CM0_H_DEPENDANT
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* check device defines and use defaults */
|
||||||
|
#if defined __CHECK_DEVICE_DEFINES
|
||||||
|
#ifndef __CM0_REV
|
||||||
|
#define __CM0_REV 0x0000U
|
||||||
|
#warning "__CM0_REV not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __NVIC_PRIO_BITS
|
||||||
|
#define __NVIC_PRIO_BITS 2U
|
||||||
|
#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
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* IO definitions (access restrictions to peripheral registers) */
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_glob_defs CMSIS Global Defines
|
||||||
|
|
||||||
|
<strong>IO Type Qualifiers</strong> are used
|
||||||
|
\li to specify the access to peripheral variables.
|
||||||
|
\li for automatic generation of peripheral register debug information.
|
||||||
|
*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define __I volatile /*!< Defines 'read only' permissions */
|
||||||
|
#else
|
||||||
|
#define __I volatile const /*!< Defines 'read only' permissions */
|
||||||
|
#endif
|
||||||
|
#define __O volatile /*!< Defines 'write only' permissions */
|
||||||
|
#define __IO volatile /*!< Defines 'read / write' permissions */
|
||||||
|
|
||||||
|
/* following defines should be used for structure members */
|
||||||
|
#define __IM volatile const /*! Defines 'read only' structure member permissions */
|
||||||
|
#define __OM volatile /*! Defines 'write only' structure member permissions */
|
||||||
|
#define __IOM volatile /*! Defines 'read / write' structure member permissions */
|
||||||
|
|
||||||
|
/*@} end of group Cortex_M0 */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Register Abstraction
|
||||||
|
Core Register contain:
|
||||||
|
- Core Register
|
||||||
|
- Core NVIC Register
|
||||||
|
- Core SCB Register
|
||||||
|
- Core SysTick Register
|
||||||
|
******************************************************************************/
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_core_register Defines and Type Definitions
|
||||||
|
\brief Type definitions and defines for Cortex-M processor based devices.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_CORE Status and Control Registers
|
||||||
|
\brief Core Register type definitions.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Application Program Status Register (APSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */
|
||||||
|
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 */
|
||||||
|
#define APSR_N_Pos 31U /*!< APSR: N Position */
|
||||||
|
#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */
|
||||||
|
|
||||||
|
#define APSR_Z_Pos 30U /*!< APSR: Z Position */
|
||||||
|
#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */
|
||||||
|
|
||||||
|
#define APSR_C_Pos 29U /*!< APSR: C Position */
|
||||||
|
#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */
|
||||||
|
|
||||||
|
#define APSR_V_Pos 28U /*!< APSR: V Position */
|
||||||
|
#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Interrupt Program Status Register (IPSR).
|
||||||
|
*/
|
||||||
|
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 */
|
||||||
|
} IPSR_Type;
|
||||||
|
|
||||||
|
/* IPSR Register Definitions */
|
||||||
|
#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */
|
||||||
|
#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Special-Purpose Program Status Registers (xPSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
|
||||||
|
uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */
|
||||||
|
uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */
|
||||||
|
uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */
|
||||||
|
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 */
|
||||||
|
#define xPSR_N_Pos 31U /*!< xPSR: N Position */
|
||||||
|
#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */
|
||||||
|
|
||||||
|
#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */
|
||||||
|
#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */
|
||||||
|
|
||||||
|
#define xPSR_C_Pos 29U /*!< xPSR: C Position */
|
||||||
|
#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */
|
||||||
|
|
||||||
|
#define xPSR_V_Pos 28U /*!< xPSR: V Position */
|
||||||
|
#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */
|
||||||
|
|
||||||
|
#define xPSR_T_Pos 24U /*!< xPSR: T Position */
|
||||||
|
#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */
|
||||||
|
|
||||||
|
#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */
|
||||||
|
#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Control Registers (CONTROL).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t _reserved0:1; /*!< bit: 0 Reserved */
|
||||||
|
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 */
|
||||||
|
#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */
|
||||||
|
#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_CORE */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC)
|
||||||
|
\brief Type definitions for the NVIC Registers
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
|
||||||
|
uint32_t RESERVED0[31U];
|
||||||
|
__IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
|
||||||
|
uint32_t RSERVED1[31U];
|
||||||
|
__IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
|
||||||
|
uint32_t RESERVED2[31U];
|
||||||
|
__IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
|
||||||
|
uint32_t RESERVED3[31U];
|
||||||
|
uint32_t RESERVED4[64U];
|
||||||
|
__IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */
|
||||||
|
} NVIC_Type;
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_NVIC */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SCB System Control Block (SCB)
|
||||||
|
\brief Type definitions for the System Control Block Registers
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Structure type to access the System Control Block (SCB).
|
||||||
|
*/
|
||||||
|
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 */
|
||||||
|
uint32_t RESERVED0;
|
||||||
|
__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 */
|
||||||
|
uint32_t RESERVED1;
|
||||||
|
__IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */
|
||||||
|
__IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */
|
||||||
|
} SCB_Type;
|
||||||
|
|
||||||
|
/* SCB CPUID Register Definitions */
|
||||||
|
#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */
|
||||||
|
#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */
|
||||||
|
#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */
|
||||||
|
#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */
|
||||||
|
#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */
|
||||||
|
#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */
|
||||||
|
|
||||||
|
/* SCB Interrupt Control State Register Definitions */
|
||||||
|
#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */
|
||||||
|
#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */
|
||||||
|
#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */
|
||||||
|
#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */
|
||||||
|
#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */
|
||||||
|
#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */
|
||||||
|
#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */
|
||||||
|
#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */
|
||||||
|
#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */
|
||||||
|
#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */
|
||||||
|
|
||||||
|
/* SCB Application Interrupt and Reset Control Register Definitions */
|
||||||
|
#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */
|
||||||
|
#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */
|
||||||
|
#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */
|
||||||
|
#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */
|
||||||
|
#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */
|
||||||
|
#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */
|
||||||
|
|
||||||
|
/* SCB System Control Register Definitions */
|
||||||
|
#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */
|
||||||
|
#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */
|
||||||
|
|
||||||
|
#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */
|
||||||
|
#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */
|
||||||
|
|
||||||
|
#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */
|
||||||
|
#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */
|
||||||
|
|
||||||
|
/* SCB Configuration Control Register Definitions */
|
||||||
|
#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */
|
||||||
|
#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */
|
||||||
|
|
||||||
|
#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */
|
||||||
|
#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */
|
||||||
|
|
||||||
|
/* SCB System Handler Control and State Register Definitions */
|
||||||
|
#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */
|
||||||
|
#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SCB */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SysTick System Tick Timer (SysTick)
|
||||||
|
\brief Type definitions for the System Timer Registers.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Structure type to access the System Timer (SysTick).
|
||||||
|
*/
|
||||||
|
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 */
|
||||||
|
} SysTick_Type;
|
||||||
|
|
||||||
|
/* SysTick Control / Status Register Definitions */
|
||||||
|
#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */
|
||||||
|
#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */
|
||||||
|
#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */
|
||||||
|
#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */
|
||||||
|
#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */
|
||||||
|
|
||||||
|
/* SysTick Reload Register Definitions */
|
||||||
|
#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */
|
||||||
|
#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */
|
||||||
|
|
||||||
|
/* SysTick Current Register Definitions */
|
||||||
|
#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */
|
||||||
|
#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */
|
||||||
|
|
||||||
|
/* SysTick Calibration Register Definitions */
|
||||||
|
#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */
|
||||||
|
#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */
|
||||||
|
|
||||||
|
#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */
|
||||||
|
#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */
|
||||||
|
|
||||||
|
#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */
|
||||||
|
#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SysTick */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug)
|
||||||
|
\brief Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor.
|
||||||
|
Therefore they are not covered by the Cortex-M0 header file.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
/*@} end of group CMSIS_CoreDebug */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_core_bitfield Core register bit field macros
|
||||||
|
\brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk).
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Mask and shift a bit field value for use in a register bit range.
|
||||||
|
\param[in] field Name of the register bit field.
|
||||||
|
\param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type.
|
||||||
|
\return Masked and shifted value.
|
||||||
|
*/
|
||||||
|
#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Mask and shift a register value to extract a bit filed value.
|
||||||
|
\param[in] field Name of the register bit field.
|
||||||
|
\param[in] value Value of register. This parameter is interpreted as an uint32_t type.
|
||||||
|
\return Masked and shifted bit field value.
|
||||||
|
*/
|
||||||
|
#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_core_bitfield */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_core_base Core Definitions
|
||||||
|
\brief Definitions for base addresses, unions, and structures.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Memory mapping of Core Hardware */
|
||||||
|
#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */
|
||||||
|
#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */
|
||||||
|
#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */
|
||||||
|
#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */
|
||||||
|
|
||||||
|
#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */
|
||||||
|
#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */
|
||||||
|
#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */
|
||||||
|
|
||||||
|
|
||||||
|
/*@} */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Hardware Abstraction Layer
|
||||||
|
Core Function Interface contains:
|
||||||
|
- Core NVIC Functions
|
||||||
|
- Core SysTick Functions
|
||||||
|
- Core Register Access Functions
|
||||||
|
******************************************************************************/
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## NVIC functions #################################### */
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_NVICFunctions NVIC Functions
|
||||||
|
\brief Functions that manage interrupts and exceptions via the NVIC.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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
|
||||||
|
#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 not available for Cortex-M0 */
|
||||||
|
#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
|
||||||
|
#else
|
||||||
|
#define NVIC_SetVector __NVIC_SetVector
|
||||||
|
#define NVIC_GetVector __NVIC_GetVector
|
||||||
|
#endif /* (CMSIS_VECTAB_VIRTUAL) */
|
||||||
|
|
||||||
|
#define NVIC_USER_IRQ_OFFSET 16
|
||||||
|
|
||||||
|
|
||||||
|
/* The following EXC_RETURN values are saved the LR on exception entry */
|
||||||
|
#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */
|
||||||
|
#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */
|
||||||
|
#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */
|
||||||
|
|
||||||
|
|
||||||
|
/* Interrupt Priorities are WORD accessible only under Armv6-M */
|
||||||
|
/* The following MACROS handle generation of the register offset and byte masks */
|
||||||
|
#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL)
|
||||||
|
#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) )
|
||||||
|
#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) )
|
||||||
|
|
||||||
|
#define __NVIC_SetPriorityGrouping(X) (void)(X)
|
||||||
|
#define __NVIC_GetPriorityGrouping() (0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Enable Interrupt
|
||||||
|
\details Enables a device specific interrupt in the NVIC interrupt controller.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Interrupt Enable status
|
||||||
|
\details Returns a device specific interrupt enable status from the NVIC interrupt controller.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\return 0 Interrupt is not enabled.
|
||||||
|
\return 1 Interrupt is enabled.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(0U);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Disable Interrupt
|
||||||
|
\details Disables a device specific interrupt in the NVIC interrupt controller.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Pending Interrupt
|
||||||
|
\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\return 0 Interrupt status is not pending.
|
||||||
|
\return 1 Interrupt status is pending.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(0U);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Pending Interrupt
|
||||||
|
\details Sets the pending bit of a device specific interrupt in the NVIC pending register.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Clear Pending Interrupt
|
||||||
|
\details Clears the pending bit of a device specific interrupt in the NVIC pending register.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Interrupt Priority
|
||||||
|
\details Sets the priority of a device specific interrupt or a processor exception.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\param [in] priority Priority to set.
|
||||||
|
\note The priority cannot be set for every processor exception.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
|
||||||
|
(((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
|
||||||
|
(((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Interrupt Priority
|
||||||
|
\details Reads the priority of a device specific interrupt or a processor exception.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\return Interrupt Priority.
|
||||||
|
Value is aligned automatically to the implemented priority bits of the microcontroller.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Encode Priority
|
||||||
|
\details Encodes the priority for an interrupt with the given priority group,
|
||||||
|
preemptive priority value, and subpriority value.
|
||||||
|
In case of a conflict between priority grouping and available
|
||||||
|
priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.
|
||||||
|
\param [in] PriorityGroup Used priority group.
|
||||||
|
\param [in] PreemptPriority Preemptive priority value (starting from 0).
|
||||||
|
\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)
|
||||||
|
{
|
||||||
|
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));
|
||||||
|
|
||||||
|
return (
|
||||||
|
((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |
|
||||||
|
((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL)))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Decode Priority
|
||||||
|
\details Decodes an interrupt priority value with a given priority group to
|
||||||
|
preemptive priority value and subpriority value.
|
||||||
|
In case of a conflict between priority grouping and available
|
||||||
|
priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.
|
||||||
|
\param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority().
|
||||||
|
\param [in] PriorityGroup Used priority group.
|
||||||
|
\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)
|
||||||
|
{
|
||||||
|
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));
|
||||||
|
|
||||||
|
*pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);
|
||||||
|
*pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Interrupt Vector
|
||||||
|
\details Sets an interrupt vector in SRAM based interrupt vector table.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
Address 0 must be mapped to SRAM.
|
||||||
|
\param [in] IRQn Interrupt number
|
||||||
|
\param [in] vector Address of interrupt handler function
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)
|
||||||
|
{
|
||||||
|
uint32_t *vectors = (uint32_t *)0x0U;
|
||||||
|
vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Interrupt Vector
|
||||||
|
\details Reads an interrupt vector from interrupt vector table.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\return Address of interrupt handler function
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
uint32_t *vectors = (uint32_t *)0x0U;
|
||||||
|
return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief System Reset
|
||||||
|
\details Initiates a system reset request to reset the MCU.
|
||||||
|
*/
|
||||||
|
__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
|
||||||
|
{
|
||||||
|
__DSB(); /* Ensure all outstanding memory accesses included
|
||||||
|
buffered write are completed before reset */
|
||||||
|
SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
|
||||||
|
SCB_AIRCR_SYSRESETREQ_Msk);
|
||||||
|
__DSB(); /* Ensure completion of memory access */
|
||||||
|
|
||||||
|
for(;;) /* wait until reset */
|
||||||
|
{
|
||||||
|
__NOP();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_NVICFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## FPU functions #################################### */
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_FpuFunctions FPU Functions
|
||||||
|
\brief Function that provides FPU type.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief get FPU type
|
||||||
|
\details returns the FPU type
|
||||||
|
\returns
|
||||||
|
- \b 0: No FPU
|
||||||
|
- \b 1: Single precision FPU
|
||||||
|
- \b 2: Double + Single precision FPU
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t SCB_GetFPUType(void)
|
||||||
|
{
|
||||||
|
return 0U; /* No FPU */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_FpuFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ################################## SysTick function ############################################ */
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_SysTickFunctions SysTick Functions
|
||||||
|
\brief Functions that configure the System.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief System Tick Configuration
|
||||||
|
\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.
|
||||||
|
Counter is in free running mode to generate periodic interrupts.
|
||||||
|
\param [in] ticks Number of ticks between two interrupts.
|
||||||
|
\return 0 Function succeeded.
|
||||||
|
\return 1 Function failed.
|
||||||
|
\note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
|
||||||
|
function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
|
||||||
|
must contain a vendor-specific implementation of this function.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
|
||||||
|
{
|
||||||
|
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 */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_SysTickFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_CM0_H_DEPENDANT */
|
||||||
|
|
||||||
|
#endif /* __CMSIS_GENERIC */
|
||||||
1083
CMSIS/Core/Include/core_cm0plus.h
Normal file
1083
CMSIS/Core/Include/core_cm0plus.h
Normal file
File diff suppressed because it is too large
Load Diff
976
CMSIS/Core/Include/core_cm1.h
Normal file
976
CMSIS/Core/Include/core_cm1.h
Normal file
@ -0,0 +1,976 @@
|
|||||||
|
/**************************************************************************//**
|
||||||
|
* @file core_cm1.h
|
||||||
|
* @brief CMSIS Cortex-M1 Core Peripheral Access Layer Header File
|
||||||
|
* @version V1.0.0
|
||||||
|
* @date 23. July 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#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 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __CORE_CM1_H_GENERIC
|
||||||
|
#define __CORE_CM1_H_GENERIC
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
\page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions
|
||||||
|
CMSIS violates the following MISRA-C:2004 rules:
|
||||||
|
|
||||||
|
\li Required Rule 8.5, object/function definition in header file.<br>
|
||||||
|
Function definitions in header files are used to allow 'inlining'.
|
||||||
|
|
||||||
|
\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>
|
||||||
|
Unions are used for effective representation of core registers.
|
||||||
|
|
||||||
|
\li Advisory Rule 19.7, Function-like macro defined.<br>
|
||||||
|
Function-like macros are used to allow more efficient code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* CMSIS definitions
|
||||||
|
******************************************************************************/
|
||||||
|
/**
|
||||||
|
\ingroup Cortex_M1
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "cmsis_version.h"
|
||||||
|
|
||||||
|
/* CMSIS CM1 definitions */
|
||||||
|
#define __CM1_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */
|
||||||
|
#define __CM1_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */
|
||||||
|
#define __CM1_CMSIS_VERSION ((__CM1_CMSIS_VERSION_MAIN << 16U) | \
|
||||||
|
__CM1_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */
|
||||||
|
|
||||||
|
#define __CORTEX_M (1U) /*!< Cortex-M Core */
|
||||||
|
|
||||||
|
/** __FPU_USED indicates whether an FPU is used or not.
|
||||||
|
This core does not support an FPU at all
|
||||||
|
*/
|
||||||
|
#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
|
||||||
|
|
||||||
|
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
|
||||||
|
#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
|
||||||
|
|
||||||
|
#elif defined ( __ICCARM__ )
|
||||||
|
#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
|
||||||
|
|
||||||
|
#elif defined ( __TASKING__ )
|
||||||
|
#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
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "cmsis_compiler.h" /* CMSIS compiler specific defines */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_CM1_H_GENERIC */
|
||||||
|
|
||||||
|
#ifndef __CMSIS_GENERIC
|
||||||
|
|
||||||
|
#ifndef __CORE_CM1_H_DEPENDANT
|
||||||
|
#define __CORE_CM1_H_DEPENDANT
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* check device defines and use defaults */
|
||||||
|
#if defined __CHECK_DEVICE_DEFINES
|
||||||
|
#ifndef __CM1_REV
|
||||||
|
#define __CM1_REV 0x0100U
|
||||||
|
#warning "__CM1_REV not defined in device header file; using default!"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef __NVIC_PRIO_BITS
|
||||||
|
#define __NVIC_PRIO_BITS 2U
|
||||||
|
#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
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* IO definitions (access restrictions to peripheral registers) */
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_glob_defs CMSIS Global Defines
|
||||||
|
|
||||||
|
<strong>IO Type Qualifiers</strong> are used
|
||||||
|
\li to specify the access to peripheral variables.
|
||||||
|
\li for automatic generation of peripheral register debug information.
|
||||||
|
*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
#define __I volatile /*!< Defines 'read only' permissions */
|
||||||
|
#else
|
||||||
|
#define __I volatile const /*!< Defines 'read only' permissions */
|
||||||
|
#endif
|
||||||
|
#define __O volatile /*!< Defines 'write only' permissions */
|
||||||
|
#define __IO volatile /*!< Defines 'read / write' permissions */
|
||||||
|
|
||||||
|
/* following defines should be used for structure members */
|
||||||
|
#define __IM volatile const /*! Defines 'read only' structure member permissions */
|
||||||
|
#define __OM volatile /*! Defines 'write only' structure member permissions */
|
||||||
|
#define __IOM volatile /*! Defines 'read / write' structure member permissions */
|
||||||
|
|
||||||
|
/*@} end of group Cortex_M1 */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Register Abstraction
|
||||||
|
Core Register contain:
|
||||||
|
- Core Register
|
||||||
|
- Core NVIC Register
|
||||||
|
- Core SCB Register
|
||||||
|
- Core SysTick Register
|
||||||
|
******************************************************************************/
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_core_register Defines and Type Definitions
|
||||||
|
\brief Type definitions and defines for Cortex-M processor based devices.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_CORE Status and Control Registers
|
||||||
|
\brief Core Register type definitions.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Application Program Status Register (APSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t _reserved0:28; /*!< bit: 0..27 Reserved */
|
||||||
|
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 */
|
||||||
|
#define APSR_N_Pos 31U /*!< APSR: N Position */
|
||||||
|
#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */
|
||||||
|
|
||||||
|
#define APSR_Z_Pos 30U /*!< APSR: Z Position */
|
||||||
|
#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */
|
||||||
|
|
||||||
|
#define APSR_C_Pos 29U /*!< APSR: C Position */
|
||||||
|
#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */
|
||||||
|
|
||||||
|
#define APSR_V_Pos 28U /*!< APSR: V Position */
|
||||||
|
#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Interrupt Program Status Register (IPSR).
|
||||||
|
*/
|
||||||
|
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 */
|
||||||
|
} IPSR_Type;
|
||||||
|
|
||||||
|
/* IPSR Register Definitions */
|
||||||
|
#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */
|
||||||
|
#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Special-Purpose Program Status Registers (xPSR).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */
|
||||||
|
uint32_t _reserved0:15; /*!< bit: 9..23 Reserved */
|
||||||
|
uint32_t T:1; /*!< bit: 24 Thumb bit (read 0) */
|
||||||
|
uint32_t _reserved1:3; /*!< bit: 25..27 Reserved */
|
||||||
|
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 */
|
||||||
|
#define xPSR_N_Pos 31U /*!< xPSR: N Position */
|
||||||
|
#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */
|
||||||
|
|
||||||
|
#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */
|
||||||
|
#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */
|
||||||
|
|
||||||
|
#define xPSR_C_Pos 29U /*!< xPSR: C Position */
|
||||||
|
#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */
|
||||||
|
|
||||||
|
#define xPSR_V_Pos 28U /*!< xPSR: V Position */
|
||||||
|
#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */
|
||||||
|
|
||||||
|
#define xPSR_T_Pos 24U /*!< xPSR: T Position */
|
||||||
|
#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */
|
||||||
|
|
||||||
|
#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */
|
||||||
|
#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Union type to access the Control Registers (CONTROL).
|
||||||
|
*/
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint32_t _reserved0:1; /*!< bit: 0 Reserved */
|
||||||
|
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 */
|
||||||
|
#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */
|
||||||
|
#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_CORE */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC)
|
||||||
|
\brief Type definitions for the NVIC Registers
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Structure type to access the Nested Vectored Interrupt Controller (NVIC).
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
__IOM uint32_t ISER[1U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */
|
||||||
|
uint32_t RESERVED0[31U];
|
||||||
|
__IOM uint32_t ICER[1U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */
|
||||||
|
uint32_t RSERVED1[31U];
|
||||||
|
__IOM uint32_t ISPR[1U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */
|
||||||
|
uint32_t RESERVED2[31U];
|
||||||
|
__IOM uint32_t ICPR[1U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */
|
||||||
|
uint32_t RESERVED3[31U];
|
||||||
|
uint32_t RESERVED4[64U];
|
||||||
|
__IOM uint32_t IP[8U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register */
|
||||||
|
} NVIC_Type;
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_NVIC */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SCB System Control Block (SCB)
|
||||||
|
\brief Type definitions for the System Control Block Registers
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Structure type to access the System Control Block (SCB).
|
||||||
|
*/
|
||||||
|
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 */
|
||||||
|
uint32_t RESERVED0;
|
||||||
|
__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 */
|
||||||
|
uint32_t RESERVED1;
|
||||||
|
__IOM uint32_t SHP[2U]; /*!< Offset: 0x01C (R/W) System Handlers Priority Registers. [0] is RESERVED */
|
||||||
|
__IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */
|
||||||
|
} SCB_Type;
|
||||||
|
|
||||||
|
/* SCB CPUID Register Definitions */
|
||||||
|
#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */
|
||||||
|
#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */
|
||||||
|
#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */
|
||||||
|
#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */
|
||||||
|
#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */
|
||||||
|
|
||||||
|
#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */
|
||||||
|
#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */
|
||||||
|
|
||||||
|
/* SCB Interrupt Control State Register Definitions */
|
||||||
|
#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */
|
||||||
|
#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */
|
||||||
|
#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */
|
||||||
|
#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */
|
||||||
|
#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */
|
||||||
|
#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */
|
||||||
|
#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */
|
||||||
|
#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */
|
||||||
|
#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */
|
||||||
|
|
||||||
|
#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */
|
||||||
|
#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */
|
||||||
|
|
||||||
|
/* SCB Application Interrupt and Reset Control Register Definitions */
|
||||||
|
#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */
|
||||||
|
#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */
|
||||||
|
#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */
|
||||||
|
#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */
|
||||||
|
#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */
|
||||||
|
|
||||||
|
#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */
|
||||||
|
#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */
|
||||||
|
|
||||||
|
/* SCB System Control Register Definitions */
|
||||||
|
#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */
|
||||||
|
#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */
|
||||||
|
|
||||||
|
#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */
|
||||||
|
#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */
|
||||||
|
|
||||||
|
#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */
|
||||||
|
#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */
|
||||||
|
|
||||||
|
/* SCB Configuration Control Register Definitions */
|
||||||
|
#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */
|
||||||
|
#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */
|
||||||
|
|
||||||
|
#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */
|
||||||
|
#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */
|
||||||
|
|
||||||
|
/* SCB System Handler Control and State Register Definitions */
|
||||||
|
#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */
|
||||||
|
#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SCB */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB)
|
||||||
|
\brief Type definitions for the System Control and ID Register not in the SCB
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Structure type to access the System Control and ID Register not in the SCB.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
uint32_t RESERVED0[2U];
|
||||||
|
__IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */
|
||||||
|
} SCnSCB_Type;
|
||||||
|
|
||||||
|
/* Auxiliary Control Register Definitions */
|
||||||
|
#define SCnSCB_ACTLR_ITCMUAEN_Pos 4U /*!< ACTLR: Instruction TCM Upper Alias Enable Position */
|
||||||
|
#define SCnSCB_ACTLR_ITCMUAEN_Msk (1UL << SCnSCB_ACTLR_ITCMUAEN_Pos) /*!< ACTLR: Instruction TCM Upper Alias Enable Mask */
|
||||||
|
|
||||||
|
#define SCnSCB_ACTLR_ITCMLAEN_Pos 3U /*!< ACTLR: Instruction TCM Lower Alias Enable Position */
|
||||||
|
#define SCnSCB_ACTLR_ITCMLAEN_Msk (1UL << SCnSCB_ACTLR_ITCMLAEN_Pos) /*!< ACTLR: Instruction TCM Lower Alias Enable Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SCnotSCB */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_SysTick System Tick Timer (SysTick)
|
||||||
|
\brief Type definitions for the System Timer Registers.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Structure type to access the System Timer (SysTick).
|
||||||
|
*/
|
||||||
|
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 */
|
||||||
|
} SysTick_Type;
|
||||||
|
|
||||||
|
/* SysTick Control / Status Register Definitions */
|
||||||
|
#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */
|
||||||
|
#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */
|
||||||
|
#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */
|
||||||
|
#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */
|
||||||
|
|
||||||
|
#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */
|
||||||
|
#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */
|
||||||
|
|
||||||
|
/* SysTick Reload Register Definitions */
|
||||||
|
#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */
|
||||||
|
#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */
|
||||||
|
|
||||||
|
/* SysTick Current Register Definitions */
|
||||||
|
#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */
|
||||||
|
#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */
|
||||||
|
|
||||||
|
/* SysTick Calibration Register Definitions */
|
||||||
|
#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */
|
||||||
|
#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */
|
||||||
|
|
||||||
|
#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */
|
||||||
|
#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */
|
||||||
|
|
||||||
|
#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */
|
||||||
|
#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_SysTick */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug)
|
||||||
|
\brief Cortex-M1 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor.
|
||||||
|
Therefore they are not covered by the Cortex-M1 header file.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
/*@} end of group CMSIS_CoreDebug */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_core_bitfield Core register bit field macros
|
||||||
|
\brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk).
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Mask and shift a bit field value for use in a register bit range.
|
||||||
|
\param[in] field Name of the register bit field.
|
||||||
|
\param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type.
|
||||||
|
\return Masked and shifted value.
|
||||||
|
*/
|
||||||
|
#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Mask and shift a register value to extract a bit filed value.
|
||||||
|
\param[in] field Name of the register bit field.
|
||||||
|
\param[in] value Value of register. This parameter is interpreted as an uint32_t type.
|
||||||
|
\return Masked and shifted bit field value.
|
||||||
|
*/
|
||||||
|
#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)
|
||||||
|
|
||||||
|
/*@} end of group CMSIS_core_bitfield */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_core_register
|
||||||
|
\defgroup CMSIS_core_base Core Definitions
|
||||||
|
\brief Definitions for base addresses, unions, and structures.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Memory mapping of Core Hardware */
|
||||||
|
#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */
|
||||||
|
#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */
|
||||||
|
#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */
|
||||||
|
#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */
|
||||||
|
|
||||||
|
#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */
|
||||||
|
#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */
|
||||||
|
#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */
|
||||||
|
#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */
|
||||||
|
|
||||||
|
|
||||||
|
/*@} */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
* Hardware Abstraction Layer
|
||||||
|
Core Function Interface contains:
|
||||||
|
- Core NVIC Functions
|
||||||
|
- Core SysTick Functions
|
||||||
|
- Core Register Access Functions
|
||||||
|
******************************************************************************/
|
||||||
|
/**
|
||||||
|
\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## NVIC functions #################################### */
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_NVICFunctions NVIC Functions
|
||||||
|
\brief Functions that manage interrupts and exceptions via the NVIC.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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
|
||||||
|
#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 not available for Cortex-M1 */
|
||||||
|
#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
|
||||||
|
#else
|
||||||
|
#define NVIC_SetVector __NVIC_SetVector
|
||||||
|
#define NVIC_GetVector __NVIC_GetVector
|
||||||
|
#endif /* (CMSIS_VECTAB_VIRTUAL) */
|
||||||
|
|
||||||
|
#define NVIC_USER_IRQ_OFFSET 16
|
||||||
|
|
||||||
|
|
||||||
|
/* The following EXC_RETURN values are saved the LR on exception entry */
|
||||||
|
#define EXC_RETURN_HANDLER (0xFFFFFFF1UL) /* return to Handler mode, uses MSP after return */
|
||||||
|
#define EXC_RETURN_THREAD_MSP (0xFFFFFFF9UL) /* return to Thread mode, uses MSP after return */
|
||||||
|
#define EXC_RETURN_THREAD_PSP (0xFFFFFFFDUL) /* return to Thread mode, uses PSP after return */
|
||||||
|
|
||||||
|
|
||||||
|
/* Interrupt Priorities are WORD accessible only under Armv6-M */
|
||||||
|
/* The following MACROS handle generation of the register offset and byte masks */
|
||||||
|
#define _BIT_SHIFT(IRQn) ( ((((uint32_t)(int32_t)(IRQn)) ) & 0x03UL) * 8UL)
|
||||||
|
#define _SHP_IDX(IRQn) ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >> 2UL) )
|
||||||
|
#define _IP_IDX(IRQn) ( (((uint32_t)(int32_t)(IRQn)) >> 2UL) )
|
||||||
|
|
||||||
|
#define __NVIC_SetPriorityGrouping(X) (void)(X)
|
||||||
|
#define __NVIC_GetPriorityGrouping() (0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Enable Interrupt
|
||||||
|
\details Enables a device specific interrupt in the NVIC interrupt controller.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Interrupt Enable status
|
||||||
|
\details Returns a device specific interrupt enable status from the NVIC interrupt controller.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\return 0 Interrupt is not enabled.
|
||||||
|
\return 1 Interrupt is enabled.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(0U);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Disable Interrupt
|
||||||
|
\details Disables a device specific interrupt in the NVIC interrupt controller.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Pending Interrupt
|
||||||
|
\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\return 0 Interrupt status is not pending.
|
||||||
|
\return 1 Interrupt status is pending.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return(0U);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Pending Interrupt
|
||||||
|
\details Sets the pending bit of a device specific interrupt in the NVIC pending register.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Clear Pending Interrupt
|
||||||
|
\details Clears the pending bit of a device specific interrupt in the NVIC pending register.
|
||||||
|
\param [in] IRQn Device specific interrupt number.
|
||||||
|
\note IRQn must not be negative.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Interrupt Priority
|
||||||
|
\details Sets the priority of a device specific interrupt or a processor exception.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\param [in] priority Priority to set.
|
||||||
|
\note The priority cannot be set for every processor exception.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
|
||||||
|
{
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
NVIC->IP[_IP_IDX(IRQn)] = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
|
||||||
|
(((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
|
||||||
|
(((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Interrupt Priority
|
||||||
|
\details Reads the priority of a device specific interrupt or a processor exception.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\return Interrupt Priority.
|
||||||
|
Value is aligned automatically to the implemented priority bits of the microcontroller.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((int32_t)(IRQn) >= 0)
|
||||||
|
{
|
||||||
|
return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Encode Priority
|
||||||
|
\details Encodes the priority for an interrupt with the given priority group,
|
||||||
|
preemptive priority value, and subpriority value.
|
||||||
|
In case of a conflict between priority grouping and available
|
||||||
|
priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.
|
||||||
|
\param [in] PriorityGroup Used priority group.
|
||||||
|
\param [in] PreemptPriority Preemptive priority value (starting from 0).
|
||||||
|
\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)
|
||||||
|
{
|
||||||
|
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));
|
||||||
|
|
||||||
|
return (
|
||||||
|
((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |
|
||||||
|
((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL)))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Decode Priority
|
||||||
|
\details Decodes an interrupt priority value with a given priority group to
|
||||||
|
preemptive priority value and subpriority value.
|
||||||
|
In case of a conflict between priority grouping and available
|
||||||
|
priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.
|
||||||
|
\param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority().
|
||||||
|
\param [in] PriorityGroup Used priority group.
|
||||||
|
\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)
|
||||||
|
{
|
||||||
|
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));
|
||||||
|
|
||||||
|
*pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);
|
||||||
|
*pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Set Interrupt Vector
|
||||||
|
\details Sets an interrupt vector in SRAM based interrupt vector table.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
Address 0 must be mapped to SRAM.
|
||||||
|
\param [in] IRQn Interrupt number
|
||||||
|
\param [in] vector Address of interrupt handler function
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)
|
||||||
|
{
|
||||||
|
uint32_t *vectors = (uint32_t *)0x0U;
|
||||||
|
vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief Get Interrupt Vector
|
||||||
|
\details Reads an interrupt vector from interrupt vector table.
|
||||||
|
The interrupt number can be positive to specify a device specific interrupt,
|
||||||
|
or negative to specify a processor exception.
|
||||||
|
\param [in] IRQn Interrupt number.
|
||||||
|
\return Address of interrupt handler function
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)
|
||||||
|
{
|
||||||
|
uint32_t *vectors = (uint32_t *)0x0U;
|
||||||
|
return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief System Reset
|
||||||
|
\details Initiates a system reset request to reset the MCU.
|
||||||
|
*/
|
||||||
|
__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)
|
||||||
|
{
|
||||||
|
__DSB(); /* Ensure all outstanding memory accesses included
|
||||||
|
buffered write are completed before reset */
|
||||||
|
SCB->AIRCR = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |
|
||||||
|
SCB_AIRCR_SYSRESETREQ_Msk);
|
||||||
|
__DSB(); /* Ensure completion of memory access */
|
||||||
|
|
||||||
|
for(;;) /* wait until reset */
|
||||||
|
{
|
||||||
|
__NOP();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_NVICFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
/* ########################## FPU functions #################################### */
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_FpuFunctions FPU Functions
|
||||||
|
\brief Function that provides FPU type.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief get FPU type
|
||||||
|
\details returns the FPU type
|
||||||
|
\returns
|
||||||
|
- \b 0: No FPU
|
||||||
|
- \b 1: Single precision FPU
|
||||||
|
- \b 2: Double + Single precision FPU
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t SCB_GetFPUType(void)
|
||||||
|
{
|
||||||
|
return 0U; /* No FPU */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_FpuFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ################################## SysTick function ############################################ */
|
||||||
|
/**
|
||||||
|
\ingroup CMSIS_Core_FunctionInterface
|
||||||
|
\defgroup CMSIS_Core_SysTickFunctions SysTick Functions
|
||||||
|
\brief Functions that configure the System.
|
||||||
|
@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief System Tick Configuration
|
||||||
|
\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.
|
||||||
|
Counter is in free running mode to generate periodic interrupts.
|
||||||
|
\param [in] ticks Number of ticks between two interrupts.
|
||||||
|
\return 0 Function succeeded.
|
||||||
|
\return 1 Function failed.
|
||||||
|
\note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
|
||||||
|
function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
|
||||||
|
must contain a vendor-specific implementation of this function.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
|
||||||
|
{
|
||||||
|
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 */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*@} end of CMSIS_Core_SysTickFunctions */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __CORE_CM1_H_DEPENDANT */
|
||||||
|
|
||||||
|
#endif /* __CMSIS_GENERIC */
|
||||||
1993
CMSIS/Core/Include/core_cm23.h
Normal file
1993
CMSIS/Core/Include/core_cm23.h
Normal file
File diff suppressed because it is too large
Load Diff
1941
CMSIS/Core/Include/core_cm3.h
Normal file
1941
CMSIS/Core/Include/core_cm3.h
Normal file
File diff suppressed because it is too large
Load Diff
3002
CMSIS/Core/Include/core_cm33.h
Normal file
3002
CMSIS/Core/Include/core_cm33.h
Normal file
File diff suppressed because it is too large
Load Diff
2129
CMSIS/Core/Include/core_cm4.h
Normal file
2129
CMSIS/Core/Include/core_cm4.h
Normal file
File diff suppressed because it is too large
Load Diff
2671
CMSIS/Core/Include/core_cm7.h
Normal file
2671
CMSIS/Core/Include/core_cm7.h
Normal file
File diff suppressed because it is too large
Load Diff
1022
CMSIS/Core/Include/core_sc000.h
Normal file
1022
CMSIS/Core/Include/core_sc000.h
Normal file
File diff suppressed because it is too large
Load Diff
1915
CMSIS/Core/Include/core_sc300.h
Normal file
1915
CMSIS/Core/Include/core_sc300.h
Normal file
File diff suppressed because it is too large
Load Diff
270
CMSIS/Core/Include/mpu_armv7.h
Normal file
270
CMSIS/Core/Include/mpu_armv7.h
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file mpu_armv7.h
|
||||||
|
* @brief CMSIS MPU API for Armv7-M MPU
|
||||||
|
* @version V5.0.4
|
||||||
|
* @date 10. January 2018
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#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 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ARM_MPU_ARMV7_H
|
||||||
|
#define ARM_MPU_ARMV7_H
|
||||||
|
|
||||||
|
#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) ///!< MPU Region Size 32 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) ///!< MPU Region Size 64 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) ///!< MPU Region Size 128 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) ///!< MPU Region Size 256 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) ///!< MPU Region Size 512 Bytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) ///!< MPU Region Size 1 KByte
|
||||||
|
#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) ///!< MPU Region Size 2 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) ///!< MPU Region Size 4 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) ///!< MPU Region Size 8 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) ///!< MPU Region Size 16 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) ///!< MPU Region Size 32 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) ///!< MPU Region Size 64 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) ///!< MPU Region Size 128 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) ///!< MPU Region Size 256 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) ///!< MPU Region Size 512 KBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) ///!< MPU Region Size 1 MByte
|
||||||
|
#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) ///!< MPU Region Size 2 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) ///!< MPU Region Size 4 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) ///!< MPU Region Size 8 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) ///!< MPU Region Size 16 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) ///!< MPU Region Size 32 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) ///!< MPU Region Size 64 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) ///!< MPU Region Size 128 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) ///!< MPU Region Size 256 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) ///!< MPU Region Size 512 MBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) ///!< MPU Region Size 1 GByte
|
||||||
|
#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) ///!< MPU Region Size 2 GBytes
|
||||||
|
#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) ///!< MPU Region Size 4 GBytes
|
||||||
|
|
||||||
|
#define ARM_MPU_AP_NONE 0U ///!< MPU Access Permission no access
|
||||||
|
#define ARM_MPU_AP_PRIV 1U ///!< MPU Access Permission privileged access only
|
||||||
|
#define ARM_MPU_AP_URO 2U ///!< MPU Access Permission unprivileged access read-only
|
||||||
|
#define ARM_MPU_AP_FULL 3U ///!< MPU Access Permission full access
|
||||||
|
#define ARM_MPU_AP_PRO 5U ///!< MPU Access Permission privileged access read-only
|
||||||
|
#define ARM_MPU_AP_RO 6U ///!< MPU Access Permission read-only access
|
||||||
|
|
||||||
|
/** MPU Region Base Address Register Value
|
||||||
|
*
|
||||||
|
* \param Region The region to be configured, number 0 to 15.
|
||||||
|
* \param BaseAddress The base address for the region.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RBAR(Region, BaseAddress) \
|
||||||
|
(((BaseAddress) & MPU_RBAR_ADDR_Msk) | \
|
||||||
|
((Region) & MPU_RBAR_REGION_Msk) | \
|
||||||
|
(MPU_RBAR_VALID_Msk))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attributes
|
||||||
|
*
|
||||||
|
* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral.
|
||||||
|
* \param IsShareable Region is shareable between multiple bus masters.
|
||||||
|
* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache.
|
||||||
|
* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable) \
|
||||||
|
((((TypeExtField ) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \
|
||||||
|
(((IsShareable ) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \
|
||||||
|
(((IsCacheable ) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \
|
||||||
|
(((IsBufferable ) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Region Attribute and Size Register Value
|
||||||
|
*
|
||||||
|
* \param DisableExec Instruction access disable bit, 1= disable instruction fetches.
|
||||||
|
* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode.
|
||||||
|
* \param AccessAttributes Memory access attribution, see \ref ARM_MPU_ACCESS_.
|
||||||
|
* \param SubRegionDisable Sub-region disable field.
|
||||||
|
* \param Size Region size of the region to be configured, for example 4K, 8K.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RASR_EX(DisableExec, AccessPermission, AccessAttributes, SubRegionDisable, Size) \
|
||||||
|
((((DisableExec ) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \
|
||||||
|
(((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \
|
||||||
|
(((AccessAttributes) ) & (MPU_RASR_TEX_Msk | MPU_RASR_S_Msk | MPU_RASR_C_Msk | MPU_RASR_B_Msk)))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Region Attribute and Size Register Value
|
||||||
|
*
|
||||||
|
* \param DisableExec Instruction access disable bit, 1= disable instruction fetches.
|
||||||
|
* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode.
|
||||||
|
* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral.
|
||||||
|
* \param IsShareable Region is shareable between multiple bus masters.
|
||||||
|
* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache.
|
||||||
|
* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy.
|
||||||
|
* \param SubRegionDisable Sub-region disable field.
|
||||||
|
* \param Size Region size of the region to be configured, for example 4K, 8K.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \
|
||||||
|
ARM_MPU_RASR_EX(DisableExec, AccessPermission, ARM_MPU_ACCESS_(TypeExtField, IsShareable, IsCacheable, IsBufferable), SubRegionDisable, Size)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute for strongly ordered memory.
|
||||||
|
* - TEX: 000b
|
||||||
|
* - Shareable
|
||||||
|
* - Non-cacheable
|
||||||
|
* - Non-bufferable
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ACCESS_ORDERED ARM_MPU_ACCESS_(0U, 1U, 0U, 0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute for device memory.
|
||||||
|
* - TEX: 000b (if non-shareable) or 010b (if shareable)
|
||||||
|
* - Shareable or non-shareable
|
||||||
|
* - Non-cacheable
|
||||||
|
* - Bufferable (if shareable) or non-bufferable (if non-shareable)
|
||||||
|
*
|
||||||
|
* \param IsShareable Configures the device memory as shareable or non-shareable.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ACCESS_DEVICE(IsShareable) ((IsShareable) ? ARM_MPU_ACCESS_(0U, 1U, 0U, 1U) : ARM_MPU_ACCESS_(2U, 0U, 0U, 0U))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute for normal memory.
|
||||||
|
* - TEX: 1BBb (reflecting outer cacheability rules)
|
||||||
|
* - Shareable or non-shareable
|
||||||
|
* - Cacheable or non-cacheable (reflecting inner cacheability rules)
|
||||||
|
* - Bufferable or non-bufferable (reflecting inner cacheability rules)
|
||||||
|
*
|
||||||
|
* \param OuterCp Configures the outer cache policy.
|
||||||
|
* \param InnerCp Configures the inner cache policy.
|
||||||
|
* \param IsShareable Configures the memory as shareable or non-shareable.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ACCESS_NORMAL(OuterCp, InnerCp, IsShareable) ARM_MPU_ACCESS_((4U | (OuterCp)), IsShareable, ((InnerCp) & 2U), ((InnerCp) & 1U))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute non-cacheable policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_CACHEP_NOCACHE 0U
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute write-back, write and read allocate policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_CACHEP_WB_WRA 1U
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute write-through, no write allocate policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_CACHEP_WT_NWA 2U
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MPU Memory Access Attribute write-back, no write allocate policy.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_CACHEP_WB_NWA 3U
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Struct for a single MPU Region
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uint32_t RBAR; //!< The region base address register value (RBAR)
|
||||||
|
uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR
|
||||||
|
} ARM_MPU_Region_t;
|
||||||
|
|
||||||
|
/** Enable the MPU.
|
||||||
|
* \param MPU_Control Default access permissions for unconfigured regions.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control)
|
||||||
|
{
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Disable the MPU.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Disable(void)
|
||||||
|
{
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Clear and disable the given MPU region.
|
||||||
|
* \param rnr Region number to be cleared.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr)
|
||||||
|
{
|
||||||
|
MPU->RNR = rnr;
|
||||||
|
MPU->RASR = 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure an MPU region.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rsar Value for RSAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr)
|
||||||
|
{
|
||||||
|
MPU->RBAR = rbar;
|
||||||
|
MPU->RASR = rasr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure the given MPU region.
|
||||||
|
* \param rnr Region number to be configured.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rsar Value for RSAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr)
|
||||||
|
{
|
||||||
|
MPU->RNR = rnr;
|
||||||
|
MPU->RBAR = rbar;
|
||||||
|
MPU->RASR = rasr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Memcopy with strictly ordered memory access, e.g. for register targets.
|
||||||
|
* \param dst Destination data is copied to.
|
||||||
|
* \param src Source data is copied from.
|
||||||
|
* \param len Amount of data words to be copied.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
for (i = 0U; i < len; ++i)
|
||||||
|
{
|
||||||
|
dst[i] = src[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Load the given number of MPU regions from a table.
|
||||||
|
* \param table Pointer to the MPU configuration table.
|
||||||
|
* \param cnt Amount of regions to be configured.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt)
|
||||||
|
{
|
||||||
|
const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U;
|
||||||
|
while (cnt > MPU_TYPE_RALIASES) {
|
||||||
|
orderedCpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize);
|
||||||
|
table += MPU_TYPE_RALIASES;
|
||||||
|
cnt -= MPU_TYPE_RALIASES;
|
||||||
|
}
|
||||||
|
orderedCpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
333
CMSIS/Core/Include/mpu_armv8.h
Normal file
333
CMSIS/Core/Include/mpu_armv8.h
Normal file
@ -0,0 +1,333 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file mpu_armv8.h
|
||||||
|
* @brief CMSIS MPU API for Armv8-M MPU
|
||||||
|
* @version V5.0.4
|
||||||
|
* @date 10. January 2018
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#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 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef ARM_MPU_ARMV8_H
|
||||||
|
#define ARM_MPU_ARMV8_H
|
||||||
|
|
||||||
|
/** \brief Attribute for device memory (outer only) */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE ( 0U )
|
||||||
|
|
||||||
|
/** \brief Attribute for non-cacheable, normal memory */
|
||||||
|
#define ARM_MPU_ATTR_NON_CACHEABLE ( 4U )
|
||||||
|
|
||||||
|
/** \brief Attribute for normal memory (outer and inner)
|
||||||
|
* \param NT Non-Transient: Set to 1 for non-transient data.
|
||||||
|
* \param WB Write-Back: Set to 1 to use write-back update policy.
|
||||||
|
* \param RA Read Allocation: Set to 1 to use cache allocation on read miss.
|
||||||
|
* \param WA Write Allocation: Set to 1 to use cache allocation on write miss.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \
|
||||||
|
(((NT & 1U) << 3U) | ((WB & 1U) << 2U) | ((RA & 1U) << 1U) | (WA & 1U))
|
||||||
|
|
||||||
|
/** \brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U)
|
||||||
|
|
||||||
|
/** \brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE_nGnRE (1U)
|
||||||
|
|
||||||
|
/** \brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE_nGRE (2U)
|
||||||
|
|
||||||
|
/** \brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */
|
||||||
|
#define ARM_MPU_ATTR_DEVICE_GRE (3U)
|
||||||
|
|
||||||
|
/** \brief Memory Attribute
|
||||||
|
* \param O Outer memory attributes
|
||||||
|
* \param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_ATTR(O, I) (((O & 0xFU) << 4U) | (((O & 0xFU) != 0U) ? (I & 0xFU) : ((I & 0x3U) << 2U)))
|
||||||
|
|
||||||
|
/** \brief Normal memory non-shareable */
|
||||||
|
#define ARM_MPU_SH_NON (0U)
|
||||||
|
|
||||||
|
/** \brief Normal memory outer shareable */
|
||||||
|
#define ARM_MPU_SH_OUTER (2U)
|
||||||
|
|
||||||
|
/** \brief Normal memory inner shareable */
|
||||||
|
#define ARM_MPU_SH_INNER (3U)
|
||||||
|
|
||||||
|
/** \brief Memory access permissions
|
||||||
|
* \param RO Read-Only: Set to 1 for read-only memory.
|
||||||
|
* \param NP Non-Privileged: Set to 1 for non-privileged memory.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_AP_(RO, NP) (((RO & 1U) << 1U) | (NP & 1U))
|
||||||
|
|
||||||
|
/** \brief Region Base Address Register value
|
||||||
|
* \param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned.
|
||||||
|
* \param SH Defines the Shareability domain for this memory region.
|
||||||
|
* \param RO Read-Only: Set to 1 for a read-only memory region.
|
||||||
|
* \param NP Non-Privileged: Set to 1 for a non-privileged memory region.
|
||||||
|
* \oaram XN eXecute Never: Set to 1 for a non-executable memory region.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \
|
||||||
|
((BASE & MPU_RBAR_BASE_Msk) | \
|
||||||
|
((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \
|
||||||
|
((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \
|
||||||
|
((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk))
|
||||||
|
|
||||||
|
/** \brief Region Limit Address Register value
|
||||||
|
* \param LIMIT The limit address bits [31:5] for this memory region. The value is one extended.
|
||||||
|
* \param IDX The attribute index to be associated with this memory region.
|
||||||
|
*/
|
||||||
|
#define ARM_MPU_RLAR(LIMIT, IDX) \
|
||||||
|
((LIMIT & MPU_RLAR_LIMIT_Msk) | \
|
||||||
|
((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \
|
||||||
|
(MPU_RLAR_EN_Msk))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Struct for a single MPU Region
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
uint32_t RBAR; /*!< Region Base Address Register value */
|
||||||
|
uint32_t RLAR; /*!< Region Limit Address Register value */
|
||||||
|
} ARM_MPU_Region_t;
|
||||||
|
|
||||||
|
/** Enable the MPU.
|
||||||
|
* \param MPU_Control Default access permissions for unconfigured regions.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control)
|
||||||
|
{
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Disable the MPU.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Disable(void)
|
||||||
|
{
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Enable the Non-secure MPU.
|
||||||
|
* \param MPU_Control Default access permissions for unconfigured regions.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control)
|
||||||
|
{
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Disable the Non-secure MPU.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Disable_NS(void)
|
||||||
|
{
|
||||||
|
__DSB();
|
||||||
|
__ISB();
|
||||||
|
#ifdef SCB_SHCSR_MEMFAULTENA_Msk
|
||||||
|
SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;
|
||||||
|
#endif
|
||||||
|
MPU_NS->CTRL &= ~MPU_CTRL_ENABLE_Msk;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Set the memory attribute encoding to the given MPU.
|
||||||
|
* \param mpu Pointer to the MPU to be configured.
|
||||||
|
* \param idx The attribute index to be set [0-7]
|
||||||
|
* \param attr The attribute value to be set.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr)
|
||||||
|
{
|
||||||
|
const uint8_t reg = idx / 4U;
|
||||||
|
const uint32_t pos = ((idx % 4U) * 8U);
|
||||||
|
const uint32_t mask = 0xFFU << pos;
|
||||||
|
|
||||||
|
if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) {
|
||||||
|
return; // invalid index
|
||||||
|
}
|
||||||
|
|
||||||
|
mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask));
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Set the memory attribute encoding.
|
||||||
|
* \param idx The attribute index to be set [0-7]
|
||||||
|
* \param attr The attribute value to be set.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr)
|
||||||
|
{
|
||||||
|
ARM_MPU_SetMemAttrEx(MPU, idx, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Set the memory attribute encoding to the Non-secure MPU.
|
||||||
|
* \param idx The attribute index to be set [0-7]
|
||||||
|
* \param attr The attribute value to be set.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr)
|
||||||
|
{
|
||||||
|
ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Clear and disable the given MPU region of the given MPU.
|
||||||
|
* \param mpu Pointer to MPU to be used.
|
||||||
|
* \param rnr Region number to be cleared.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr)
|
||||||
|
{
|
||||||
|
mpu->RNR = rnr;
|
||||||
|
mpu->RLAR = 0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Clear and disable the given MPU region.
|
||||||
|
* \param rnr Region number to be cleared.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr)
|
||||||
|
{
|
||||||
|
ARM_MPU_ClrRegionEx(MPU, rnr);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Clear and disable the given Non-secure MPU region.
|
||||||
|
* \param rnr Region number to be cleared.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr)
|
||||||
|
{
|
||||||
|
ARM_MPU_ClrRegionEx(MPU_NS, rnr);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Configure the given MPU region of the given MPU.
|
||||||
|
* \param mpu Pointer to MPU to be used.
|
||||||
|
* \param rnr Region number to be configured.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rlar Value for RLAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar)
|
||||||
|
{
|
||||||
|
mpu->RNR = rnr;
|
||||||
|
mpu->RBAR = rbar;
|
||||||
|
mpu->RLAR = rlar;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Configure the given MPU region.
|
||||||
|
* \param rnr Region number to be configured.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rlar Value for RLAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar)
|
||||||
|
{
|
||||||
|
ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Configure the given Non-secure MPU region.
|
||||||
|
* \param rnr Region number to be configured.
|
||||||
|
* \param rbar Value for RBAR register.
|
||||||
|
* \param rlar Value for RLAR register.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar)
|
||||||
|
{
|
||||||
|
ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Memcopy with strictly ordered memory access, e.g. for register targets.
|
||||||
|
* \param dst Destination data is copied to.
|
||||||
|
* \param src Source data is copied from.
|
||||||
|
* \param len Amount of data words to be copied.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len)
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
for (i = 0U; i < len; ++i)
|
||||||
|
{
|
||||||
|
dst[i] = src[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Load the given number of MPU regions from a table to the given MPU.
|
||||||
|
* \param mpu Pointer to the MPU registers to be used.
|
||||||
|
* \param rnr First region number to be configured.
|
||||||
|
* \param table Pointer to the MPU configuration table.
|
||||||
|
* \param cnt Amount of regions to be configured.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)
|
||||||
|
{
|
||||||
|
const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U;
|
||||||
|
if (cnt == 1U) {
|
||||||
|
mpu->RNR = rnr;
|
||||||
|
orderedCpy(&(mpu->RBAR), &(table->RBAR), rowWordSize);
|
||||||
|
} else {
|
||||||
|
uint32_t rnrBase = rnr & ~(MPU_TYPE_RALIASES-1U);
|
||||||
|
uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES;
|
||||||
|
|
||||||
|
mpu->RNR = rnrBase;
|
||||||
|
while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) {
|
||||||
|
uint32_t c = MPU_TYPE_RALIASES - rnrOffset;
|
||||||
|
orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize);
|
||||||
|
table += c;
|
||||||
|
cnt -= c;
|
||||||
|
rnrOffset = 0U;
|
||||||
|
rnrBase += MPU_TYPE_RALIASES;
|
||||||
|
mpu->RNR = rnrBase;
|
||||||
|
}
|
||||||
|
|
||||||
|
orderedCpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Load the given number of MPU regions from a table.
|
||||||
|
* \param rnr First region number to be configured.
|
||||||
|
* \param table Pointer to the MPU configuration table.
|
||||||
|
* \param cnt Amount of regions to be configured.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)
|
||||||
|
{
|
||||||
|
ARM_MPU_LoadEx(MPU, rnr, table, cnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MPU_NS
|
||||||
|
/** Load the given number of MPU regions from a table to the Non-secure MPU.
|
||||||
|
* \param rnr First region number to be configured.
|
||||||
|
* \param table Pointer to the MPU configuration table.
|
||||||
|
* \param cnt Amount of regions to be configured.
|
||||||
|
*/
|
||||||
|
__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)
|
||||||
|
{
|
||||||
|
ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
70
CMSIS/Core/Include/tz_context.h
Normal file
70
CMSIS/Core/Include/tz_context.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/******************************************************************************
|
||||||
|
* @file tz_context.h
|
||||||
|
* @brief Context Management for Armv8-M TrustZone
|
||||||
|
* @version V1.0.1
|
||||||
|
* @date 10. January 2018
|
||||||
|
******************************************************************************/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2017-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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined ( __ICCARM__ )
|
||||||
|
#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 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TZ_CONTEXT_H
|
||||||
|
#define TZ_CONTEXT_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef TZ_MODULEID_T
|
||||||
|
#define TZ_MODULEID_T
|
||||||
|
/// \details Data type that identifies secure software modules called by a process.
|
||||||
|
typedef uint32_t TZ_ModuleId_t;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// \details TZ Memory ID identifies an allocated memory slot.
|
||||||
|
typedef uint32_t TZ_MemoryId_t;
|
||||||
|
|
||||||
|
/// Initialize secure context memory system
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
uint32_t TZ_InitContextSystem_S (void);
|
||||||
|
|
||||||
|
/// Allocate context memory for calling secure software modules in TrustZone
|
||||||
|
/// \param[in] module identifies software modules called from non-secure mode
|
||||||
|
/// \return value != 0 id TrustZone memory slot identifier
|
||||||
|
/// \return value 0 no memory available or internal error
|
||||||
|
TZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module);
|
||||||
|
|
||||||
|
/// Free context memory that was previously allocated with \ref TZ_AllocModuleContext_S
|
||||||
|
/// \param[in] id TrustZone memory slot identifier
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
uint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id);
|
||||||
|
|
||||||
|
/// Load secure context (called on RTOS thread context switch)
|
||||||
|
/// \param[in] id TrustZone memory slot identifier
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
uint32_t TZ_LoadContext_S (TZ_MemoryId_t id);
|
||||||
|
|
||||||
|
/// Store secure context (called on RTOS thread context switch)
|
||||||
|
/// \param[in] id TrustZone memory slot identifier
|
||||||
|
/// \return execution status (1: success, 0: error)
|
||||||
|
uint32_t TZ_StoreContext_S (TZ_MemoryId_t id);
|
||||||
|
|
||||||
|
#endif // TZ_CONTEXT_H
|
||||||
196
CMSIS/Documentation/Core/html/index.html
Normal file
196
CMSIS/Documentation/Core/html/index.html
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
||||||
|
<title>Overview</title>
|
||||||
|
<title>CMSIS-Core (Cortex-M): Overview</title>
|
||||||
|
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<link href="cmsis.css" rel="stylesheet" type="text/css" />
|
||||||
|
<script type="text/javascript" src="jquery.js"></script>
|
||||||
|
<script type="text/javascript" src="dynsections.js"></script>
|
||||||
|
<script type="text/javascript" src="printComponentTabs.js"></script>
|
||||||
|
<link href="navtree.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script type="text/javascript" src="resize.js"></script>
|
||||||
|
<script type="text/javascript" src="navtree.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready(initResizable);
|
||||||
|
$(window).load(resizeHeight);
|
||||||
|
</script>
|
||||||
|
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
||||||
|
<script type="text/javascript" src="search/search.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready(function() { searchBox.OnSelectItem(0); });
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||||
|
<div id="titlearea">
|
||||||
|
<table cellspacing="0" cellpadding="0">
|
||||||
|
<tbody>
|
||||||
|
<tr style="height: 46px;">
|
||||||
|
<td id="projectlogo"><img alt="Logo" src="CMSIS_Logo_Final.png"/></td>
|
||||||
|
<td style="padding-left: 0.5em;">
|
||||||
|
<div id="projectname">CMSIS-Core (Cortex-M)
|
||||||
|
 <span id="projectnumber">Version 5.1.2</span>
|
||||||
|
</div>
|
||||||
|
<div id="projectbrief">CMSIS-Core support for Cortex-M processor-based devices</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!-- end header part -->
|
||||||
|
<div id="CMSISnav" class="tabs1">
|
||||||
|
<ul class="tablist">
|
||||||
|
<script type="text/javascript">
|
||||||
|
<!--
|
||||||
|
writeComponentTabs.call(this);
|
||||||
|
//-->
|
||||||
|
</script>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<!-- Generated by Doxygen 1.8.6 -->
|
||||||
|
<script type="text/javascript">
|
||||||
|
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
||||||
|
</script>
|
||||||
|
<div id="navrow1" class="tabs">
|
||||||
|
<ul class="tablist">
|
||||||
|
<li class="current"><a href="index.html"><span>Main Page</span></a></li>
|
||||||
|
<li><a href="pages.html"><span>Usage and Description</span></a></li>
|
||||||
|
<li><a href="modules.html"><span>Reference</span></a></li>
|
||||||
|
<li>
|
||||||
|
<div id="MSearchBox" class="MSearchBoxInactive">
|
||||||
|
<span class="left">
|
||||||
|
<img id="MSearchSelect" src="search/mag_sel.png"
|
||||||
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
||||||
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
||||||
|
alt=""/>
|
||||||
|
<input type="text" id="MSearchField" value="Search" accesskey="S"
|
||||||
|
onfocus="searchBox.OnSearchFieldFocus(true)"
|
||||||
|
onblur="searchBox.OnSearchFieldFocus(false)"
|
||||||
|
onkeyup="searchBox.OnSearchFieldChange(event)"/>
|
||||||
|
</span><span class="right">
|
||||||
|
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div><!-- top -->
|
||||||
|
<div id="side-nav" class="ui-resizable side-nav-resizable">
|
||||||
|
<div id="nav-tree">
|
||||||
|
<div id="nav-tree-contents">
|
||||||
|
<div id="nav-sync" class="sync"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="splitbar" style="-moz-user-select:none;"
|
||||||
|
class="ui-resizable-handle">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready(function(){initNavTree('index.html','');});
|
||||||
|
</script>
|
||||||
|
<div id="doc-content">
|
||||||
|
<!-- window showing the filter options -->
|
||||||
|
<div id="MSearchSelectWindow"
|
||||||
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
||||||
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
||||||
|
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
||||||
|
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark"> </span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark"> </span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark"> </span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark"> </span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark"> </span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark"> </span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark"> </span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark"> </span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark"> </span>Pages</a></div>
|
||||||
|
|
||||||
|
<!-- iframe showing the search results (closed by default) -->
|
||||||
|
<div id="MSearchResultsWindow">
|
||||||
|
<iframe src="javascript:void(0)" frameborder="0"
|
||||||
|
name="MSearchResults" id="MSearchResults">
|
||||||
|
</iframe>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="header">
|
||||||
|
<div class="headertitle">
|
||||||
|
<div class="title">Overview </div> </div>
|
||||||
|
</div><!--header-->
|
||||||
|
<div class="contents">
|
||||||
|
<div class="textblock"><p>CMSIS-Core (Cortex-M) implements the basic run-time system for a Cortex-M device and gives the user access to the processor core and the device peripherals. In detail it defines:</p>
|
||||||
|
<ul>
|
||||||
|
<li><b>Hardware Abstraction Layer (HAL)</b> for Cortex-M processor registers with standardized definitions for the SysTick, NVIC, System Control Block registers, MPU registers, FPU registers, and core access functions.</li>
|
||||||
|
<li><b>System exception names</b> to interface to system exceptions without having compatibility issues.</li>
|
||||||
|
<li><b>Methods to organize header files</b> that makes it easy to learn new Cortex-M microcontroller products and improve software portability. This includes naming conventions for device-specific interrupts.</li>
|
||||||
|
<li><b>Methods for system initialization</b> to be used by each MCU vendor. For example, the standardized <a class="el" href="group__system__init__gr.html#ga93f514700ccf00d08dbdcff7f1224eb2" title="Function to Initialize the system. ">SystemInit()</a> function is essential for configuring the clock system of the device.</li>
|
||||||
|
<li><b>Intrinsic functions</b> used to generate CPU instructions that are not supported by standard C functions.</li>
|
||||||
|
<li>A variable to determine the <b>system clock frequency</b> which simplifies the setup the SysTick timer.</li>
|
||||||
|
</ul>
|
||||||
|
<p>The following sections provide details about the CMSIS-Core (Cortex-M):</p>
|
||||||
|
<ul>
|
||||||
|
<li><a class="el" href="using_pg.html">Using CMSIS in Embedded Applications</a> describes the project setup and shows a simple program example.</li>
|
||||||
|
<li><a class="el" href="using_TrustZone_pg.html">Using TrustZone® for Armv8-M</a> describes how to use the security extensions available in the Armv8-M architecture.</li>
|
||||||
|
<li><a class="el" href="templates_pg.html">CMSIS-Core Device Templates</a> describes the files of the CMSIS-Core (Cortex-M) in detail and explains how to adapt template files provided by Arm to silicon vendor devices.</li>
|
||||||
|
<li><a class="el" href="coreMISRA_Exceptions_pg.html">MISRA-C Deviations</a> describes the violations to the MISRA standard.</li>
|
||||||
|
<li><a href="Modules.html"><b>Reference</b> </a> describe the features and functions of the <a class="el" href="device_h_pg.html">Device Header File <device.h></a> in detail.</li>
|
||||||
|
<li><a href="Annotated.html"><b>Data</b> <b>Structures</b> </a> describe the data structures of the <a class="el" href="device_h_pg.html">Device Header File <device.h></a> in detail.</li>
|
||||||
|
</ul>
|
||||||
|
<hr/>
|
||||||
|
<h2>CMSIS-Core (Cortex-M) in ARM::CMSIS Pack </h2>
|
||||||
|
<p>Files relevant to CMSIS-Core (Cortex-M) are present in the following <b>ARM::CMSIS</b> directories: </p>
|
||||||
|
<table class="doxtable">
|
||||||
|
<tr>
|
||||||
|
<th>File/Folder </th><th>Content </th></tr>
|
||||||
|
<tr>
|
||||||
|
<td><b>CMSIS\Documentation\Core</b> </td><td>This documentation </td></tr>
|
||||||
|
<tr>
|
||||||
|
<td><b>CMSIS\Core\Include</b> </td><td>CMSIS-Core (Cortex-M) header files (for example core_cm3.h, core_cmInstr.h, etc.) </td></tr>
|
||||||
|
<tr>
|
||||||
|
<td><b>Device</b> </td><td><a class="el" href="using_ARM_pg.html">Arm reference implementations</a> of Cortex-M devices </td></tr>
|
||||||
|
<tr>
|
||||||
|
<td><b>Device\_Template_Vendor</b> </td><td><a class="el" href="templates_pg.html">CMSIS-Core Device Templates</a> for extension by silicon vendors </td></tr>
|
||||||
|
</table>
|
||||||
|
<hr/>
|
||||||
|
<h1><a class="anchor" id="ref_v6-v8M"></a>
|
||||||
|
Processor Support</h1>
|
||||||
|
<p>CMSIS supports the complete range of <a href="http://www.arm.com/products/processors/cortex-m/index.php" target="_blank"><b>Cortex-M processors</b></a> (with exception of Cortex-M1) and the <a href="http://www.arm.com/products/processors/instruction-set-architectures/armv8-m-architecture.php" target="_blank"><b>Armv8-M architecture</b></a> including security extensions.</p>
|
||||||
|
<h2><a class="anchor" id="ref_man_sec"></a>
|
||||||
|
Cortex-M Reference Manuals</h2>
|
||||||
|
<p>The Cortex-M Device Generic User Guides contain the programmers model and detailed information about the core peripherals and are available for:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="http://infocenter.arm.com/help/topic/com.arm.doc.dui0497a/DUI0497A_cortex_m0_r0p0_generic_ug.pdf" target="_blank"><b>Cortex-M0 Devices Generic User Guide</b></a> (Armv6-M architecture)</li>
|
||||||
|
<li><a href="http://infocenter.arm.com/help/topic/com.arm.doc.dui0662b/DUI0662B_cortex_m0p_r0p1_dgug.pdf" target="_blank"><b>Cortex-M0+ Devices Generic User Guide</b></a> (Armv6-M architecture)</li>
|
||||||
|
<li><a href="http://infocenter.arm.com/help/topic/com.arm.doc.dui0552a/DUI0552A_cortex_m3_dgug.pdf" target="_blank"><b>Cortex-M3 Devices Generic User Guide</b></a> (Armv7-M architecture)</li>
|
||||||
|
<li><a href="http://infocenter.arm.com/help/topic/com.arm.doc.dui0553a/DUI0553A_cortex_m4_dgug.pdf" target="_blank"><b>Cortex-M4 Devices Generic User Guide</b></a> (ARMv7-M architecture)</li>
|
||||||
|
<li><a href="http://infocenter.arm.com/help/topic/com.arm.doc.dui0646a/DUI0646A_cortex_m7_dgug.pdf" target="_blank"><b>Cortex-M7 Devices Generic User Guide</b></a> (Armv7-M architecture)</li>
|
||||||
|
</ul>
|
||||||
|
<p>The <b>Cortex-M23</b> and <b>Cortex-M33</b> are described with Technical Reference Manuals that are available here:</p>
|
||||||
|
<ul>
|
||||||
|
<li><a href="http://infocenter.arm.com/help/topic/com.arm.doc.ddi0550c/cortex_m23_r1p0_technical_reference_manual_DDI0550C_en.pdf" target="_blank"><b>Cortex-M23 Technical Reference Manual</b></a> (Armv8-M baseline architecture)</li>
|
||||||
|
<li><a href="http://infocenter.arm.com/help/topic/com.arm.doc.100230_0002_00_en/cortex_m33_trm_100230_0002_00_en.pdf" target="_blank"><b>Cortex-M33 Technical Reference Manual</b></a> (Armv8-M mainline architecture)</li>
|
||||||
|
</ul>
|
||||||
|
<h2><a class="anchor" id="ARMv8M"></a>
|
||||||
|
Armv8-M Architecture</h2>
|
||||||
|
<p>Armv8-M introduces two profiles <b>baseline</b> (for power and area constrained applications) and <b>mainline</b> (full-featured with optional SIMD, floating-point, and co-processor extensions). Both Armv8-M profiles are supported by CMSIS.</p>
|
||||||
|
<p>The Armv8-M Architecture is described in the <a href="http://developer.arm.com/products/architecture/m-profile/docs/ddi0553/latest/armv8-m-architecture-reference-manual" target="_blank"><b>Armv8-M Architecture Reference Manual</b></a>.</p>
|
||||||
|
<hr/>
|
||||||
|
<h1><a class="anchor" id="tested_tools_sec"></a>
|
||||||
|
Tested and Verified Toolchains</h1>
|
||||||
|
<p>The <a class="el" href="templates_pg.html">CMSIS-Core Device Templates</a> supplied by Arm have been tested and verified with the following toolchains:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Arm: Arm Compiler 5.06 update 6 (not for Cortex-M23, Cortex-M33, Armv8-M)</li>
|
||||||
|
<li>Arm: Arm Compiler 6.9</li>
|
||||||
|
<li>Arm: Arm Compiler 6.6.2 (not for Cortex-M0, Cortex-M23, Cortex-M33, Armv8-M)</li>
|
||||||
|
<li>GNU: GNU Tools for Arm Embedded 6.3.1 20170620</li>
|
||||||
|
<li>IAR: IAR ANSI C/C++ Compiler for Arm 8.20.1.14183</li>
|
||||||
|
</ul>
|
||||||
|
<hr/>
|
||||||
|
</div></div><!-- contents -->
|
||||||
|
</div><!-- doc-content -->
|
||||||
|
<!-- start footer part -->
|
||||||
|
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
||||||
|
<ul>
|
||||||
|
<li class="footer">Generated on Wed Aug 1 2018 17:12:09 for CMSIS-Core (Cortex-M) by Arm Ltd. All rights reserved.
|
||||||
|
<!--
|
||||||
|
<a href="http://www.doxygen.org/index.html">
|
||||||
|
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.6
|
||||||
|
-->
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
101
CMakeLists.txt
Normal file
101
CMakeLists.txt
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
|
||||||
|
project(skl_tunnel
|
||||||
|
LANGUAGES
|
||||||
|
C CXX
|
||||||
|
)
|
||||||
|
|
||||||
|
include(FetchContent)
|
||||||
|
|
||||||
|
FetchContent_Declare(
|
||||||
|
skullc
|
||||||
|
GIT_REPOSITORY "https://git.skullnet.me/erki/skullc-peripherals.git"
|
||||||
|
)
|
||||||
|
|
||||||
|
set(SKULLC_WITH_HAL OFF)
|
||||||
|
set(SKULLC_WITH_TESTS OFF)
|
||||||
|
FetchContent_MakeAvailable(skullc)
|
||||||
|
|
||||||
|
add_executable(skl_tunnel
|
||||||
|
hal/src/hal_io.c
|
||||||
|
samd21a/gcc/gcc/startup_samd21.c
|
||||||
|
hpl/eic/hpl_eic.c
|
||||||
|
hal/utils/src/utils_syscalls.c
|
||||||
|
hal/src/hal_spi_m_sync.c
|
||||||
|
hal/src/hal_delay.c
|
||||||
|
hpl/pm/hpl_pm.c
|
||||||
|
hpl/core/hpl_init.c
|
||||||
|
hal/utils/src/utils_list.c
|
||||||
|
hpl/core/hpl_core_m0plus_base.c
|
||||||
|
hal/utils/src/utils_assert.c
|
||||||
|
hpl/dmac/hpl_dmac.c
|
||||||
|
hpl/sysctrl/hpl_sysctrl.c
|
||||||
|
hpl/sercom/hpl_sercom.c
|
||||||
|
hpl/gclk/hpl_gclk.c
|
||||||
|
hal/src/hal_init.c
|
||||||
|
|
||||||
|
main.cpp
|
||||||
|
|
||||||
|
samd21a/gcc/system_samd21.c
|
||||||
|
examples/driver_examples.c
|
||||||
|
driver_init.c
|
||||||
|
hal/src/hal_usart_async.c
|
||||||
|
hal/src/hal_ext_irq.c
|
||||||
|
hal/utils/src/utils_ringbuffer.c
|
||||||
|
hal/src/hal_gpio.c
|
||||||
|
hal/utils/src/utils_event.c
|
||||||
|
hal/src/hal_sleep.c
|
||||||
|
atmel_start.c
|
||||||
|
hal/src/hal_atomic.c
|
||||||
|
|
||||||
|
radio/src/radio_spi.c
|
||||||
|
radio/src/radio_gpio.c
|
||||||
|
radio/src/radio_hw_instance.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(skl_tunnel
|
||||||
|
PRIVATE
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}
|
||||||
|
config
|
||||||
|
examples
|
||||||
|
|
||||||
|
hal/include
|
||||||
|
hal/utils/include
|
||||||
|
hpl/core
|
||||||
|
hpl/dmac
|
||||||
|
hpl/eic
|
||||||
|
hpl/gclk
|
||||||
|
hpl/pm
|
||||||
|
hpl/port
|
||||||
|
hpl/sercom
|
||||||
|
hpl/sysctrl
|
||||||
|
|
||||||
|
hri
|
||||||
|
|
||||||
|
CMSIS/Core/Include
|
||||||
|
samd21a/include
|
||||||
|
radio/include
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(skl_tunnel
|
||||||
|
PRIVATE
|
||||||
|
skullc::utility
|
||||||
|
)
|
||||||
|
|
||||||
|
set_target_properties(skl_tunnel
|
||||||
|
PROPERTIES
|
||||||
|
CXX_STANDARD 17
|
||||||
|
C_STANDARD 11
|
||||||
|
)
|
||||||
|
|
||||||
|
target_compile_definitions(skl_tunnel
|
||||||
|
PRIVATE
|
||||||
|
"__SAMD21E17A__"
|
||||||
|
F_CPU=48000000
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_options(skl_tunnel
|
||||||
|
PRIVATE
|
||||||
|
-Wl,--script=${CMAKE_CURRENT_LIST_DIR}/samd21a/gcc/gcc/samd21e17a_flash.ld
|
||||||
|
-Wl,--gc-sections
|
||||||
|
-Wl,--print-memory-usage
|
||||||
|
)
|
||||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2022 Erki, Rusted Skull
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
42
arm-none-eabi.cmake
Normal file
42
arm-none-eabi.cmake
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2020, The OpenThread Authors.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# 3. Neither the name of the copyright holder nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
|
||||||
|
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
# POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
#
|
||||||
|
|
||||||
|
set(CMAKE_SYSTEM_NAME Generic)
|
||||||
|
set(CMAKE_SYSTEM_PROCESSOR ARM)
|
||||||
|
|
||||||
|
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
|
||||||
|
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
|
||||||
|
set(CMAKE_ASM_COMPILER arm-none-eabi-as)
|
||||||
|
set(CMAKE_RANLIB arm-none-eabi-ranlib)
|
||||||
|
|
||||||
|
set(COMMON_C_FLAGS "-mcpu=cortex-m0plus -mfloat-abi=soft -mthumb -mlong-calls -fdata-sections -ffunction-sections -Wall -Wextra -O2")
|
||||||
|
|
||||||
|
set(CMAKE_C_FLAGS_INIT "${COMMON_C_FLAGS}")
|
||||||
|
set(CMAKE_CXX_FLAGS_INIT "${COMMON_C_FLAGS} -fno-exceptions -fno-rtti")
|
||||||
|
set(CMAKE_ASM_FLAGS_INIT "${COMMON_C_FLAGS}")
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS_INIT "${COMMON_C_FLAGS} -specs=nosys.specs")
|
||||||
11
atmel_samr21_xplained_pro.cfg
Normal file
11
atmel_samr21_xplained_pro.cfg
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#
|
||||||
|
# Atmel SAMR21 Xplained Pro evaluation kit.
|
||||||
|
#
|
||||||
|
|
||||||
|
source [find interface/cmsis-dap.cfg]
|
||||||
|
|
||||||
|
# chip name
|
||||||
|
#set CHIPNAME at91samr21g18
|
||||||
|
set CHIPNAME at91samr21e17
|
||||||
|
|
||||||
|
source [find target/at91samdXX.cfg]
|
||||||
9
atmel_start.c
Normal file
9
atmel_start.c
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#include <atmel_start.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes MCU, drivers and middleware in the project
|
||||||
|
**/
|
||||||
|
void atmel_start_init(void)
|
||||||
|
{
|
||||||
|
system_init();
|
||||||
|
}
|
||||||
18
atmel_start.h
Normal file
18
atmel_start.h
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#ifndef ATMEL_START_H_INCLUDED
|
||||||
|
#define ATMEL_START_H_INCLUDED
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "driver_init.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes MCU, drivers and middleware in the project
|
||||||
|
**/
|
||||||
|
void atmel_start_init(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
785
atmel_start_config.atstart
Normal file
785
atmel_start_config.atstart
Normal file
@ -0,0 +1,785 @@
|
|||||||
|
format_version: '2'
|
||||||
|
name: My Project
|
||||||
|
versions:
|
||||||
|
api: '1.0'
|
||||||
|
backend: 1.8.580
|
||||||
|
commit: f3d8d96e294de8dee688333bbbe8d8458a4f6b4c
|
||||||
|
content: unknown
|
||||||
|
content_pack_name: unknown
|
||||||
|
format: '2'
|
||||||
|
frontend: 1.8.580
|
||||||
|
packs_version_avr8: 1.0.1463
|
||||||
|
packs_version_qtouch: unknown
|
||||||
|
packs_version_sam: 1.0.1726
|
||||||
|
version_backend: 1.8.580
|
||||||
|
version_frontend: ''
|
||||||
|
board:
|
||||||
|
identifier: CustomBoard
|
||||||
|
device: SAMD21E17A-MF
|
||||||
|
details: null
|
||||||
|
application: null
|
||||||
|
middlewares: {}
|
||||||
|
drivers:
|
||||||
|
EXTERNAL_IRQ_0:
|
||||||
|
user_label: EXTERNAL_IRQ_0
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::EIC::driver_config_definition::Default::HAL:Driver:Ext.IRQ
|
||||||
|
functionality: External_IRQ
|
||||||
|
api: HAL:Driver:Ext_IRQ
|
||||||
|
configuration:
|
||||||
|
eic_arch_enable_irq_setting0: false
|
||||||
|
eic_arch_enable_irq_setting1: false
|
||||||
|
eic_arch_enable_irq_setting10: false
|
||||||
|
eic_arch_enable_irq_setting11: false
|
||||||
|
eic_arch_enable_irq_setting12: false
|
||||||
|
eic_arch_enable_irq_setting13: false
|
||||||
|
eic_arch_enable_irq_setting14: false
|
||||||
|
eic_arch_enable_irq_setting15: false
|
||||||
|
eic_arch_enable_irq_setting2: false
|
||||||
|
eic_arch_enable_irq_setting3: false
|
||||||
|
eic_arch_enable_irq_setting4: false
|
||||||
|
eic_arch_enable_irq_setting5: false
|
||||||
|
eic_arch_enable_irq_setting6: false
|
||||||
|
eic_arch_enable_irq_setting7: false
|
||||||
|
eic_arch_enable_irq_setting8: false
|
||||||
|
eic_arch_enable_irq_setting9: false
|
||||||
|
eic_arch_extinteo0: false
|
||||||
|
eic_arch_extinteo1: false
|
||||||
|
eic_arch_extinteo10: false
|
||||||
|
eic_arch_extinteo11: false
|
||||||
|
eic_arch_extinteo12: false
|
||||||
|
eic_arch_extinteo13: false
|
||||||
|
eic_arch_extinteo14: false
|
||||||
|
eic_arch_extinteo15: false
|
||||||
|
eic_arch_extinteo2: false
|
||||||
|
eic_arch_extinteo3: false
|
||||||
|
eic_arch_extinteo4: false
|
||||||
|
eic_arch_extinteo5: false
|
||||||
|
eic_arch_extinteo6: false
|
||||||
|
eic_arch_extinteo7: false
|
||||||
|
eic_arch_extinteo8: false
|
||||||
|
eic_arch_extinteo9: false
|
||||||
|
eic_arch_filten0: false
|
||||||
|
eic_arch_filten1: false
|
||||||
|
eic_arch_filten10: false
|
||||||
|
eic_arch_filten11: false
|
||||||
|
eic_arch_filten12: false
|
||||||
|
eic_arch_filten13: false
|
||||||
|
eic_arch_filten14: false
|
||||||
|
eic_arch_filten15: false
|
||||||
|
eic_arch_filten2: false
|
||||||
|
eic_arch_filten3: false
|
||||||
|
eic_arch_filten4: false
|
||||||
|
eic_arch_filten5: false
|
||||||
|
eic_arch_filten6: false
|
||||||
|
eic_arch_filten7: false
|
||||||
|
eic_arch_filten8: false
|
||||||
|
eic_arch_filten9: false
|
||||||
|
eic_arch_nmifilten: false
|
||||||
|
eic_arch_nmisense: No detection
|
||||||
|
eic_arch_sense0: No detection
|
||||||
|
eic_arch_sense1: No detection
|
||||||
|
eic_arch_sense10: No detection
|
||||||
|
eic_arch_sense11: No detection
|
||||||
|
eic_arch_sense12: No detection
|
||||||
|
eic_arch_sense13: No detection
|
||||||
|
eic_arch_sense14: No detection
|
||||||
|
eic_arch_sense15: No detection
|
||||||
|
eic_arch_sense2: No detection
|
||||||
|
eic_arch_sense3: No detection
|
||||||
|
eic_arch_sense4: No detection
|
||||||
|
eic_arch_sense5: No detection
|
||||||
|
eic_arch_sense6: No detection
|
||||||
|
eic_arch_sense7: No detection
|
||||||
|
eic_arch_sense8: No detection
|
||||||
|
eic_arch_sense9: No detection
|
||||||
|
eic_arch_wakeupen0: false
|
||||||
|
eic_arch_wakeupen1: false
|
||||||
|
eic_arch_wakeupen10: false
|
||||||
|
eic_arch_wakeupen11: false
|
||||||
|
eic_arch_wakeupen12: false
|
||||||
|
eic_arch_wakeupen13: false
|
||||||
|
eic_arch_wakeupen14: false
|
||||||
|
eic_arch_wakeupen15: false
|
||||||
|
eic_arch_wakeupen2: false
|
||||||
|
eic_arch_wakeupen3: false
|
||||||
|
eic_arch_wakeupen4: false
|
||||||
|
eic_arch_wakeupen5: false
|
||||||
|
eic_arch_wakeupen6: false
|
||||||
|
eic_arch_wakeupen7: false
|
||||||
|
eic_arch_wakeupen8: false
|
||||||
|
eic_arch_wakeupen9: false
|
||||||
|
optional_signals: []
|
||||||
|
variant: null
|
||||||
|
clocks:
|
||||||
|
domain_group:
|
||||||
|
nodes:
|
||||||
|
- name: EIC
|
||||||
|
input: Generic clock generator 0
|
||||||
|
external: false
|
||||||
|
external_frequency: 0
|
||||||
|
configuration:
|
||||||
|
eic_gclk_selection: Generic clock generator 0
|
||||||
|
GCLK:
|
||||||
|
user_label: GCLK
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::GCLK::driver_config_definition::GCLK::HAL:HPL:GCLK
|
||||||
|
functionality: System
|
||||||
|
api: HAL:HPL:GCLK
|
||||||
|
configuration:
|
||||||
|
$input: 48000000
|
||||||
|
$input_id: Digital Frequency Locked Loop (DFLL48M)
|
||||||
|
RESERVED_InputFreq: 48000000
|
||||||
|
RESERVED_InputFreq_id: Digital Frequency Locked Loop (DFLL48M)
|
||||||
|
_$freq_output_Generic clock generator 0: 48000000
|
||||||
|
_$freq_output_Generic clock generator 1: 8000000
|
||||||
|
_$freq_output_Generic clock generator 2: 16000000
|
||||||
|
_$freq_output_Generic clock generator 3: 32768
|
||||||
|
_$freq_output_Generic clock generator 4: 16000000
|
||||||
|
_$freq_output_Generic clock generator 5: 16000000
|
||||||
|
_$freq_output_Generic clock generator 6: 16000000
|
||||||
|
_$freq_output_Generic clock generator 7: 16000000
|
||||||
|
enable_gclk_gen_0: true
|
||||||
|
enable_gclk_gen_0__externalclock: 1000000
|
||||||
|
enable_gclk_gen_1: false
|
||||||
|
enable_gclk_gen_1__externalclock: 1000000
|
||||||
|
enable_gclk_gen_2: false
|
||||||
|
enable_gclk_gen_2__externalclock: 1000000
|
||||||
|
enable_gclk_gen_3: true
|
||||||
|
enable_gclk_gen_3__externalclock: 1000000
|
||||||
|
enable_gclk_gen_4: false
|
||||||
|
enable_gclk_gen_4__externalclock: 1000000
|
||||||
|
enable_gclk_gen_5: false
|
||||||
|
enable_gclk_gen_5__externalclock: 1000000
|
||||||
|
enable_gclk_gen_6: false
|
||||||
|
enable_gclk_gen_6__externalclock: 1000000
|
||||||
|
enable_gclk_gen_7: false
|
||||||
|
enable_gclk_gen_7__externalclock: 1000000
|
||||||
|
gclk_arch_gen_0_RUNSTDBY: false
|
||||||
|
gclk_arch_gen_0_enable: true
|
||||||
|
gclk_arch_gen_0_idc: true
|
||||||
|
gclk_arch_gen_0_oe: false
|
||||||
|
gclk_arch_gen_0_oov: false
|
||||||
|
gclk_arch_gen_1_RUNSTDBY: false
|
||||||
|
gclk_arch_gen_1_enable: false
|
||||||
|
gclk_arch_gen_1_idc: false
|
||||||
|
gclk_arch_gen_1_oe: false
|
||||||
|
gclk_arch_gen_1_oov: false
|
||||||
|
gclk_arch_gen_2_RUNSTDBY: false
|
||||||
|
gclk_arch_gen_2_enable: false
|
||||||
|
gclk_arch_gen_2_idc: false
|
||||||
|
gclk_arch_gen_2_oe: false
|
||||||
|
gclk_arch_gen_2_oov: false
|
||||||
|
gclk_arch_gen_3_RUNSTDBY: true
|
||||||
|
gclk_arch_gen_3_enable: true
|
||||||
|
gclk_arch_gen_3_idc: true
|
||||||
|
gclk_arch_gen_3_oe: false
|
||||||
|
gclk_arch_gen_3_oov: false
|
||||||
|
gclk_arch_gen_4_RUNSTDBY: false
|
||||||
|
gclk_arch_gen_4_enable: false
|
||||||
|
gclk_arch_gen_4_idc: false
|
||||||
|
gclk_arch_gen_4_oe: false
|
||||||
|
gclk_arch_gen_4_oov: false
|
||||||
|
gclk_arch_gen_5_RUNSTDBY: false
|
||||||
|
gclk_arch_gen_5_enable: false
|
||||||
|
gclk_arch_gen_5_idc: false
|
||||||
|
gclk_arch_gen_5_oe: false
|
||||||
|
gclk_arch_gen_5_oov: false
|
||||||
|
gclk_arch_gen_6_RUNSTDBY: false
|
||||||
|
gclk_arch_gen_6_enable: false
|
||||||
|
gclk_arch_gen_6_idc: false
|
||||||
|
gclk_arch_gen_6_oe: false
|
||||||
|
gclk_arch_gen_6_oov: false
|
||||||
|
gclk_arch_gen_7_RUNSTDBY: false
|
||||||
|
gclk_arch_gen_7_enable: false
|
||||||
|
gclk_arch_gen_7_idc: false
|
||||||
|
gclk_arch_gen_7_oe: false
|
||||||
|
gclk_arch_gen_7_oov: false
|
||||||
|
gclk_gen_0_div: 1
|
||||||
|
gclk_gen_0_div_sel: false
|
||||||
|
gclk_gen_0_oscillator: Digital Frequency Locked Loop (DFLL48M)
|
||||||
|
gclk_gen_1_div: 1
|
||||||
|
gclk_gen_1_div_sel: false
|
||||||
|
gclk_gen_1_oscillator: 8MHz Internal Oscillator (OSC8M)
|
||||||
|
gclk_gen_2_div: 1
|
||||||
|
gclk_gen_2_div_sel: false
|
||||||
|
gclk_gen_2_oscillator: External Crystal Oscillator 0.4-32MHz (XOSC)
|
||||||
|
gclk_gen_3_div: 1
|
||||||
|
gclk_gen_3_div_sel: false
|
||||||
|
gclk_gen_3_oscillator: 32kHz Ultra Low Power Internal Oscillator (OSCULP32K)
|
||||||
|
gclk_gen_4_div: 1
|
||||||
|
gclk_gen_4_div_sel: false
|
||||||
|
gclk_gen_4_oscillator: External Crystal Oscillator 0.4-32MHz (XOSC)
|
||||||
|
gclk_gen_5_div: 1
|
||||||
|
gclk_gen_5_div_sel: false
|
||||||
|
gclk_gen_5_oscillator: External Crystal Oscillator 0.4-32MHz (XOSC)
|
||||||
|
gclk_gen_6_div: 1
|
||||||
|
gclk_gen_6_div_sel: false
|
||||||
|
gclk_gen_6_oscillator: External Crystal Oscillator 0.4-32MHz (XOSC)
|
||||||
|
gclk_gen_7_div: 1
|
||||||
|
gclk_gen_7_div_sel: false
|
||||||
|
gclk_gen_7_oscillator: External Crystal Oscillator 0.4-32MHz (XOSC)
|
||||||
|
optional_signals: []
|
||||||
|
variant: null
|
||||||
|
clocks:
|
||||||
|
domain_group: null
|
||||||
|
PM:
|
||||||
|
user_label: PM
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::PM::driver_config_definition::PM::HAL:HPL:PM
|
||||||
|
functionality: System
|
||||||
|
api: HAL:HPL:PM
|
||||||
|
configuration:
|
||||||
|
$input: 48000000
|
||||||
|
$input_id: Generic clock generator 0
|
||||||
|
RESERVED_InputFreq: 48000000
|
||||||
|
RESERVED_InputFreq_id: Generic clock generator 0
|
||||||
|
_$freq_output_CPU: 48000000
|
||||||
|
apba_div: '1'
|
||||||
|
apbb_div: '1'
|
||||||
|
apbc_div: '1'
|
||||||
|
cpu_clock_source: Generic clock generator 0
|
||||||
|
cpu_div: '1'
|
||||||
|
enable_cpu_clock: true
|
||||||
|
nvm_wait_states: '0'
|
||||||
|
optional_signals: []
|
||||||
|
variant: null
|
||||||
|
clocks:
|
||||||
|
domain_group:
|
||||||
|
nodes:
|
||||||
|
- name: CPU
|
||||||
|
input: CPU
|
||||||
|
external: false
|
||||||
|
external_frequency: 0
|
||||||
|
configuration: {}
|
||||||
|
USART_0:
|
||||||
|
user_label: USART_0
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::SERCOM0::driver_config_definition::UART::HAL:Driver:USART.Async
|
||||||
|
functionality: USART
|
||||||
|
api: HAL:Driver:USART_Async
|
||||||
|
configuration:
|
||||||
|
usart_advanced: true
|
||||||
|
usart_arch_clock_mode: USART with internal clock
|
||||||
|
usart_arch_cloden: false
|
||||||
|
usart_arch_dbgstop: Keep running
|
||||||
|
usart_arch_dord: LSB is transmitted first
|
||||||
|
usart_arch_enc: No encoding
|
||||||
|
usart_arch_fractional: 0
|
||||||
|
usart_arch_ibon: false
|
||||||
|
usart_arch_lin_slave_enable: Disable
|
||||||
|
usart_arch_runstdby: false
|
||||||
|
usart_arch_sampa: 7-8-9 (3-4-5 8-bit over-sampling)
|
||||||
|
usart_arch_sampr: 16x arithmetic
|
||||||
|
usart_arch_sfde: false
|
||||||
|
usart_baud_rate: 115200
|
||||||
|
usart_character_size: 8 bits
|
||||||
|
usart_parity: No parity
|
||||||
|
usart_rx_enable: true
|
||||||
|
usart_stop_bit: One stop bit
|
||||||
|
usart_tx_enable: true
|
||||||
|
optional_signals: []
|
||||||
|
variant:
|
||||||
|
specification: TXPO=0, RXPO=1, CMODE=0
|
||||||
|
required_signals:
|
||||||
|
- name: SERCOM0/PAD/0
|
||||||
|
pad: PA08
|
||||||
|
label: TX
|
||||||
|
- name: SERCOM0/PAD/1
|
||||||
|
pad: PA09
|
||||||
|
label: RX
|
||||||
|
clocks:
|
||||||
|
domain_group:
|
||||||
|
nodes:
|
||||||
|
- name: Core
|
||||||
|
input: Generic clock generator 0
|
||||||
|
external: false
|
||||||
|
external_frequency: 0
|
||||||
|
- name: Slow
|
||||||
|
input: Generic clock generator 3
|
||||||
|
external: false
|
||||||
|
external_frequency: 0
|
||||||
|
configuration:
|
||||||
|
core_gclk_selection: Generic clock generator 0
|
||||||
|
slow_gclk_selection: Generic clock generator 3
|
||||||
|
SPI_0:
|
||||||
|
user_label: SPI_0
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::SERCOM1::driver_config_definition::SPI.Master::HAL:Driver:SPI.Master.Sync
|
||||||
|
functionality: SPI
|
||||||
|
api: HAL:Driver:SPI_Master_Sync
|
||||||
|
configuration:
|
||||||
|
spi_master_advanced: true
|
||||||
|
spi_master_arch_cpha: Sample input on leading edge
|
||||||
|
spi_master_arch_cpol: SCK is low when idle
|
||||||
|
spi_master_arch_dbgstop: Keep running
|
||||||
|
spi_master_arch_dord: MSB first
|
||||||
|
spi_master_arch_ibon: In data stream
|
||||||
|
spi_master_arch_runstdby: false
|
||||||
|
spi_master_baud_rate: 50000
|
||||||
|
spi_master_character_size: 8 bits
|
||||||
|
spi_master_dummybyte: 511
|
||||||
|
spi_master_rx_enable: true
|
||||||
|
optional_signals: []
|
||||||
|
variant:
|
||||||
|
specification: TXPO=1, RXPO=0
|
||||||
|
required_signals:
|
||||||
|
- name: SERCOM1/PAD/0
|
||||||
|
pad: PA16
|
||||||
|
label: MISO
|
||||||
|
- name: SERCOM1/PAD/2
|
||||||
|
pad: PA18
|
||||||
|
label: MOSI
|
||||||
|
- name: SERCOM1/PAD/3
|
||||||
|
pad: PA19
|
||||||
|
label: SCK
|
||||||
|
clocks:
|
||||||
|
domain_group:
|
||||||
|
nodes:
|
||||||
|
- name: Core
|
||||||
|
input: Generic clock generator 0
|
||||||
|
external: false
|
||||||
|
external_frequency: 0
|
||||||
|
- name: Slow
|
||||||
|
input: Generic clock generator 3
|
||||||
|
external: false
|
||||||
|
external_frequency: 0
|
||||||
|
configuration:
|
||||||
|
core_gclk_selection: Generic clock generator 0
|
||||||
|
slow_gclk_selection: Generic clock generator 3
|
||||||
|
DMAC:
|
||||||
|
user_label: DMAC
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::DMAC::driver_config_definition::DMAC::HAL:HPL:DMAC
|
||||||
|
functionality: System
|
||||||
|
api: HAL:HPL:DMAC
|
||||||
|
configuration:
|
||||||
|
dmac_beatsize_0: 8-bit bus transfer
|
||||||
|
dmac_beatsize_1: 8-bit bus transfer
|
||||||
|
dmac_beatsize_10: 8-bit bus transfer
|
||||||
|
dmac_beatsize_11: 8-bit bus transfer
|
||||||
|
dmac_beatsize_12: 8-bit bus transfer
|
||||||
|
dmac_beatsize_13: 8-bit bus transfer
|
||||||
|
dmac_beatsize_14: 8-bit bus transfer
|
||||||
|
dmac_beatsize_15: 8-bit bus transfer
|
||||||
|
dmac_beatsize_2: 8-bit bus transfer
|
||||||
|
dmac_beatsize_3: 8-bit bus transfer
|
||||||
|
dmac_beatsize_4: 8-bit bus transfer
|
||||||
|
dmac_beatsize_5: 8-bit bus transfer
|
||||||
|
dmac_beatsize_6: 8-bit bus transfer
|
||||||
|
dmac_beatsize_7: 8-bit bus transfer
|
||||||
|
dmac_beatsize_8: 8-bit bus transfer
|
||||||
|
dmac_beatsize_9: 8-bit bus transfer
|
||||||
|
dmac_blockact_0: Channel will be disabled if it is the last block transfer in
|
||||||
|
the transaction
|
||||||
|
dmac_blockact_1: Channel will be disabled if it is the last block transfer in
|
||||||
|
the transaction
|
||||||
|
dmac_blockact_10: Channel will be disabled if it is the last block transfer
|
||||||
|
in the transaction
|
||||||
|
dmac_blockact_11: Channel will be disabled if it is the last block transfer
|
||||||
|
in the transaction
|
||||||
|
dmac_blockact_12: Channel will be disabled if it is the last block transfer
|
||||||
|
in the transaction
|
||||||
|
dmac_blockact_13: Channel will be disabled if it is the last block transfer
|
||||||
|
in the transaction
|
||||||
|
dmac_blockact_14: Channel will be disabled if it is the last block transfer
|
||||||
|
in the transaction
|
||||||
|
dmac_blockact_15: Channel will be disabled if it is the last block transfer
|
||||||
|
in the transaction
|
||||||
|
dmac_blockact_2: Channel will be disabled if it is the last block transfer in
|
||||||
|
the transaction
|
||||||
|
dmac_blockact_3: Channel will be disabled if it is the last block transfer in
|
||||||
|
the transaction
|
||||||
|
dmac_blockact_4: Channel will be disabled if it is the last block transfer in
|
||||||
|
the transaction
|
||||||
|
dmac_blockact_5: Channel will be disabled if it is the last block transfer in
|
||||||
|
the transaction
|
||||||
|
dmac_blockact_6: Channel will be disabled if it is the last block transfer in
|
||||||
|
the transaction
|
||||||
|
dmac_blockact_7: Channel will be disabled if it is the last block transfer in
|
||||||
|
the transaction
|
||||||
|
dmac_blockact_8: Channel will be disabled if it is the last block transfer in
|
||||||
|
the transaction
|
||||||
|
dmac_blockact_9: Channel will be disabled if it is the last block transfer in
|
||||||
|
the transaction
|
||||||
|
dmac_channel_0_settings: false
|
||||||
|
dmac_channel_10_settings: false
|
||||||
|
dmac_channel_11_settings: false
|
||||||
|
dmac_channel_12_settings: false
|
||||||
|
dmac_channel_13_settings: false
|
||||||
|
dmac_channel_14_settings: false
|
||||||
|
dmac_channel_15_settings: false
|
||||||
|
dmac_channel_1_settings: false
|
||||||
|
dmac_channel_2_settings: false
|
||||||
|
dmac_channel_3_settings: false
|
||||||
|
dmac_channel_4_settings: false
|
||||||
|
dmac_channel_5_settings: false
|
||||||
|
dmac_channel_6_settings: false
|
||||||
|
dmac_channel_7_settings: false
|
||||||
|
dmac_channel_8_settings: false
|
||||||
|
dmac_channel_9_settings: false
|
||||||
|
dmac_dbgrun: false
|
||||||
|
dmac_dstinc_0: false
|
||||||
|
dmac_dstinc_1: false
|
||||||
|
dmac_dstinc_10: false
|
||||||
|
dmac_dstinc_11: false
|
||||||
|
dmac_dstinc_12: false
|
||||||
|
dmac_dstinc_13: false
|
||||||
|
dmac_dstinc_14: false
|
||||||
|
dmac_dstinc_15: false
|
||||||
|
dmac_dstinc_2: false
|
||||||
|
dmac_dstinc_3: false
|
||||||
|
dmac_dstinc_4: false
|
||||||
|
dmac_dstinc_5: false
|
||||||
|
dmac_dstinc_6: false
|
||||||
|
dmac_dstinc_7: false
|
||||||
|
dmac_dstinc_8: false
|
||||||
|
dmac_dstinc_9: false
|
||||||
|
dmac_enable: false
|
||||||
|
dmac_enable_0: false
|
||||||
|
dmac_enable_1: false
|
||||||
|
dmac_enable_10: false
|
||||||
|
dmac_enable_11: false
|
||||||
|
dmac_enable_12: false
|
||||||
|
dmac_enable_13: false
|
||||||
|
dmac_enable_14: false
|
||||||
|
dmac_enable_15: false
|
||||||
|
dmac_enable_2: false
|
||||||
|
dmac_enable_3: false
|
||||||
|
dmac_enable_4: false
|
||||||
|
dmac_enable_5: false
|
||||||
|
dmac_enable_6: false
|
||||||
|
dmac_enable_7: false
|
||||||
|
dmac_enable_8: false
|
||||||
|
dmac_enable_9: false
|
||||||
|
dmac_evact_0: No action
|
||||||
|
dmac_evact_1: No action
|
||||||
|
dmac_evact_10: No action
|
||||||
|
dmac_evact_11: No action
|
||||||
|
dmac_evact_12: No action
|
||||||
|
dmac_evact_13: No action
|
||||||
|
dmac_evact_14: No action
|
||||||
|
dmac_evact_15: No action
|
||||||
|
dmac_evact_2: No action
|
||||||
|
dmac_evact_3: No action
|
||||||
|
dmac_evact_4: No action
|
||||||
|
dmac_evact_5: No action
|
||||||
|
dmac_evact_6: No action
|
||||||
|
dmac_evact_7: No action
|
||||||
|
dmac_evact_8: No action
|
||||||
|
dmac_evact_9: No action
|
||||||
|
dmac_evie_0: false
|
||||||
|
dmac_evie_1: false
|
||||||
|
dmac_evie_10: false
|
||||||
|
dmac_evie_11: false
|
||||||
|
dmac_evie_12: false
|
||||||
|
dmac_evie_13: false
|
||||||
|
dmac_evie_14: false
|
||||||
|
dmac_evie_15: false
|
||||||
|
dmac_evie_2: false
|
||||||
|
dmac_evie_3: false
|
||||||
|
dmac_evie_4: false
|
||||||
|
dmac_evie_5: false
|
||||||
|
dmac_evie_6: false
|
||||||
|
dmac_evie_7: false
|
||||||
|
dmac_evie_8: false
|
||||||
|
dmac_evie_9: false
|
||||||
|
dmac_evoe_0: false
|
||||||
|
dmac_evoe_1: false
|
||||||
|
dmac_evoe_10: false
|
||||||
|
dmac_evoe_11: false
|
||||||
|
dmac_evoe_12: false
|
||||||
|
dmac_evoe_13: false
|
||||||
|
dmac_evoe_14: false
|
||||||
|
dmac_evoe_15: false
|
||||||
|
dmac_evoe_2: false
|
||||||
|
dmac_evoe_3: false
|
||||||
|
dmac_evoe_4: false
|
||||||
|
dmac_evoe_5: false
|
||||||
|
dmac_evoe_6: false
|
||||||
|
dmac_evoe_7: false
|
||||||
|
dmac_evoe_8: false
|
||||||
|
dmac_evoe_9: false
|
||||||
|
dmac_evosel_0: Event generation disabled
|
||||||
|
dmac_evosel_1: Event generation disabled
|
||||||
|
dmac_evosel_10: Event generation disabled
|
||||||
|
dmac_evosel_11: Event generation disabled
|
||||||
|
dmac_evosel_12: Event generation disabled
|
||||||
|
dmac_evosel_13: Event generation disabled
|
||||||
|
dmac_evosel_14: Event generation disabled
|
||||||
|
dmac_evosel_15: Event generation disabled
|
||||||
|
dmac_evosel_2: Event generation disabled
|
||||||
|
dmac_evosel_3: Event generation disabled
|
||||||
|
dmac_evosel_4: Event generation disabled
|
||||||
|
dmac_evosel_5: Event generation disabled
|
||||||
|
dmac_evosel_6: Event generation disabled
|
||||||
|
dmac_evosel_7: Event generation disabled
|
||||||
|
dmac_evosel_8: Event generation disabled
|
||||||
|
dmac_evosel_9: Event generation disabled
|
||||||
|
dmac_lvl_0: Channel priority 0
|
||||||
|
dmac_lvl_1: Channel priority 0
|
||||||
|
dmac_lvl_10: Channel priority 0
|
||||||
|
dmac_lvl_11: Channel priority 0
|
||||||
|
dmac_lvl_12: Channel priority 0
|
||||||
|
dmac_lvl_13: Channel priority 0
|
||||||
|
dmac_lvl_14: Channel priority 0
|
||||||
|
dmac_lvl_15: Channel priority 0
|
||||||
|
dmac_lvl_2: Channel priority 0
|
||||||
|
dmac_lvl_3: Channel priority 0
|
||||||
|
dmac_lvl_4: Channel priority 0
|
||||||
|
dmac_lvl_5: Channel priority 0
|
||||||
|
dmac_lvl_6: Channel priority 0
|
||||||
|
dmac_lvl_7: Channel priority 0
|
||||||
|
dmac_lvl_8: Channel priority 0
|
||||||
|
dmac_lvl_9: Channel priority 0
|
||||||
|
dmac_lvlen0: false
|
||||||
|
dmac_lvlen1: false
|
||||||
|
dmac_lvlen2: false
|
||||||
|
dmac_lvlen3: false
|
||||||
|
dmac_lvlpri0: 0
|
||||||
|
dmac_lvlpri1: 0
|
||||||
|
dmac_lvlpri2: 0
|
||||||
|
dmac_lvlpri3: 0
|
||||||
|
dmac_rrlvlen0: Static arbitration scheme for channel with priority 0
|
||||||
|
dmac_rrlvlen1: Static arbitration scheme for channel with priority 1
|
||||||
|
dmac_rrlvlen2: Static arbitration scheme for channel with priority 2
|
||||||
|
dmac_rrlvlen3: Static arbitration scheme for channel with priority 3
|
||||||
|
dmac_srcinc_0: false
|
||||||
|
dmac_srcinc_1: false
|
||||||
|
dmac_srcinc_10: false
|
||||||
|
dmac_srcinc_11: false
|
||||||
|
dmac_srcinc_12: false
|
||||||
|
dmac_srcinc_13: false
|
||||||
|
dmac_srcinc_14: false
|
||||||
|
dmac_srcinc_15: false
|
||||||
|
dmac_srcinc_2: false
|
||||||
|
dmac_srcinc_3: false
|
||||||
|
dmac_srcinc_4: false
|
||||||
|
dmac_srcinc_5: false
|
||||||
|
dmac_srcinc_6: false
|
||||||
|
dmac_srcinc_7: false
|
||||||
|
dmac_srcinc_8: false
|
||||||
|
dmac_srcinc_9: false
|
||||||
|
dmac_stepsel_0: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_1: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_10: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_11: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_12: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_13: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_14: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_15: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_2: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_3: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_4: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_5: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_6: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_7: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_8: Step size settings apply to the destination address
|
||||||
|
dmac_stepsel_9: Step size settings apply to the destination address
|
||||||
|
dmac_stepsize_0: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_1: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_10: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_11: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_12: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_13: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_14: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_15: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_2: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_3: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_4: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_5: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_6: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_7: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_8: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_stepsize_9: Next ADDR = ADDR + (BEATSIZE + 1) * 1
|
||||||
|
dmac_trifsrc_0: Only software/event triggers
|
||||||
|
dmac_trifsrc_1: Only software/event triggers
|
||||||
|
dmac_trifsrc_10: Only software/event triggers
|
||||||
|
dmac_trifsrc_11: Only software/event triggers
|
||||||
|
dmac_trifsrc_12: Only software/event triggers
|
||||||
|
dmac_trifsrc_13: Only software/event triggers
|
||||||
|
dmac_trifsrc_14: Only software/event triggers
|
||||||
|
dmac_trifsrc_15: Only software/event triggers
|
||||||
|
dmac_trifsrc_2: Only software/event triggers
|
||||||
|
dmac_trifsrc_3: Only software/event triggers
|
||||||
|
dmac_trifsrc_4: Only software/event triggers
|
||||||
|
dmac_trifsrc_5: Only software/event triggers
|
||||||
|
dmac_trifsrc_6: Only software/event triggers
|
||||||
|
dmac_trifsrc_7: Only software/event triggers
|
||||||
|
dmac_trifsrc_8: Only software/event triggers
|
||||||
|
dmac_trifsrc_9: Only software/event triggers
|
||||||
|
dmac_trigact_0: One trigger required for each block transfer
|
||||||
|
dmac_trigact_1: One trigger required for each block transfer
|
||||||
|
dmac_trigact_10: One trigger required for each block transfer
|
||||||
|
dmac_trigact_11: One trigger required for each block transfer
|
||||||
|
dmac_trigact_12: One trigger required for each block transfer
|
||||||
|
dmac_trigact_13: One trigger required for each block transfer
|
||||||
|
dmac_trigact_14: One trigger required for each block transfer
|
||||||
|
dmac_trigact_15: One trigger required for each block transfer
|
||||||
|
dmac_trigact_2: One trigger required for each block transfer
|
||||||
|
dmac_trigact_3: One trigger required for each block transfer
|
||||||
|
dmac_trigact_4: One trigger required for each block transfer
|
||||||
|
dmac_trigact_5: One trigger required for each block transfer
|
||||||
|
dmac_trigact_6: One trigger required for each block transfer
|
||||||
|
dmac_trigact_7: One trigger required for each block transfer
|
||||||
|
dmac_trigact_8: One trigger required for each block transfer
|
||||||
|
dmac_trigact_9: One trigger required for each block transfer
|
||||||
|
optional_signals: []
|
||||||
|
variant: null
|
||||||
|
clocks:
|
||||||
|
domain_group: null
|
||||||
|
SYSCTRL:
|
||||||
|
user_label: SYSCTRL
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::SYSCTRL::driver_config_definition::SYSCTRL::HAL:HPL:SYSCTRL
|
||||||
|
functionality: System
|
||||||
|
api: HAL:HPL:SYSCTRL
|
||||||
|
configuration:
|
||||||
|
$input: 32768
|
||||||
|
$input_id: Generic clock generator 3
|
||||||
|
RESERVED_InputFreq: 32768
|
||||||
|
RESERVED_InputFreq_id: Generic clock generator 3
|
||||||
|
_$freq_output_8MHz Internal Oscillator (OSC8M): 8000000
|
||||||
|
_$freq_output_Digital Frequency Locked Loop (DFLL48M): 48000000
|
||||||
|
_$freq_output_External Crystal Oscillator 0.4-32MHz (XOSC): '16000000'
|
||||||
|
_$freq_output_Fractional Digital Phase Locked Loop (FDPLL96M): 47998976
|
||||||
|
dfll48m_arch_bplckc: false
|
||||||
|
dfll48m_arch_calibration: false
|
||||||
|
dfll48m_arch_ccdis: false
|
||||||
|
dfll48m_arch_coarse: 31
|
||||||
|
dfll48m_arch_enable: true
|
||||||
|
dfll48m_arch_fine: 512
|
||||||
|
dfll48m_arch_llaw: false
|
||||||
|
dfll48m_arch_ondemand: true
|
||||||
|
dfll48m_arch_qldis: false
|
||||||
|
dfll48m_arch_runstdby: true
|
||||||
|
dfll48m_arch_stable: false
|
||||||
|
dfll48m_arch_usbcrm: false
|
||||||
|
dfll48m_arch_waitlock: true
|
||||||
|
dfll48m_mode: Open Loop Mode
|
||||||
|
dfll48m_mul: 1465
|
||||||
|
dfll48m_ref_clock: Generic clock generator 3
|
||||||
|
dfll_arch_cstep: 31
|
||||||
|
dfll_arch_fstep: 511
|
||||||
|
enable_dfll48m: true
|
||||||
|
enable_fdpll96m: false
|
||||||
|
enable_osc32k: false
|
||||||
|
enable_osc8m: true
|
||||||
|
enable_osculp32k: true
|
||||||
|
enable_xosc: false
|
||||||
|
enable_xosc32k: false
|
||||||
|
fdpll96m_arch_enable: false
|
||||||
|
fdpll96m_arch_lbypass: false
|
||||||
|
fdpll96m_arch_ondemand: true
|
||||||
|
fdpll96m_arch_runstdby: false
|
||||||
|
fdpll96m_clock_div: 0
|
||||||
|
fdpll96m_ldr: 1463
|
||||||
|
fdpll96m_ldrfrac: 13
|
||||||
|
fdpll96m_ref_clock: Generic clock generator 3
|
||||||
|
osc32k_arch_calib: 0
|
||||||
|
osc32k_arch_en1k: false
|
||||||
|
osc32k_arch_en32k: false
|
||||||
|
osc32k_arch_enable: false
|
||||||
|
osc32k_arch_ondemand: true
|
||||||
|
osc32k_arch_overwrite_calibration: false
|
||||||
|
osc32k_arch_runstdby: false
|
||||||
|
osc32k_arch_startup: 3 Clock Cycles (92us)
|
||||||
|
osc32k_arch_wrtlock: false
|
||||||
|
osc8m_arch_calib: 0
|
||||||
|
osc8m_arch_enable: true
|
||||||
|
osc8m_arch_ondemand: true
|
||||||
|
osc8m_arch_overwrite_calibration: false
|
||||||
|
osc8m_arch_runstdby: false
|
||||||
|
osc8m_presc: '1'
|
||||||
|
osculp32k_arch_calib: 0
|
||||||
|
osculp32k_arch_overwrite_calibration: false
|
||||||
|
osculp32k_arch_wrtlock: false
|
||||||
|
xosc32k_arch_aampen: false
|
||||||
|
xosc32k_arch_en1k: false
|
||||||
|
xosc32k_arch_en32k: false
|
||||||
|
xosc32k_arch_enable: false
|
||||||
|
xosc32k_arch_ondemand: true
|
||||||
|
xosc32k_arch_runstdby: false
|
||||||
|
xosc32k_arch_startup: 122 us
|
||||||
|
xosc32k_arch_wrtlock: false
|
||||||
|
xosc32k_arch_xtalen: false
|
||||||
|
xosc_arch_ampgc: false
|
||||||
|
xosc_arch_enable: false
|
||||||
|
xosc_arch_gain: 2Mhz
|
||||||
|
xosc_arch_ondemand: true
|
||||||
|
xosc_arch_runstdby: false
|
||||||
|
xosc_arch_startup: 31 us
|
||||||
|
xosc_arch_xtalen: false
|
||||||
|
xosc_frequency: 16000000
|
||||||
|
optional_signals: []
|
||||||
|
variant: null
|
||||||
|
clocks:
|
||||||
|
domain_group: null
|
||||||
|
pads:
|
||||||
|
OUT_LED_TX:
|
||||||
|
name: PA06
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::pad::PA06
|
||||||
|
mode: Digital output
|
||||||
|
user_label: OUT_LED_TX
|
||||||
|
configuration: null
|
||||||
|
OUT_XBEE_REMOTE_RESET:
|
||||||
|
name: PA07
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::pad::PA07
|
||||||
|
mode: Digital output
|
||||||
|
user_label: OUT_XBEE_REMOTE_RESET
|
||||||
|
configuration: null
|
||||||
|
IN_UART_TX:
|
||||||
|
name: PA08
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::pad::PA08
|
||||||
|
mode: Peripheral IO
|
||||||
|
user_label: IN_UART_TX
|
||||||
|
configuration: null
|
||||||
|
OUT_UART_RX:
|
||||||
|
name: PA09
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::pad::PA09
|
||||||
|
mode: Peripheral IO
|
||||||
|
user_label: OUT_UART_RX
|
||||||
|
configuration: null
|
||||||
|
OUT_XBEE_HEARTBEAT:
|
||||||
|
name: PA14
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::pad::PA14
|
||||||
|
mode: Digital output
|
||||||
|
user_label: OUT_XBEE_HEARTBEAT
|
||||||
|
configuration: null
|
||||||
|
OUT_LED_OTAU:
|
||||||
|
name: PA15
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::pad::PA15
|
||||||
|
mode: Digital output
|
||||||
|
user_label: OUT_LED_OTAU
|
||||||
|
configuration: null
|
||||||
|
PA16:
|
||||||
|
name: PA16
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::pad::PA16
|
||||||
|
mode: Digital input
|
||||||
|
user_label: PA16
|
||||||
|
configuration: null
|
||||||
|
OUT_SPI_CS:
|
||||||
|
name: PA17
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::pad::PA17
|
||||||
|
mode: Digital output
|
||||||
|
user_label: OUT_SPI_CS
|
||||||
|
configuration: null
|
||||||
|
PA18:
|
||||||
|
name: PA18
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::pad::PA18
|
||||||
|
mode: Digital output
|
||||||
|
user_label: PA18
|
||||||
|
configuration: null
|
||||||
|
PA19:
|
||||||
|
name: PA19
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::pad::PA19
|
||||||
|
mode: Digital output
|
||||||
|
user_label: PA19
|
||||||
|
configuration: null
|
||||||
|
OUT_LED_LINK:
|
||||||
|
name: PA27
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::pad::PA27
|
||||||
|
mode: Digital output
|
||||||
|
user_label: OUT_LED_LINK
|
||||||
|
configuration: null
|
||||||
|
OUT_LED_RX:
|
||||||
|
name: PA28
|
||||||
|
definition: Atmel:SAMD21_Drivers:0.0.1::SAMD21E17A-MF::pad::PA28
|
||||||
|
mode: Digital output
|
||||||
|
user_label: OUT_LED_RX
|
||||||
|
configuration: null
|
||||||
|
toolchain_options: []
|
||||||
|
static_files: []
|
||||||
37
atmel_start_pins.h
Normal file
37
atmel_start_pins.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* Code generated from Atmel Start.
|
||||||
|
*
|
||||||
|
* This file will be overwritten when reconfiguring your Atmel Start project.
|
||||||
|
* Please copy examples or other code you want to keep to a separate file
|
||||||
|
* to avoid losing it when reconfiguring.
|
||||||
|
*/
|
||||||
|
#ifndef ATMEL_START_PINS_H_INCLUDED
|
||||||
|
#define ATMEL_START_PINS_H_INCLUDED
|
||||||
|
|
||||||
|
#include <hal_gpio.h>
|
||||||
|
|
||||||
|
// SAMD21 has 8 pin functions
|
||||||
|
|
||||||
|
#define GPIO_PIN_FUNCTION_A 0
|
||||||
|
#define GPIO_PIN_FUNCTION_B 1
|
||||||
|
#define GPIO_PIN_FUNCTION_C 2
|
||||||
|
#define GPIO_PIN_FUNCTION_D 3
|
||||||
|
#define GPIO_PIN_FUNCTION_E 4
|
||||||
|
#define GPIO_PIN_FUNCTION_F 5
|
||||||
|
#define GPIO_PIN_FUNCTION_G 6
|
||||||
|
#define GPIO_PIN_FUNCTION_H 7
|
||||||
|
|
||||||
|
#define OUT_LED_TX GPIO(GPIO_PORTA, 6)
|
||||||
|
#define OUT_XBEE_REMOTE_RESET GPIO(GPIO_PORTA, 7)
|
||||||
|
#define IN_UART_TX GPIO(GPIO_PORTA, 8)
|
||||||
|
#define OUT_UART_RX GPIO(GPIO_PORTA, 9)
|
||||||
|
#define OUT_XBEE_HEARTBEAT GPIO(GPIO_PORTA, 14)
|
||||||
|
#define OUT_LED_OTAU GPIO(GPIO_PORTA, 15)
|
||||||
|
#define PA16 GPIO(GPIO_PORTA, 16)
|
||||||
|
#define OUT_SPI_CS GPIO(GPIO_PORTA, 17)
|
||||||
|
#define PA18 GPIO(GPIO_PORTA, 18)
|
||||||
|
#define PA19 GPIO(GPIO_PORTA, 19)
|
||||||
|
#define OUT_LED_LINK GPIO(GPIO_PORTA, 27)
|
||||||
|
#define OUT_LED_RX GPIO(GPIO_PORTA, 28)
|
||||||
|
|
||||||
|
#endif // ATMEL_START_PINS_H_INCLUDED
|
||||||
3073
config/hpl_dmac_config.h
Normal file
3073
config/hpl_dmac_config.h
Normal file
File diff suppressed because it is too large
Load Diff
687
config/hpl_eic_config.h
Normal file
687
config/hpl_eic_config.h
Normal file
@ -0,0 +1,687 @@
|
|||||||
|
/* Auto-generated config file hpl_eic_config.h */
|
||||||
|
#ifndef HPL_EIC_CONFIG_H
|
||||||
|
#define HPL_EIC_CONFIG_H
|
||||||
|
|
||||||
|
// <<< Use Configuration Wizard in Context Menu >>>
|
||||||
|
|
||||||
|
// <h> Non-Maskable Interrupt Control
|
||||||
|
// <q> Non-Maskable Interrupt Filter Enable
|
||||||
|
// <i> Indicates whether the mon-maskable interrupt filter is enabled or not
|
||||||
|
// <id> eic_arch_nmifilten
|
||||||
|
#ifndef CONF_EIC_NMIFILTEN
|
||||||
|
#define CONF_EIC_NMIFILTEN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Non-Maskable Interrupt Sense
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines non-maskable interrupt sense
|
||||||
|
// <id> eic_arch_nmisense
|
||||||
|
#ifndef CONF_EIC_NMISENSE
|
||||||
|
#define CONF_EIC_NMISENSE EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
// <e> Interrupt 0 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting0
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING0
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING0 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 0 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 0 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo0
|
||||||
|
#ifndef CONF_EIC_EXTINTEO0
|
||||||
|
#define CONF_EIC_EXTINTEO0 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 0 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 0 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen0
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN0
|
||||||
|
#define CONF_EIC_WAKEUPEN0 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 0 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 0 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten0
|
||||||
|
#ifndef CONF_EIC_FILTEN0
|
||||||
|
#define CONF_EIC_FILTEN0 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 0 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense0
|
||||||
|
#ifndef CONF_EIC_SENSE0
|
||||||
|
#define CONF_EIC_SENSE0 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 1 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting1
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING1
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING1 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 1 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 1 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo1
|
||||||
|
#ifndef CONF_EIC_EXTINTEO1
|
||||||
|
#define CONF_EIC_EXTINTEO1 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 1 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 1 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen1
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN1
|
||||||
|
#define CONF_EIC_WAKEUPEN1 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 1 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 1 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten1
|
||||||
|
#ifndef CONF_EIC_FILTEN1
|
||||||
|
#define CONF_EIC_FILTEN1 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 1 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense1
|
||||||
|
#ifndef CONF_EIC_SENSE1
|
||||||
|
#define CONF_EIC_SENSE1 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 2 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting2
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING2
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING2 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 2 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 2 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo2
|
||||||
|
#ifndef CONF_EIC_EXTINTEO2
|
||||||
|
#define CONF_EIC_EXTINTEO2 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 2 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 2 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen2
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN2
|
||||||
|
#define CONF_EIC_WAKEUPEN2 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 2 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 2 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten2
|
||||||
|
#ifndef CONF_EIC_FILTEN2
|
||||||
|
#define CONF_EIC_FILTEN2 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 2 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense2
|
||||||
|
#ifndef CONF_EIC_SENSE2
|
||||||
|
#define CONF_EIC_SENSE2 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 3 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting3
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING3
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING3 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 3 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 3 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo3
|
||||||
|
#ifndef CONF_EIC_EXTINTEO3
|
||||||
|
#define CONF_EIC_EXTINTEO3 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 3 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 3 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen3
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN3
|
||||||
|
#define CONF_EIC_WAKEUPEN3 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 3 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 3 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten3
|
||||||
|
#ifndef CONF_EIC_FILTEN3
|
||||||
|
#define CONF_EIC_FILTEN3 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 3 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense3
|
||||||
|
#ifndef CONF_EIC_SENSE3
|
||||||
|
#define CONF_EIC_SENSE3 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 4 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting4
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING4
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING4 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 4 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 4 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo4
|
||||||
|
#ifndef CONF_EIC_EXTINTEO4
|
||||||
|
#define CONF_EIC_EXTINTEO4 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 4 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 4 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen4
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN4
|
||||||
|
#define CONF_EIC_WAKEUPEN4 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 4 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 4 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten4
|
||||||
|
#ifndef CONF_EIC_FILTEN4
|
||||||
|
#define CONF_EIC_FILTEN4 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 4 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense4
|
||||||
|
#ifndef CONF_EIC_SENSE4
|
||||||
|
#define CONF_EIC_SENSE4 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 5 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting5
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING5
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING5 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 5 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 5 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo5
|
||||||
|
#ifndef CONF_EIC_EXTINTEO5
|
||||||
|
#define CONF_EIC_EXTINTEO5 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 5 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 5 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen5
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN5
|
||||||
|
#define CONF_EIC_WAKEUPEN5 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 5 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 5 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten5
|
||||||
|
#ifndef CONF_EIC_FILTEN5
|
||||||
|
#define CONF_EIC_FILTEN5 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 5 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense5
|
||||||
|
#ifndef CONF_EIC_SENSE5
|
||||||
|
#define CONF_EIC_SENSE5 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 6 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting6
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING6
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING6 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 6 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 6 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo6
|
||||||
|
#ifndef CONF_EIC_EXTINTEO6
|
||||||
|
#define CONF_EIC_EXTINTEO6 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 6 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 6 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen6
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN6
|
||||||
|
#define CONF_EIC_WAKEUPEN6 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 6 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 6 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten6
|
||||||
|
#ifndef CONF_EIC_FILTEN6
|
||||||
|
#define CONF_EIC_FILTEN6 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 6 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense6
|
||||||
|
#ifndef CONF_EIC_SENSE6
|
||||||
|
#define CONF_EIC_SENSE6 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 7 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting7
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING7
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING7 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 7 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 7 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo7
|
||||||
|
#ifndef CONF_EIC_EXTINTEO7
|
||||||
|
#define CONF_EIC_EXTINTEO7 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 7 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 7 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen7
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN7
|
||||||
|
#define CONF_EIC_WAKEUPEN7 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 7 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 7 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten7
|
||||||
|
#ifndef CONF_EIC_FILTEN7
|
||||||
|
#define CONF_EIC_FILTEN7 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 7 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense7
|
||||||
|
#ifndef CONF_EIC_SENSE7
|
||||||
|
#define CONF_EIC_SENSE7 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 8 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting8
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING8
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING8 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 8 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 8 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo8
|
||||||
|
#ifndef CONF_EIC_EXTINTEO8
|
||||||
|
#define CONF_EIC_EXTINTEO8 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 8 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 8 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen8
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN8
|
||||||
|
#define CONF_EIC_WAKEUPEN8 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 8 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 8 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten8
|
||||||
|
#ifndef CONF_EIC_FILTEN8
|
||||||
|
#define CONF_EIC_FILTEN8 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 8 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense8
|
||||||
|
#ifndef CONF_EIC_SENSE8
|
||||||
|
#define CONF_EIC_SENSE8 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 9 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting9
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING9
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING9 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 9 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 9 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo9
|
||||||
|
#ifndef CONF_EIC_EXTINTEO9
|
||||||
|
#define CONF_EIC_EXTINTEO9 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 9 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 9 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen9
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN9
|
||||||
|
#define CONF_EIC_WAKEUPEN9 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 9 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 9 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten9
|
||||||
|
#ifndef CONF_EIC_FILTEN9
|
||||||
|
#define CONF_EIC_FILTEN9 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 9 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense9
|
||||||
|
#ifndef CONF_EIC_SENSE9
|
||||||
|
#define CONF_EIC_SENSE9 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 10 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting10
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING10
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING10 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 10 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 10 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo10
|
||||||
|
#ifndef CONF_EIC_EXTINTEO10
|
||||||
|
#define CONF_EIC_EXTINTEO10 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 10 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 10 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen10
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN10
|
||||||
|
#define CONF_EIC_WAKEUPEN10 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 10 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 10 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten10
|
||||||
|
#ifndef CONF_EIC_FILTEN10
|
||||||
|
#define CONF_EIC_FILTEN10 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 10 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense10
|
||||||
|
#ifndef CONF_EIC_SENSE10
|
||||||
|
#define CONF_EIC_SENSE10 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 11 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting11
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING11
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING11 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 11 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 11 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo11
|
||||||
|
#ifndef CONF_EIC_EXTINTEO11
|
||||||
|
#define CONF_EIC_EXTINTEO11 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 11 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 11 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen11
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN11
|
||||||
|
#define CONF_EIC_WAKEUPEN11 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 11 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 11 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten11
|
||||||
|
#ifndef CONF_EIC_FILTEN11
|
||||||
|
#define CONF_EIC_FILTEN11 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 11 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense11
|
||||||
|
#ifndef CONF_EIC_SENSE11
|
||||||
|
#define CONF_EIC_SENSE11 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 12 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting12
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING12
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING12 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 12 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 12 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo12
|
||||||
|
#ifndef CONF_EIC_EXTINTEO12
|
||||||
|
#define CONF_EIC_EXTINTEO12 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 12 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 12 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen12
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN12
|
||||||
|
#define CONF_EIC_WAKEUPEN12 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 12 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 12 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten12
|
||||||
|
#ifndef CONF_EIC_FILTEN12
|
||||||
|
#define CONF_EIC_FILTEN12 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 12 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense12
|
||||||
|
#ifndef CONF_EIC_SENSE12
|
||||||
|
#define CONF_EIC_SENSE12 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 13 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting13
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING13
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING13 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 13 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 13 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo13
|
||||||
|
#ifndef CONF_EIC_EXTINTEO13
|
||||||
|
#define CONF_EIC_EXTINTEO13 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 13 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 13 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen13
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN13
|
||||||
|
#define CONF_EIC_WAKEUPEN13 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 13 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 13 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten13
|
||||||
|
#ifndef CONF_EIC_FILTEN13
|
||||||
|
#define CONF_EIC_FILTEN13 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 13 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense13
|
||||||
|
#ifndef CONF_EIC_SENSE13
|
||||||
|
#define CONF_EIC_SENSE13 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 14 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting14
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING14
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING14 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 14 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 14 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo14
|
||||||
|
#ifndef CONF_EIC_EXTINTEO14
|
||||||
|
#define CONF_EIC_EXTINTEO14 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 14 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 14 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen14
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN14
|
||||||
|
#define CONF_EIC_WAKEUPEN14 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 14 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 14 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten14
|
||||||
|
#ifndef CONF_EIC_FILTEN14
|
||||||
|
#define CONF_EIC_FILTEN14 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 14 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense14
|
||||||
|
#ifndef CONF_EIC_SENSE14
|
||||||
|
#define CONF_EIC_SENSE14 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> Interrupt 15 Settings
|
||||||
|
// <id> eic_arch_enable_irq_setting15
|
||||||
|
#ifndef CONF_EIC_ENABLE_IRQ_SETTING15
|
||||||
|
#define CONF_EIC_ENABLE_IRQ_SETTING15 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 15 Event Output Enable
|
||||||
|
// <i> Indicates whether the external interrupt 15 event output is enabled or not
|
||||||
|
// <id> eic_arch_extinteo15
|
||||||
|
#ifndef CONF_EIC_EXTINTEO15
|
||||||
|
#define CONF_EIC_EXTINTEO15 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 15 Wake-up Enable
|
||||||
|
// <i> Indicates whether the external interrupt 15 wake-up is enabled or not
|
||||||
|
// <id> eic_arch_wakeupen15
|
||||||
|
#ifndef CONF_EIC_WAKEUPEN15
|
||||||
|
#define CONF_EIC_WAKEUPEN15 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> External Interrupt 15 Filter Enable
|
||||||
|
// <i> Indicates whether the external interrupt 15 filter is enabled or not
|
||||||
|
// <id> eic_arch_filten15
|
||||||
|
#ifndef CONF_EIC_FILTEN15
|
||||||
|
#define CONF_EIC_FILTEN15 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Input 15 Sense Configuration
|
||||||
|
// <EIC_NMICTRL_NMISENSE_NONE_Val"> No detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_RISE_Val"> Rising-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_FALL_Val"> Falling-edge detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_BOTH_Val"> Both-edges detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_HIGH_Val"> High-level detection
|
||||||
|
// <EIC_NMICTRL_NMISENSE_LOW_Val"> Low-level detection
|
||||||
|
// <i> This defines input sense trigger
|
||||||
|
// <id> eic_arch_sense15
|
||||||
|
#ifndef CONF_EIC_SENSE15
|
||||||
|
#define CONF_EIC_SENSE15 EIC_NMICTRL_NMISENSE_NONE_Val
|
||||||
|
#endif
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <<< end of configuration section >>>
|
||||||
|
|
||||||
|
#endif // HPL_EIC_CONFIG_H
|
||||||
618
config/hpl_gclk_config.h
Normal file
618
config/hpl_gclk_config.h
Normal file
@ -0,0 +1,618 @@
|
|||||||
|
/* Auto-generated config file hpl_gclk_config.h */
|
||||||
|
#ifndef HPL_GCLK_CONFIG_H
|
||||||
|
#define HPL_GCLK_CONFIG_H
|
||||||
|
|
||||||
|
// <<< Use Configuration Wizard in Context Menu >>>
|
||||||
|
|
||||||
|
// <e> Generic clock generator 0 configuration
|
||||||
|
// <i> Indicates whether generic clock 0 configuration is enabled or not
|
||||||
|
// <id> enable_gclk_gen_0
|
||||||
|
#ifndef CONF_GCLK_GENERATOR_0_CONFIG
|
||||||
|
#define CONF_GCLK_GENERATOR_0_CONFIG 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> Generic Clock Generator Control
|
||||||
|
// <q> Run in Standby
|
||||||
|
// <i> Indicates whether Run in Standby is enabled or not
|
||||||
|
// <id> gclk_arch_gen_0_RUNSTDBY
|
||||||
|
#ifndef CONF_GCLK_GEN_0_RUNSTDBY
|
||||||
|
#define CONF_GCLK_GEN_0_RUNSTDBY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Divide Selection
|
||||||
|
// <i> Indicates whether Divide Selection is enabled or not
|
||||||
|
// <id> gclk_gen_0_div_sel
|
||||||
|
#ifndef CONF_GCLK_GEN_0_DIVSEL
|
||||||
|
#define CONF_GCLK_GEN_0_DIVSEL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Enable
|
||||||
|
// <i> Indicates whether Output Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_0_oe
|
||||||
|
#ifndef CONF_GCLK_GEN_0_OE
|
||||||
|
#define CONF_GCLK_GEN_0_OE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Off Value
|
||||||
|
// <i> Indicates whether Output Off Value is enabled or not
|
||||||
|
// <id> gclk_arch_gen_0_oov
|
||||||
|
#ifndef CONF_GCLK_GEN_0_OOV
|
||||||
|
#define CONF_GCLK_GEN_0_OOV 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Improve Duty Cycle
|
||||||
|
// <i> Indicates whether Improve Duty Cycle is enabled or not
|
||||||
|
// <id> gclk_arch_gen_0_idc
|
||||||
|
#ifndef CONF_GCLK_GEN_0_IDC
|
||||||
|
#define CONF_GCLK_GEN_0_IDC 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Generic Clock Generator Enable
|
||||||
|
// <i> Indicates whether Generic Clock Generator Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_0_enable
|
||||||
|
#ifndef CONF_GCLK_GEN_0_GENEN
|
||||||
|
#define CONF_GCLK_GEN_0_GENEN 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Generic clock generator 0 source
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC"> External Crystal Oscillator 0.4-32MHz (XOSC)
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKIN"> Generic clock generator input pad
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKGEN1"> Generic clock generator 1
|
||||||
|
// <GCLK_GENCTRL_SRC_OSCULP32K"> 32kHz Ultra Low Power Internal Oscillator (OSCULP32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC32K"> 32kHz High Accuracy Internal Oscillator (OSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC32K"> 32kHz External Crystal Oscillator (XOSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC8M"> 8MHz Internal Oscillator (OSC8M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DFLL48M"> Digital Frequency Locked Loop (DFLL48M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DPLL96M"> Fractional Digital Phase Locked Loop (FDPLL96M)
|
||||||
|
// <i> This defines the clock source for generic clock generator 0
|
||||||
|
// <id> gclk_gen_0_oscillator
|
||||||
|
#ifndef CONF_GCLK_GEN_0_SRC
|
||||||
|
#define CONF_GCLK_GEN_0_SRC GCLK_GENCTRL_SRC_DFLL48M
|
||||||
|
#endif
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
//<h> Generic Clock Generator Division
|
||||||
|
//<o> Generic clock generator 0 division <0x0000-0xFFFF>
|
||||||
|
// <i>
|
||||||
|
// <id> gclk_gen_0_div
|
||||||
|
#ifndef CONF_GCLK_GEN_0_DIV
|
||||||
|
#define CONF_GCLK_GEN_0_DIV 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>// <e> Generic clock generator 1 configuration
|
||||||
|
// <i> Indicates whether generic clock 1 configuration is enabled or not
|
||||||
|
// <id> enable_gclk_gen_1
|
||||||
|
#ifndef CONF_GCLK_GENERATOR_1_CONFIG
|
||||||
|
#define CONF_GCLK_GENERATOR_1_CONFIG 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> Generic Clock Generator Control
|
||||||
|
// <q> Run in Standby
|
||||||
|
// <i> Indicates whether Run in Standby is enabled or not
|
||||||
|
// <id> gclk_arch_gen_1_RUNSTDBY
|
||||||
|
#ifndef CONF_GCLK_GEN_1_RUNSTDBY
|
||||||
|
#define CONF_GCLK_GEN_1_RUNSTDBY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Divide Selection
|
||||||
|
// <i> Indicates whether Divide Selection is enabled or not
|
||||||
|
// <id> gclk_gen_1_div_sel
|
||||||
|
#ifndef CONF_GCLK_GEN_1_DIVSEL
|
||||||
|
#define CONF_GCLK_GEN_1_DIVSEL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Enable
|
||||||
|
// <i> Indicates whether Output Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_1_oe
|
||||||
|
#ifndef CONF_GCLK_GEN_1_OE
|
||||||
|
#define CONF_GCLK_GEN_1_OE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Off Value
|
||||||
|
// <i> Indicates whether Output Off Value is enabled or not
|
||||||
|
// <id> gclk_arch_gen_1_oov
|
||||||
|
#ifndef CONF_GCLK_GEN_1_OOV
|
||||||
|
#define CONF_GCLK_GEN_1_OOV 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Improve Duty Cycle
|
||||||
|
// <i> Indicates whether Improve Duty Cycle is enabled or not
|
||||||
|
// <id> gclk_arch_gen_1_idc
|
||||||
|
#ifndef CONF_GCLK_GEN_1_IDC
|
||||||
|
#define CONF_GCLK_GEN_1_IDC 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Generic Clock Generator Enable
|
||||||
|
// <i> Indicates whether Generic Clock Generator Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_1_enable
|
||||||
|
#ifndef CONF_GCLK_GEN_1_GENEN
|
||||||
|
#define CONF_GCLK_GEN_1_GENEN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Generic clock generator 1 source
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC"> External Crystal Oscillator 0.4-32MHz (XOSC)
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKIN"> Generic clock generator input pad
|
||||||
|
// <GCLK_GENCTRL_SRC_OSCULP32K"> 32kHz Ultra Low Power Internal Oscillator (OSCULP32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC32K"> 32kHz High Accuracy Internal Oscillator (OSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC32K"> 32kHz External Crystal Oscillator (XOSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC8M"> 8MHz Internal Oscillator (OSC8M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DFLL48M"> Digital Frequency Locked Loop (DFLL48M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DPLL96M"> Fractional Digital Phase Locked Loop (FDPLL96M)
|
||||||
|
// <i> This defines the clock source for generic clock generator 1
|
||||||
|
// <id> gclk_gen_1_oscillator
|
||||||
|
#ifndef CONF_GCLK_GEN_1_SRC
|
||||||
|
#define CONF_GCLK_GEN_1_SRC GCLK_GENCTRL_SRC_OSC8M
|
||||||
|
#endif
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
//<h> Generic Clock Generator Division
|
||||||
|
//<o> Generic clock generator 1 division <0x0000-0xFFFF>
|
||||||
|
// <i>
|
||||||
|
// <id> gclk_gen_1_div
|
||||||
|
#ifndef CONF_GCLK_GEN_1_DIV
|
||||||
|
#define CONF_GCLK_GEN_1_DIV 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>// <e> Generic clock generator 2 configuration
|
||||||
|
// <i> Indicates whether generic clock 2 configuration is enabled or not
|
||||||
|
// <id> enable_gclk_gen_2
|
||||||
|
#ifndef CONF_GCLK_GENERATOR_2_CONFIG
|
||||||
|
#define CONF_GCLK_GENERATOR_2_CONFIG 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> Generic Clock Generator Control
|
||||||
|
// <q> Run in Standby
|
||||||
|
// <i> Indicates whether Run in Standby is enabled or not
|
||||||
|
// <id> gclk_arch_gen_2_RUNSTDBY
|
||||||
|
#ifndef CONF_GCLK_GEN_2_RUNSTDBY
|
||||||
|
#define CONF_GCLK_GEN_2_RUNSTDBY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Divide Selection
|
||||||
|
// <i> Indicates whether Divide Selection is enabled or not
|
||||||
|
// <id> gclk_gen_2_div_sel
|
||||||
|
#ifndef CONF_GCLK_GEN_2_DIVSEL
|
||||||
|
#define CONF_GCLK_GEN_2_DIVSEL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Enable
|
||||||
|
// <i> Indicates whether Output Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_2_oe
|
||||||
|
#ifndef CONF_GCLK_GEN_2_OE
|
||||||
|
#define CONF_GCLK_GEN_2_OE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Off Value
|
||||||
|
// <i> Indicates whether Output Off Value is enabled or not
|
||||||
|
// <id> gclk_arch_gen_2_oov
|
||||||
|
#ifndef CONF_GCLK_GEN_2_OOV
|
||||||
|
#define CONF_GCLK_GEN_2_OOV 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Improve Duty Cycle
|
||||||
|
// <i> Indicates whether Improve Duty Cycle is enabled or not
|
||||||
|
// <id> gclk_arch_gen_2_idc
|
||||||
|
#ifndef CONF_GCLK_GEN_2_IDC
|
||||||
|
#define CONF_GCLK_GEN_2_IDC 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Generic Clock Generator Enable
|
||||||
|
// <i> Indicates whether Generic Clock Generator Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_2_enable
|
||||||
|
#ifndef CONF_GCLK_GEN_2_GENEN
|
||||||
|
#define CONF_GCLK_GEN_2_GENEN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Generic clock generator 2 source
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC"> External Crystal Oscillator 0.4-32MHz (XOSC)
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKIN"> Generic clock generator input pad
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKGEN1"> Generic clock generator 1
|
||||||
|
// <GCLK_GENCTRL_SRC_OSCULP32K"> 32kHz Ultra Low Power Internal Oscillator (OSCULP32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC32K"> 32kHz High Accuracy Internal Oscillator (OSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC32K"> 32kHz External Crystal Oscillator (XOSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC8M"> 8MHz Internal Oscillator (OSC8M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DFLL48M"> Digital Frequency Locked Loop (DFLL48M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DPLL96M"> Fractional Digital Phase Locked Loop (FDPLL96M)
|
||||||
|
// <i> This defines the clock source for generic clock generator 2
|
||||||
|
// <id> gclk_gen_2_oscillator
|
||||||
|
#ifndef CONF_GCLK_GEN_2_SRC
|
||||||
|
#define CONF_GCLK_GEN_2_SRC GCLK_GENCTRL_SRC_XOSC
|
||||||
|
#endif
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
//<h> Generic Clock Generator Division
|
||||||
|
//<o> Generic clock generator 2 division <0x0000-0xFFFF>
|
||||||
|
// <i>
|
||||||
|
// <id> gclk_gen_2_div
|
||||||
|
#ifndef CONF_GCLK_GEN_2_DIV
|
||||||
|
#define CONF_GCLK_GEN_2_DIV 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>// <e> Generic clock generator 3 configuration
|
||||||
|
// <i> Indicates whether generic clock 3 configuration is enabled or not
|
||||||
|
// <id> enable_gclk_gen_3
|
||||||
|
#ifndef CONF_GCLK_GENERATOR_3_CONFIG
|
||||||
|
#define CONF_GCLK_GENERATOR_3_CONFIG 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> Generic Clock Generator Control
|
||||||
|
// <q> Run in Standby
|
||||||
|
// <i> Indicates whether Run in Standby is enabled or not
|
||||||
|
// <id> gclk_arch_gen_3_RUNSTDBY
|
||||||
|
#ifndef CONF_GCLK_GEN_3_RUNSTDBY
|
||||||
|
#define CONF_GCLK_GEN_3_RUNSTDBY 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Divide Selection
|
||||||
|
// <i> Indicates whether Divide Selection is enabled or not
|
||||||
|
// <id> gclk_gen_3_div_sel
|
||||||
|
#ifndef CONF_GCLK_GEN_3_DIVSEL
|
||||||
|
#define CONF_GCLK_GEN_3_DIVSEL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Enable
|
||||||
|
// <i> Indicates whether Output Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_3_oe
|
||||||
|
#ifndef CONF_GCLK_GEN_3_OE
|
||||||
|
#define CONF_GCLK_GEN_3_OE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Off Value
|
||||||
|
// <i> Indicates whether Output Off Value is enabled or not
|
||||||
|
// <id> gclk_arch_gen_3_oov
|
||||||
|
#ifndef CONF_GCLK_GEN_3_OOV
|
||||||
|
#define CONF_GCLK_GEN_3_OOV 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Improve Duty Cycle
|
||||||
|
// <i> Indicates whether Improve Duty Cycle is enabled or not
|
||||||
|
// <id> gclk_arch_gen_3_idc
|
||||||
|
#ifndef CONF_GCLK_GEN_3_IDC
|
||||||
|
#define CONF_GCLK_GEN_3_IDC 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Generic Clock Generator Enable
|
||||||
|
// <i> Indicates whether Generic Clock Generator Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_3_enable
|
||||||
|
#ifndef CONF_GCLK_GEN_3_GENEN
|
||||||
|
#define CONF_GCLK_GEN_3_GENEN 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Generic clock generator 3 source
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC"> External Crystal Oscillator 0.4-32MHz (XOSC)
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKIN"> Generic clock generator input pad
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKGEN1"> Generic clock generator 1
|
||||||
|
// <GCLK_GENCTRL_SRC_OSCULP32K"> 32kHz Ultra Low Power Internal Oscillator (OSCULP32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC32K"> 32kHz High Accuracy Internal Oscillator (OSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC32K"> 32kHz External Crystal Oscillator (XOSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC8M"> 8MHz Internal Oscillator (OSC8M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DFLL48M"> Digital Frequency Locked Loop (DFLL48M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DPLL96M"> Fractional Digital Phase Locked Loop (FDPLL96M)
|
||||||
|
// <i> This defines the clock source for generic clock generator 3
|
||||||
|
// <id> gclk_gen_3_oscillator
|
||||||
|
#ifndef CONF_GCLK_GEN_3_SRC
|
||||||
|
#define CONF_GCLK_GEN_3_SRC GCLK_GENCTRL_SRC_OSCULP32K
|
||||||
|
#endif
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
//<h> Generic Clock Generator Division
|
||||||
|
//<o> Generic clock generator 3 division <0x0000-0xFFFF>
|
||||||
|
// <i>
|
||||||
|
// <id> gclk_gen_3_div
|
||||||
|
#ifndef CONF_GCLK_GEN_3_DIV
|
||||||
|
#define CONF_GCLK_GEN_3_DIV 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>// <e> Generic clock generator 4 configuration
|
||||||
|
// <i> Indicates whether generic clock 4 configuration is enabled or not
|
||||||
|
// <id> enable_gclk_gen_4
|
||||||
|
#ifndef CONF_GCLK_GENERATOR_4_CONFIG
|
||||||
|
#define CONF_GCLK_GENERATOR_4_CONFIG 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> Generic Clock Generator Control
|
||||||
|
// <q> Run in Standby
|
||||||
|
// <i> Indicates whether Run in Standby is enabled or not
|
||||||
|
// <id> gclk_arch_gen_4_RUNSTDBY
|
||||||
|
#ifndef CONF_GCLK_GEN_4_RUNSTDBY
|
||||||
|
#define CONF_GCLK_GEN_4_RUNSTDBY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Divide Selection
|
||||||
|
// <i> Indicates whether Divide Selection is enabled or not
|
||||||
|
// <id> gclk_gen_4_div_sel
|
||||||
|
#ifndef CONF_GCLK_GEN_4_DIVSEL
|
||||||
|
#define CONF_GCLK_GEN_4_DIVSEL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Enable
|
||||||
|
// <i> Indicates whether Output Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_4_oe
|
||||||
|
#ifndef CONF_GCLK_GEN_4_OE
|
||||||
|
#define CONF_GCLK_GEN_4_OE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Off Value
|
||||||
|
// <i> Indicates whether Output Off Value is enabled or not
|
||||||
|
// <id> gclk_arch_gen_4_oov
|
||||||
|
#ifndef CONF_GCLK_GEN_4_OOV
|
||||||
|
#define CONF_GCLK_GEN_4_OOV 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Improve Duty Cycle
|
||||||
|
// <i> Indicates whether Improve Duty Cycle is enabled or not
|
||||||
|
// <id> gclk_arch_gen_4_idc
|
||||||
|
#ifndef CONF_GCLK_GEN_4_IDC
|
||||||
|
#define CONF_GCLK_GEN_4_IDC 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Generic Clock Generator Enable
|
||||||
|
// <i> Indicates whether Generic Clock Generator Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_4_enable
|
||||||
|
#ifndef CONF_GCLK_GEN_4_GENEN
|
||||||
|
#define CONF_GCLK_GEN_4_GENEN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Generic clock generator 4 source
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC"> External Crystal Oscillator 0.4-32MHz (XOSC)
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKIN"> Generic clock generator input pad
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKGEN1"> Generic clock generator 1
|
||||||
|
// <GCLK_GENCTRL_SRC_OSCULP32K"> 32kHz Ultra Low Power Internal Oscillator (OSCULP32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC32K"> 32kHz High Accuracy Internal Oscillator (OSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC32K"> 32kHz External Crystal Oscillator (XOSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC8M"> 8MHz Internal Oscillator (OSC8M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DFLL48M"> Digital Frequency Locked Loop (DFLL48M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DPLL96M"> Fractional Digital Phase Locked Loop (FDPLL96M)
|
||||||
|
// <i> This defines the clock source for generic clock generator 4
|
||||||
|
// <id> gclk_gen_4_oscillator
|
||||||
|
#ifndef CONF_GCLK_GEN_4_SRC
|
||||||
|
#define CONF_GCLK_GEN_4_SRC GCLK_GENCTRL_SRC_XOSC
|
||||||
|
#endif
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
//<h> Generic Clock Generator Division
|
||||||
|
//<o> Generic clock generator 4 division <0x0000-0xFFFF>
|
||||||
|
// <i>
|
||||||
|
// <id> gclk_gen_4_div
|
||||||
|
#ifndef CONF_GCLK_GEN_4_DIV
|
||||||
|
#define CONF_GCLK_GEN_4_DIV 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>// <e> Generic clock generator 5 configuration
|
||||||
|
// <i> Indicates whether generic clock 5 configuration is enabled or not
|
||||||
|
// <id> enable_gclk_gen_5
|
||||||
|
#ifndef CONF_GCLK_GENERATOR_5_CONFIG
|
||||||
|
#define CONF_GCLK_GENERATOR_5_CONFIG 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> Generic Clock Generator Control
|
||||||
|
// <q> Run in Standby
|
||||||
|
// <i> Indicates whether Run in Standby is enabled or not
|
||||||
|
// <id> gclk_arch_gen_5_RUNSTDBY
|
||||||
|
#ifndef CONF_GCLK_GEN_5_RUNSTDBY
|
||||||
|
#define CONF_GCLK_GEN_5_RUNSTDBY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Divide Selection
|
||||||
|
// <i> Indicates whether Divide Selection is enabled or not
|
||||||
|
// <id> gclk_gen_5_div_sel
|
||||||
|
#ifndef CONF_GCLK_GEN_5_DIVSEL
|
||||||
|
#define CONF_GCLK_GEN_5_DIVSEL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Enable
|
||||||
|
// <i> Indicates whether Output Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_5_oe
|
||||||
|
#ifndef CONF_GCLK_GEN_5_OE
|
||||||
|
#define CONF_GCLK_GEN_5_OE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Off Value
|
||||||
|
// <i> Indicates whether Output Off Value is enabled or not
|
||||||
|
// <id> gclk_arch_gen_5_oov
|
||||||
|
#ifndef CONF_GCLK_GEN_5_OOV
|
||||||
|
#define CONF_GCLK_GEN_5_OOV 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Improve Duty Cycle
|
||||||
|
// <i> Indicates whether Improve Duty Cycle is enabled or not
|
||||||
|
// <id> gclk_arch_gen_5_idc
|
||||||
|
#ifndef CONF_GCLK_GEN_5_IDC
|
||||||
|
#define CONF_GCLK_GEN_5_IDC 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Generic Clock Generator Enable
|
||||||
|
// <i> Indicates whether Generic Clock Generator Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_5_enable
|
||||||
|
#ifndef CONF_GCLK_GEN_5_GENEN
|
||||||
|
#define CONF_GCLK_GEN_5_GENEN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Generic clock generator 5 source
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC"> External Crystal Oscillator 0.4-32MHz (XOSC)
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKIN"> Generic clock generator input pad
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKGEN1"> Generic clock generator 1
|
||||||
|
// <GCLK_GENCTRL_SRC_OSCULP32K"> 32kHz Ultra Low Power Internal Oscillator (OSCULP32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC32K"> 32kHz High Accuracy Internal Oscillator (OSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC32K"> 32kHz External Crystal Oscillator (XOSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC8M"> 8MHz Internal Oscillator (OSC8M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DFLL48M"> Digital Frequency Locked Loop (DFLL48M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DPLL96M"> Fractional Digital Phase Locked Loop (FDPLL96M)
|
||||||
|
// <i> This defines the clock source for generic clock generator 5
|
||||||
|
// <id> gclk_gen_5_oscillator
|
||||||
|
#ifndef CONF_GCLK_GEN_5_SRC
|
||||||
|
#define CONF_GCLK_GEN_5_SRC GCLK_GENCTRL_SRC_XOSC
|
||||||
|
#endif
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
//<h> Generic Clock Generator Division
|
||||||
|
//<o> Generic clock generator 5 division <0x0000-0xFFFF>
|
||||||
|
// <i>
|
||||||
|
// <id> gclk_gen_5_div
|
||||||
|
#ifndef CONF_GCLK_GEN_5_DIV
|
||||||
|
#define CONF_GCLK_GEN_5_DIV 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>// <e> Generic clock generator 6 configuration
|
||||||
|
// <i> Indicates whether generic clock 6 configuration is enabled or not
|
||||||
|
// <id> enable_gclk_gen_6
|
||||||
|
#ifndef CONF_GCLK_GENERATOR_6_CONFIG
|
||||||
|
#define CONF_GCLK_GENERATOR_6_CONFIG 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> Generic Clock Generator Control
|
||||||
|
// <q> Run in Standby
|
||||||
|
// <i> Indicates whether Run in Standby is enabled or not
|
||||||
|
// <id> gclk_arch_gen_6_RUNSTDBY
|
||||||
|
#ifndef CONF_GCLK_GEN_6_RUNSTDBY
|
||||||
|
#define CONF_GCLK_GEN_6_RUNSTDBY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Divide Selection
|
||||||
|
// <i> Indicates whether Divide Selection is enabled or not
|
||||||
|
// <id> gclk_gen_6_div_sel
|
||||||
|
#ifndef CONF_GCLK_GEN_6_DIVSEL
|
||||||
|
#define CONF_GCLK_GEN_6_DIVSEL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Enable
|
||||||
|
// <i> Indicates whether Output Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_6_oe
|
||||||
|
#ifndef CONF_GCLK_GEN_6_OE
|
||||||
|
#define CONF_GCLK_GEN_6_OE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Off Value
|
||||||
|
// <i> Indicates whether Output Off Value is enabled or not
|
||||||
|
// <id> gclk_arch_gen_6_oov
|
||||||
|
#ifndef CONF_GCLK_GEN_6_OOV
|
||||||
|
#define CONF_GCLK_GEN_6_OOV 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Improve Duty Cycle
|
||||||
|
// <i> Indicates whether Improve Duty Cycle is enabled or not
|
||||||
|
// <id> gclk_arch_gen_6_idc
|
||||||
|
#ifndef CONF_GCLK_GEN_6_IDC
|
||||||
|
#define CONF_GCLK_GEN_6_IDC 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Generic Clock Generator Enable
|
||||||
|
// <i> Indicates whether Generic Clock Generator Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_6_enable
|
||||||
|
#ifndef CONF_GCLK_GEN_6_GENEN
|
||||||
|
#define CONF_GCLK_GEN_6_GENEN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Generic clock generator 6 source
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC"> External Crystal Oscillator 0.4-32MHz (XOSC)
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKIN"> Generic clock generator input pad
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKGEN1"> Generic clock generator 1
|
||||||
|
// <GCLK_GENCTRL_SRC_OSCULP32K"> 32kHz Ultra Low Power Internal Oscillator (OSCULP32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC32K"> 32kHz High Accuracy Internal Oscillator (OSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC32K"> 32kHz External Crystal Oscillator (XOSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC8M"> 8MHz Internal Oscillator (OSC8M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DFLL48M"> Digital Frequency Locked Loop (DFLL48M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DPLL96M"> Fractional Digital Phase Locked Loop (FDPLL96M)
|
||||||
|
// <i> This defines the clock source for generic clock generator 6
|
||||||
|
// <id> gclk_gen_6_oscillator
|
||||||
|
#ifndef CONF_GCLK_GEN_6_SRC
|
||||||
|
#define CONF_GCLK_GEN_6_SRC GCLK_GENCTRL_SRC_XOSC
|
||||||
|
#endif
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
//<h> Generic Clock Generator Division
|
||||||
|
//<o> Generic clock generator 6 division <0x0000-0xFFFF>
|
||||||
|
// <i>
|
||||||
|
// <id> gclk_gen_6_div
|
||||||
|
#ifndef CONF_GCLK_GEN_6_DIV
|
||||||
|
#define CONF_GCLK_GEN_6_DIV 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>// <e> Generic clock generator 7 configuration
|
||||||
|
// <i> Indicates whether generic clock 7 configuration is enabled or not
|
||||||
|
// <id> enable_gclk_gen_7
|
||||||
|
#ifndef CONF_GCLK_GENERATOR_7_CONFIG
|
||||||
|
#define CONF_GCLK_GENERATOR_7_CONFIG 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> Generic Clock Generator Control
|
||||||
|
// <q> Run in Standby
|
||||||
|
// <i> Indicates whether Run in Standby is enabled or not
|
||||||
|
// <id> gclk_arch_gen_7_RUNSTDBY
|
||||||
|
#ifndef CONF_GCLK_GEN_7_RUNSTDBY
|
||||||
|
#define CONF_GCLK_GEN_7_RUNSTDBY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Divide Selection
|
||||||
|
// <i> Indicates whether Divide Selection is enabled or not
|
||||||
|
// <id> gclk_gen_7_div_sel
|
||||||
|
#ifndef CONF_GCLK_GEN_7_DIVSEL
|
||||||
|
#define CONF_GCLK_GEN_7_DIVSEL 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Enable
|
||||||
|
// <i> Indicates whether Output Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_7_oe
|
||||||
|
#ifndef CONF_GCLK_GEN_7_OE
|
||||||
|
#define CONF_GCLK_GEN_7_OE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Output Off Value
|
||||||
|
// <i> Indicates whether Output Off Value is enabled or not
|
||||||
|
// <id> gclk_arch_gen_7_oov
|
||||||
|
#ifndef CONF_GCLK_GEN_7_OOV
|
||||||
|
#define CONF_GCLK_GEN_7_OOV 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Improve Duty Cycle
|
||||||
|
// <i> Indicates whether Improve Duty Cycle is enabled or not
|
||||||
|
// <id> gclk_arch_gen_7_idc
|
||||||
|
#ifndef CONF_GCLK_GEN_7_IDC
|
||||||
|
#define CONF_GCLK_GEN_7_IDC 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Generic Clock Generator Enable
|
||||||
|
// <i> Indicates whether Generic Clock Generator Enable is enabled or not
|
||||||
|
// <id> gclk_arch_gen_7_enable
|
||||||
|
#ifndef CONF_GCLK_GEN_7_GENEN
|
||||||
|
#define CONF_GCLK_GEN_7_GENEN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Generic clock generator 7 source
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC"> External Crystal Oscillator 0.4-32MHz (XOSC)
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKIN"> Generic clock generator input pad
|
||||||
|
// <GCLK_GENCTRL_SRC_GCLKGEN1"> Generic clock generator 1
|
||||||
|
// <GCLK_GENCTRL_SRC_OSCULP32K"> 32kHz Ultra Low Power Internal Oscillator (OSCULP32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC32K"> 32kHz High Accuracy Internal Oscillator (OSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC32K"> 32kHz External Crystal Oscillator (XOSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_OSC8M"> 8MHz Internal Oscillator (OSC8M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DFLL48M"> Digital Frequency Locked Loop (DFLL48M)
|
||||||
|
// <GCLK_GENCTRL_SRC_DPLL96M"> Fractional Digital Phase Locked Loop (FDPLL96M)
|
||||||
|
// <i> This defines the clock source for generic clock generator 7
|
||||||
|
// <id> gclk_gen_7_oscillator
|
||||||
|
#ifndef CONF_GCLK_GEN_7_SRC
|
||||||
|
#define CONF_GCLK_GEN_7_SRC GCLK_GENCTRL_SRC_XOSC
|
||||||
|
#endif
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
//<h> Generic Clock Generator Division
|
||||||
|
//<o> Generic clock generator 7 division <0x0000-0xFFFF>
|
||||||
|
// <i>
|
||||||
|
// <id> gclk_gen_7_div
|
||||||
|
#ifndef CONF_GCLK_GEN_7_DIV
|
||||||
|
#define CONF_GCLK_GEN_7_DIV 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <<< end of configuration section >>>
|
||||||
|
|
||||||
|
#endif // HPL_GCLK_CONFIG_H
|
||||||
134
config/hpl_pm_config.h
Normal file
134
config/hpl_pm_config.h
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
/* Auto-generated config file hpl_pm_config.h */
|
||||||
|
#ifndef HPL_PM_CONFIG_H
|
||||||
|
#define HPL_PM_CONFIG_H
|
||||||
|
|
||||||
|
// <<< Use Configuration Wizard in Context Menu >>>
|
||||||
|
|
||||||
|
#include <peripheral_clk_config.h>
|
||||||
|
|
||||||
|
// <e> System Configuration
|
||||||
|
// <i> Indicates whether configuration for system is enabled or not
|
||||||
|
// <id> enable_cpu_clock
|
||||||
|
#ifndef CONF_SYSTEM_CONFIG
|
||||||
|
#define CONF_SYSTEM_CONFIG 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> CPU Clock Settings
|
||||||
|
// <y> CPU Clock source
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK0_Val"> Generic clock generator 0
|
||||||
|
// <i> This defines the clock source for the CPU
|
||||||
|
// <id> cpu_clock_source
|
||||||
|
#ifndef CONF_CPU_SRC
|
||||||
|
#define CONF_CPU_SRC GCLK_CLKCTRL_GEN_GCLK0_Val
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> CPU clock Prescalar
|
||||||
|
// <PM_CPUSEL_CPUDIV_DIV1_Val"> 1
|
||||||
|
// <PM_CPUSEL_CPUDIV_DIV2_Val"> 2
|
||||||
|
// <PM_CPUSEL_CPUDIV_DIV4_Val"> 4
|
||||||
|
// <PM_CPUSEL_CPUDIV_DIV8_Val"> 8
|
||||||
|
// <PM_CPUSEL_CPUDIV_DIV16_Val"> 16
|
||||||
|
// <PM_CPUSEL_CPUDIV_DIV32_Val"> 32
|
||||||
|
// <PM_CPUSEL_CPUDIV_DIV64_Val"> 64
|
||||||
|
// <PM_CPUSEL_CPUDIV_DIV128_Val"> 128
|
||||||
|
// <i> Prescalar for Main CPU clock
|
||||||
|
// <id> cpu_div
|
||||||
|
#ifndef CONF_CPU_DIV
|
||||||
|
#define CONF_CPU_DIV PM_CPUSEL_CPUDIV_DIV1_Val
|
||||||
|
#endif
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
// <h> NVM Settings
|
||||||
|
// <o> NVM Wait States
|
||||||
|
// <i> These bits select the number of wait states for a read operation.
|
||||||
|
// <0=> 0
|
||||||
|
// <1=> 1
|
||||||
|
// <2=> 2
|
||||||
|
// <3=> 3
|
||||||
|
// <4=> 4
|
||||||
|
// <5=> 5
|
||||||
|
// <6=> 6
|
||||||
|
// <7=> 7
|
||||||
|
// <8=> 8
|
||||||
|
// <9=> 9
|
||||||
|
// <10=> 10
|
||||||
|
// <11=> 11
|
||||||
|
// <12=> 12
|
||||||
|
// <13=> 13
|
||||||
|
// <14=> 14
|
||||||
|
// <15=> 15
|
||||||
|
// <id> nvm_wait_states
|
||||||
|
#ifndef CONF_NVM_WAIT_STATE
|
||||||
|
#define CONF_NVM_WAIT_STATE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
// <h> APBA Clock Select
|
||||||
|
// <y> APBA clock prescalar
|
||||||
|
// <PM_APBASEL_APBADIV_DIV1"> 1
|
||||||
|
// <PM_APBASEL_APBADIV_DIV2"> 2
|
||||||
|
// <PM_APBASEL_APBADIV_DIV4"> 4
|
||||||
|
// <PM_APBASEL_APBADIV_DIV8"> 8
|
||||||
|
// <PM_APBASEL_APBADIV_DIV16"> 16
|
||||||
|
// <PM_APBASEL_APBADIV_DIV32"> 32
|
||||||
|
// <PM_APBASEL_APBADIV_DIV64"> 64
|
||||||
|
// <PM_APBASEL_APBADIV_DIV128"> 128
|
||||||
|
// <i> APBA clock prescalar
|
||||||
|
// <id> apba_div
|
||||||
|
#ifndef CONF_APBA_DIV
|
||||||
|
#define CONF_APBA_DIV PM_APBASEL_APBADIV_DIV1
|
||||||
|
#endif
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
#if CONF_APBA_DIV < CONF_CPU_DIV
|
||||||
|
#warning APBA DIV cannot less than CPU DIV
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> APBB Clock Select
|
||||||
|
// <y> APBB clock prescalar
|
||||||
|
// <PM_APBBSEL_APBBDIV_DIV1"> 1
|
||||||
|
// <PM_APBBSEL_APBBDIV_DIV2"> 2
|
||||||
|
// <PM_APBBSEL_APBBDIV_DIV4"> 4
|
||||||
|
// <PM_APBBSEL_APBBDIV_DIV8"> 8
|
||||||
|
// <PM_APBBSEL_APBBDIV_DIV16"> 16
|
||||||
|
// <PM_APBBSEL_APBBDIV_DIV32"> 32
|
||||||
|
// <PM_APBBSEL_APBBDIV_DIV64"> 64
|
||||||
|
// <PM_APBBSEL_APBBDIV_DIV128"> 128
|
||||||
|
// <i> APBB clock prescalar
|
||||||
|
// <id> apbb_div
|
||||||
|
#ifndef CONF_APBB_DIV
|
||||||
|
#define CONF_APBB_DIV PM_APBBSEL_APBBDIV_DIV1
|
||||||
|
#endif
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
#if CONF_APBB_DIV < CONF_CPU_DIV
|
||||||
|
#warning APBB DIV cannot less than CPU DIV
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> APBC Clock Select
|
||||||
|
// <y> APBC clock prescalar
|
||||||
|
// <PM_APBCSEL_APBCDIV_DIV1"> 1
|
||||||
|
// <PM_APBCSEL_APBCDIV_DIV2"> 2
|
||||||
|
// <PM_APBCSEL_APBCDIV_DIV4"> 4
|
||||||
|
// <PM_APBCSEL_APBCDIV_DIV8"> 8
|
||||||
|
// <PM_APBCSEL_APBCDIV_DIV16"> 16
|
||||||
|
// <PM_APBCSEL_APBCDIV_DIV32"> 32
|
||||||
|
// <PM_APBCSEL_APBCDIV_DIV64"> 64
|
||||||
|
// <PM_APBCSEL_APBCDIV_DIV128"> 128
|
||||||
|
// <i> APBC clock prescalar
|
||||||
|
// <id> apbc_div
|
||||||
|
#ifndef CONF_APBC_DIV
|
||||||
|
#define CONF_APBC_DIV PM_APBCSEL_APBCDIV_DIV1
|
||||||
|
#endif
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
#if CONF_APBC_DIV < CONF_CPU_DIV
|
||||||
|
#warning APBC DIV cannot less than CPU DIV
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <<< end of configuration section >>>
|
||||||
|
|
||||||
|
#endif // HPL_PM_CONFIG_H
|
||||||
577
config/hpl_sercom_config.h
Normal file
577
config/hpl_sercom_config.h
Normal file
@ -0,0 +1,577 @@
|
|||||||
|
/* Auto-generated config file hpl_sercom_config.h */
|
||||||
|
#ifndef HPL_SERCOM_CONFIG_H
|
||||||
|
#define HPL_SERCOM_CONFIG_H
|
||||||
|
|
||||||
|
// <<< Use Configuration Wizard in Context Menu >>>
|
||||||
|
|
||||||
|
#include <peripheral_clk_config.h>
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_0_USART_ENABLE
|
||||||
|
#define CONF_SERCOM_0_USART_ENABLE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> Basic Configuration
|
||||||
|
|
||||||
|
// <q> Receive buffer enable
|
||||||
|
// <i> Enable input buffer in SERCOM module
|
||||||
|
// <id> usart_rx_enable
|
||||||
|
#ifndef CONF_SERCOM_0_USART_RXEN
|
||||||
|
#define CONF_SERCOM_0_USART_RXEN 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Transmitt buffer enable
|
||||||
|
// <i> Enable output buffer in SERCOM module
|
||||||
|
// <id> usart_tx_enable
|
||||||
|
#ifndef CONF_SERCOM_0_USART_TXEN
|
||||||
|
#define CONF_SERCOM_0_USART_TXEN 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Frame parity
|
||||||
|
// <0x0=>No parity
|
||||||
|
// <0x1=>Even parity
|
||||||
|
// <0x2=>Odd parity
|
||||||
|
// <i> Parity bit mode for USART frame
|
||||||
|
// <id> usart_parity
|
||||||
|
#ifndef CONF_SERCOM_0_USART_PARITY
|
||||||
|
#define CONF_SERCOM_0_USART_PARITY 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Character Size
|
||||||
|
// <0x0=>8 bits
|
||||||
|
// <0x1=>9 bits
|
||||||
|
// <0x5=>5 bits
|
||||||
|
// <0x6=>6 bits
|
||||||
|
// <0x7=>7 bits
|
||||||
|
// <i> Data character size in USART frame
|
||||||
|
// <id> usart_character_size
|
||||||
|
#ifndef CONF_SERCOM_0_USART_CHSIZE
|
||||||
|
#define CONF_SERCOM_0_USART_CHSIZE 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Stop Bit
|
||||||
|
// <0=>One stop bit
|
||||||
|
// <1=>Two stop bits
|
||||||
|
// <i> Number of stop bits in USART frame
|
||||||
|
// <id> usart_stop_bit
|
||||||
|
#ifndef CONF_SERCOM_0_USART_SBMODE
|
||||||
|
#define CONF_SERCOM_0_USART_SBMODE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Baud rate <1-3000000>
|
||||||
|
// <i> USART baud rate setting
|
||||||
|
// <id> usart_baud_rate
|
||||||
|
#ifndef CONF_SERCOM_0_USART_BAUD
|
||||||
|
#define CONF_SERCOM_0_USART_BAUD 115200
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
// <e> Advanced configuration
|
||||||
|
// <id> usart_advanced
|
||||||
|
#ifndef CONF_SERCOM_0_USART_ADVANCED_CONFIG
|
||||||
|
#define CONF_SERCOM_0_USART_ADVANCED_CONFIG 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Run in stand-by
|
||||||
|
// <i> Keep the module running in standby sleep mode
|
||||||
|
// <id> usart_arch_runstdby
|
||||||
|
#ifndef CONF_SERCOM_0_USART_RUNSTDBY
|
||||||
|
#define CONF_SERCOM_0_USART_RUNSTDBY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Immediate Buffer Overflow Notification
|
||||||
|
// <i> Controls when the BUFOVF status bit is asserted
|
||||||
|
// <id> usart_arch_ibon
|
||||||
|
#ifndef CONF_SERCOM_0_USART_IBON
|
||||||
|
#define CONF_SERCOM_0_USART_IBON 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Start of Frame Detection Enable
|
||||||
|
// <i> Will wake the device from any sleep mode if usart_init and usart_enable was run priort to going to sleep. (receive buffer must be enabled)
|
||||||
|
// <id> usart_arch_sfde
|
||||||
|
#ifndef CONF_SERCOM_0_USART_SFDE
|
||||||
|
#define CONF_SERCOM_0_USART_SFDE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Collision Detection Enable
|
||||||
|
// <i> Collision detection enable
|
||||||
|
// <id> usart_arch_cloden
|
||||||
|
#ifndef CONF_SERCOM_0_USART_CLODEN
|
||||||
|
#define CONF_SERCOM_0_USART_CLODEN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Operating Mode
|
||||||
|
// <0x0=>USART with external clock
|
||||||
|
// <0x1=>USART with internal clock
|
||||||
|
// <i> Drive the shift register by an internal clock generated by the baud rate generator or an external clock supplied on the XCK pin.
|
||||||
|
// <id> usart_arch_clock_mode
|
||||||
|
#ifndef CONF_SERCOM_0_USART_MODE
|
||||||
|
#define CONF_SERCOM_0_USART_MODE 0x1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Sample Rate
|
||||||
|
// <0x0=>16x arithmetic
|
||||||
|
// <0x1=>16x fractional
|
||||||
|
// <0x2=>8x arithmetic
|
||||||
|
// <0x3=>8x fractional
|
||||||
|
// <0x4=>3x arithmetic
|
||||||
|
// <i> How many over-sampling bits used when sampling data state
|
||||||
|
// <id> usart_arch_sampr
|
||||||
|
#ifndef CONF_SERCOM_0_USART_SAMPR
|
||||||
|
#define CONF_SERCOM_0_USART_SAMPR 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Sample Adjustment
|
||||||
|
// <0x0=>7-8-9 (3-4-5 8-bit over-sampling)
|
||||||
|
// <0x1=>9-10-11 (4-5-6 8-bit over-sampling)
|
||||||
|
// <0x2=>11-12-13 (5-6-7 8-bit over-sampling)
|
||||||
|
// <0x3=>13-14-15 (6-7-8 8-bit over-sampling)
|
||||||
|
// <i> Adjust which samples to use for data sampling in asynchronous mode
|
||||||
|
// <id> usart_arch_sampa
|
||||||
|
#ifndef CONF_SERCOM_0_USART_SAMPA
|
||||||
|
#define CONF_SERCOM_0_USART_SAMPA 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Fractional Part <0-7>
|
||||||
|
// <i> Fractional part of the baud rate if baud rate generator is in fractional mode
|
||||||
|
// <id> usart_arch_fractional
|
||||||
|
#ifndef CONF_SERCOM_0_USART_FRACTIONAL
|
||||||
|
#define CONF_SERCOM_0_USART_FRACTIONAL 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Data Order
|
||||||
|
// <0=>MSB is transmitted first
|
||||||
|
// <1=>LSB is transmitted first
|
||||||
|
// <i> Data order of the data bits in the frame
|
||||||
|
// <id> usart_arch_dord
|
||||||
|
#ifndef CONF_SERCOM_0_USART_DORD
|
||||||
|
#define CONF_SERCOM_0_USART_DORD 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Does not do anything in UART mode
|
||||||
|
#define CONF_SERCOM_0_USART_CPOL 0
|
||||||
|
|
||||||
|
// <o> Encoding Format
|
||||||
|
// <0=>No encoding
|
||||||
|
// <1=>IrDA encoded
|
||||||
|
// <id> usart_arch_enc
|
||||||
|
#ifndef CONF_SERCOM_0_USART_ENC
|
||||||
|
#define CONF_SERCOM_0_USART_ENC 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> LIN Slave Enable
|
||||||
|
// <i> Break Character Detection and Auto-Baud/LIN Slave Enable.
|
||||||
|
// <i> Additional setting needed: 16x sample rate using fractional baud rate generation (CTRLA.SAMPR = 1).
|
||||||
|
// <0=>Disable
|
||||||
|
// <1=>Enable
|
||||||
|
// <id> usart_arch_lin_slave_enable
|
||||||
|
#ifndef CONF_SERCOM_0_USART_LIN_SLAVE_ENABLE
|
||||||
|
#define CONF_SERCOM_0_USART_LIN_SLAVE_ENABLE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Debug Stop Mode
|
||||||
|
// <i> Behavior of the baud-rate generator when CPU is halted by external debugger.
|
||||||
|
// <0=>Keep running
|
||||||
|
// <1=>Halt
|
||||||
|
// <id> usart_arch_dbgstop
|
||||||
|
#ifndef CONF_SERCOM_0_USART_DEBUG_STOP_MODE
|
||||||
|
#define CONF_SERCOM_0_USART_DEBUG_STOP_MODE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_0_USART_CMODE
|
||||||
|
#define CONF_SERCOM_0_USART_CMODE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_0_USART_RXPO
|
||||||
|
#define CONF_SERCOM_0_USART_RXPO 1 /* RX is on PIN_PA09 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_0_USART_TXPO
|
||||||
|
#define CONF_SERCOM_0_USART_TXPO 0 /* TX is on PIN_PA08 */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set correct parity settings in register interface based on PARITY setting */
|
||||||
|
#if CONF_SERCOM_0_USART_LIN_SLAVE_ENABLE == 1
|
||||||
|
#if CONF_SERCOM_0_USART_PARITY == 0
|
||||||
|
#define CONF_SERCOM_0_USART_PMODE 0
|
||||||
|
#define CONF_SERCOM_0_USART_FORM 4
|
||||||
|
#else
|
||||||
|
#define CONF_SERCOM_0_USART_PMODE CONF_SERCOM_0_USART_PARITY - 1
|
||||||
|
#define CONF_SERCOM_0_USART_FORM 5
|
||||||
|
#endif
|
||||||
|
#else /* #if CONF_SERCOM_0_USART_LIN_SLAVE_ENABLE == 0 */
|
||||||
|
#if CONF_SERCOM_0_USART_PARITY == 0
|
||||||
|
#define CONF_SERCOM_0_USART_PMODE 0
|
||||||
|
#define CONF_SERCOM_0_USART_FORM 0
|
||||||
|
#else
|
||||||
|
#define CONF_SERCOM_0_USART_PMODE CONF_SERCOM_0_USART_PARITY - 1
|
||||||
|
#define CONF_SERCOM_0_USART_FORM 1
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Calculate BAUD register value in UART mode
|
||||||
|
#if CONF_SERCOM_0_USART_SAMPR == 0
|
||||||
|
#ifndef CONF_SERCOM_0_USART_BAUD_RATE
|
||||||
|
#define CONF_SERCOM_0_USART_BAUD_RATE \
|
||||||
|
65536 - ((65536 * 16.0f * CONF_SERCOM_0_USART_BAUD) / CONF_GCLK_SERCOM0_CORE_FREQUENCY)
|
||||||
|
#endif
|
||||||
|
#ifndef CONF_SERCOM_0_USART_RECEIVE_PULSE_LENGTH
|
||||||
|
#define CONF_SERCOM_0_USART_RECEIVE_PULSE_LENGTH 0
|
||||||
|
#endif
|
||||||
|
#elif CONF_SERCOM_0_USART_SAMPR == 1
|
||||||
|
#ifndef CONF_SERCOM_0_USART_BAUD_RATE
|
||||||
|
#define CONF_SERCOM_0_USART_BAUD_RATE \
|
||||||
|
((CONF_GCLK_SERCOM0_CORE_FREQUENCY) / (CONF_SERCOM_0_USART_BAUD * 16)) - (CONF_SERCOM_0_USART_FRACTIONAL / 8)
|
||||||
|
#endif
|
||||||
|
#ifndef CONF_SERCOM_0_USART_RECEIVE_PULSE_LENGTH
|
||||||
|
#define CONF_SERCOM_0_USART_RECEIVE_PULSE_LENGTH 0
|
||||||
|
#endif
|
||||||
|
#elif CONF_SERCOM_0_USART_SAMPR == 2
|
||||||
|
#ifndef CONF_SERCOM_0_USART_BAUD_RATE
|
||||||
|
#define CONF_SERCOM_0_USART_BAUD_RATE \
|
||||||
|
65536 - ((65536 * 8.0f * CONF_SERCOM_0_USART_BAUD) / CONF_GCLK_SERCOM0_CORE_FREQUENCY)
|
||||||
|
#endif
|
||||||
|
#ifndef CONF_SERCOM_0_USART_RECEIVE_PULSE_LENGTH
|
||||||
|
#define CONF_SERCOM_0_USART_RECEIVE_PULSE_LENGTH 0
|
||||||
|
#endif
|
||||||
|
#elif CONF_SERCOM_0_USART_SAMPR == 3
|
||||||
|
#ifndef CONF_SERCOM_0_USART_BAUD_RATE
|
||||||
|
#define CONF_SERCOM_0_USART_BAUD_RATE \
|
||||||
|
((CONF_GCLK_SERCOM0_CORE_FREQUENCY) / (CONF_SERCOM_0_USART_BAUD * 8)) - (CONF_SERCOM_0_USART_FRACTIONAL / 8)
|
||||||
|
#endif
|
||||||
|
#ifndef CONF_SERCOM_0_USART_RECEIVE_PULSE_LENGTH
|
||||||
|
#define CONF_SERCOM_0_USART_RECEIVE_PULSE_LENGTH 0
|
||||||
|
#endif
|
||||||
|
#elif CONF_SERCOM_0_USART_SAMPR == 4
|
||||||
|
#ifndef CONF_SERCOM_0_USART_BAUD_RATE
|
||||||
|
#define CONF_SERCOM_0_USART_BAUD_RATE \
|
||||||
|
65536 - ((65536 * 3.0f * CONF_SERCOM_0_USART_BAUD) / CONF_GCLK_SERCOM0_CORE_FREQUENCY)
|
||||||
|
#endif
|
||||||
|
#ifndef CONF_SERCOM_0_USART_RECEIVE_PULSE_LENGTH
|
||||||
|
#define CONF_SERCOM_0_USART_RECEIVE_PULSE_LENGTH 0
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <peripheral_clk_config.h>
|
||||||
|
|
||||||
|
// Enable configuration of module
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_ENABLE
|
||||||
|
#define CONF_SERCOM_1_SPI_ENABLE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Set module in SPI Master mode
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_MODE
|
||||||
|
#define CONF_SERCOM_1_SPI_MODE 0x03
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> Basic Configuration
|
||||||
|
|
||||||
|
// <q> Receive buffer enable
|
||||||
|
// <i> Enable receive buffer to receive data from slave (RXEN)
|
||||||
|
// <id> spi_master_rx_enable
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_RXEN
|
||||||
|
#define CONF_SERCOM_1_SPI_RXEN 0x1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Character Size
|
||||||
|
// <i> Bit size for all characters sent over the SPI bus (CHSIZE)
|
||||||
|
// <0x0=>8 bits
|
||||||
|
// <0x1=>9 bits
|
||||||
|
// <id> spi_master_character_size
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_CHSIZE
|
||||||
|
#define CONF_SERCOM_1_SPI_CHSIZE 0x0
|
||||||
|
#endif
|
||||||
|
// <o> Baud rate <1-12000000>
|
||||||
|
// <i> The SPI data transfer rate
|
||||||
|
// <id> spi_master_baud_rate
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_BAUD
|
||||||
|
#define CONF_SERCOM_1_SPI_BAUD 5000000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
// <e> Advanced Configuration
|
||||||
|
// <id> spi_master_advanced
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_ADVANCED
|
||||||
|
#define CONF_SERCOM_1_SPI_ADVANCED 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Dummy byte <0x00-0x1ff>
|
||||||
|
// <id> spi_master_dummybyte
|
||||||
|
// <i> Dummy byte used when reading data from the slave without sending any data
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_DUMMYBYTE
|
||||||
|
#define CONF_SERCOM_1_SPI_DUMMYBYTE 0x1ff
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Data Order
|
||||||
|
// <0=>MSB first
|
||||||
|
// <1=>LSB first
|
||||||
|
// <i> I least significant or most significant bit is shifted out first (DORD)
|
||||||
|
// <id> spi_master_arch_dord
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_DORD
|
||||||
|
#define CONF_SERCOM_1_SPI_DORD 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Clock Polarity
|
||||||
|
// <0=>SCK is low when idle
|
||||||
|
// <1=>SCK is high when idle
|
||||||
|
// <i> Determines if the leading edge is rising or falling with a corresponding opposite edge at the trailing edge. (CPOL)
|
||||||
|
// <id> spi_master_arch_cpol
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_CPOL
|
||||||
|
#define CONF_SERCOM_1_SPI_CPOL 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Clock Phase
|
||||||
|
// <0x0=>Sample input on leading edge
|
||||||
|
// <0x1=>Sample input on trailing edge
|
||||||
|
// <i> Determines if input data is sampled on leading or trailing SCK edge. (CPHA)
|
||||||
|
// <id> spi_master_arch_cpha
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_CPHA
|
||||||
|
#define CONF_SERCOM_1_SPI_CPHA 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Immediate Buffer Overflow Notification
|
||||||
|
// <i> Controls when OVF is asserted (IBON)
|
||||||
|
// <0x0=>In data stream
|
||||||
|
// <0x1=>On buffer overflow
|
||||||
|
// <id> spi_master_arch_ibon
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_IBON
|
||||||
|
#define CONF_SERCOM_1_SPI_IBON 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Run in stand-by
|
||||||
|
// <i> Module stays active in stand-by sleep mode. (RUNSTDBY)
|
||||||
|
// <id> spi_master_arch_runstdby
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_RUNSTDBY
|
||||||
|
#define CONF_SERCOM_1_SPI_RUNSTDBY 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Debug Stop Mode
|
||||||
|
// <i> Behavior of the baud-rate generator when CPU is halted by external debugger. (DBGSTOP)
|
||||||
|
// <0=>Keep running
|
||||||
|
// <1=>Halt
|
||||||
|
// <id> spi_master_arch_dbgstop
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_DBGSTOP
|
||||||
|
#define CONF_SERCOM_1_SPI_DBGSTOP 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// Address mode disabled in master mode
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_AMODE_EN
|
||||||
|
#define CONF_SERCOM_1_SPI_AMODE_EN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_AMODE
|
||||||
|
#define CONF_SERCOM_1_SPI_AMODE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_ADDR
|
||||||
|
#define CONF_SERCOM_1_SPI_ADDR 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_ADDRMASK
|
||||||
|
#define CONF_SERCOM_1_SPI_ADDRMASK 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_SSDE
|
||||||
|
#define CONF_SERCOM_1_SPI_SSDE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_MSSEN
|
||||||
|
#define CONF_SERCOM_1_SPI_MSSEN 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_PLOADEN
|
||||||
|
#define CONF_SERCOM_1_SPI_PLOADEN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Receive Data Pinout
|
||||||
|
// <0x0=>PAD[0]
|
||||||
|
// <0x1=>PAD[1]
|
||||||
|
// <0x2=>PAD[2]
|
||||||
|
// <0x3=>PAD[3]
|
||||||
|
// <id> spi_master_rxpo
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_RXPO
|
||||||
|
#define CONF_SERCOM_1_SPI_RXPO 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Transmit Data Pinout
|
||||||
|
// <0x0=>PAD[0,1]_DO_SCK
|
||||||
|
// <0x1=>PAD[2,3]_DO_SCK
|
||||||
|
// <0x2=>PAD[3,1]_DO_SCK
|
||||||
|
// <0x3=>PAD[0,3]_DO_SCK
|
||||||
|
// <id> spi_master_txpo
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_TXPO
|
||||||
|
#define CONF_SERCOM_1_SPI_TXPO 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Calculate baud register value from requested baudrate value
|
||||||
|
#ifndef CONF_SERCOM_1_SPI_BAUD_RATE
|
||||||
|
#define CONF_SERCOM_1_SPI_BAUD_RATE ((float)CONF_GCLK_SERCOM1_CORE_FREQUENCY / (float)(2 * CONF_SERCOM_1_SPI_BAUD)) - 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// -- SERCOM 4
|
||||||
|
|
||||||
|
// Enable configuration of module
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_ENABLE
|
||||||
|
#define CONF_SERCOM_4_SPI_ENABLE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Set module in SPI Master mode
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_MODE
|
||||||
|
#define CONF_SERCOM_4_SPI_MODE 0x03
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> Basic Configuration
|
||||||
|
|
||||||
|
// <q> Receive buffer enable
|
||||||
|
// <i> Enable receive buffer to receive data from slave (RXEN)
|
||||||
|
// <id> spi_master_rx_enable
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_RXEN
|
||||||
|
#define CONF_SERCOM_4_SPI_RXEN 0x1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Character Size
|
||||||
|
// <i> Bit size for all characters sent over the SPI bus (CHSIZE)
|
||||||
|
// <0x0=>8 bits
|
||||||
|
// <0x1=>9 bits
|
||||||
|
// <id> spi_master_character_size
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_CHSIZE
|
||||||
|
#define CONF_SERCOM_4_SPI_CHSIZE 0x0
|
||||||
|
#endif
|
||||||
|
// <o> Baud rate <1-12000000>
|
||||||
|
// <i> The SPI data transfer rate
|
||||||
|
// <id> spi_master_baud_rate
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_BAUD
|
||||||
|
#define CONF_SERCOM_4_SPI_BAUD 5000000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
|
||||||
|
// <e> Advanced Configuration
|
||||||
|
// <id> spi_master_advanced
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_ADVANCED
|
||||||
|
#define CONF_SERCOM_4_SPI_ADVANCED 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Dummy byte <0x00-0x1ff>
|
||||||
|
// <id> spi_master_dummybyte
|
||||||
|
// <i> Dummy byte used when reading data from the slave without sending any data
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_DUMMYBYTE
|
||||||
|
#define CONF_SERCOM_4_SPI_DUMMYBYTE 0xff
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Data Order
|
||||||
|
// <0=>MSB first
|
||||||
|
// <1=>LSB first
|
||||||
|
// <i> I least significant or most significant bit is shifted out first (DORD)
|
||||||
|
// <id> spi_master_arch_dord
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_DORD
|
||||||
|
#define CONF_SERCOM_4_SPI_DORD 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Clock Polarity
|
||||||
|
// <0=>SCK is low when idle
|
||||||
|
// <1=>SCK is high when idle
|
||||||
|
// <i> Determines if the leading edge is rising or falling with a corresponding opposite edge at the trailing edge. (CPOL)
|
||||||
|
// <id> spi_master_arch_cpol
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_CPOL
|
||||||
|
#define CONF_SERCOM_4_SPI_CPOL 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Clock Phase
|
||||||
|
// <0x0=>Sample input on leading edge
|
||||||
|
// <0x1=>Sample input on trailing edge
|
||||||
|
// <i> Determines if input data is sampled on leading or trailing SCK edge. (CPHA)
|
||||||
|
// <id> spi_master_arch_cpha
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_CPHA
|
||||||
|
#define CONF_SERCOM_4_SPI_CPHA 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Immediate Buffer Overflow Notification
|
||||||
|
// <i> Controls when OVF is asserted (IBON)
|
||||||
|
// <0x0=>In data stream
|
||||||
|
// <0x1=>On buffer overflow
|
||||||
|
// <id> spi_master_arch_ibon
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_IBON
|
||||||
|
#define CONF_SERCOM_4_SPI_IBON 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Run in stand-by
|
||||||
|
// <i> Module stays active in stand-by sleep mode. (RUNSTDBY)
|
||||||
|
// <id> spi_master_arch_runstdby
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_RUNSTDBY
|
||||||
|
#define CONF_SERCOM_4_SPI_RUNSTDBY 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Debug Stop Mode
|
||||||
|
// <i> Behavior of the baud-rate generator when CPU is halted by external debugger. (DBGSTOP)
|
||||||
|
// <0=>Keep running
|
||||||
|
// <1=>Halt
|
||||||
|
// <id> spi_master_arch_dbgstop
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_DBGSTOP
|
||||||
|
#define CONF_SERCOM_4_SPI_DBGSTOP 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// Address mode disabled in master mode
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_AMODE_EN
|
||||||
|
#define CONF_SERCOM_4_SPI_AMODE_EN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_AMODE
|
||||||
|
#define CONF_SERCOM_4_SPI_AMODE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_ADDR
|
||||||
|
#define CONF_SERCOM_4_SPI_ADDR 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_ADDRMASK
|
||||||
|
#define CONF_SERCOM_4_SPI_ADDRMASK 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_SSDE
|
||||||
|
#define CONF_SERCOM_4_SPI_SSDE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_MSSEN
|
||||||
|
#define CONF_SERCOM_4_SPI_MSSEN 0x0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_PLOADEN
|
||||||
|
#define CONF_SERCOM_4_SPI_PLOADEN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Receive Data Pinout
|
||||||
|
// <0x0=>PAD[0]
|
||||||
|
// <0x1=>PAD[1]
|
||||||
|
// <0x2=>PAD[2]
|
||||||
|
// <0x3=>PAD[3]
|
||||||
|
// <id> spi_master_rxpo
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_RXPO
|
||||||
|
#define CONF_SERCOM_4_SPI_RXPO 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Transmit Data Pinout
|
||||||
|
// <0x0=>PAD[0,1]_DO_SCK
|
||||||
|
// <0x1=>PAD[2,3]_DO_SCK
|
||||||
|
// <0x2=>PAD[3,1]_DO_SCK
|
||||||
|
// <0x3=>PAD[0,3]_DO_SCK
|
||||||
|
// <id> spi_master_txpo
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_TXPO
|
||||||
|
#define CONF_SERCOM_4_SPI_TXPO 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Calculate baud register value from requested baudrate value
|
||||||
|
#ifndef CONF_SERCOM_4_SPI_BAUD_RATE
|
||||||
|
#define CONF_SERCOM_4_SPI_BAUD_RATE ((float)CONF_GCLK_SERCOM1_CORE_FREQUENCY / (float)(2 * CONF_SERCOM_4_SPI_BAUD)) - 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <<< end of configuration section >>>
|
||||||
|
|
||||||
|
#endif // HPL_SERCOM_CONFIG_H
|
||||||
678
config/hpl_sysctrl_config.h
Normal file
678
config/hpl_sysctrl_config.h
Normal file
@ -0,0 +1,678 @@
|
|||||||
|
/* Auto-generated config file hpl_sysctrl_config.h */
|
||||||
|
#ifndef HPL_SYSCTRL_CONFIG_H
|
||||||
|
#define HPL_SYSCTRL_CONFIG_H
|
||||||
|
|
||||||
|
// <<< Use Configuration Wizard in Context Menu >>>
|
||||||
|
|
||||||
|
#define CONF_DFLL_OPEN_LOOP_MODE 0
|
||||||
|
#define CONF_DFLL_CLOSED_LOOP_MODE 1
|
||||||
|
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_31MCS 0
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_61MCS 1
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_122MCS 2
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_244MCS 3
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_488MCS 4
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_977MCS 5
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_1953MCS 6
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_3906MCS 7
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_7813MCS 8
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_15625MCS 9
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_31250MCS 10
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_62500MCS 11
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_125000MCS 12
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_250000MCS 13
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_500000MCS 14
|
||||||
|
#define CONF_XOSC_STARTUP_TIME_1000000MCS 15
|
||||||
|
|
||||||
|
#define CONF_OSC_STARTUP_TIME_92MCS 0
|
||||||
|
#define CONF_OSC_STARTUP_TIME_122MCS 1
|
||||||
|
#define CONF_OSC_STARTUP_TIME_183MCS 2
|
||||||
|
#define CONF_OSC_STARTUP_TIME_305MCS 3
|
||||||
|
#define CONF_OSC_STARTUP_TIME_549MCS 4
|
||||||
|
#define CONF_OSC_STARTUP_TIME_1038MCS 5
|
||||||
|
#define CONF_OSC_STARTUP_TIME_2014MCS 6
|
||||||
|
#define CONF_OSC_STARTUP_TIME_3967MCS 7
|
||||||
|
|
||||||
|
#define CONF_XOSC32K_STARTUP_TIME_122MCS 0
|
||||||
|
#define CONF_XOSC32K_STARTUP_TIME_1068MCS 1
|
||||||
|
#define CONF_XOSC32K_STARTUP_TIME_65592MCS 2
|
||||||
|
#define CONF_XOSC32K_STARTUP_TIME_125092MCS 3
|
||||||
|
#define CONF_XOSC32K_STARTUP_TIME_500092MCS 4
|
||||||
|
#define CONF_XOSC32K_STARTUP_TIME_1000092MCS 5
|
||||||
|
#define CONF_XOSC32K_STARTUP_TIME_2000092MCS 6
|
||||||
|
#define CONF_XOSC32K_STARTUP_TIME_4000092MCS 7
|
||||||
|
|
||||||
|
// <e> 8MHz Internal Oscillator Configuration
|
||||||
|
// <i> Indicates whether configuration for OSC8M is enabled or not
|
||||||
|
// <id> enable_osc8m
|
||||||
|
#ifndef CONF_OSC8M_CONFIG
|
||||||
|
#define CONF_OSC8M_CONFIG 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> 8MHz Internal Oscillator (OSC8M) Control
|
||||||
|
// <q> Internal 8M Oscillator Enable
|
||||||
|
// <i> Indicates whether Internal 8 Mhz Oscillator is enabled or not
|
||||||
|
// <id> osc8m_arch_enable
|
||||||
|
#ifndef CONF_OSC8M_ENABLE
|
||||||
|
#define CONF_OSC8M_ENABLE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> On Demand Control
|
||||||
|
// <i> Indicates whether On Demand Control is enabled or not.
|
||||||
|
// <i> If enabled, the oscillator will only be running when requested by a peripheral.
|
||||||
|
// <i> If disabled, the oscillator will always be running when enabled.
|
||||||
|
// <id> osc8m_arch_ondemand
|
||||||
|
#ifndef CONF_OSC8M_ONDEMAND
|
||||||
|
#define CONF_OSC8M_ONDEMAND 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Run In Standby
|
||||||
|
// <i> Run In standby Mode
|
||||||
|
// <i> If this bit is 0: The oscillator is disabled in standby sleep mode.
|
||||||
|
// <i> If this bit is 1: The oscillator is not stopped in standby sleep mode.
|
||||||
|
// <id> osc8m_arch_runstdby
|
||||||
|
#ifndef CONF_OSC8M_RUNSTDBY
|
||||||
|
#define CONF_OSC8M_RUNSTDBY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Prescaler
|
||||||
|
// <SYSCTRL_OSC8M_PRESC_0_Val"> 1
|
||||||
|
// <SYSCTRL_OSC8M_PRESC_1_Val"> 2
|
||||||
|
// <SYSCTRL_OSC8M_PRESC_2_Val"> 4
|
||||||
|
// <SYSCTRL_OSC8M_PRESC_3_Val"> 8
|
||||||
|
// <i> Prescaler for Internal 8Mhz OSC
|
||||||
|
// <i> Default: No Prescaling
|
||||||
|
// <id> osc8m_presc
|
||||||
|
#ifndef CONF_OSC8M_PRESC
|
||||||
|
#define CONF_OSC8M_PRESC SYSCTRL_OSC8M_PRESC_0_Val
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Overwrite Default Osc Calibration
|
||||||
|
// <i> Overwrite Default Osc Calibration
|
||||||
|
// <id> osc8m_arch_overwrite_calibration
|
||||||
|
#ifndef CONF_OSC8M_OVERWRITE_CALIBRATION
|
||||||
|
#define CONF_OSC8M_OVERWRITE_CALIBRATION 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o>Osc Calibration Value <0-65535>
|
||||||
|
// <i> Set the Oscillator Calibration Value
|
||||||
|
// <i> Default: 1
|
||||||
|
// <id> osc8m_arch_calib
|
||||||
|
#ifndef CONF_OSC8M_CALIB
|
||||||
|
#define CONF_OSC8M_CALIB 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> 32kHz Internal Oscillator Configuration
|
||||||
|
// <i> Indicates whether configuration for OSC32K is enabled or not
|
||||||
|
// <id> enable_osc32k
|
||||||
|
#ifndef CONF_OSC32K_CONFIG
|
||||||
|
#define CONF_OSC32K_CONFIG 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> 32kHz Internal Oscillator (OSC32K) Control
|
||||||
|
// <q> Internal 32K Oscillator Enable
|
||||||
|
// <i> Indicates whether Internal 32K Oscillator is enabled or not
|
||||||
|
// <id> osc32k_arch_enable
|
||||||
|
#ifndef CONF_OSC32K_ENABLE
|
||||||
|
#define CONF_OSC32K_ENABLE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> On Demand Control
|
||||||
|
// <i> Enable On Demand
|
||||||
|
// <i> If this bit is 0: The oscillator is always on, if enabled.
|
||||||
|
// <i> If this bit is 1, the oscillator will only be running when requested by a peripheral.
|
||||||
|
// <id> osc32k_arch_ondemand
|
||||||
|
#ifndef CONF_OSC32K_ONDEMAND
|
||||||
|
#define CONF_OSC32K_ONDEMAND 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Run In Standby
|
||||||
|
// <i> Run In standby Mode
|
||||||
|
// <i> If this bit is 0: The oscillator is disabled in standby sleep mode.
|
||||||
|
// <i> If this bit is 1: The oscillator is not stopped in standby sleep mode.
|
||||||
|
// <id> osc32k_arch_runstdby
|
||||||
|
#ifndef CONF_OSC32K_RUNSTDBY
|
||||||
|
#define CONF_OSC32K_RUNSTDBY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Enable 32Khz Output
|
||||||
|
// <i> Enable 32 Khz Output
|
||||||
|
// <id> osc32k_arch_en32k
|
||||||
|
#ifndef CONF_OSC32K_EN32K
|
||||||
|
#define CONF_OSC32K_EN32K 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Enable 1K
|
||||||
|
// <i> Enable 1K
|
||||||
|
// <id> osc32k_arch_en1k
|
||||||
|
#ifndef CONF_OSC32K_EN1K
|
||||||
|
#define CONF_OSC32K_EN1K 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Write Lock
|
||||||
|
// <i> Write Lock
|
||||||
|
// <id> osc32k_arch_wrtlock
|
||||||
|
#ifndef CONF_OSC32K_WRTLOCK
|
||||||
|
#define CONF_OSC32K_WRTLOCK 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Start up time for the 32K Oscillator
|
||||||
|
// <CONF_OSC_STARTUP_TIME_92MCS"> 3 Clock Cycles (92us)
|
||||||
|
// <CONF_OSC_STARTUP_TIME_122MCS"> 4 Clock Cycles (122us)
|
||||||
|
// <CONF_OSC_STARTUP_TIME_183MCS"> 6 Clock Cycles (183us)
|
||||||
|
// <CONF_OSC_STARTUP_TIME_305MCS"> 10 Clock Cycles (305us)
|
||||||
|
// <CONF_OSC_STARTUP_TIME_549MCS"> 18 Clock Cycles (549us)
|
||||||
|
// <CONF_OSC_STARTUP_TIME_1038MCS"> 34 Clock Cycles (1038us)
|
||||||
|
// <CONF_OSC_STARTUP_TIME_2014MCS"> 66 Clock Cycles (2014us)
|
||||||
|
// <CONF_OSC_STARTUP_TIME_3967MCS"> 130 Clock Cycles (3967us)
|
||||||
|
// <i> Start Up Time for the 32K Oscillator
|
||||||
|
// <i> Default: 10 Clock Cycles (305us)
|
||||||
|
// <id> osc32k_arch_startup
|
||||||
|
#ifndef CONF_OSC32K_STARTUP
|
||||||
|
#define CONF_OSC32K_STARTUP CONF_OSC_STARTUP_TIME_92MCS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Overwrite Default Osc Calibration
|
||||||
|
// <i> Overwrite Default Osc Calibration
|
||||||
|
// <id> osc32k_arch_overwrite_calibration
|
||||||
|
#ifndef CONF_OSC32K_OVERWRITE_CALIBRATION
|
||||||
|
#define CONF_OSC32K_OVERWRITE_CALIBRATION 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o>Osc Calibration Value <0-65535>
|
||||||
|
// <i> Set the Oscillator Calibration Value
|
||||||
|
// <i> Default: 0
|
||||||
|
// <id> osc32k_arch_calib
|
||||||
|
#ifndef CONF_OSC32K_CALIB
|
||||||
|
#define CONF_OSC32K_CALIB 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> 32kHz External Crystal Oscillator Configuration
|
||||||
|
// <i> Indicates whether configuration for External 32K Osc is enabled or not
|
||||||
|
// <id> enable_xosc32k
|
||||||
|
#ifndef CONF_XOSC32K_CONFIG
|
||||||
|
#define CONF_XOSC32K_CONFIG 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> 32kHz External Crystal Oscillator (XOSC32K) Control
|
||||||
|
// <q> External 32K Oscillator Enable
|
||||||
|
// <i> Indicates whether External 32K Oscillator is enabled or not
|
||||||
|
// <id> xosc32k_arch_enable
|
||||||
|
#ifndef CONF_XOSC32K_ENABLE
|
||||||
|
#define CONF_XOSC32K_ENABLE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> On Demand
|
||||||
|
// <i> Enable On Demand.
|
||||||
|
// <i> If this bit is 0: The oscillator is always on, if enabled.
|
||||||
|
// <i> If this bit is 1: the oscillator will only be running when requested by a peripheral.
|
||||||
|
// <id> xosc32k_arch_ondemand
|
||||||
|
#ifndef CONF_XOSC32K_ONDEMAND
|
||||||
|
#define CONF_XOSC32K_ONDEMAND 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Run In Standby
|
||||||
|
// <i> Run In standby Mode
|
||||||
|
// <i> If this bit is 0: The oscillator is disabled in standby sleep mode.
|
||||||
|
// <i> If this bit is 1: The oscillator is not stopped in standby sleep mode.
|
||||||
|
// <id> xosc32k_arch_runstdby
|
||||||
|
#ifndef CONF_XOSC32K_RUNSTDBY
|
||||||
|
#define CONF_XOSC32K_RUNSTDBY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Enable 1K
|
||||||
|
// <i> Enable 1K
|
||||||
|
// <id> xosc32k_arch_en1k
|
||||||
|
#ifndef CONF_XOSC32K_EN1K
|
||||||
|
#define CONF_XOSC32K_EN1K 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Enable 32Khz Output
|
||||||
|
// <i> Enable 32 Khz Output
|
||||||
|
// <id> xosc32k_arch_en32k
|
||||||
|
#ifndef CONF_XOSC32K_EN32K
|
||||||
|
#define CONF_XOSC32K_EN32K 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Enable XTAL
|
||||||
|
// <i> Enable XTAL
|
||||||
|
// <id> xosc32k_arch_xtalen
|
||||||
|
#ifndef CONF_XOSC32K_XTALEN
|
||||||
|
#define CONF_XOSC32K_XTALEN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Write Lock
|
||||||
|
// <i> Write Lock
|
||||||
|
// <id> xosc32k_arch_wrtlock
|
||||||
|
#ifndef CONF_XOSC32K_WRTLOCK
|
||||||
|
#define CONF_XOSC32K_WRTLOCK 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Automatic Amplitude Control Enable
|
||||||
|
// <i> Indicates whether Automatic Amplitude Control is Enabled or not
|
||||||
|
// <id> xosc32k_arch_aampen
|
||||||
|
#ifndef CONF_XOSC32K_AAMPEN
|
||||||
|
#define CONF_XOSC32K_AAMPEN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Start up time for the 32K Oscillator
|
||||||
|
// <CONF_XOSC32K_STARTUP_TIME_122MCS"> 122 us
|
||||||
|
// <CONF_XOSC32K_STARTUP_TIME_1068MCS"> 1068 us
|
||||||
|
// <CONF_XOSC32K_STARTUP_TIME_65592MCS"> 62592 us
|
||||||
|
// <CONF_XOSC32K_STARTUP_TIME_125092MCS"> 1125092 us
|
||||||
|
// <CONF_XOSC32K_STARTUP_TIME_500092MCS"> 500092 us
|
||||||
|
// <CONF_XOSC32K_STARTUP_TIME_1000092MCS"> 1000092 us
|
||||||
|
// <CONF_XOSC32K_STARTUP_TIME_2000092MCS"> 2000092 us
|
||||||
|
// <CONF_XOSC32K_STARTUP_TIME_4000092MCS"> 4000092 us
|
||||||
|
// <i> Start Up Time for the 32K Oscillator
|
||||||
|
// <i> Default: 122 us
|
||||||
|
// <id> xosc32k_arch_startup
|
||||||
|
#ifndef CONF_XOSC32K_STARTUP
|
||||||
|
#define CONF_XOSC32K_STARTUP CONF_XOSC32K_STARTUP_TIME_122MCS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> External Multipurpose Crystal Oscillator Configuration
|
||||||
|
// <i> Indicates whether configuration for External Multipurpose Osc is enabled or not
|
||||||
|
// <id> enable_xosc
|
||||||
|
#ifndef CONF_XOSC_CONFIG
|
||||||
|
#define CONF_XOSC_CONFIG 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Frequency <400000-32000000>
|
||||||
|
// <i> Oscillation frequency of the resonator connected to the External Multipurpose Crystal Oscillator.
|
||||||
|
// <id> xosc_frequency
|
||||||
|
#ifndef CONF_XOSC_FREQUENCY
|
||||||
|
#define CONF_XOSC_FREQUENCY 16000000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> External Multipurpose Crystal Oscillator (XOSC) Control
|
||||||
|
// <q> Enable
|
||||||
|
// <i> Indicates whether External Multipurpose Oscillator is enabled or not
|
||||||
|
// <id> xosc_arch_enable
|
||||||
|
#ifndef CONF_XOSC_ENABLE
|
||||||
|
#define CONF_XOSC_ENABLE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> On Demand
|
||||||
|
// <i> Enable On Demand
|
||||||
|
// <i> If this bit is 0: The oscillator is always on, if enabled.
|
||||||
|
// <i> If this bit is 1: the oscillator will only be running when requested by a peripheral.
|
||||||
|
// <id> xosc_arch_ondemand
|
||||||
|
#ifndef CONF_XOSC_ONDEMAND
|
||||||
|
#define CONF_XOSC_ONDEMAND 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Run In Standby
|
||||||
|
// <i> Run In standby Mode
|
||||||
|
// <i> If this bit is 0: The oscillator is disabled in standby sleep mode.
|
||||||
|
// <i> If this bit is 1: The oscillator is not stopped in standby sleep mode.
|
||||||
|
// <id> xosc_arch_runstdby
|
||||||
|
#ifndef CONF_XOSC_RUNSTDBY
|
||||||
|
#define CONF_XOSC_RUNSTDBY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Enable XTAL
|
||||||
|
// <i> Enable XTAL
|
||||||
|
// <id> xosc_arch_xtalen
|
||||||
|
#ifndef CONF_XOSC_XTALEN
|
||||||
|
#define CONF_XOSC_XTALEN 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Automatic Amplitude Control Enable
|
||||||
|
// <i> Indicates whether Automatic Amplitude Control is Enabled or not
|
||||||
|
// <id> xosc_arch_ampgc
|
||||||
|
#ifndef CONF_XOSC_AMPGC
|
||||||
|
#define CONF_XOSC_AMPGC 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Gain of the Oscillator
|
||||||
|
// <SYSCTRL_XOSC_GAIN_0_Val"> 2Mhz
|
||||||
|
// <SYSCTRL_XOSC_GAIN_1_Val"> 4Mhz
|
||||||
|
// <SYSCTRL_XOSC_GAIN_2_Val"> 8Mhz
|
||||||
|
// <SYSCTRL_XOSC_GAIN_3_Val"> 16Mhz
|
||||||
|
// <SYSCTRL_XOSC_GAIN_4_Val"> 30Mhz
|
||||||
|
// <i> Select the Gain of the oscillator
|
||||||
|
// <id> xosc_arch_gain
|
||||||
|
#ifndef CONF_XOSC_GAIN
|
||||||
|
#define CONF_XOSC_GAIN SYSCTRL_XOSC_GAIN_0_Val
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Start up time for the External Oscillator
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_31MCS"> 31 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_61MCS"> 61 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_122MCS"> 122 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_244MCS"> 244 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_488MCS"> 488 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_977MCS"> 977 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_1953MCS"> 1953 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_3906MCS"> 3906 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_7813MCS"> 7813 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_15625MCS"> 15625 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_31250MCS"> 31250 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_62500MCS"> 62500 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_125000MCS"> 125000 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_250000MCS"> 250000 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_500000MCS"> 500000 us
|
||||||
|
// <CONF_XOSC_STARTUP_TIME_1000000MCS"> 1000000 us
|
||||||
|
// <i> Start Up Time for the External Oscillator
|
||||||
|
// <i> Default: 31 us
|
||||||
|
// <id> xosc_arch_startup
|
||||||
|
#ifndef CONF_XOSC_STARTUP
|
||||||
|
#define CONF_XOSC_STARTUP CONF_XOSC_STARTUP_TIME_31MCS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> 32kHz Ultra Low Power Internal Oscillator Configuration
|
||||||
|
// <i> Indicates whether configuration for OSCULP32K is enabled or not
|
||||||
|
// <id> enable_osculp32k
|
||||||
|
#ifndef CONF_OSCULP32K_CONFIG
|
||||||
|
#define CONF_OSCULP32K_CONFIG 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> 32kHz Ultra Low Power Internal Oscillator (OSCULP32K) Control
|
||||||
|
// <q> Write Lock
|
||||||
|
// <i> Locks the OSCULP32K register for future writes to fix the OSCULP32K configuration
|
||||||
|
// <id> osculp32k_arch_wrtlock
|
||||||
|
#ifndef CONF_OSCULP32K_WRTLOCK
|
||||||
|
#define CONF_OSCULP32K_WRTLOCK 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Overwrite Default Osc Calibration
|
||||||
|
// <i> Overwrite Default Osc Calibration
|
||||||
|
// <id> osculp32k_arch_overwrite_calibration
|
||||||
|
#ifndef CONF_OSCULP32K_OVERWRITE_CALIBRATION
|
||||||
|
#define CONF_OSCULP32K_OVERWRITE_CALIBRATION 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o>Osc Calibration Value <0-255>
|
||||||
|
// <i> Set the Oscillator Calibration Value
|
||||||
|
// <i> Default: 0
|
||||||
|
// <id> osculp32k_arch_calib
|
||||||
|
#ifndef CONF_OSCULP32K_CALIB
|
||||||
|
#define CONF_OSCULP32K_CALIB 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> DFLL Configuration
|
||||||
|
// <i> Indicates whether configuration for DFLL is enabled or not
|
||||||
|
// <id> enable_dfll48m
|
||||||
|
#ifndef CONF_DFLL_CONFIG
|
||||||
|
#define CONF_DFLL_CONFIG 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Reference Clock Source
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK0_Val"> Generic clock generator 0
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK1_Val"> Generic clock generator 1
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK2_Val"> Generic clock generator 2
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK3_Val"> Generic clock generator 3
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK4_Val"> Generic clock generator 4
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK5_Val"> Generic clock generator 5
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK6_Val"> Generic clock generator 6
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK7_Val"> Generic clock generator 7
|
||||||
|
// <i> Select the clock source.
|
||||||
|
// <id> dfll48m_ref_clock
|
||||||
|
#ifndef CONF_DFLL_GCLK
|
||||||
|
#define CONF_DFLL_GCLK GCLK_CLKCTRL_GEN_GCLK3_Val
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> DFLL Control
|
||||||
|
// <q> DFLL Enable
|
||||||
|
// <i> Indicates whether DFLL is enabled or not
|
||||||
|
// <id> dfll48m_arch_enable
|
||||||
|
#ifndef CONF_DFLL_ENABLE
|
||||||
|
#define CONF_DFLL_ENABLE 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Wait Lock
|
||||||
|
// <i> Indicates whether Wait Lock is Enables or not
|
||||||
|
// <id> dfll48m_arch_waitlock
|
||||||
|
#ifndef CONF_DFLL_WAITLOCK
|
||||||
|
#define CONF_DFLL_WAITLOCK 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Bypass Coarse Lock
|
||||||
|
// <i> Indicates whether Bypass coarse lock is enabled or not
|
||||||
|
// <id> dfll48m_arch_bplckc
|
||||||
|
#ifndef CONF_DFLL_BPLCKC
|
||||||
|
#define CONF_DFLL_BPLCKC 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Quick Lock Disable
|
||||||
|
// <i> Quick Lock Disable
|
||||||
|
// <id> dfll48m_arch_qldis
|
||||||
|
#ifndef CONF_DFLL_QLDIS
|
||||||
|
#define CONF_DFLL_QLDIS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Chill Cycle Disable
|
||||||
|
// <i> Chill Cycle Disable
|
||||||
|
// <id> dfll48m_arch_ccdis
|
||||||
|
#ifndef CONF_DFLL_CCDIS
|
||||||
|
#define CONF_DFLL_CCDIS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> On Demand
|
||||||
|
// <i> Enable On Demand
|
||||||
|
// <i> If this bit is 0: The DFLL is always on, if enabled.
|
||||||
|
// <i> If this bit is 1: the DFLL will only be running when requested by a peripheral.
|
||||||
|
// <id> dfll48m_arch_ondemand
|
||||||
|
#ifndef CONF_DFLL_ONDEMAND
|
||||||
|
#define CONF_DFLL_ONDEMAND 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Run In Standby
|
||||||
|
// <i> Run In standby Mode
|
||||||
|
// <i> If this bit is 0: The DFLL is disabled in standby sleep mode.
|
||||||
|
// <i> If this bit is 1: The DFLL is not stopped in standby sleep mode.
|
||||||
|
// <id> dfll48m_arch_runstdby
|
||||||
|
#ifndef CONF_DFLL_RUNSTDBY
|
||||||
|
#define CONF_DFLL_RUNSTDBY 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> USB Clock Recovery Mode
|
||||||
|
// <i> USB Clock Recovery Mode
|
||||||
|
// <id> dfll48m_arch_usbcrm
|
||||||
|
#ifndef CONF_DFLL_USBCRM
|
||||||
|
#define CONF_DFLL_USBCRM 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONF_DFLL_USBCRM == 1
|
||||||
|
#if CONF_DFLL_QLDIS == 1
|
||||||
|
#warning QLDIS must be cleared to speed up the lock phase
|
||||||
|
#endif
|
||||||
|
#if CONF_DFLL_CCDIS == 0
|
||||||
|
#warning CCDIS should be set to speed up the lock phase
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Lose Lock After Wake
|
||||||
|
// <i> Lose Lock After Wake
|
||||||
|
// <id> dfll48m_arch_llaw
|
||||||
|
#ifndef CONF_DFLL_LLAW
|
||||||
|
#define CONF_DFLL_LLAW 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Stable DFLL Frequency
|
||||||
|
// <i> Stable DFLL Frequency
|
||||||
|
// <i> If 0: FINE calibration tracks changes in output frequency.
|
||||||
|
// <i> If 1: FINE calibration register value will be fixed after a fine lock.
|
||||||
|
// <id> dfll48m_arch_stable
|
||||||
|
#ifndef CONF_DFLL_STABLE
|
||||||
|
#define CONF_DFLL_STABLE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Operating Mode Selection
|
||||||
|
// <CONF_DFLL_OPEN_LOOP_MODE"> Open Loop Mode
|
||||||
|
// <CONF_DFLL_CLOSED_LOOP_MODE"> Closed Loop Mode
|
||||||
|
// <i> Mode
|
||||||
|
// <id> dfll48m_mode
|
||||||
|
#ifndef CONF_DFLL_MODE
|
||||||
|
#define CONF_DFLL_MODE CONF_DFLL_OPEN_LOOP_MODE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Coarse Maximum Step <0x0-0x1F>
|
||||||
|
// <id> dfll_arch_cstep
|
||||||
|
#ifndef CONF_DFLL_CSTEP
|
||||||
|
#define CONF_DFLL_CSTEP 31
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Fine Maximum Step <0x0-0x3FF>
|
||||||
|
// <id> dfll_arch_fstep
|
||||||
|
#ifndef CONF_DFLL_FSTEP
|
||||||
|
#define CONF_DFLL_FSTEP 511
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o>DFLL Multiply Factor<0-65535>
|
||||||
|
// <i> Set the DFLL Multiply Factor
|
||||||
|
// <i> Default: 0
|
||||||
|
// <id> dfll48m_mul
|
||||||
|
#ifndef CONF_DFLL_MUL
|
||||||
|
#define CONF_DFLL_MUL 1465
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <e> DFLL Calibration Overwrite
|
||||||
|
// <i> Indicates whether Overwrite Calibration value of DFLL
|
||||||
|
// <id> dfll48m_arch_calibration
|
||||||
|
#ifndef CONF_DFLL_OVERWRITE_CALIBRATION
|
||||||
|
#define CONF_DFLL_OVERWRITE_CALIBRATION 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Coarse Value <0x0-0x3F>
|
||||||
|
// <id> dfll48m_arch_coarse
|
||||||
|
#ifndef CONF_DFLL_COARSE
|
||||||
|
#define CONF_DFLL_COARSE (0x1f)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o> Fine Value <0x0-0x3FF>
|
||||||
|
// <id> dfll48m_arch_fine
|
||||||
|
#ifndef CONF_DFLL_FINE
|
||||||
|
#define CONF_DFLL_FINE (0x200)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CONF_DFLL_OVERWRITE_CALIBRATION == 0
|
||||||
|
#define CONF_DEFAULT_CORASE \
|
||||||
|
((FUSES_DFLL48M_COARSE_CAL_Msk & (*((uint32_t *)FUSES_DFLL48M_COARSE_CAL_ADDR))) >> FUSES_DFLL48M_COARSE_CAL_Pos)
|
||||||
|
|
||||||
|
#define CONF_DFLLVAL \
|
||||||
|
SYSCTRL_DFLLVAL_COARSE(((CONF_DEFAULT_CORASE) == 0x3F) ? 0x1F : (CONF_DEFAULT_CORASE)) \
|
||||||
|
| SYSCTRL_DFLLVAL_FINE(512)
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define CONF_DFLLVAL SYSCTRL_DFLLVAL_COARSE(CONF_DFLL_COARSE) | SYSCTRL_DFLLVAL_FINE(CONF_DFLL_FINE)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
//</e>
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
// <e> DPLL Configuration
|
||||||
|
// <i> Indicates whether configuration for DPLL is enabled or not
|
||||||
|
// <id> enable_fdpll96m
|
||||||
|
#ifndef CONF_DPLL_CONFIG
|
||||||
|
#define CONF_DPLL_CONFIG 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Reference Clock Source
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC32K"> 32kHz External Crystal Oscillator (XOSC32K)
|
||||||
|
// <GCLK_GENCTRL_SRC_XOSC"> External Crystal Oscillator 0.4-32MHz (XOSC)
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK0_Val"> Generic clock generator 0
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK1_Val"> Generic clock generator 1
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK2_Val"> Generic clock generator 2
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK3_Val"> Generic clock generator 3
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK4_Val"> Generic clock generator 4
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK5_Val"> Generic clock generator 5
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK6_Val"> Generic clock generator 6
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK7_Val"> Generic clock generator 7
|
||||||
|
// <i> Select the clock source.
|
||||||
|
// <id> fdpll96m_ref_clock
|
||||||
|
#ifndef CONF_DPLL_GCLK
|
||||||
|
#define CONF_DPLL_GCLK GCLK_CLKCTRL_GEN_GCLK3_Val
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (CONF_DPLL_GCLK == GCLK_GENCTRL_SRC_XOSC32K)
|
||||||
|
#define CONF_DPLL_REFCLK SYSCTRL_DPLLCTRLB_REFCLK_REF0_Val
|
||||||
|
#elif (CONF_DPLL_GCLK == GCLK_GENCTRL_SRC_XOSC)
|
||||||
|
#define CONF_DPLL_REFCLK SYSCTRL_DPLLCTRLB_REFCLK_REF1_Val
|
||||||
|
#else
|
||||||
|
#define CONF_DPLL_REFCLK SYSCTRL_DPLLCTRLB_REFCLK_GCLK_Val
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <h> DPLL Control
|
||||||
|
// <q> ON Demand
|
||||||
|
// <i> Enable On Demand
|
||||||
|
// <i> If this bit is 0: The DFLL is always on, if enabled.
|
||||||
|
// <i> If this bit is 1: the DFLL will only be running when requested by a peripheral.
|
||||||
|
// <id> fdpll96m_arch_ondemand
|
||||||
|
#ifndef CONF_DPLL_ONDEMAND
|
||||||
|
#define CONF_DPLL_ONDEMAND 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Run In Standby
|
||||||
|
// <i> Run In standby Mode
|
||||||
|
// <i> If this bit is 0: The DFLL is disabled in standby sleep mode.
|
||||||
|
// <i> If this bit is 1: The DFLL is not stopped in standby sleep mode.
|
||||||
|
// <id> fdpll96m_arch_runstdby
|
||||||
|
#ifndef CONF_DPLL_RUNSTDBY
|
||||||
|
#define CONF_DPLL_RUNSTDBY 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> DPLL Enable
|
||||||
|
// <i> Indicates whether DPLL is enabled or not
|
||||||
|
// <id> fdpll96m_arch_enable
|
||||||
|
#ifndef CONF_DPLL_ENABLE
|
||||||
|
#define CONF_DPLL_ENABLE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <q> Lock ByPass
|
||||||
|
// <i> Enabling it makes the CLK_FDPLL96M always running otherwise it will be turned off when lock signal is low
|
||||||
|
// <id> fdpll96m_arch_lbypass
|
||||||
|
#ifndef CONF_DPLL_LBYPASS
|
||||||
|
#define CONF_DPLL_LBYPASS 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o>Clock Divider <0-2047>
|
||||||
|
// <i> Clock Division Factor (Applicable if reference clock is XOSC)
|
||||||
|
// <id> fdpll96m_clock_div
|
||||||
|
#ifndef CONF_DPLL_DIV
|
||||||
|
#define CONF_DPLL_DIV 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o>DPLL LDRFRAC<0-15>
|
||||||
|
// <i> Set the fractional part of the frequency multiplier.
|
||||||
|
// <id> fdpll96m_ldrfrac
|
||||||
|
#ifndef CONF_DPLL_LDRFRAC
|
||||||
|
#define CONF_DPLL_LDRFRAC 13
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <o>DPLL LDR <0-4095>
|
||||||
|
// <i> Set the integer part of the frequency multiplier.
|
||||||
|
// <id> fdpll96m_ldr
|
||||||
|
#ifndef CONF_DPLL_LDR
|
||||||
|
#define CONF_DPLL_LDR 1463
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// </h>
|
||||||
|
// </e>
|
||||||
|
|
||||||
|
#define CONF_DPLL_LTIME SYSCTRL_DPLLCTRLB_LTIME_DEFAULT_Val
|
||||||
|
#define CONF_DPLL_WUF 0
|
||||||
|
#define CONF_DPLL_LPEN 0
|
||||||
|
#define CONF_DPLL_FILTER SYSCTRL_DPLLCTRLB_FILTER_DEFAULT_Val
|
||||||
|
|
||||||
|
// <<< end of configuration section >>>
|
||||||
|
|
||||||
|
#endif // HPL_SYSCTRL_CONFIG_H
|
||||||
177
config/peripheral_clk_config.h
Normal file
177
config/peripheral_clk_config.h
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
/* Auto-generated config file peripheral_clk_config.h */
|
||||||
|
#ifndef PERIPHERAL_CLK_CONFIG_H
|
||||||
|
#define PERIPHERAL_CLK_CONFIG_H
|
||||||
|
|
||||||
|
// <<< Use Configuration Wizard in Context Menu >>>
|
||||||
|
|
||||||
|
// <y> EIC Clock Source
|
||||||
|
// <id> eic_gclk_selection
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK0_Val"> Generic clock generator 0
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK1_Val"> Generic clock generator 1
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK2_Val"> Generic clock generator 2
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK3_Val"> Generic clock generator 3
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK4_Val"> Generic clock generator 4
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK5_Val"> Generic clock generator 5
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK6_Val"> Generic clock generator 6
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK7_Val"> Generic clock generator 7
|
||||||
|
|
||||||
|
// <i> Select the clock source for EIC.
|
||||||
|
#ifndef CONF_GCLK_EIC_SRC
|
||||||
|
#define CONF_GCLK_EIC_SRC GCLK_CLKCTRL_GEN_GCLK0_Val
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \def CONF_GCLK_EIC_FREQUENCY
|
||||||
|
* \brief EIC's Clock frequency
|
||||||
|
*/
|
||||||
|
#ifndef CONF_GCLK_EIC_FREQUENCY
|
||||||
|
#define CONF_GCLK_EIC_FREQUENCY 48000000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \def CONF_CPU_FREQUENCY
|
||||||
|
* \brief CPU's Clock frequency
|
||||||
|
*/
|
||||||
|
#ifndef CONF_CPU_FREQUENCY
|
||||||
|
#define CONF_CPU_FREQUENCY 48000000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Core Clock Source
|
||||||
|
// <id> core_gclk_selection
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK0_Val"> Generic clock generator 0
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK1_Val"> Generic clock generator 1
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK2_Val"> Generic clock generator 2
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK3_Val"> Generic clock generator 3
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK4_Val"> Generic clock generator 4
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK5_Val"> Generic clock generator 5
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK6_Val"> Generic clock generator 6
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK7_Val"> Generic clock generator 7
|
||||||
|
|
||||||
|
// <i> Select the clock source for CORE.
|
||||||
|
#ifndef CONF_GCLK_SERCOM0_CORE_SRC
|
||||||
|
#define CONF_GCLK_SERCOM0_CORE_SRC GCLK_CLKCTRL_GEN_GCLK0_Val
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Slow Clock Source
|
||||||
|
// <id> slow_gclk_selection
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK0_Val"> Generic clock generator 0
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK1_Val"> Generic clock generator 1
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK2_Val"> Generic clock generator 2
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK3_Val"> Generic clock generator 3
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK4_Val"> Generic clock generator 4
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK5_Val"> Generic clock generator 5
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK6_Val"> Generic clock generator 6
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK7_Val"> Generic clock generator 7
|
||||||
|
|
||||||
|
// <i> Select the slow clock source.
|
||||||
|
#ifndef CONF_GCLK_SERCOM0_SLOW_SRC
|
||||||
|
#define CONF_GCLK_SERCOM0_SLOW_SRC GCLK_CLKCTRL_GEN_GCLK3_Val
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \def CONF_GCLK_SERCOM0_CORE_FREQUENCY
|
||||||
|
* \brief SERCOM0's Core Clock frequency
|
||||||
|
*/
|
||||||
|
#ifndef CONF_GCLK_SERCOM0_CORE_FREQUENCY
|
||||||
|
#define CONF_GCLK_SERCOM0_CORE_FREQUENCY 48000000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \def CONF_GCLK_SERCOM0_SLOW_FREQUENCY
|
||||||
|
* \brief SERCOM0's Slow Clock frequency
|
||||||
|
*/
|
||||||
|
#ifndef CONF_GCLK_SERCOM0_SLOW_FREQUENCY
|
||||||
|
#define CONF_GCLK_SERCOM0_SLOW_FREQUENCY 32768
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Core Clock Source
|
||||||
|
// <id> core_gclk_selection
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK0_Val"> Generic clock generator 0
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK1_Val"> Generic clock generator 1
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK2_Val"> Generic clock generator 2
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK3_Val"> Generic clock generator 3
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK4_Val"> Generic clock generator 4
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK5_Val"> Generic clock generator 5
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK6_Val"> Generic clock generator 6
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK7_Val"> Generic clock generator 7
|
||||||
|
|
||||||
|
// <i> Select the clock source for CORE.
|
||||||
|
#ifndef CONF_GCLK_SERCOM1_CORE_SRC
|
||||||
|
#define CONF_GCLK_SERCOM1_CORE_SRC GCLK_CLKCTRL_GEN_GCLK0_Val
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <y> Slow Clock Source
|
||||||
|
// <id> slow_gclk_selection
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK0_Val"> Generic clock generator 0
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK1_Val"> Generic clock generator 1
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK2_Val"> Generic clock generator 2
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK3_Val"> Generic clock generator 3
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK4_Val"> Generic clock generator 4
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK5_Val"> Generic clock generator 5
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK6_Val"> Generic clock generator 6
|
||||||
|
|
||||||
|
// <GCLK_CLKCTRL_GEN_GCLK7_Val"> Generic clock generator 7
|
||||||
|
|
||||||
|
// <i> Select the slow clock source.
|
||||||
|
#ifndef CONF_GCLK_SERCOM1_SLOW_SRC
|
||||||
|
#define CONF_GCLK_SERCOM1_SLOW_SRC GCLK_CLKCTRL_GEN_GCLK3_Val
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \def CONF_GCLK_SERCOM1_CORE_FREQUENCY
|
||||||
|
* \brief SERCOM1's Core Clock frequency
|
||||||
|
*/
|
||||||
|
#ifndef CONF_GCLK_SERCOM1_CORE_FREQUENCY
|
||||||
|
#define CONF_GCLK_SERCOM1_CORE_FREQUENCY 48000000
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \def CONF_GCLK_SERCOM1_SLOW_FREQUENCY
|
||||||
|
* \brief SERCOM1's Slow Clock frequency
|
||||||
|
*/
|
||||||
|
#ifndef CONF_GCLK_SERCOM1_SLOW_FREQUENCY
|
||||||
|
#define CONF_GCLK_SERCOM1_SLOW_FREQUENCY 32768
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// <<< end of configuration section >>>
|
||||||
|
|
||||||
|
#endif // PERIPHERAL_CLK_CONFIG_H
|
||||||
229
driver_init.c
Normal file
229
driver_init.c
Normal file
@ -0,0 +1,229 @@
|
|||||||
|
/*
|
||||||
|
* Code generated from Atmel Start.
|
||||||
|
*
|
||||||
|
* This file will be overwritten when reconfiguring your Atmel Start project.
|
||||||
|
* Please copy examples or other code you want to keep to a separate file
|
||||||
|
* to avoid losing it when reconfiguring.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "driver_init.h"
|
||||||
|
#include <peripheral_clk_config.h>
|
||||||
|
#include <utils.h>
|
||||||
|
#include <hal_init.h>
|
||||||
|
#include <hpl_gclk_base.h>
|
||||||
|
#include <hpl_pm_base.h>
|
||||||
|
|
||||||
|
/*! The buffer size for USART */
|
||||||
|
#define USART_0_BUFFER_SIZE 16
|
||||||
|
|
||||||
|
struct usart_async_descriptor USART_0;
|
||||||
|
struct spi_m_sync_descriptor SPI_0;
|
||||||
|
|
||||||
|
static uint8_t USART_0_buffer[USART_0_BUFFER_SIZE];
|
||||||
|
|
||||||
|
void EXTERNAL_IRQ_0_init(void)
|
||||||
|
{
|
||||||
|
_gclk_enable_channel(EIC_GCLK_ID, CONF_GCLK_EIC_SRC);
|
||||||
|
|
||||||
|
ext_irq_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART Clock initialization function
|
||||||
|
*
|
||||||
|
* Enables register interface and peripheral clock
|
||||||
|
*/
|
||||||
|
void USART_0_CLOCK_init()
|
||||||
|
{
|
||||||
|
|
||||||
|
_pm_enable_bus_clock(PM_BUS_APBC, SERCOM0);
|
||||||
|
_gclk_enable_channel(SERCOM0_GCLK_ID_CORE, CONF_GCLK_SERCOM0_CORE_SRC);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART pinmux initialization function
|
||||||
|
*
|
||||||
|
* Set each required pin to USART functionality
|
||||||
|
*/
|
||||||
|
void USART_0_PORT_init()
|
||||||
|
{
|
||||||
|
|
||||||
|
gpio_set_pin_function(IN_UART_TX, PINMUX_PA08C_SERCOM0_PAD0);
|
||||||
|
|
||||||
|
gpio_set_pin_function(OUT_UART_RX, PINMUX_PA09C_SERCOM0_PAD1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART initialization function
|
||||||
|
*
|
||||||
|
* Enables USART peripheral, clocks and initializes USART driver
|
||||||
|
*/
|
||||||
|
void USART_0_init(void)
|
||||||
|
{
|
||||||
|
USART_0_CLOCK_init();
|
||||||
|
usart_async_init(&USART_0, SERCOM0, USART_0_buffer, USART_0_BUFFER_SIZE, (void *)NULL);
|
||||||
|
USART_0_PORT_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPI_0_PORT_init(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Set pin direction to input
|
||||||
|
gpio_set_pin_direction(PA16, GPIO_DIRECTION_IN);
|
||||||
|
|
||||||
|
gpio_set_pin_pull_mode(PA16,
|
||||||
|
// <y> Pull configuration
|
||||||
|
// <id> pad_pull_config
|
||||||
|
// <GPIO_PULL_OFF"> Off
|
||||||
|
// <GPIO_PULL_UP"> Pull-up
|
||||||
|
// <GPIO_PULL_DOWN"> Pull-down
|
||||||
|
GPIO_PULL_OFF);
|
||||||
|
|
||||||
|
gpio_set_pin_function(PA16, PINMUX_PA16C_SERCOM1_PAD0);
|
||||||
|
|
||||||
|
gpio_set_pin_level(PA18,
|
||||||
|
// <y> Initial level
|
||||||
|
// <id> pad_initial_level
|
||||||
|
// <false"> Low
|
||||||
|
// <true"> High
|
||||||
|
false);
|
||||||
|
|
||||||
|
// Set pin direction to output
|
||||||
|
gpio_set_pin_direction(PA18, GPIO_DIRECTION_OUT);
|
||||||
|
|
||||||
|
gpio_set_pin_function(PA18, PINMUX_PA18C_SERCOM1_PAD2);
|
||||||
|
|
||||||
|
gpio_set_pin_level(PA19,
|
||||||
|
// <y> Initial level
|
||||||
|
// <id> pad_initial_level
|
||||||
|
// <false"> Low
|
||||||
|
// <true"> High
|
||||||
|
false);
|
||||||
|
|
||||||
|
// Set pin direction to output
|
||||||
|
gpio_set_pin_direction(PA19, GPIO_DIRECTION_OUT);
|
||||||
|
|
||||||
|
gpio_set_pin_function(PA19, PINMUX_PA19C_SERCOM1_PAD3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPI_0_CLOCK_init(void)
|
||||||
|
{
|
||||||
|
_pm_enable_bus_clock(PM_BUS_APBC, SERCOM1);
|
||||||
|
_gclk_enable_channel(SERCOM1_GCLK_ID_CORE, CONF_GCLK_SERCOM1_CORE_SRC);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SPI_0_init(void)
|
||||||
|
{
|
||||||
|
SPI_0_CLOCK_init();
|
||||||
|
spi_m_sync_init(&SPI_0, SERCOM1);
|
||||||
|
SPI_0_PORT_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void system_init(void)
|
||||||
|
{
|
||||||
|
init_mcu();
|
||||||
|
|
||||||
|
// GPIO on PA06
|
||||||
|
|
||||||
|
gpio_set_pin_level(OUT_LED_TX,
|
||||||
|
// <y> Initial level
|
||||||
|
// <id> pad_initial_level
|
||||||
|
// <false"> Low
|
||||||
|
// <true"> High
|
||||||
|
false);
|
||||||
|
|
||||||
|
// Set pin direction to output
|
||||||
|
gpio_set_pin_direction(OUT_LED_TX, GPIO_DIRECTION_OUT);
|
||||||
|
|
||||||
|
gpio_set_pin_function(OUT_LED_TX, GPIO_PIN_FUNCTION_OFF);
|
||||||
|
|
||||||
|
// GPIO on PA07
|
||||||
|
|
||||||
|
gpio_set_pin_level(OUT_XBEE_REMOTE_RESET,
|
||||||
|
// <y> Initial level
|
||||||
|
// <id> pad_initial_level
|
||||||
|
// <false"> Low
|
||||||
|
// <true"> High
|
||||||
|
false);
|
||||||
|
|
||||||
|
// Set pin direction to output
|
||||||
|
gpio_set_pin_direction(OUT_XBEE_REMOTE_RESET, GPIO_DIRECTION_OUT);
|
||||||
|
|
||||||
|
gpio_set_pin_function(OUT_XBEE_REMOTE_RESET, GPIO_PIN_FUNCTION_OFF);
|
||||||
|
|
||||||
|
// GPIO on PA14
|
||||||
|
|
||||||
|
gpio_set_pin_level(OUT_XBEE_HEARTBEAT,
|
||||||
|
// <y> Initial level
|
||||||
|
// <id> pad_initial_level
|
||||||
|
// <false"> Low
|
||||||
|
// <true"> High
|
||||||
|
false);
|
||||||
|
|
||||||
|
// Set pin direction to output
|
||||||
|
gpio_set_pin_direction(OUT_XBEE_HEARTBEAT, GPIO_DIRECTION_OUT);
|
||||||
|
|
||||||
|
gpio_set_pin_function(OUT_XBEE_HEARTBEAT, GPIO_PIN_FUNCTION_OFF);
|
||||||
|
|
||||||
|
// GPIO on PA15
|
||||||
|
|
||||||
|
gpio_set_pin_level(OUT_LED_OTAU,
|
||||||
|
// <y> Initial level
|
||||||
|
// <id> pad_initial_level
|
||||||
|
// <false"> Low
|
||||||
|
// <true"> High
|
||||||
|
false);
|
||||||
|
|
||||||
|
// Set pin direction to output
|
||||||
|
gpio_set_pin_direction(OUT_LED_OTAU, GPIO_DIRECTION_OUT);
|
||||||
|
|
||||||
|
gpio_set_pin_function(OUT_LED_OTAU, GPIO_PIN_FUNCTION_OFF);
|
||||||
|
|
||||||
|
// GPIO on PA17
|
||||||
|
|
||||||
|
gpio_set_pin_level(OUT_SPI_CS,
|
||||||
|
// <y> Initial level
|
||||||
|
// <id> pad_initial_level
|
||||||
|
// <false"> Low
|
||||||
|
// <true"> High
|
||||||
|
false);
|
||||||
|
|
||||||
|
// Set pin direction to output
|
||||||
|
gpio_set_pin_direction(OUT_SPI_CS, GPIO_DIRECTION_OUT);
|
||||||
|
|
||||||
|
gpio_set_pin_function(OUT_SPI_CS, GPIO_PIN_FUNCTION_OFF);
|
||||||
|
|
||||||
|
// GPIO on PA27
|
||||||
|
|
||||||
|
gpio_set_pin_level(OUT_LED_LINK,
|
||||||
|
// <y> Initial level
|
||||||
|
// <id> pad_initial_level
|
||||||
|
// <false"> Low
|
||||||
|
// <true"> High
|
||||||
|
false);
|
||||||
|
|
||||||
|
// Set pin direction to output
|
||||||
|
gpio_set_pin_direction(OUT_LED_LINK, GPIO_DIRECTION_OUT);
|
||||||
|
|
||||||
|
gpio_set_pin_function(OUT_LED_LINK, GPIO_PIN_FUNCTION_OFF);
|
||||||
|
|
||||||
|
// GPIO on PA28
|
||||||
|
|
||||||
|
gpio_set_pin_level(OUT_LED_RX,
|
||||||
|
// <y> Initial level
|
||||||
|
// <id> pad_initial_level
|
||||||
|
// <false"> Low
|
||||||
|
// <true"> High
|
||||||
|
false);
|
||||||
|
|
||||||
|
// Set pin direction to output
|
||||||
|
gpio_set_pin_direction(OUT_LED_RX, GPIO_DIRECTION_OUT);
|
||||||
|
|
||||||
|
gpio_set_pin_function(OUT_LED_RX, GPIO_PIN_FUNCTION_OFF);
|
||||||
|
|
||||||
|
EXTERNAL_IRQ_0_init();
|
||||||
|
|
||||||
|
USART_0_init();
|
||||||
|
|
||||||
|
SPI_0_init();
|
||||||
|
}
|
||||||
49
driver_init.h
Normal file
49
driver_init.h
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Code generated from Atmel Start.
|
||||||
|
*
|
||||||
|
* This file will be overwritten when reconfiguring your Atmel Start project.
|
||||||
|
* Please copy examples or other code you want to keep to a separate file
|
||||||
|
* to avoid losing it when reconfiguring.
|
||||||
|
*/
|
||||||
|
#ifndef DRIVER_INIT_INCLUDED
|
||||||
|
#define DRIVER_INIT_INCLUDED
|
||||||
|
|
||||||
|
#include "atmel_start_pins.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <hal_atomic.h>
|
||||||
|
#include <hal_delay.h>
|
||||||
|
#include <hal_gpio.h>
|
||||||
|
#include <hal_init.h>
|
||||||
|
#include <hal_io.h>
|
||||||
|
#include <hal_sleep.h>
|
||||||
|
|
||||||
|
#include <hal_ext_irq.h>
|
||||||
|
|
||||||
|
#include <hal_usart_async.h>
|
||||||
|
#include <hal_spi_m_sync.h>
|
||||||
|
|
||||||
|
extern struct usart_async_descriptor USART_0;
|
||||||
|
extern struct spi_m_sync_descriptor SPI_0;
|
||||||
|
|
||||||
|
void USART_0_PORT_init(void);
|
||||||
|
void USART_0_CLOCK_init(void);
|
||||||
|
void USART_0_init(void);
|
||||||
|
|
||||||
|
void SPI_0_PORT_init(void);
|
||||||
|
void SPI_0_CLOCK_init(void);
|
||||||
|
void SPI_0_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Perform system initialization, initialize pins and clocks for
|
||||||
|
* peripherals
|
||||||
|
*/
|
||||||
|
void system_init(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif // DRIVER_INIT_INCLUDED
|
||||||
61
examples/driver_examples.c
Normal file
61
examples/driver_examples.c
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* Code generated from Atmel Start.
|
||||||
|
*
|
||||||
|
* This file will be overwritten when reconfiguring your Atmel Start project.
|
||||||
|
* Please copy examples or other code you want to keep to a separate file
|
||||||
|
* to avoid losing it when reconfiguring.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "driver_examples.h"
|
||||||
|
#include "driver_init.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example of using EXTERNAL_IRQ_0
|
||||||
|
*/
|
||||||
|
void EXTERNAL_IRQ_0_example(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example of using USART_0 to write "Hello World" using the IO abstraction.
|
||||||
|
*
|
||||||
|
* Since the driver is asynchronous we need to use statically allocated memory for string
|
||||||
|
* because driver initiates transfer and then returns before the transmission is completed.
|
||||||
|
*
|
||||||
|
* Once transfer has been completed the tx_cb function will be called.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static uint8_t example_USART_0[12] = "Hello World!";
|
||||||
|
|
||||||
|
static void tx_cb_USART_0(const struct usart_async_descriptor *const io_descr)
|
||||||
|
{
|
||||||
|
/* Transfer completed */
|
||||||
|
}
|
||||||
|
|
||||||
|
void USART_0_example(void)
|
||||||
|
{
|
||||||
|
struct io_descriptor *io;
|
||||||
|
|
||||||
|
usart_async_register_callback(&USART_0, USART_ASYNC_TXC_CB, tx_cb_USART_0);
|
||||||
|
/*usart_async_register_callback(&USART_0, USART_ASYNC_RXC_CB, rx_cb);
|
||||||
|
usart_async_register_callback(&USART_0, USART_ASYNC_ERROR_CB, err_cb);*/
|
||||||
|
usart_async_get_io_descriptor(&USART_0, &io);
|
||||||
|
usart_async_enable(&USART_0);
|
||||||
|
|
||||||
|
io_write(io, example_USART_0, 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Example of using SPI_0 to write "Hello World" using the IO abstraction.
|
||||||
|
*/
|
||||||
|
static uint8_t example_SPI_0[12] = "Hello World!";
|
||||||
|
|
||||||
|
void SPI_0_example(void)
|
||||||
|
{
|
||||||
|
struct io_descriptor *io;
|
||||||
|
spi_m_sync_get_io_descriptor(&SPI_0, &io);
|
||||||
|
|
||||||
|
spi_m_sync_enable(&SPI_0);
|
||||||
|
io_write(io, example_SPI_0, 12);
|
||||||
|
}
|
||||||
22
examples/driver_examples.h
Normal file
22
examples/driver_examples.h
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* Code generated from Atmel Start.
|
||||||
|
*
|
||||||
|
* This file will be overwritten when reconfiguring your Atmel Start project.
|
||||||
|
* Please copy examples or other code you want to keep to a separate file
|
||||||
|
* to avoid losing it when reconfiguring.
|
||||||
|
*/
|
||||||
|
#ifndef DRIVER_EXAMPLES_H_INCLUDED
|
||||||
|
#define DRIVER_EXAMPLES_H_INCLUDED
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void EXTERNAL_IRQ_0_example(void);
|
||||||
|
|
||||||
|
void USART_0_example(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif // DRIVER_EXAMPLES_H_INCLUDED
|
||||||
39
hal/documentation/ext_irq.rst
Normal file
39
hal/documentation/ext_irq.rst
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
==============
|
||||||
|
EXT IRQ driver
|
||||||
|
==============
|
||||||
|
|
||||||
|
The External Interrupt driver allows external pins to be
|
||||||
|
configured as interrupt lines. Each interrupt line can be
|
||||||
|
individually masked and can generate an interrupt on rising,
|
||||||
|
falling or both edges, or on high or low levels. Some of
|
||||||
|
external pin can also be configured to wake up the device
|
||||||
|
from sleep modes where all clocks have been disabled.
|
||||||
|
External pins can also generate an event.
|
||||||
|
|
||||||
|
Features
|
||||||
|
--------
|
||||||
|
* Initialization and de-initialization
|
||||||
|
* Enabling and disabling
|
||||||
|
* Detect external pins interrupt
|
||||||
|
|
||||||
|
Applications
|
||||||
|
------------
|
||||||
|
* Generate an interrupt on rising, falling or both edges,
|
||||||
|
or on high or low levels.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
------------
|
||||||
|
* GPIO hardware
|
||||||
|
|
||||||
|
Concurrency
|
||||||
|
-----------
|
||||||
|
N/A
|
||||||
|
|
||||||
|
Limitations
|
||||||
|
-----------
|
||||||
|
N/A
|
||||||
|
|
||||||
|
Knows issues and workarounds
|
||||||
|
----------------------------
|
||||||
|
N/A
|
||||||
|
|
||||||
51
hal/documentation/spi_master_sync.rst
Normal file
51
hal/documentation/spi_master_sync.rst
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
The SPI Master Synchronous Driver
|
||||||
|
=================================
|
||||||
|
|
||||||
|
The serial peripheral interface (SPI) is a synchronous serial communication
|
||||||
|
interface.
|
||||||
|
|
||||||
|
SPI devices communicate in full duplex mode using a master-slave
|
||||||
|
architecture with a single master. The master device originates the frame for
|
||||||
|
reading and writing. Multiple slave devices are supported through selection
|
||||||
|
with individual slave select (SS) lines.
|
||||||
|
|
||||||
|
Features
|
||||||
|
--------
|
||||||
|
|
||||||
|
* Initialization/de-initialization
|
||||||
|
* Enabling/disabling
|
||||||
|
* Control of the following settings:
|
||||||
|
|
||||||
|
* Baudrate
|
||||||
|
* SPI mode
|
||||||
|
* Character size
|
||||||
|
* Data order
|
||||||
|
* Data transfer: transmission, reception and full-duplex
|
||||||
|
|
||||||
|
Applications
|
||||||
|
------------
|
||||||
|
|
||||||
|
Send/receive/exchange data with a SPI slave device. E.g., serial flash, SD card,
|
||||||
|
LCD controller, etc.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
------------
|
||||||
|
|
||||||
|
SPI master capable hardware
|
||||||
|
|
||||||
|
Concurrency
|
||||||
|
-----------
|
||||||
|
|
||||||
|
N/A
|
||||||
|
|
||||||
|
Limitations
|
||||||
|
-----------
|
||||||
|
|
||||||
|
The slave select (SS) is not automatically inserted during read/write/transfer,
|
||||||
|
user must use I/O to control the devices' SS.
|
||||||
|
|
||||||
|
Known issues and workarounds
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
N/A
|
||||||
|
|
||||||
72
hal/documentation/usart_async.rst
Normal file
72
hal/documentation/usart_async.rst
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
The USART Asynchronous Driver
|
||||||
|
=============================
|
||||||
|
|
||||||
|
The universal synchronous and asynchronous receiver and transmitter
|
||||||
|
(USART) is usually used to transfer data from one device to the other.
|
||||||
|
|
||||||
|
The USART driver use a ring buffer to store received data. When the USART
|
||||||
|
raise the data received interrupt, this data will be stored in the ring buffer
|
||||||
|
at the next free location. When the ring buffer is full, the next reception
|
||||||
|
will overwrite the oldest data stored in the ring buffer. There is one
|
||||||
|
USART_BUFFER_SIZE macro per used hardware instance, e.g. for SERCOM0 the macro
|
||||||
|
is called SERCOM0_USART_BUFFER_SIZE.
|
||||||
|
|
||||||
|
On the other hand, when sending data over USART, the data is not copied to an
|
||||||
|
internal buffer, but the data buffer supplied by the user is used. The callback
|
||||||
|
will only be generated at the end of the buffer and not for each byte.
|
||||||
|
|
||||||
|
User can set action for flow control pins by function usart_set_flow_control,
|
||||||
|
if the flow control is enabled. All the available states are defined in union
|
||||||
|
usart_flow_control_state.
|
||||||
|
|
||||||
|
Note that user can set state of flow control pins only if automatic support of
|
||||||
|
the flow control is not supported by the hardware.
|
||||||
|
|
||||||
|
Features
|
||||||
|
--------
|
||||||
|
|
||||||
|
* Initialization/de-initialization
|
||||||
|
* Enabling/disabling
|
||||||
|
* Control of the following settings:
|
||||||
|
|
||||||
|
* Baudrate
|
||||||
|
* UART or USRT communication mode
|
||||||
|
* Character size
|
||||||
|
* Data order
|
||||||
|
* Flow control
|
||||||
|
* Data transfer: transmission, reception
|
||||||
|
* Notifications about transfer done or error case via callbacks
|
||||||
|
* Status information with busy state and transfer count
|
||||||
|
|
||||||
|
Applications
|
||||||
|
------------
|
||||||
|
|
||||||
|
They are commonly used in a terminal application or low-speed communication
|
||||||
|
between devices.
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
------------
|
||||||
|
|
||||||
|
USART capable hardware, with interrupt on each character is sent or
|
||||||
|
received.
|
||||||
|
|
||||||
|
Concurrency
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Write buffer should not be changed while data is being sent.
|
||||||
|
|
||||||
|
|
||||||
|
Limitations
|
||||||
|
-----------
|
||||||
|
|
||||||
|
* The driver does not support 9-bit character size.
|
||||||
|
* The "USART with ISO7816" mode can be only used in ISO7816 capable devices.
|
||||||
|
And the SCK pin can't be set directly. Application can use a GCLK output PIN
|
||||||
|
to generate SCK. For example to communicate with a SMARTCARD with ISO7816
|
||||||
|
(F = 372 ; D = 1), and baudrate=9600, the SCK pin output frequency should be
|
||||||
|
config as 372*9600=3571200Hz. More information can be refer to ISO7816 Specification.
|
||||||
|
|
||||||
|
Known issues and workarounds
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
N/A
|
||||||
120
hal/include/hal_atomic.h
Normal file
120
hal/include/hal_atomic.h
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Critical sections related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HAL_ATOMIC_H_INCLUDED
|
||||||
|
#define _HAL_ATOMIC_H_INCLUDED
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup doc_driver_hal_helper_atomic
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Type for the register holding global interrupt enable flag
|
||||||
|
*/
|
||||||
|
typedef uint32_t hal_atomic_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Helper macro for entering critical sections
|
||||||
|
*
|
||||||
|
* This macro is recommended to be used instead of a direct call
|
||||||
|
* hal_enterCritical() function to enter critical
|
||||||
|
* sections. No semicolon is required after the macro.
|
||||||
|
*
|
||||||
|
* \section atomic_usage Usage Example
|
||||||
|
* \code
|
||||||
|
* CRITICAL_SECTION_ENTER()
|
||||||
|
* Critical code
|
||||||
|
* CRITICAL_SECTION_LEAVE()
|
||||||
|
* \endcode
|
||||||
|
*/
|
||||||
|
#define CRITICAL_SECTION_ENTER() \
|
||||||
|
{ \
|
||||||
|
volatile hal_atomic_t __atomic; \
|
||||||
|
atomic_enter_critical(&__atomic);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Helper macro for leaving critical sections
|
||||||
|
*
|
||||||
|
* This macro is recommended to be used instead of a direct call
|
||||||
|
* hal_leaveCritical() function to leave critical
|
||||||
|
* sections. No semicolon is required after the macro.
|
||||||
|
*/
|
||||||
|
#define CRITICAL_SECTION_LEAVE() \
|
||||||
|
atomic_leave_critical(&__atomic); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable interrupts, enter critical section
|
||||||
|
*
|
||||||
|
* Disables global interrupts. Supports nested critical sections,
|
||||||
|
* so that global interrupts are only re-enabled
|
||||||
|
* upon leaving the outermost nested critical section.
|
||||||
|
*
|
||||||
|
* \param[out] atomic The pointer to a variable to store the value of global
|
||||||
|
* interrupt enable flag
|
||||||
|
*/
|
||||||
|
void atomic_enter_critical(hal_atomic_t volatile *atomic);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Exit atomic section
|
||||||
|
*
|
||||||
|
* Enables global interrupts. Supports nested critical sections,
|
||||||
|
* so that global interrupts are only re-enabled
|
||||||
|
* upon leaving the outermost nested critical section.
|
||||||
|
*
|
||||||
|
* \param[in] atomic The pointer to a variable, which stores the latest stored
|
||||||
|
* value of the global interrupt enable flag
|
||||||
|
*/
|
||||||
|
void atomic_leave_critical(hal_atomic_t volatile *atomic);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the current driver version
|
||||||
|
*
|
||||||
|
* \return Current driver version.
|
||||||
|
*/
|
||||||
|
uint32_t atomic_get_version(void);
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _HAL_ATOMIC_H_INCLUDED */
|
||||||
89
hal/include/hal_delay.h
Normal file
89
hal/include/hal_delay.h
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief HAL delay related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <hpl_irq.h>
|
||||||
|
#include <hpl_reset.h>
|
||||||
|
#include <hpl_sleep.h>
|
||||||
|
|
||||||
|
#ifndef _HAL_DELAY_H_INCLUDED
|
||||||
|
#define _HAL_DELAY_H_INCLUDED
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup doc_driver_hal_delay Delay Driver
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize Delay driver
|
||||||
|
*
|
||||||
|
* \param[in] hw The pointer to hardware instance
|
||||||
|
*/
|
||||||
|
void delay_init(void *const hw);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Perform delay in us
|
||||||
|
*
|
||||||
|
* This function performs delay for the given amount of microseconds.
|
||||||
|
*
|
||||||
|
* \param[in] us The amount delay in us
|
||||||
|
*/
|
||||||
|
void delay_us(const uint16_t us);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Perform delay in ms
|
||||||
|
*
|
||||||
|
* This function performs delay for the given amount of milliseconds.
|
||||||
|
*
|
||||||
|
* \param[in] ms The amount delay in ms
|
||||||
|
*/
|
||||||
|
void delay_ms(const uint16_t ms);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the current driver version
|
||||||
|
*
|
||||||
|
* \return Current driver version.
|
||||||
|
*/
|
||||||
|
uint32_t delay_get_version(void);
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* _HAL_DELAY_H_INCLUDED */
|
||||||
118
hal/include/hal_ext_irq.h
Normal file
118
hal/include/hal_ext_irq.h
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief External interrupt functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HAL_EXT_IRQ_H_INCLUDED
|
||||||
|
#define _HAL_EXT_IRQ_H_INCLUDED
|
||||||
|
|
||||||
|
#include <hpl_ext_irq.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup doc_driver_hal_ext_irq
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief External IRQ callback type
|
||||||
|
*/
|
||||||
|
typedef void (*ext_irq_cb_t)(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize external IRQ component, if any
|
||||||
|
*
|
||||||
|
* \return Initialization status.
|
||||||
|
* \retval -1 External IRQ module is already initialized
|
||||||
|
* \retval 0 The initialization is completed successfully
|
||||||
|
*/
|
||||||
|
int32_t ext_irq_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Deinitialize external IRQ, if any
|
||||||
|
*
|
||||||
|
* \return De-initialization status.
|
||||||
|
* \retval -1 External IRQ module is already deinitialized
|
||||||
|
* \retval 0 The de-initialization is completed successfully
|
||||||
|
*/
|
||||||
|
int32_t ext_irq_deinit(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Register callback for the given external interrupt
|
||||||
|
*
|
||||||
|
* \param[in] pin Pin to enable external IRQ on
|
||||||
|
* \param[in] cb Callback function
|
||||||
|
*
|
||||||
|
* \return Registration status.
|
||||||
|
* \retval -1 Passed parameters were invalid
|
||||||
|
* \retval 0 The callback registration is completed successfully
|
||||||
|
*/
|
||||||
|
int32_t ext_irq_register(const uint32_t pin, ext_irq_cb_t cb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable external IRQ
|
||||||
|
*
|
||||||
|
* \param[in] pin Pin to enable external IRQ on
|
||||||
|
*
|
||||||
|
* \return Enabling status.
|
||||||
|
* \retval -1 Passed parameters were invalid
|
||||||
|
* \retval 0 The enabling is completed successfully
|
||||||
|
*/
|
||||||
|
int32_t ext_irq_enable(const uint32_t pin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable external IRQ
|
||||||
|
*
|
||||||
|
* \param[in] pin Pin to enable external IRQ on
|
||||||
|
*
|
||||||
|
* \return Disabling status.
|
||||||
|
* \retval -1 Passed parameters were invalid
|
||||||
|
* \retval 0 The disabling is completed successfully
|
||||||
|
*/
|
||||||
|
int32_t ext_irq_disable(const uint32_t pin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the current driver version
|
||||||
|
*
|
||||||
|
* \return Current driver version.
|
||||||
|
*/
|
||||||
|
uint32_t ext_irq_get_version(void);
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _HAL_EXT_IRQ_H_INCLUDED */
|
||||||
201
hal/include/hal_gpio.h
Normal file
201
hal/include/hal_gpio.h
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Port
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*/
|
||||||
|
#ifndef _HAL_GPIO_INCLUDED_
|
||||||
|
#define _HAL_GPIO_INCLUDED_
|
||||||
|
|
||||||
|
#include <hpl_gpio.h>
|
||||||
|
#include <utils_assert.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set gpio pull mode
|
||||||
|
*
|
||||||
|
* Set pin pull mode, non existing pull modes throws an fatal assert
|
||||||
|
*
|
||||||
|
* \param[in] pin The pin number for device
|
||||||
|
* \param[in] pull_mode GPIO_PULL_DOWN = Pull pin low with internal resistor
|
||||||
|
* GPIO_PULL_UP = Pull pin high with internal resistor
|
||||||
|
* GPIO_PULL_OFF = Disable pin pull mode
|
||||||
|
*/
|
||||||
|
static inline void gpio_set_pin_pull_mode(const uint8_t pin, const enum gpio_pull_mode pull_mode)
|
||||||
|
{
|
||||||
|
_gpio_set_pin_pull_mode((enum gpio_port)GPIO_PORT(pin), pin & 0x1F, pull_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set pin function
|
||||||
|
*
|
||||||
|
* Select which function a pin will be used for
|
||||||
|
*
|
||||||
|
* \param[in] pin The pin number for device
|
||||||
|
* \param[in] function The pin function is given by a 32-bit wide bitfield
|
||||||
|
* found in the header files for the device
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static inline void gpio_set_pin_function(const uint32_t pin, uint32_t function)
|
||||||
|
{
|
||||||
|
_gpio_set_pin_function(pin, function);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set port data direction
|
||||||
|
*
|
||||||
|
* Select if the pin data direction is input, output or disabled.
|
||||||
|
* If disabled state is not possible, this function throws an assert.
|
||||||
|
*
|
||||||
|
* \param[in] port Ports are grouped into groups of maximum 32 pins,
|
||||||
|
* GPIO_PORTA = group 0, GPIO_PORTB = group 1, etc
|
||||||
|
* \param[in] mask Bit mask where 1 means apply direction setting to the
|
||||||
|
* corresponding pin
|
||||||
|
* \param[in] direction GPIO_DIRECTION_IN = Data direction in
|
||||||
|
* GPIO_DIRECTION_OUT = Data direction out
|
||||||
|
* GPIO_DIRECTION_OFF = Disables the pin
|
||||||
|
* (low power state)
|
||||||
|
*/
|
||||||
|
static inline void gpio_set_port_direction(const enum gpio_port port, const uint32_t mask,
|
||||||
|
const enum gpio_direction direction)
|
||||||
|
{
|
||||||
|
_gpio_set_direction(port, mask, direction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set gpio data direction
|
||||||
|
*
|
||||||
|
* Select if the pin data direction is input, output or disabled.
|
||||||
|
* If disabled state is not possible, this function throws an assert.
|
||||||
|
*
|
||||||
|
* \param[in] pin The pin number for device
|
||||||
|
* \param[in] direction GPIO_DIRECTION_IN = Data direction in
|
||||||
|
* GPIO_DIRECTION_OUT = Data direction out
|
||||||
|
* GPIO_DIRECTION_OFF = Disables the pin
|
||||||
|
* (low power state)
|
||||||
|
*/
|
||||||
|
static inline void gpio_set_pin_direction(const uint8_t pin, const enum gpio_direction direction)
|
||||||
|
{
|
||||||
|
_gpio_set_direction((enum gpio_port)GPIO_PORT(pin), 1U << GPIO_PIN(pin), direction);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set port level
|
||||||
|
*
|
||||||
|
* Sets output level on the pins defined by the bit mask
|
||||||
|
*
|
||||||
|
* \param[in] port Ports are grouped into groups of maximum 32 pins,
|
||||||
|
* GPIO_PORTA = group 0, GPIO_PORTB = group 1, etc
|
||||||
|
* \param[in] mask Bit mask where 1 means apply port level to the corresponding
|
||||||
|
* pin
|
||||||
|
* \param[in] level true = Pin levels set to "high" state
|
||||||
|
* false = Pin levels set to "low" state
|
||||||
|
*/
|
||||||
|
static inline void gpio_set_port_level(const enum gpio_port port, const uint32_t mask, const bool level)
|
||||||
|
{
|
||||||
|
_gpio_set_level(port, mask, level);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set gpio level
|
||||||
|
*
|
||||||
|
* Sets output level on a pin
|
||||||
|
*
|
||||||
|
* \param[in] pin The pin number for device
|
||||||
|
* \param[in] level true = Pin level set to "high" state
|
||||||
|
* false = Pin level set to "low" state
|
||||||
|
*/
|
||||||
|
static inline void gpio_set_pin_level(const uint8_t pin, const bool level)
|
||||||
|
{
|
||||||
|
_gpio_set_level((enum gpio_port)GPIO_PORT(pin), 1U << GPIO_PIN(pin), level);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Toggle out level on pins
|
||||||
|
*
|
||||||
|
* Toggle the pin levels on pins defined by bit mask
|
||||||
|
*
|
||||||
|
* \param[in] port Ports are grouped into groups of maximum 32 pins,
|
||||||
|
* GPIO_PORTA = group 0, GPIO_PORTB = group 1, etc
|
||||||
|
* \param[in] mask Bit mask where 1 means toggle pin level to the corresponding
|
||||||
|
* pin
|
||||||
|
*/
|
||||||
|
static inline void gpio_toggle_port_level(const enum gpio_port port, const uint32_t mask)
|
||||||
|
{
|
||||||
|
_gpio_toggle_level(port, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Toggle output level on pin
|
||||||
|
*
|
||||||
|
* Toggle the pin levels on pins defined by bit mask
|
||||||
|
*
|
||||||
|
* \param[in] pin The pin number for device
|
||||||
|
*/
|
||||||
|
static inline void gpio_toggle_pin_level(const uint8_t pin)
|
||||||
|
{
|
||||||
|
_gpio_toggle_level((enum gpio_port)GPIO_PORT(pin), 1U << GPIO_PIN(pin));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Get input level on pins
|
||||||
|
*
|
||||||
|
* Read the input level on pins connected to a port
|
||||||
|
*
|
||||||
|
* \param[in] port Ports are grouped into groups of maximum 32 pins,
|
||||||
|
* GPIO_PORTA = group 0, GPIO_PORTB = group 1, etc
|
||||||
|
*/
|
||||||
|
static inline uint32_t gpio_get_port_level(const enum gpio_port port)
|
||||||
|
{
|
||||||
|
return _gpio_get_level(port);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Get level on pin
|
||||||
|
*
|
||||||
|
* Reads the level on pins connected to a port
|
||||||
|
*
|
||||||
|
* \param[in] pin The pin number for device
|
||||||
|
*/
|
||||||
|
static inline bool gpio_get_pin_level(const uint8_t pin)
|
||||||
|
{
|
||||||
|
return (bool)(_gpio_get_level((enum gpio_port)GPIO_PORT(pin)) & (0x01U << GPIO_PIN(pin)));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* \brief Get current driver version
|
||||||
|
*/
|
||||||
|
uint32_t gpio_get_version(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
72
hal/include/hal_init.h
Normal file
72
hal/include/hal_init.h
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief HAL initialization related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HAL_INIT_H_INCLUDED
|
||||||
|
#define _HAL_INIT_H_INCLUDED
|
||||||
|
|
||||||
|
#include <hpl_init.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup doc_driver_hal_helper_init Init Driver
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize the hardware abstraction layer
|
||||||
|
*
|
||||||
|
* This function calls the various initialization functions.
|
||||||
|
* Currently the following initialization functions are supported:
|
||||||
|
* - System clock initialization
|
||||||
|
*/
|
||||||
|
static inline void init_mcu(void)
|
||||||
|
{
|
||||||
|
_init_chip();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the current driver version
|
||||||
|
*
|
||||||
|
* \return Current driver version.
|
||||||
|
*/
|
||||||
|
uint32_t init_get_version(void);
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* _HAL_INIT_H_INCLUDED */
|
||||||
110
hal/include/hal_io.h
Normal file
110
hal/include/hal_io.h
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief I/O related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HAL_IO_INCLUDED
|
||||||
|
#define _HAL_IO_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup doc_driver_hal_helper_io I/O Driver
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief I/O descriptor
|
||||||
|
*
|
||||||
|
* The I/O descriptor forward declaration.
|
||||||
|
*/
|
||||||
|
struct io_descriptor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief I/O write function pointer type
|
||||||
|
*/
|
||||||
|
typedef int32_t (*io_write_t)(struct io_descriptor *const io_descr, const uint8_t *const buf, const uint16_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief I/O read function pointer type
|
||||||
|
*/
|
||||||
|
typedef int32_t (*io_read_t)(struct io_descriptor *const io_descr, uint8_t *const buf, const uint16_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief I/O descriptor
|
||||||
|
*/
|
||||||
|
struct io_descriptor {
|
||||||
|
io_write_t write; /*! The write function pointer. */
|
||||||
|
io_read_t read; /*! The read function pointer. */
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief I/O write interface
|
||||||
|
*
|
||||||
|
* This function writes up to \p length of bytes to a given I/O descriptor.
|
||||||
|
* It returns the number of bytes actually write.
|
||||||
|
*
|
||||||
|
* \param[in] descr An I/O descriptor to write
|
||||||
|
* \param[in] buf The buffer pointer to story the write data
|
||||||
|
* \param[in] length The number of bytes to write
|
||||||
|
*
|
||||||
|
* \return The number of bytes written
|
||||||
|
*/
|
||||||
|
int32_t io_write(struct io_descriptor *const io_descr, const uint8_t *const buf, const uint16_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief I/O read interface
|
||||||
|
*
|
||||||
|
* This function reads up to \p length bytes from a given I/O descriptor, and
|
||||||
|
* stores it in the buffer pointed to by \p buf. It returns the number of bytes
|
||||||
|
* actually read.
|
||||||
|
*
|
||||||
|
* \param[in] descr An I/O descriptor to read
|
||||||
|
* \param[in] buf The buffer pointer to story the read data
|
||||||
|
* \param[in] length The number of bytes to read
|
||||||
|
*
|
||||||
|
* \return The number of bytes actually read. This number can be less than the
|
||||||
|
* requested length. E.g., in a driver that uses ring buffer for
|
||||||
|
* reception, it may depend on the availability of data in the
|
||||||
|
* ring buffer.
|
||||||
|
*/
|
||||||
|
int32_t io_read(struct io_descriptor *const io_descr, uint8_t *const buf, const uint16_t length);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**@}*/
|
||||||
|
#endif /* _HAL_IO_INCLUDED */
|
||||||
74
hal/include/hal_sleep.h
Normal file
74
hal/include/hal_sleep.h
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Sleep related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HAL_SLEEP_H_INCLUDED
|
||||||
|
#define _HAL_SLEEP_H_INCLUDED
|
||||||
|
|
||||||
|
#include <hpl_sleep.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup doc_driver_hal_helper_sleep
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set the sleep mode of the device and put the MCU to sleep
|
||||||
|
*
|
||||||
|
* For an overview of which systems are disabled in sleep for the different
|
||||||
|
* sleep modes, see the data sheet.
|
||||||
|
*
|
||||||
|
* \param[in] mode Sleep mode to use
|
||||||
|
*
|
||||||
|
* \return The status of a sleep request
|
||||||
|
* \retval -1 The requested sleep mode was invalid or not available
|
||||||
|
* \retval 0 The operation completed successfully, returned after leaving the
|
||||||
|
* sleep
|
||||||
|
*/
|
||||||
|
int sleep(const uint8_t mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the current driver version
|
||||||
|
*
|
||||||
|
* \return Current driver version.
|
||||||
|
*/
|
||||||
|
uint32_t sleep_get_version(void);
|
||||||
|
/**@}*/
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* _HAL_SLEEP_H_INCLUDED */
|
||||||
221
hal/include/hal_spi_m_sync.h
Normal file
221
hal/include/hal_spi_m_sync.h
Normal file
@ -0,0 +1,221 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief SPI related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HAL_SPI_M_SYNC_H_INCLUDED
|
||||||
|
#define _HAL_SPI_M_SYNC_H_INCLUDED
|
||||||
|
|
||||||
|
#include <hal_io.h>
|
||||||
|
#include <hpl_spi_m_sync.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup doc_driver_hal_spi_master_sync
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \brief SPI HAL driver struct for polling mode
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
struct spi_m_sync_descriptor {
|
||||||
|
struct _spi_m_sync_hpl_interface *func;
|
||||||
|
/** SPI device instance */
|
||||||
|
struct _spi_sync_dev dev;
|
||||||
|
/** I/O read/write */
|
||||||
|
struct io_descriptor io;
|
||||||
|
/** Flags for HAL driver */
|
||||||
|
uint16_t flags;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** \brief Set the SPI HAL instance function pointer for HPL APIs.
|
||||||
|
*
|
||||||
|
* Set SPI HAL instance function pointer for HPL APIs.
|
||||||
|
*
|
||||||
|
* \param[in] spi Pointer to the HAL SPI instance.
|
||||||
|
* \param[in] func Pointer to the HPL api structure.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void spi_m_sync_set_func_ptr(struct spi_m_sync_descriptor *spi, void *const func);
|
||||||
|
|
||||||
|
/** \brief Initialize SPI HAL instance and hardware for polling mode
|
||||||
|
*
|
||||||
|
* Initialize SPI HAL with polling mode.
|
||||||
|
*
|
||||||
|
* \param[in] spi Pointer to the HAL SPI instance.
|
||||||
|
* \param[in] hw Pointer to the hardware base.
|
||||||
|
*
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_NONE Success.
|
||||||
|
* \retval ERR_INVALID_DATA Error, initialized.
|
||||||
|
*/
|
||||||
|
int32_t spi_m_sync_init(struct spi_m_sync_descriptor *spi, void *const hw);
|
||||||
|
|
||||||
|
/** \brief Deinitialize the SPI HAL instance and hardware
|
||||||
|
*
|
||||||
|
* Abort transfer, disable and reset SPI, deinit software.
|
||||||
|
*
|
||||||
|
* \param[in] spi Pointer to the HAL SPI instance.
|
||||||
|
*
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_NONE Success.
|
||||||
|
* \retval <0 Error code.
|
||||||
|
*/
|
||||||
|
void spi_m_sync_deinit(struct spi_m_sync_descriptor *spi);
|
||||||
|
|
||||||
|
/** \brief Enable SPI
|
||||||
|
*
|
||||||
|
* \param[in] spi Pointer to the HAL SPI instance.
|
||||||
|
*
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_NONE Success.
|
||||||
|
* \retval <0 Error code.
|
||||||
|
*/
|
||||||
|
void spi_m_sync_enable(struct spi_m_sync_descriptor *spi);
|
||||||
|
|
||||||
|
/** \brief Disable SPI
|
||||||
|
*
|
||||||
|
* \param[in] spi Pointer to the HAL SPI instance.
|
||||||
|
*
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_NONE Success.
|
||||||
|
* \retval <0 Error code.
|
||||||
|
*/
|
||||||
|
void spi_m_sync_disable(struct spi_m_sync_descriptor *spi);
|
||||||
|
|
||||||
|
/** \brief Set SPI baudrate
|
||||||
|
*
|
||||||
|
* Works if SPI is initialized as master, it sets the baudrate.
|
||||||
|
*
|
||||||
|
* \param[in] spi Pointer to the HAL SPI instance.
|
||||||
|
* \param[in] baud_val The target baudrate value
|
||||||
|
* (see "baudrate calculation" for calculating the value).
|
||||||
|
*
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_NONE Success.
|
||||||
|
* \retval ERR_BUSY Busy
|
||||||
|
* \retval ERR_INVALID_ARG The baudrate is not supported.
|
||||||
|
*/
|
||||||
|
int32_t spi_m_sync_set_baudrate(struct spi_m_sync_descriptor *spi, const uint32_t baud_val);
|
||||||
|
|
||||||
|
/** \brief Set SPI mode
|
||||||
|
*
|
||||||
|
* Set the SPI transfer mode (\ref spi_transfer_mode),
|
||||||
|
* which controls the clock polarity and clock phase:
|
||||||
|
* - Mode 0: leading edge is rising edge, data sample on leading edge.
|
||||||
|
* - Mode 1: leading edge is rising edge, data sample on trailing edge.
|
||||||
|
* - Mode 2: leading edge is falling edge, data sample on leading edge.
|
||||||
|
* - Mode 3: leading edge is falling edge, data sample on trailing edge.
|
||||||
|
*
|
||||||
|
* \param[in] spi Pointer to the HAL SPI instance.
|
||||||
|
* \param[in] mode The mode (0~3).
|
||||||
|
*
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_NONE Success.
|
||||||
|
* \retval ERR_BUSY Busy
|
||||||
|
* \retval ERR_INVALID_ARG The mode is not supported.
|
||||||
|
*/
|
||||||
|
int32_t spi_m_sync_set_mode(struct spi_m_sync_descriptor *spi, const enum spi_transfer_mode mode);
|
||||||
|
|
||||||
|
/** \brief Set SPI transfer character size in number of bits
|
||||||
|
*
|
||||||
|
* The character size (\ref spi_char_size) influence the way the data is
|
||||||
|
* sent/received.
|
||||||
|
* For char size <= 8-bit, data is stored byte by byte.
|
||||||
|
* For char size between 9-bit ~ 16-bit, data is stored in 2-byte length.
|
||||||
|
* Note that the default and recommended char size is 8-bit since it's
|
||||||
|
* supported by all system.
|
||||||
|
*
|
||||||
|
* \param[in] spi Pointer to the HAL SPI instance.
|
||||||
|
* \param[in] char_size The char size (~16, recommended 8).
|
||||||
|
*
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_NONE Success.
|
||||||
|
* \retval ERR_BUSY Busy
|
||||||
|
* \retval ERR_INVALID_ARG The char size is not supported.
|
||||||
|
*/
|
||||||
|
int32_t spi_m_sync_set_char_size(struct spi_m_sync_descriptor *spi, const enum spi_char_size char_size);
|
||||||
|
|
||||||
|
/** \brief Set SPI transfer data order
|
||||||
|
*
|
||||||
|
* \param[in] spi Pointer to the HAL SPI instance.
|
||||||
|
* \param[in] dord The data order: send LSB/MSB first.
|
||||||
|
*
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_NONE Success.
|
||||||
|
* \retval ERR_BUSY Busy
|
||||||
|
* \retval ERR_INVALID_ARG The data order is not supported.
|
||||||
|
*/
|
||||||
|
int32_t spi_m_sync_set_data_order(struct spi_m_sync_descriptor *spi, const enum spi_data_order dord);
|
||||||
|
|
||||||
|
/** \brief Perform the SPI data transfer (TX and RX) in polling way
|
||||||
|
*
|
||||||
|
* Activate CS, do TX and RX and deactivate CS. It blocks.
|
||||||
|
*
|
||||||
|
* \param[in, out] spi Pointer to the HAL SPI instance.
|
||||||
|
* \param[in] xfer Pointer to the transfer information (\ref spi_xfer).
|
||||||
|
*
|
||||||
|
* \retval size Success.
|
||||||
|
* \retval >=0 Timeout, with number of characters transferred.
|
||||||
|
* \retval ERR_BUSY SPI is busy
|
||||||
|
*/
|
||||||
|
int32_t spi_m_sync_transfer(struct spi_m_sync_descriptor *spi, const struct spi_xfer *xfer);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Return the I/O descriptor for this SPI instance
|
||||||
|
*
|
||||||
|
* This function will return an I/O instance for this SPI driver instance.
|
||||||
|
*
|
||||||
|
* \param[in] spi An SPI master descriptor, which is used to communicate through
|
||||||
|
* SPI
|
||||||
|
* \param[in, out] io A pointer to an I/O descriptor pointer type
|
||||||
|
*
|
||||||
|
* \retval ERR_NONE
|
||||||
|
*/
|
||||||
|
int32_t spi_m_sync_get_io_descriptor(struct spi_m_sync_descriptor *const spi, struct io_descriptor **io);
|
||||||
|
|
||||||
|
/** \brief Retrieve the current driver version
|
||||||
|
*
|
||||||
|
* \return Current driver version.
|
||||||
|
*/
|
||||||
|
uint32_t spi_m_sync_get_version(void);
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _HAL_SPI_M_SYNC_H_INCLUDED */
|
||||||
339
hal/include/hal_usart_async.h
Normal file
339
hal/include/hal_usart_async.h
Normal file
@ -0,0 +1,339 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief USART related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HAL_USART_ASYNC_H_INCLUDED
|
||||||
|
#define _HAL_USART_ASYNC_H_INCLUDED
|
||||||
|
|
||||||
|
#include "hal_io.h"
|
||||||
|
#include <hpl_usart_async.h>
|
||||||
|
#include <utils_ringbuffer.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup doc_driver_hal_usart_async
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART descriptor
|
||||||
|
*
|
||||||
|
* The USART descriptor forward declaration.
|
||||||
|
*/
|
||||||
|
struct usart_async_descriptor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART callback type
|
||||||
|
*/
|
||||||
|
typedef void (*usart_cb_t)(const struct usart_async_descriptor *const descr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART callback types
|
||||||
|
*/
|
||||||
|
enum usart_async_callback_type { USART_ASYNC_RXC_CB, USART_ASYNC_TXC_CB, USART_ASYNC_ERROR_CB };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART callbacks
|
||||||
|
*/
|
||||||
|
struct usart_async_callbacks {
|
||||||
|
usart_cb_t tx_done;
|
||||||
|
usart_cb_t rx_done;
|
||||||
|
usart_cb_t error;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** \brief USART status
|
||||||
|
* Status descriptor holds the current status of transfer.
|
||||||
|
*/
|
||||||
|
struct usart_async_status {
|
||||||
|
/** Status flags */
|
||||||
|
uint32_t flags;
|
||||||
|
/** Number of characters transmitted */
|
||||||
|
uint16_t txcnt;
|
||||||
|
/** Number of characters receviced */
|
||||||
|
uint16_t rxcnt;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Asynchronous USART descriptor structure
|
||||||
|
*/
|
||||||
|
struct usart_async_descriptor {
|
||||||
|
struct io_descriptor io;
|
||||||
|
struct _usart_async_device device;
|
||||||
|
struct usart_async_callbacks usart_cb;
|
||||||
|
uint32_t stat;
|
||||||
|
|
||||||
|
struct ringbuffer rx;
|
||||||
|
uint16_t tx_por;
|
||||||
|
uint8_t * tx_buffer;
|
||||||
|
uint16_t tx_buffer_length;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** USART write busy */
|
||||||
|
#define USART_ASYNC_STATUS_BUSY 0x0001
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize USART interface
|
||||||
|
*
|
||||||
|
* This function initializes the given I/O descriptor to be used as USART
|
||||||
|
* interface descriptor.
|
||||||
|
* It checks if the given hardware is not initialized and if the given hardware
|
||||||
|
* is permitted to be initialized.
|
||||||
|
*
|
||||||
|
* \param[out] descr A USART descriptor which is used to communicate via the USART
|
||||||
|
* \param[in] hw The pointer to the hardware instance
|
||||||
|
* \param[in] rx_buffer An RX buffer
|
||||||
|
* \param[in] rx_buffer_length The length of the buffer above
|
||||||
|
* \param[in] func The pointer to a set of function pointers
|
||||||
|
*
|
||||||
|
* \return Initialization status.
|
||||||
|
* \retval -1 Passed parameters were invalid or the interface is already
|
||||||
|
* initialized
|
||||||
|
* \retval 0 The initialization is completed successfully
|
||||||
|
*/
|
||||||
|
int32_t usart_async_init(struct usart_async_descriptor *const descr, void *const hw, uint8_t *const rx_buffer,
|
||||||
|
const uint16_t rx_buffer_length, void *const func);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Deinitialize USART interface
|
||||||
|
*
|
||||||
|
* This function deinitializes the given I/O descriptor.
|
||||||
|
* It checks if the given hardware is initialized and if the given hardware
|
||||||
|
* is permitted to be deinitialized.
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
*
|
||||||
|
* \return De-initialization status.
|
||||||
|
*/
|
||||||
|
int32_t usart_async_deinit(struct usart_async_descriptor *const descr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable USART interface
|
||||||
|
*
|
||||||
|
* Enables the USART interface
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
*
|
||||||
|
* \return Enabling status.
|
||||||
|
*/
|
||||||
|
int32_t usart_async_enable(struct usart_async_descriptor *const descr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable USART interface
|
||||||
|
*
|
||||||
|
* Disables the USART interface
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
*
|
||||||
|
* \return Disabling status.
|
||||||
|
*/
|
||||||
|
int32_t usart_async_disable(struct usart_async_descriptor *const descr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve I/O descriptor
|
||||||
|
*
|
||||||
|
* This function retrieves the I/O descriptor of the given USART descriptor.
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
* \param[out] io An I/O descriptor to retrieve
|
||||||
|
*
|
||||||
|
* \return The status of I/O descriptor retrieving.
|
||||||
|
*/
|
||||||
|
int32_t usart_async_get_io_descriptor(struct usart_async_descriptor *const descr, struct io_descriptor **io);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Register USART callback
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
* \param[in] type Callback type
|
||||||
|
* \param[in] cb A callback function
|
||||||
|
*
|
||||||
|
* \return The status of callback assignment.
|
||||||
|
* \retval -1 Passed parameters were invalid or the interface is not initialized
|
||||||
|
* \retval 0 A callback is registered successfully
|
||||||
|
*/
|
||||||
|
int32_t usart_async_register_callback(struct usart_async_descriptor *const descr,
|
||||||
|
const enum usart_async_callback_type type, usart_cb_t cb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Specify action for flow control pins
|
||||||
|
*
|
||||||
|
* This function sets action (or state) for flow control pins if
|
||||||
|
* the flow control is enabled.
|
||||||
|
* It sets state of flow control pins only if automatic support of
|
||||||
|
* the flow control is not supported by the hardware.
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
* \param[in] state A state to set the flow control pins
|
||||||
|
*
|
||||||
|
* \return The status of flow control action setup.
|
||||||
|
*/
|
||||||
|
int32_t usart_async_set_flow_control(struct usart_async_descriptor *const descr,
|
||||||
|
const union usart_flow_control_state state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set USART baud rate
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
* \param[in] baud_rate A baud rate to set
|
||||||
|
*
|
||||||
|
* \return The status of baud rate setting.
|
||||||
|
*/
|
||||||
|
int32_t usart_async_set_baud_rate(struct usart_async_descriptor *const descr, const uint32_t baud_rate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set USART data order
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
* \param[in] data_order A data order to set
|
||||||
|
*
|
||||||
|
* \return The status of data order setting.
|
||||||
|
*/
|
||||||
|
int32_t usart_async_set_data_order(struct usart_async_descriptor *const descr, const enum usart_data_order data_order);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set USART mode
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
* \param[in] mode A mode to set
|
||||||
|
*
|
||||||
|
* \return The status of mode setting.
|
||||||
|
*/
|
||||||
|
int32_t usart_async_set_mode(struct usart_async_descriptor *const descr, const enum usart_mode mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set USART parity
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
* \param[in] parity A parity to set
|
||||||
|
*
|
||||||
|
* \return The status of parity setting.
|
||||||
|
*/
|
||||||
|
int32_t usart_async_set_parity(struct usart_async_descriptor *const descr, const enum usart_parity parity);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set USART stop bits
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
* \param[in] stop_bits Stop bits to set
|
||||||
|
*
|
||||||
|
* \return The status of stop bits setting.
|
||||||
|
*/
|
||||||
|
int32_t usart_async_set_stopbits(struct usart_async_descriptor *const descr, const enum usart_stop_bits stop_bits);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set USART character size
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
* \param[in] size A character size to set
|
||||||
|
*
|
||||||
|
* \return The status of character size setting.
|
||||||
|
*/
|
||||||
|
int32_t usart_async_set_character_size(struct usart_async_descriptor *const descr,
|
||||||
|
const enum usart_character_size size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the state of flow control pins
|
||||||
|
*
|
||||||
|
* This function retrieves the flow control pins
|
||||||
|
* if the flow control is enabled.
|
||||||
|
*
|
||||||
|
* The function can return USART_FLOW_CONTROL_STATE_UNAVAILABLE in case
|
||||||
|
* if the flow control is done by the hardware
|
||||||
|
* and the pins state cannot be read out.
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
* \param[out] state The state of flow control pins
|
||||||
|
*
|
||||||
|
* \return The status of flow control state reading.
|
||||||
|
*/
|
||||||
|
int32_t usart_async_flow_control_status(const struct usart_async_descriptor *const descr,
|
||||||
|
union usart_flow_control_state *const state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if the USART transmitter is empty
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
*
|
||||||
|
* \return The status of USART TX empty checking.
|
||||||
|
* \retval 0 The USART transmitter is not empty
|
||||||
|
* \retval 1 The USART transmitter is empty
|
||||||
|
*/
|
||||||
|
int32_t usart_async_is_tx_empty(const struct usart_async_descriptor *const descr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if the USART receiver is not empty
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
*
|
||||||
|
* \return The status of the USART RX empty checking.
|
||||||
|
* \retval 1 The USART receiver is not empty
|
||||||
|
* \retval 0 The USART receiver is empty
|
||||||
|
*/
|
||||||
|
int32_t usart_async_is_rx_not_empty(const struct usart_async_descriptor *const descr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the current interface status
|
||||||
|
*
|
||||||
|
* \param[in] descr A USART descriptor which is used to communicate via USART
|
||||||
|
* \param[out] status The state of USART
|
||||||
|
*
|
||||||
|
* \return The status of USART status retrieving.
|
||||||
|
*/
|
||||||
|
int32_t usart_async_get_status(struct usart_async_descriptor *const descr, struct usart_async_status *const status);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief flush USART ringbuf
|
||||||
|
*
|
||||||
|
* This function flush USART RX ringbuf.
|
||||||
|
*
|
||||||
|
* \param[in] descr The pointer to USART descriptor
|
||||||
|
*
|
||||||
|
* \return ERR_NONE
|
||||||
|
*/
|
||||||
|
int32_t usart_async_flush_rx_buffer(struct usart_async_descriptor *const descr);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the current driver version
|
||||||
|
*
|
||||||
|
* \return Current driver version.
|
||||||
|
*/
|
||||||
|
uint32_t usart_async_get_version(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**@}*/
|
||||||
|
#endif /* _HAL_USART_ASYNC_H_INCLUDED */
|
||||||
56
hal/include/hpl_core.h
Normal file
56
hal/include/hpl_core.h
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief CPU core related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_CORE_H_INCLUDED
|
||||||
|
#define _HPL_CORE_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup HPL Core
|
||||||
|
*
|
||||||
|
* \section hpl_core_rev Revision History
|
||||||
|
* - v1.0.0 Initial Release
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hpl_core_port.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**@}*/
|
||||||
|
#endif /* _HPL_CORE_H_INCLUDED */
|
||||||
97
hal/include/hpl_delay.h
Normal file
97
hal/include/hpl_delay.h
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Delay related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_DELAY_H_INCLUDED
|
||||||
|
#define _HPL_DELAY_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup HPL Delay
|
||||||
|
*
|
||||||
|
* \section hpl_delay_rev Revision History
|
||||||
|
* - v1.0.0 Initial Release
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _UNIT_TEST_
|
||||||
|
#include <compiler.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize delay functionality
|
||||||
|
*
|
||||||
|
* \param[in] hw The pointer to hardware instance
|
||||||
|
*/
|
||||||
|
void _delay_init(void *const hw);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the amount of cycles to delay for the given amount of us
|
||||||
|
*
|
||||||
|
* \param[in] us The amount of us to delay for
|
||||||
|
*
|
||||||
|
* \return The amount of cycles
|
||||||
|
*/
|
||||||
|
uint32_t _get_cycles_for_us(const uint16_t us);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the amount of cycles to delay for the given amount of ms
|
||||||
|
*
|
||||||
|
* \param[in] ms The amount of ms to delay for
|
||||||
|
*
|
||||||
|
* \return The amount of cycles
|
||||||
|
*/
|
||||||
|
uint32_t _get_cycles_for_ms(const uint16_t ms);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Delay loop to delay n number of cycles
|
||||||
|
*
|
||||||
|
* \param[in] hw The pointer to hardware instance
|
||||||
|
* \param[in] cycles The amount of cycles to delay for
|
||||||
|
*/
|
||||||
|
void _delay_cycles(void *const hw, uint32_t cycles);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**@}*/
|
||||||
|
#endif /* _HPL_DELAY_H_INCLUDED */
|
||||||
176
hal/include/hpl_dma.h
Normal file
176
hal/include/hpl_dma.h
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief DMA related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_DMA_H_INCLUDED
|
||||||
|
#define _HPL_DMA_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup HPL DMA
|
||||||
|
*
|
||||||
|
* \section hpl_dma_rev Revision History
|
||||||
|
* - v1.0.0 Initial Release
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
#include <hpl_irq.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct _dma_resource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief DMA callback types
|
||||||
|
*/
|
||||||
|
enum _dma_callback_type { DMA_TRANSFER_COMPLETE_CB, DMA_TRANSFER_ERROR_CB };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief DMA interrupt callbacks
|
||||||
|
*/
|
||||||
|
struct _dma_callbacks {
|
||||||
|
void (*transfer_done)(struct _dma_resource *resource);
|
||||||
|
void (*error)(struct _dma_resource *resource);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief DMA resource structure
|
||||||
|
*/
|
||||||
|
struct _dma_resource {
|
||||||
|
struct _dma_callbacks dma_cb;
|
||||||
|
void * back;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize DMA
|
||||||
|
*
|
||||||
|
* This function does low level DMA configuration.
|
||||||
|
*
|
||||||
|
* \return initialize status
|
||||||
|
*/
|
||||||
|
int32_t _dma_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set destination address
|
||||||
|
*
|
||||||
|
* \param[in] channel DMA channel to set destination address for
|
||||||
|
* \param[in] dst Destination address
|
||||||
|
*
|
||||||
|
* \return setting status
|
||||||
|
*/
|
||||||
|
int32_t _dma_set_destination_address(const uint8_t channel, const void *const dst);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set source address
|
||||||
|
*
|
||||||
|
* \param[in] channel DMA channel to set source address for
|
||||||
|
* \param[in] src Source address
|
||||||
|
*
|
||||||
|
* \return setting status
|
||||||
|
*/
|
||||||
|
int32_t _dma_set_source_address(const uint8_t channel, const void *const src);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set next descriptor address
|
||||||
|
*
|
||||||
|
* \param[in] current_channel Current DMA channel to set next descriptor address
|
||||||
|
* \param[in] next_channel Next DMA channel used as next descriptor
|
||||||
|
*
|
||||||
|
* \return setting status
|
||||||
|
*/
|
||||||
|
int32_t _dma_set_next_descriptor(const uint8_t current_channel, const uint8_t next_channel);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable/disable source address incrementation during DMA transaction
|
||||||
|
*
|
||||||
|
* \param[in] channel DMA channel to set source address for
|
||||||
|
* \param[in] enable True to enable, false to disable
|
||||||
|
*
|
||||||
|
* \return status of operation
|
||||||
|
*/
|
||||||
|
int32_t _dma_srcinc_enable(const uint8_t channel, const bool enable);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable/disable Destination address incrementation during DMA transaction
|
||||||
|
*
|
||||||
|
* \param[in] channel DMA channel to set destination address for
|
||||||
|
* \param[in] enable True to enable, false to disable
|
||||||
|
*
|
||||||
|
* \return status of operation
|
||||||
|
*/
|
||||||
|
int32_t _dma_dstinc_enable(const uint8_t channel, const bool enable);
|
||||||
|
/**
|
||||||
|
* \brief Set the amount of data to be transfered per transaction
|
||||||
|
*
|
||||||
|
* \param[in] channel DMA channel to set data amount for
|
||||||
|
* \param[in] amount Data amount
|
||||||
|
*
|
||||||
|
* \return status of operation
|
||||||
|
*/
|
||||||
|
int32_t _dma_set_data_amount(const uint8_t channel, const uint32_t amount);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Trigger DMA transaction on the given channel
|
||||||
|
*
|
||||||
|
* \param[in] channel DMA channel to trigger transaction on
|
||||||
|
*
|
||||||
|
* \return status of operation
|
||||||
|
*/
|
||||||
|
int32_t _dma_enable_transaction(const uint8_t channel, const bool software_trigger);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieves DMA resource structure
|
||||||
|
*
|
||||||
|
* \param[out] resource The resource to be retrieved
|
||||||
|
* \param[in] channel DMA channel to retrieve structure for
|
||||||
|
*
|
||||||
|
* \return status of operation
|
||||||
|
*/
|
||||||
|
int32_t _dma_get_channel_resource(struct _dma_resource **resource, const uint8_t channel);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable/disable DMA interrupt
|
||||||
|
*
|
||||||
|
* \param[in] channel DMA channel to enable/disable interrupt for
|
||||||
|
* \param[in] type The type of interrupt to disable/enable if applicable
|
||||||
|
* \param[in] state Enable or disable
|
||||||
|
*/
|
||||||
|
void _dma_set_irq_state(const uint8_t channel, const enum _dma_callback_type type, const bool state);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* HPL_DMA_H_INCLUDED */
|
||||||
95
hal/include/hpl_ext_irq.h
Normal file
95
hal/include/hpl_ext_irq.h
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief External IRQ related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_EXT_IRQ_H_INCLUDED
|
||||||
|
#define _HPL_EXT_IRQ_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup HPL EXT IRQ
|
||||||
|
*
|
||||||
|
* \section hpl_ext_irq_rev Revision History
|
||||||
|
* - v1.0.0 Initial Release
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
* \brief Initialize external interrupt module
|
||||||
|
*
|
||||||
|
* This function does low level external interrupt configuration.
|
||||||
|
*
|
||||||
|
* \param[in] cb The pointer to callback function from external interrupt
|
||||||
|
*
|
||||||
|
* \return Initialization status.
|
||||||
|
* \retval -1 External irq module is already initialized
|
||||||
|
* \retval 0 The initialization is completed successfully
|
||||||
|
*/
|
||||||
|
int32_t _ext_irq_init(void (*cb)(const uint32_t pin));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Deinitialize external interrupt module
|
||||||
|
*
|
||||||
|
* \return Initialization status.
|
||||||
|
* \retval -1 External irq module is already deinitialized
|
||||||
|
* \retval 0 The de-initialization is completed successfully
|
||||||
|
*/
|
||||||
|
int32_t _ext_irq_deinit(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable / disable external irq
|
||||||
|
*
|
||||||
|
* \param[in] pin Pin to enable external irq on
|
||||||
|
* \param[in] enable True to enable, false to disable
|
||||||
|
*
|
||||||
|
* \return Status of external irq enabling / disabling
|
||||||
|
* \retval -1 External irq module can't be enabled / disabled
|
||||||
|
* \retval 0 External irq module is enabled / disabled successfully
|
||||||
|
*/
|
||||||
|
int32_t _ext_irq_enable(const uint32_t pin, const bool enable);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**@}*/
|
||||||
|
#endif /* _HPL_EXT_IRQ_H_INCLUDED */
|
||||||
185
hal/include/hpl_gpio.h
Normal file
185
hal/include/hpl_gpio.h
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Port related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_GPIO_H_INCLUDED
|
||||||
|
#define _HPL_GPIO_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup HPL Port
|
||||||
|
*
|
||||||
|
* \section hpl_port_rev Revision History
|
||||||
|
* - v1.0.0 Initial Release
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* \brief Macros for the pin and port group, lower 5
|
||||||
|
* bits stands for pin number in the group, higher 3
|
||||||
|
* bits stands for port group
|
||||||
|
*/
|
||||||
|
#define GPIO_PIN(n) (((n)&0x1Fu) << 0)
|
||||||
|
#define GPIO_PORT(n) ((n) >> 5)
|
||||||
|
#define GPIO(port, pin) ((((port)&0x7u) << 5) + ((pin)&0x1Fu))
|
||||||
|
#define GPIO_PIN_FUNCTION_OFF 0xffffffff
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief PORT pull mode settings
|
||||||
|
*/
|
||||||
|
enum gpio_pull_mode { GPIO_PULL_OFF, GPIO_PULL_UP, GPIO_PULL_DOWN };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief PORT direction settins
|
||||||
|
*/
|
||||||
|
enum gpio_direction { GPIO_DIRECTION_OFF, GPIO_DIRECTION_IN, GPIO_DIRECTION_OUT };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief PORT group abstraction
|
||||||
|
*/
|
||||||
|
|
||||||
|
enum gpio_port { GPIO_PORTA, GPIO_PORTB, GPIO_PORTC, GPIO_PORTD, GPIO_PORTE };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
* \brief Port initialization function
|
||||||
|
*
|
||||||
|
* Port initialization function should setup the port module based
|
||||||
|
* on a static configuration file, this function should normally
|
||||||
|
* not be called directly, but is a part of hal_init()
|
||||||
|
*/
|
||||||
|
void _gpio_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set direction on port with mask
|
||||||
|
*
|
||||||
|
* Set data direction for each pin, or disable the pin
|
||||||
|
*
|
||||||
|
* \param[in] port Ports are grouped into groups of maximum 32 pins,
|
||||||
|
* GPIO_PORTA = group 0, GPIO_PORTB = group 1, etc
|
||||||
|
* \param[in] mask Bit mask where 1 means apply direction setting to the
|
||||||
|
* corresponding pin
|
||||||
|
* \param[in] direction GPIO_DIRECTION_OFF = set pin direction to input
|
||||||
|
* and disable input buffer to disable the pin
|
||||||
|
* GPIO_DIRECTION_IN = set pin direction to input
|
||||||
|
* and enable input buffer to enable the pin
|
||||||
|
* GPIO_DIRECTION_OUT = set pin direction to output
|
||||||
|
* and disable input buffer
|
||||||
|
*/
|
||||||
|
static inline void _gpio_set_direction(const enum gpio_port port, const uint32_t mask,
|
||||||
|
const enum gpio_direction direction);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set output level on port with mask
|
||||||
|
*
|
||||||
|
* Sets output state on pin to high or low with pin masking
|
||||||
|
*
|
||||||
|
* \param[in] port Ports are grouped into groups of maximum 32 pins,
|
||||||
|
* GPIO_PORTA = group 0, GPIO_PORTB = group 1, etc
|
||||||
|
* \param[in] mask Bit mask where 1 means apply direction setting to
|
||||||
|
* the corresponding pin
|
||||||
|
* \param[in] level true = pin level is set to 1
|
||||||
|
* false = pin level is set to 0
|
||||||
|
*/
|
||||||
|
static inline void _gpio_set_level(const enum gpio_port port, const uint32_t mask, const bool level);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Change output level to the opposite with mask
|
||||||
|
*
|
||||||
|
* Change pin output level to the opposite with pin masking
|
||||||
|
*
|
||||||
|
* \param[in] port Ports are grouped into groups of maximum 32 pins,
|
||||||
|
* GPIO_PORTA = group 0, GPIO_PORTB = group 1, etc
|
||||||
|
* \param[in] mask Bit mask where 1 means apply direction setting to
|
||||||
|
* the corresponding pin
|
||||||
|
*/
|
||||||
|
static inline void _gpio_toggle_level(const enum gpio_port port, const uint32_t mask);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Get input levels on all port pins
|
||||||
|
*
|
||||||
|
* Get input level on all port pins, will read IN register if configured to
|
||||||
|
* input and OUT register if configured as output
|
||||||
|
*
|
||||||
|
* \param[in] port Ports are grouped into groups of maximum 32 pins,
|
||||||
|
* GPIO_PORTA = group 0, GPIO_PORTB = group 1, etc
|
||||||
|
*/
|
||||||
|
static inline uint32_t _gpio_get_level(const enum gpio_port port);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set pin pull mode
|
||||||
|
*
|
||||||
|
* Set pull mode on a single pin
|
||||||
|
*
|
||||||
|
* \notice This function will automatically change pin direction to input
|
||||||
|
*
|
||||||
|
* \param[in] port Ports are grouped into groups of maximum 32 pins,
|
||||||
|
* GPIO_PORTA = group 0, GPIO_PORTB = group 1, etc
|
||||||
|
* \param[in] pin The pin in the group that pull mode should be selected
|
||||||
|
* for
|
||||||
|
* \param[in] pull_mode GPIO_PULL_OFF = pull resistor on pin is disabled
|
||||||
|
* GPIO_PULL_DOWN = pull resistor on pin will pull pin
|
||||||
|
* level to ground level
|
||||||
|
* GPIO_PULL_UP = pull resistor on pin will pull pin
|
||||||
|
* level to VCC
|
||||||
|
*/
|
||||||
|
static inline void _gpio_set_pin_pull_mode(const enum gpio_port port, const uint8_t pin,
|
||||||
|
const enum gpio_pull_mode pull_mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set gpio function
|
||||||
|
*
|
||||||
|
* Select which function a gpio is used for
|
||||||
|
*
|
||||||
|
* \param[in] gpio The gpio to set function for
|
||||||
|
* \param[in] function The gpio function is given by a 32-bit wide bitfield
|
||||||
|
* found in the header files for the device
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static inline void _gpio_set_pin_function(const uint32_t gpio, const uint32_t function);
|
||||||
|
|
||||||
|
#include <hpl_gpio_base.h>
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**@}*/
|
||||||
|
#endif /* _HPL_GPIO_H_INCLUDED */
|
||||||
205
hal/include/hpl_i2c_m_async.h
Normal file
205
hal/include/hpl_i2c_m_async.h
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief I2C Master Hardware Proxy Layer(HPL) declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef _HPL_I2C_M_ASYNC_H_INCLUDED
|
||||||
|
#define _HPL_I2C_M_ASYNC_H_INCLUDED
|
||||||
|
|
||||||
|
#include "hpl_i2c_m_sync.h"
|
||||||
|
#include "hpl_irq.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief i2c master callback names
|
||||||
|
*/
|
||||||
|
enum _i2c_m_async_callback_type {
|
||||||
|
I2C_M_ASYNC_DEVICE_ERROR,
|
||||||
|
I2C_M_ASYNC_DEVICE_TX_COMPLETE,
|
||||||
|
I2C_M_ASYNC_DEVICE_RX_COMPLETE
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _i2c_m_async_device;
|
||||||
|
|
||||||
|
typedef void (*_i2c_complete_cb_t)(struct _i2c_m_async_device *i2c_dev);
|
||||||
|
typedef void (*_i2c_error_cb_t)(struct _i2c_m_async_device *i2c_dev, int32_t errcode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief i2c callback pointers structure
|
||||||
|
*/
|
||||||
|
struct _i2c_m_async_callback {
|
||||||
|
_i2c_error_cb_t error;
|
||||||
|
_i2c_complete_cb_t tx_complete;
|
||||||
|
_i2c_complete_cb_t rx_complete;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief i2c device structure
|
||||||
|
*/
|
||||||
|
struct _i2c_m_async_device {
|
||||||
|
struct _i2c_m_service service;
|
||||||
|
void * hw;
|
||||||
|
struct _i2c_m_async_callback cb;
|
||||||
|
struct _irq_descriptor irq;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize I2C in interrupt mode
|
||||||
|
*
|
||||||
|
* This function does low level I2C configuration.
|
||||||
|
*
|
||||||
|
* \param[in] i2c_dev The pointer to i2c interrupt device structure
|
||||||
|
* \param[in] hw The pointer to hardware instance
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_async_init(struct _i2c_m_async_device *const i2c_dev, void *const hw);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Deinitialize I2C in interrupt mode
|
||||||
|
*
|
||||||
|
* \param[in] i2c_dev The pointer to i2c device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_async_deinit(struct _i2c_m_async_device *const i2c_dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable I2C module
|
||||||
|
*
|
||||||
|
* This function does low level I2C enable.
|
||||||
|
*
|
||||||
|
* \param[in] i2c_dev The pointer to i2c device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_async_enable(struct _i2c_m_async_device *const i2c_dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable I2C module
|
||||||
|
*
|
||||||
|
* This function does low level I2C disable.
|
||||||
|
*
|
||||||
|
* \param[in] i2c_dev The pointer to i2c device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_async_disable(struct _i2c_m_async_device *const i2c_dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Transfer data by I2C
|
||||||
|
*
|
||||||
|
* This function does low level I2C data transfer.
|
||||||
|
*
|
||||||
|
* \param[in] i2c_dev The pointer to i2c device structure
|
||||||
|
* \param[in] msg The pointer to i2c msg structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_async_transfer(struct _i2c_m_async_device *const i2c_dev, struct _i2c_m_msg *msg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set baud rate of I2C
|
||||||
|
*
|
||||||
|
* This function does low level I2C set baud rate.
|
||||||
|
*
|
||||||
|
* \param[in] i2c_dev The pointer to i2c device structure
|
||||||
|
* \param[in] clkrate The clock rate(KHz) input to i2c module
|
||||||
|
* \param[in] baudrate The demand baud rate(KHz) of i2c module
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_async_set_baudrate(struct _i2c_m_async_device *const i2c_dev, uint32_t clkrate, uint32_t baudrate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Register callback to I2C
|
||||||
|
*
|
||||||
|
* This function does low level I2C callback register.
|
||||||
|
*
|
||||||
|
* \param[in] i2c_dev The pointer to i2c device structure
|
||||||
|
* \param[in] cb_type The callback type request
|
||||||
|
* \param[in] func The callback function pointer
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_async_register_callback(struct _i2c_m_async_device *i2c_dev, enum _i2c_m_async_callback_type cb_type,
|
||||||
|
FUNC_PTR func);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Generate stop condition on the I2C bus
|
||||||
|
*
|
||||||
|
* This function will generate a stop condition on the I2C bus
|
||||||
|
*
|
||||||
|
* \param[in] i2c_m_async_descriptor An i2c descriptor which is used to communicate through I2C
|
||||||
|
*
|
||||||
|
* \return Operation status
|
||||||
|
* \retval 0 Operation executed successfully
|
||||||
|
* \retval <0 Operation failed
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_async_send_stop(struct _i2c_m_async_device *const i2c_dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Returns the number of bytes left or not used in the I2C message buffer
|
||||||
|
*
|
||||||
|
* This function will return the number of bytes left (not written to the bus) or still free
|
||||||
|
* (not received from the bus) in the message buffer, depending on direction of transmission.
|
||||||
|
*
|
||||||
|
* \param[in] i2c_m_async_descriptor An i2c descriptor which is used to communicate through I2C
|
||||||
|
*
|
||||||
|
* \return Number of bytes or error code
|
||||||
|
* \retval >0 Positive number indicating bytes left
|
||||||
|
* \retval 0 Buffer is full/empty depending on direction
|
||||||
|
* \retval <0 Error code
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_async_get_bytes_left(struct _i2c_m_async_device *const i2c_dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable/disable I2C master interrupt
|
||||||
|
*
|
||||||
|
* param[in] device The pointer to I2C master device instance
|
||||||
|
* param[in] type The type of interrupt to disable/enable if applicable
|
||||||
|
* param[in] state Enable or disable
|
||||||
|
*/
|
||||||
|
void _i2c_m_async_set_irq_state(struct _i2c_m_async_device *const device, const enum _i2c_m_async_callback_type type,
|
||||||
|
const bool state);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
185
hal/include/hpl_i2c_m_sync.h
Normal file
185
hal/include/hpl_i2c_m_sync.h
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief I2C Master Hardware Proxy Layer(HPL) declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef _HPL_I2C_M_SYNC_H_INCLUDED
|
||||||
|
#define _HPL_I2C_M_SYNC_H_INCLUDED
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief i2c flags
|
||||||
|
*/
|
||||||
|
#define I2C_M_RD 0x0001 /* read data, from slave to master */
|
||||||
|
#define I2C_M_BUSY 0x0100
|
||||||
|
#define I2C_M_TEN 0x0400 /* this is a ten bit chip address */
|
||||||
|
#define I2C_M_SEVEN 0x0800 /* this is a seven bit chip address */
|
||||||
|
#define I2C_M_FAIL 0x1000
|
||||||
|
#define I2C_M_STOP 0x8000 /* if I2C_FUNC_PROTOCOL_MANGLING */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief i2c Return codes
|
||||||
|
*/
|
||||||
|
#define I2C_OK 0 /* Operation successful */
|
||||||
|
#define I2C_ACK -1 /* Received ACK from device on I2C bus */
|
||||||
|
#define I2C_NACK -2 /* Received NACK from device on I2C bus */
|
||||||
|
#define I2C_ERR_ARBLOST -3 /* Arbitration lost */
|
||||||
|
#define I2C_ERR_BAD_ADDRESS -4 /* Bad address */
|
||||||
|
#define I2C_ERR_BUS -5 /* Bus error */
|
||||||
|
#define I2C_ERR_BUSY -6 /* Device busy */
|
||||||
|
#define I2c_ERR_PACKAGE_COLLISION -7 /* Package collision */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief i2c I2C Modes
|
||||||
|
*/
|
||||||
|
#define I2C_STANDARD_MODE 0x00
|
||||||
|
#define I2C_FASTMODE 0x01
|
||||||
|
#define I2C_HIGHSPEED_MODE 0x02
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief i2c master message structure
|
||||||
|
*/
|
||||||
|
struct _i2c_m_msg {
|
||||||
|
uint16_t addr;
|
||||||
|
volatile uint16_t flags;
|
||||||
|
int32_t len;
|
||||||
|
uint8_t * buffer;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief i2c master service
|
||||||
|
*/
|
||||||
|
struct _i2c_m_service {
|
||||||
|
struct _i2c_m_msg msg;
|
||||||
|
uint16_t mode;
|
||||||
|
uint16_t trise;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief i2c sync master device structure
|
||||||
|
*/
|
||||||
|
struct _i2c_m_sync_device {
|
||||||
|
struct _i2c_m_service service;
|
||||||
|
void * hw;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize I2C
|
||||||
|
*
|
||||||
|
* This function does low level I2C configuration.
|
||||||
|
*
|
||||||
|
* \param[in] i2c_dev The pointer to i2c device structure
|
||||||
|
* \param[in] hw The pointer to hardware instance
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_sync_init(struct _i2c_m_sync_device *const i2c_dev, void *const hw);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Deinitialize I2C
|
||||||
|
*
|
||||||
|
* \param[in] i2c_dev The pointer to i2c device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_sync_deinit(struct _i2c_m_sync_device *const i2c_dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable I2C module
|
||||||
|
*
|
||||||
|
* This function does low level I2C enable.
|
||||||
|
*
|
||||||
|
* \param[in] i2c_dev The pointer to i2c device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_sync_enable(struct _i2c_m_sync_device *const i2c_dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable I2C module
|
||||||
|
*
|
||||||
|
* This function does low level I2C disable.
|
||||||
|
*
|
||||||
|
* \param[in] i2c_dev The pointer to i2c device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_sync_disable(struct _i2c_m_sync_device *const i2c_dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Transfer data by I2C
|
||||||
|
*
|
||||||
|
* This function does low level I2C data transfer.
|
||||||
|
*
|
||||||
|
* \param[in] i2c_dev The pointer to i2c device structure
|
||||||
|
* \param[in] msg The pointer to i2c msg structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_sync_transfer(struct _i2c_m_sync_device *const i2c_dev, struct _i2c_m_msg *msg);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set baud rate of I2C
|
||||||
|
*
|
||||||
|
* This function does low level I2C set baud rate.
|
||||||
|
*
|
||||||
|
* \param[in] i2c_dev The pointer to i2c device structure
|
||||||
|
* \param[in] clkrate The clock rate(KHz) input to i2c module
|
||||||
|
* \param[in] baudrate The demand baud rate(KHz) of i2c module
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_sync_set_baudrate(struct _i2c_m_sync_device *const i2c_dev, uint32_t clkrate, uint32_t baudrate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Send send condition on the I2C bus
|
||||||
|
*
|
||||||
|
* This function will generate a stop condition on the I2C bus
|
||||||
|
*
|
||||||
|
* \param[in] i2c_dev The pointer to i2c device struct
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_m_sync_send_stop(struct _i2c_m_sync_device *const i2c_dev);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
184
hal/include/hpl_i2c_s_async.h
Normal file
184
hal/include/hpl_i2c_s_async.h
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief I2C Slave Hardware Proxy Layer(HPL) declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef _HPL_I2C_S_ASYNC_H_INCLUDED
|
||||||
|
#define _HPL_I2C_S_ASYNC_H_INCLUDED
|
||||||
|
|
||||||
|
#include "hpl_i2c_s_sync.h"
|
||||||
|
#include "hpl_irq.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief i2c callback types
|
||||||
|
*/
|
||||||
|
enum _i2c_s_async_callback_type { I2C_S_DEVICE_ERROR, I2C_S_DEVICE_TX, I2C_S_DEVICE_RX_COMPLETE };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Forward declaration of I2C Slave device
|
||||||
|
*/
|
||||||
|
struct _i2c_s_async_device;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief i2c slave callback function type
|
||||||
|
*/
|
||||||
|
typedef void (*_i2c_s_async_cb_t)(struct _i2c_s_async_device *device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief i2c slave callback pointers structure
|
||||||
|
*/
|
||||||
|
struct _i2c_s_async_callback {
|
||||||
|
void (*error)(struct _i2c_s_async_device *const device);
|
||||||
|
void (*tx)(struct _i2c_s_async_device *const device);
|
||||||
|
void (*rx_done)(struct _i2c_s_async_device *const device, const uint8_t data);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief i2c slave device structure
|
||||||
|
*/
|
||||||
|
struct _i2c_s_async_device {
|
||||||
|
void * hw;
|
||||||
|
struct _i2c_s_async_callback cb;
|
||||||
|
struct _irq_descriptor irq;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize asynchronous I2C slave
|
||||||
|
*
|
||||||
|
* This function does low level I2C configuration.
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c interrupt device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_async_init(struct _i2c_s_async_device *const device, void *const hw);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Deinitialize asynchronous I2C in interrupt mode
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_async_deinit(struct _i2c_s_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable I2C module
|
||||||
|
*
|
||||||
|
* This function does low level I2C enable.
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_async_enable(struct _i2c_s_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable I2C module
|
||||||
|
*
|
||||||
|
* This function does low level I2C disable.
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_async_disable(struct _i2c_s_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if 10-bit addressing mode is on
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
*
|
||||||
|
* \return Cheking status
|
||||||
|
* \retval 1 10-bit addressing mode is on
|
||||||
|
* \retval 0 10-bit addressing mode is off
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_async_is_10bit_addressing_on(const struct _i2c_s_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set I2C slave address
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
* \param[in] address Address to set
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_async_set_address(struct _i2c_s_async_device *const device, const uint16_t address);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Write a byte to the given I2C instance
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
* \param[in] data Data to write
|
||||||
|
*/
|
||||||
|
void _i2c_s_async_write_byte(struct _i2c_s_async_device *const device, const uint8_t data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve I2C slave status
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
*
|
||||||
|
*\return I2C slave status
|
||||||
|
*/
|
||||||
|
i2c_s_status_t _i2c_s_async_get_status(const struct _i2c_s_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Abort data transmission
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_async_abort_transmission(const struct _i2c_s_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable/disable I2C slave interrupt
|
||||||
|
*
|
||||||
|
* param[in] device The pointer to I2C slave device instance
|
||||||
|
* param[in] type The type of interrupt to disable/enable if applicable
|
||||||
|
* param[in] disable Enable or disable
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_async_set_irq_state(struct _i2c_s_async_device *const device, const enum _i2c_s_async_callback_type type,
|
||||||
|
const bool disable);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _HPL_I2C_S_ASYNC_H_INCLUDED */
|
||||||
184
hal/include/hpl_i2c_s_sync.h
Normal file
184
hal/include/hpl_i2c_s_sync.h
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief I2C Slave Hardware Proxy Layer(HPL) declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#ifndef _HPL_I2C_S_SYNC_H_INCLUDED
|
||||||
|
#define _HPL_I2C_S_SYNC_H_INCLUDED
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief I2C Slave status type
|
||||||
|
*/
|
||||||
|
typedef uint32_t i2c_s_status_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief i2c slave device structure
|
||||||
|
*/
|
||||||
|
struct _i2c_s_sync_device {
|
||||||
|
void *hw;
|
||||||
|
};
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize synchronous I2C slave
|
||||||
|
*
|
||||||
|
* This function does low level I2C configuration.
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_sync_init(struct _i2c_s_sync_device *const device, void *const hw);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Deinitialize synchronous I2C slave
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_sync_deinit(struct _i2c_s_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable I2C module
|
||||||
|
*
|
||||||
|
* This function does low level I2C enable.
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_sync_enable(struct _i2c_s_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable I2C module
|
||||||
|
*
|
||||||
|
* This function does low level I2C disable.
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_sync_disable(struct _i2c_s_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if 10-bit addressing mode is on
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
*
|
||||||
|
* \return Cheking status
|
||||||
|
* \retval 1 10-bit addressing mode is on
|
||||||
|
* \retval 0 10-bit addressing mode is off
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_sync_is_10bit_addressing_on(const struct _i2c_s_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set I2C slave address
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
* \param[in] address Address to set
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_sync_set_address(struct _i2c_s_sync_device *const device, const uint16_t address);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Write a byte to the given I2C instance
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
* \param[in] data Data to write
|
||||||
|
*/
|
||||||
|
void _i2c_s_sync_write_byte(struct _i2c_s_sync_device *const device, const uint8_t data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve I2C slave status
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
*
|
||||||
|
*\return I2C slave status
|
||||||
|
*/
|
||||||
|
i2c_s_status_t _i2c_s_sync_get_status(const struct _i2c_s_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Clear the Data Ready interrupt flag
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
*
|
||||||
|
* \return Return 0 for success and negative value for error
|
||||||
|
*/
|
||||||
|
int32_t _i2c_s_sync_clear_data_ready_flag(const struct _i2c_s_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Read a byte from the given I2C instance
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
*
|
||||||
|
* \return Data received via I2C interface.
|
||||||
|
*/
|
||||||
|
uint8_t _i2c_s_sync_read_byte(const struct _i2c_s_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if I2C is ready to send next byte
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
*
|
||||||
|
* \return Status of the ready check.
|
||||||
|
* \retval true if the I2C is ready to send next byte
|
||||||
|
* \retval false if the I2C is not ready to send next byte
|
||||||
|
*/
|
||||||
|
bool _i2c_s_sync_is_byte_sent(const struct _i2c_s_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if there is data received by I2C
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to i2c slave device structure
|
||||||
|
*
|
||||||
|
* \return Status of the data received check.
|
||||||
|
* \retval true if the I2C has received a byte
|
||||||
|
* \retval false if the I2C has not received a byte
|
||||||
|
*/
|
||||||
|
bool _i2c_s_sync_is_byte_received(const struct _i2c_s_sync_device *const device);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _HPL_I2C_S_SYNC_H_INCLUDED */
|
||||||
124
hal/include/hpl_init.h
Normal file
124
hal/include/hpl_init.h
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Init related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_INIT_H_INCLUDED
|
||||||
|
#define _HPL_INIT_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup HPL Init
|
||||||
|
*
|
||||||
|
* \section hpl_init_rev Revision History
|
||||||
|
* - v1.0.0 Initial Release
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
* \brief Initializes clock sources
|
||||||
|
*/
|
||||||
|
void _sysctrl_init_sources(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initializes Power Manager
|
||||||
|
*/
|
||||||
|
void _pm_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize generators
|
||||||
|
*/
|
||||||
|
void _gclk_init_generators(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize 32 kHz clock sources
|
||||||
|
*/
|
||||||
|
void _osc32kctrl_init_sources(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize clock sources
|
||||||
|
*/
|
||||||
|
void _oscctrl_init_sources(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize clock sources that need input reference clocks
|
||||||
|
*/
|
||||||
|
void _sysctrl_init_referenced_generators(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize clock sources that need input reference clocks
|
||||||
|
*/
|
||||||
|
void _oscctrl_init_referenced_generators(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize master clock generator
|
||||||
|
*/
|
||||||
|
void _mclk_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize clock generator
|
||||||
|
*/
|
||||||
|
void _lpmcu_misc_regs_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize clock generator
|
||||||
|
*/
|
||||||
|
void _pmc_init(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set performance level
|
||||||
|
*
|
||||||
|
* \param[in] level The performance level to set
|
||||||
|
*/
|
||||||
|
void _set_performance_level(const uint8_t level);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize the chip
|
||||||
|
*/
|
||||||
|
void _init_chip(void);
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**@}*/
|
||||||
|
#endif /* _HPL_INIT_H_INCLUDED */
|
||||||
116
hal/include/hpl_irq.h
Normal file
116
hal/include/hpl_irq.h
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief IRQ related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_IRQ_H_INCLUDED
|
||||||
|
#define _HPL_IRQ_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup HPL IRQ
|
||||||
|
*
|
||||||
|
* \section hpl_irq_rev Revision History
|
||||||
|
* - v1.0.0 Initial Release
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief IRQ descriptor
|
||||||
|
*/
|
||||||
|
struct _irq_descriptor {
|
||||||
|
void (*handler)(void *parameter);
|
||||||
|
void *parameter;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
* \brief Retrieve current IRQ number
|
||||||
|
*
|
||||||
|
* \return The current IRQ number
|
||||||
|
*/
|
||||||
|
uint8_t _irq_get_current(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable the given IRQ
|
||||||
|
*
|
||||||
|
* \param[in] n The number of IRQ to disable
|
||||||
|
*/
|
||||||
|
void _irq_disable(uint8_t n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set the given IRQ
|
||||||
|
*
|
||||||
|
* \param[in] n The number of IRQ to set
|
||||||
|
*/
|
||||||
|
void _irq_set(uint8_t n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Clear the given IRQ
|
||||||
|
*
|
||||||
|
* \param[in] n The number of IRQ to clear
|
||||||
|
*/
|
||||||
|
void _irq_clear(uint8_t n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable the given IRQ
|
||||||
|
*
|
||||||
|
* \param[in] n The number of IRQ to enable
|
||||||
|
*/
|
||||||
|
void _irq_enable(uint8_t n);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Register IRQ handler
|
||||||
|
*
|
||||||
|
* \param[in] number The number registered IRQ
|
||||||
|
* \param[in] irq The pointer to irq handler to register
|
||||||
|
*
|
||||||
|
* \return The status of IRQ handler registering
|
||||||
|
* \retval -1 Passed parameters were invalid
|
||||||
|
* \retval 0 The registering is completed successfully
|
||||||
|
*/
|
||||||
|
void _irq_register(const uint8_t number, struct _irq_descriptor *const irq);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**@}*/
|
||||||
|
#endif /* _HPL_IRQ_H_INCLUDED */
|
||||||
37
hal/include/hpl_missing_features.h
Normal file
37
hal/include/hpl_missing_features.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Family-dependent missing features expected by HAL
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_MISSING_FEATURES
|
||||||
|
#define _HPL_MISSING_FEATURES
|
||||||
|
|
||||||
|
#endif /* _HPL_MISSING_FEATURES */
|
||||||
91
hal/include/hpl_reset.h
Normal file
91
hal/include/hpl_reset.h
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Reset related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_RESET_H_INCLUDED
|
||||||
|
#define _HPL_RESET_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup HPL Reset
|
||||||
|
*
|
||||||
|
* \section hpl_reset_rev Revision History
|
||||||
|
* - v1.0.0 Initial Release
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _UNIT_TEST_
|
||||||
|
#include <compiler.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Reset reason enumeration
|
||||||
|
*
|
||||||
|
* The list of possible reset reasons.
|
||||||
|
*/
|
||||||
|
enum reset_reason {
|
||||||
|
RESET_REASON_POR = 1,
|
||||||
|
RESET_REASON_BOD12 = 2,
|
||||||
|
RESET_REASON_BOD33 = 4,
|
||||||
|
RESET_REASON_EXT = 16,
|
||||||
|
RESET_REASON_WDT = 32,
|
||||||
|
RESET_REASON_SYST = 64,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the reset reason
|
||||||
|
*
|
||||||
|
* Retrieves the reset reason of the last MCU reset.
|
||||||
|
*
|
||||||
|
*\return An enum value indicating the reason of the last reset.
|
||||||
|
*/
|
||||||
|
enum reset_reason _get_reset_reason(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Reset MCU
|
||||||
|
*/
|
||||||
|
void _reset_mcu(void);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**@}*/
|
||||||
|
#endif /* _HPL_RESET_H_INCLUDED */
|
||||||
88
hal/include/hpl_sleep.h
Normal file
88
hal/include/hpl_sleep.h
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Sleep related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_SLEEP_H_INCLUDED
|
||||||
|
#define _HPL_SLEEP_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup HPL Sleep
|
||||||
|
*
|
||||||
|
* \section hpl_sleep_rev Revision History
|
||||||
|
* - v1.0.0 Initial Release
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _UNIT_TEST_
|
||||||
|
#include <compiler.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
* \brief Set the sleep mode for the device
|
||||||
|
*
|
||||||
|
* This function sets the sleep mode for the device.
|
||||||
|
* For an overview of which systems are disabled in sleep for the different
|
||||||
|
* sleep modes see datasheet.
|
||||||
|
*
|
||||||
|
* \param[in] mode Sleep mode to use
|
||||||
|
*
|
||||||
|
* \return the status of a sleep request
|
||||||
|
* \retval -1 The requested sleep mode was invalid
|
||||||
|
* \retval 0 The operation completed successfully, sleep mode is set
|
||||||
|
*/
|
||||||
|
int32_t _set_sleep_mode(const uint8_t mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Reset MCU
|
||||||
|
*/
|
||||||
|
void _reset_mcu(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Put MCU to sleep
|
||||||
|
*/
|
||||||
|
void _go_to_sleep(void);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**@}*/
|
||||||
|
#endif /* _HPL_SLEEP_H_INCLUDED */
|
||||||
163
hal/include/hpl_spi.h
Normal file
163
hal/include/hpl_spi.h
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief SPI related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_SPI_H_INCLUDED
|
||||||
|
#define _HPL_SPI_H_INCLUDED
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
#include <utils.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup hpl_spi HPL SPI
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief SPI Dummy char is used when reading data from the SPI slave
|
||||||
|
*/
|
||||||
|
#define SPI_DUMMY_CHAR 0x1ff
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief SPI message to let driver to process
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
struct spi_msg {
|
||||||
|
/** Pointer to the output data buffer */
|
||||||
|
uint8_t *txbuf;
|
||||||
|
/** Pointer to the input data buffer */
|
||||||
|
uint8_t *rxbuf;
|
||||||
|
/** Size of the message data in SPI characters */
|
||||||
|
uint32_t size;
|
||||||
|
};
|
||||||
|
//@}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief SPI transfer modes
|
||||||
|
* SPI transfer mode controls clock polarity and clock phase.
|
||||||
|
* Mode 0: leading edge is rising edge, data sample on leading edge.
|
||||||
|
* Mode 1: leading edge is rising edge, data sample on trailing edge.
|
||||||
|
* Mode 2: leading edge is falling edge, data sample on leading edge.
|
||||||
|
* Mode 3: leading edge is falling edge, data sample on trailing edge.
|
||||||
|
*/
|
||||||
|
enum spi_transfer_mode {
|
||||||
|
/** Leading edge is rising edge, data sample on leading edge. */
|
||||||
|
SPI_MODE_0,
|
||||||
|
/** Leading edge is rising edge, data sample on trailing edge. */
|
||||||
|
SPI_MODE_1,
|
||||||
|
/** Leading edge is falling edge, data sample on leading edge. */
|
||||||
|
SPI_MODE_2,
|
||||||
|
/** Leading edge is falling edge, data sample on trailing edge. */
|
||||||
|
SPI_MODE_3
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief SPI character sizes
|
||||||
|
* The character size influence the way the data is sent/received.
|
||||||
|
* For char size <= 8 data is stored byte by byte.
|
||||||
|
* For char size between 9 ~ 16 data is stored in 2-byte length.
|
||||||
|
* Note that the default and recommended char size is 8 bit since it's
|
||||||
|
* supported by all system.
|
||||||
|
*/
|
||||||
|
enum spi_char_size {
|
||||||
|
/** Character size is 8 bit. */
|
||||||
|
SPI_CHAR_SIZE_8 = 0,
|
||||||
|
/** Character size is 9 bit. */
|
||||||
|
SPI_CHAR_SIZE_9 = 1,
|
||||||
|
/** Character size is 10 bit. */
|
||||||
|
SPI_CHAR_SIZE_10 = 2,
|
||||||
|
/** Character size is 11 bit. */
|
||||||
|
SPI_CHAR_SIZE_11 = 3,
|
||||||
|
/** Character size is 12 bit. */
|
||||||
|
SPI_CHAR_SIZE_12 = 4,
|
||||||
|
/** Character size is 13 bit. */
|
||||||
|
SPI_CHAR_SIZE_13 = 5,
|
||||||
|
/** Character size is 14 bit. */
|
||||||
|
SPI_CHAR_SIZE_14 = 6,
|
||||||
|
/** Character size is 15 bit. */
|
||||||
|
SPI_CHAR_SIZE_15 = 7,
|
||||||
|
/** Character size is 16 bit. */
|
||||||
|
SPI_CHAR_SIZE_16 = 8
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief SPI data order
|
||||||
|
*/
|
||||||
|
enum spi_data_order {
|
||||||
|
/** MSB goes first. */
|
||||||
|
SPI_DATA_ORDER_MSB_1ST = 0,
|
||||||
|
/** LSB goes first. */
|
||||||
|
SPI_DATA_ORDER_LSB_1ST = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
/** \brief Transfer descriptor for SPI
|
||||||
|
* Transfer descriptor holds TX and RX buffers
|
||||||
|
*/
|
||||||
|
struct spi_xfer {
|
||||||
|
/** Pointer to data buffer to TX */
|
||||||
|
uint8_t *txbuf;
|
||||||
|
/** Pointer to data buffer to RX */
|
||||||
|
uint8_t *rxbuf;
|
||||||
|
/** Size of data characters to TX & RX */
|
||||||
|
uint32_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** SPI generic driver. */
|
||||||
|
struct spi_dev {
|
||||||
|
/** Pointer to the hardware base or private data for special device. */
|
||||||
|
void *prvt;
|
||||||
|
/** Reference start of sync/async variables */
|
||||||
|
uint32_t sync_async_misc[1];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Calculate the baudrate value for hardware to use to set baudrate
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] clk Clock frequency (Hz) for baudrate generation.
|
||||||
|
* \param[in] baud Target baudrate (bps).
|
||||||
|
* \return Error or baudrate value.
|
||||||
|
* \retval >0 Baudrate value.
|
||||||
|
* \retval ERR_INVALID_ARG Calculation fail.
|
||||||
|
*/
|
||||||
|
int32_t _spi_calc_baud_val(struct spi_dev *dev, const uint32_t clk, const uint32_t baud);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
#endif /* ifndef _HPL_SPI_H_INCLUDED */
|
||||||
131
hal/include/hpl_spi_async.h
Normal file
131
hal/include/hpl_spi_async.h
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Common SPI related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_SPI_ASYNC_H_INCLUDED
|
||||||
|
#define _HPL_SPI_ASYNC_H_INCLUDED
|
||||||
|
|
||||||
|
#include <hpl_spi.h>
|
||||||
|
#include <hpl_irq.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup hpl_spi HPL SPI
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Callbacks the SPI driver must offer in async mode
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
/** The callback types */
|
||||||
|
enum _spi_async_dev_cb_type {
|
||||||
|
/** Callback type for transmit, see \ref _spi_async_dev_cb_xfer_t. */
|
||||||
|
SPI_DEV_CB_TX,
|
||||||
|
/** Callback type for receive, see \ref _spi_async_dev_cb_xfer_t. */
|
||||||
|
SPI_DEV_CB_RX,
|
||||||
|
/** Callback type for \ref _spi_async_dev_cb_complete_t. */
|
||||||
|
SPI_DEV_CB_COMPLETE,
|
||||||
|
/** Callback type for error */
|
||||||
|
SPI_DEV_CB_ERROR,
|
||||||
|
/** Number of callbacks. */
|
||||||
|
SPI_DEV_CB_N
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _spi_async_dev;
|
||||||
|
|
||||||
|
/** \brief The prototype for callback on SPI transfer error.
|
||||||
|
* If status code is zero, it indicates the normal completion, that is,
|
||||||
|
* SS deactivation.
|
||||||
|
* If status code belows zero, it indicates complete.
|
||||||
|
*/
|
||||||
|
typedef void (*_spi_async_dev_cb_error_t)(struct _spi_async_dev *dev, int32_t status);
|
||||||
|
|
||||||
|
/** \brief The prototype for callback on SPI transmit/receive event
|
||||||
|
* For TX, the callback is invoked when transmit is done or ready to start
|
||||||
|
* transmit.
|
||||||
|
* For RX, the callback is invoked when receive is done or ready to read data,
|
||||||
|
* see \ref _spi_async_dev_read_one_t on data reading.
|
||||||
|
* Without DMA enabled, the callback is invoked on each character event.
|
||||||
|
* With DMA enabled, the callback is invoked on DMA buffer done.
|
||||||
|
*/
|
||||||
|
typedef void (*_spi_async_dev_cb_xfer_t)(struct _spi_async_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief The callbacks offered by SPI driver
|
||||||
|
*/
|
||||||
|
struct _spi_async_dev_callbacks {
|
||||||
|
/** TX callback, see \ref _spi_async_dev_cb_xfer_t. */
|
||||||
|
_spi_async_dev_cb_xfer_t tx;
|
||||||
|
/** RX callback, see \ref _spi_async_dev_cb_xfer_t. */
|
||||||
|
_spi_async_dev_cb_xfer_t rx;
|
||||||
|
/** Complete or complete callback, see \ref _spi_async_dev_cb_complete_t. */
|
||||||
|
_spi_async_dev_cb_xfer_t complete;
|
||||||
|
/** Error callback, see \ref */
|
||||||
|
_spi_async_dev_cb_error_t err;
|
||||||
|
};
|
||||||
|
//@}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief SPI async driver
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
|
||||||
|
/** SPI driver to support async HAL */
|
||||||
|
struct _spi_async_dev {
|
||||||
|
/** Pointer to the hardware base or private data for special device. */
|
||||||
|
void *prvt;
|
||||||
|
/** Data size, number of bytes for each character */
|
||||||
|
uint8_t char_size;
|
||||||
|
/** Dummy byte used in master mode when reading the slave */
|
||||||
|
uint16_t dummy_byte;
|
||||||
|
|
||||||
|
/** \brief Pointer to callback functions, ignored for polling mode
|
||||||
|
* Pointer to the callback functions so that initialize the driver to
|
||||||
|
* handle interrupts.
|
||||||
|
*/
|
||||||
|
struct _spi_async_dev_callbacks callbacks;
|
||||||
|
/** IRQ instance for SPI device. */
|
||||||
|
struct _irq_descriptor irq;
|
||||||
|
};
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
#endif /* ifndef _HPL_SPI_ASYNC_H_INCLUDED */
|
||||||
88
hal/include/hpl_spi_dma.h
Normal file
88
hal/include/hpl_spi_dma.h
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Common SPI DMA related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_SPI_DMA_H_INCLUDED
|
||||||
|
#define _HPL_SPI_DMA_H_INCLUDED
|
||||||
|
|
||||||
|
#include <hpl_irq.h>
|
||||||
|
#include <hpl_dma.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** The callback types */
|
||||||
|
enum _spi_dma_dev_cb_type {
|
||||||
|
/** Callback type for DMA transmit. */
|
||||||
|
SPI_DEV_CB_DMA_TX,
|
||||||
|
/** Callback type for DMA receive. */
|
||||||
|
SPI_DEV_CB_DMA_RX,
|
||||||
|
/** Callback type for DMA error. */
|
||||||
|
SPI_DEV_CB_DMA_ERROR,
|
||||||
|
/** Number of callbacks. */
|
||||||
|
SPI_DEV_CB_DMA_N
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _spi_dma_dev;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief The prototype for callback on SPI DMA.
|
||||||
|
*/
|
||||||
|
typedef void (*_spi_dma_cb_t)(struct _dma_resource *resource);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief The callbacks offered by SPI driver
|
||||||
|
*/
|
||||||
|
struct _spi_dma_dev_callbacks {
|
||||||
|
_spi_dma_cb_t tx;
|
||||||
|
_spi_dma_cb_t rx;
|
||||||
|
_spi_dma_cb_t error;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** SPI driver to support DMA HAL */
|
||||||
|
struct _spi_dma_dev {
|
||||||
|
/** Pointer to the hardware base or private data for special device. */
|
||||||
|
void *prvt;
|
||||||
|
/** Pointer to callback functions */
|
||||||
|
struct _spi_dma_dev_callbacks callbacks;
|
||||||
|
/** IRQ instance for SPI device. */
|
||||||
|
struct _irq_descriptor irq;
|
||||||
|
/** DMA resource */
|
||||||
|
struct _dma_resource *resource;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ifndef _HPL_SPI_DMA_H_INCLUDED */
|
||||||
243
hal/include/hpl_spi_m_async.h
Normal file
243
hal/include/hpl_spi_m_async.h
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief SPI Slave Async related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_SPI_M_ASYNC_H_INCLUDED
|
||||||
|
#define _HPL_SPI_M_ASYNC_H_INCLUDED
|
||||||
|
|
||||||
|
#include <hpl_spi.h>
|
||||||
|
#include <hpl_spi_async.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup hpl_spi HPL SPI
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Uses common SPI async device driver. */
|
||||||
|
#define _spi_m_async_dev _spi_async_dev
|
||||||
|
|
||||||
|
#define _spi_m_async_dev_cb_type _spi_async_dev_cb_type
|
||||||
|
|
||||||
|
/** Uses common SPI async device driver complete callback type. */
|
||||||
|
#define _spi_m_async_dev_cb_error_t _spi_async_dev_cb_error_t
|
||||||
|
|
||||||
|
/** Uses common SPI async device driver transfer callback type. */
|
||||||
|
#define _spi_m_async_dev_cb_xfer_t _spi_async_dev_cb_xfer_t
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
* \brief Initialize SPI for access with interrupts
|
||||||
|
* It will load default hardware configuration and software struct.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] hw Pointer to the hardware base.
|
||||||
|
* \retval ERR_INVALID_ARG Input parameter problem.
|
||||||
|
* \retval ERR_BUSY SPI hardware not ready (resetting).
|
||||||
|
* \retval ERR_DENIED SPI has been enabled.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_async_init(struct _spi_m_async_dev *dev, void *const hw);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize SPI for access with interrupts
|
||||||
|
* Disable, reset the hardware and the software struct.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_async_deinit(struct _spi_m_async_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable SPI for access with interrupts
|
||||||
|
* Enable the SPI and enable callback generation of receive and error
|
||||||
|
* interrupts.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG Input parameter problem.
|
||||||
|
* \retval ERR_BUSY SPI hardware not ready (resetting).
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_async_enable(struct _spi_m_async_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable SPI for access without interrupts
|
||||||
|
* Disable SPI and interrupts. Deactivate all CS pins if works as master.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_async_disable(struct _spi_m_async_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI transfer mode
|
||||||
|
* Set SPI transfer mode (\ref spi_transfer_mode),
|
||||||
|
* which controls clock polarity and clock phase.
|
||||||
|
* Mode 0: leading edge is rising edge, data sample on leading edge.
|
||||||
|
* Mode 1: leading edge is rising edge, data sample on trailing edge.
|
||||||
|
* Mode 2: leading edge is falling edge, data sample on leading edge.
|
||||||
|
* Mode 3: leading edge is falling edge, data sample on trailing edge.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] mode The SPI transfer mode.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_async_set_mode(struct _spi_m_async_dev *dev, const enum spi_transfer_mode mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI baudrate
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] baud_val The SPI baudrate value, see \ref _spi_calc_baud_val() on
|
||||||
|
* how it's generated.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_async_set_baudrate(struct _spi_m_async_dev *dev, const uint32_t baud_val);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI baudrate
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] char_size The character size, see \ref spi_char_size.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG The character size is not supported.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_async_set_char_size(struct _spi_m_async_dev *dev, const enum spi_char_size char_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI data order
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] dord SPI data order (LSB/MSB first).
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG The character size is not supported.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_async_set_data_order(struct _spi_m_async_dev *dev, const enum spi_data_order dord);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable interrupt on character output
|
||||||
|
*
|
||||||
|
* Enable interrupt when a new character can be written
|
||||||
|
* to the SPI device.
|
||||||
|
*
|
||||||
|
* \param[in] dev Pointer to the SPI device instance
|
||||||
|
* \param[in] state true = enable output interrupt
|
||||||
|
* false = disable output interrupt
|
||||||
|
*
|
||||||
|
* \return Status code
|
||||||
|
* \retval 0 Ok status
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_async_enable_tx(struct _spi_m_async_dev *dev, bool state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable interrupt on character input
|
||||||
|
*
|
||||||
|
* Enable interrupt when a new character is ready to be
|
||||||
|
* read from the SPI device.
|
||||||
|
*
|
||||||
|
* \param[in] dev Pointer to the SPI device instance
|
||||||
|
* \param[in] state true = enable input interrupts
|
||||||
|
* false = disable input interrupt
|
||||||
|
*
|
||||||
|
* \return Status code
|
||||||
|
* \retvat 0 OK Status
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_async_enable_rx(struct _spi_m_async_dev *dev, bool state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable interrupt on after data transmission complate
|
||||||
|
*
|
||||||
|
* \param[in] dev Pointer to the SPI device instance
|
||||||
|
* \param[in] state true = enable input interrupts
|
||||||
|
* false = disable input interrupt
|
||||||
|
*
|
||||||
|
* \return Status code
|
||||||
|
* \retvat 0 OK Status
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_async_enable_tx_complete(struct _spi_m_async_dev *dev, bool state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Read one character to SPI device instance
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
*
|
||||||
|
* \return Character read from SPI module
|
||||||
|
*/
|
||||||
|
uint16_t _spi_m_async_read_one(struct _spi_m_async_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Write one character to assigned buffer
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] data
|
||||||
|
*
|
||||||
|
* \return Status code of write operation
|
||||||
|
* \retval 0 Write operation OK
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_async_write_one(struct _spi_m_async_dev *dev, uint16_t data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Register the SPI device callback
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] cb_type The callback type.
|
||||||
|
* \param[in] func The callback function to register. NULL to disable callback.
|
||||||
|
* \return Always 0.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_async_register_callback(struct _spi_m_async_dev *dev, const enum _spi_m_async_dev_cb_type cb_type,
|
||||||
|
const FUNC_PTR func);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable/disable SPI master interrupt
|
||||||
|
*
|
||||||
|
* param[in] device The pointer to SPI master device instance
|
||||||
|
* param[in] type The type of interrupt to disable/enable if applicable
|
||||||
|
* param[in] state Enable or disable
|
||||||
|
*/
|
||||||
|
void _spi_m_async_set_irq_state(struct _spi_m_async_dev *const device, const enum _spi_m_async_dev_cb_type type,
|
||||||
|
const bool state);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
#endif /* ifndef _HPL_SPI_M_ASYNC_H_INCLUDED */
|
||||||
182
hal/include/hpl_spi_m_dma.h
Normal file
182
hal/include/hpl_spi_m_dma.h
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief SPI Master DMA related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_SPI_M_DMA_H_INCLUDED
|
||||||
|
#define _HPL_SPI_M_DMA_H_INCLUDED
|
||||||
|
|
||||||
|
#include <hpl_spi.h>
|
||||||
|
#include <hpl_spi_dma.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup hpl_spi HPL SPI
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Uses common SPI dma device driver. */
|
||||||
|
#define _spi_m_dma_dev _spi_dma_dev
|
||||||
|
|
||||||
|
#define _spi_m_dma_dev_cb_type _spi_dma_dev_cb_type
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
* \brief Initialize SPI for access with interrupts
|
||||||
|
* It will load default hardware configuration and software struct.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] hw Pointer to the hardware base.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG Input parameter problem.
|
||||||
|
* \retval ERR_BUSY SPI hardware not ready (resetting).
|
||||||
|
* \retval ERR_DENIED SPI has been enabled.
|
||||||
|
* \retval 0 ERR_NONE is operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_dma_init(struct _spi_m_dma_dev *dev, void *const hw);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize SPI for access with interrupts
|
||||||
|
* Disable, reset the hardware and the software struct.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval 0 ERR_NONE is operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_dma_deinit(struct _spi_m_dma_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable SPI for access with interrupts
|
||||||
|
* Enable the SPI and enable callback generation of receive and error
|
||||||
|
* interrupts.
|
||||||
|
* \param[in] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG Input parameter problem.
|
||||||
|
* \retval ERR_BUSY SPI hardware not ready (resetting).
|
||||||
|
* \retval 0 ERR_NONE is operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_dma_enable(struct _spi_m_dma_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable SPI for access without interrupts
|
||||||
|
* Disable SPI and interrupts. Deactivate all CS pins if works as master.
|
||||||
|
* \param[in] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval 0 ERR_NONE is operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_dma_disable(struct _spi_m_dma_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI transfer mode
|
||||||
|
* Set SPI transfer mode (\ref spi_transfer_mode),
|
||||||
|
* which controls clock polarity and clock phase.
|
||||||
|
* Mode 0: leading edge is rising edge, data sample on leading edge.
|
||||||
|
* Mode 1: leading edge is rising edge, data sample on trailing edge.
|
||||||
|
* Mode 2: leading edge is falling edge, data sample on leading edge.
|
||||||
|
* Mode 3: leading edge is falling edge, data sample on trailing edge.
|
||||||
|
* \param[in] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] mode The SPI transfer mode.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 ERR_NONE is operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_dma_set_mode(struct _spi_m_dma_dev *dev, const enum spi_transfer_mode mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI baudrate
|
||||||
|
* \param[in] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] baud_val The SPI baudrate value, see \ref _spi_calc_baud_val() on
|
||||||
|
* how it's generated.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_dma_set_baudrate(struct _spi_m_dma_dev *dev, const uint32_t baud_val);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI baudrate
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] char_size The character size, see \ref spi_char_size.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG The character size is not supported.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_dma_set_char_size(struct _spi_m_dma_dev *dev, const enum spi_char_size char_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI data order
|
||||||
|
* \param[in] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] dord SPI data order (LSB/MSB first).
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG The character size is not supported.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_dma_set_data_order(struct _spi_m_dma_dev *dev, const enum spi_data_order dord);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Register the SPI device callback
|
||||||
|
* \param[in] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] cb_type The callback type.
|
||||||
|
* \param[in] func The callback function to register. NULL to disable callback.
|
||||||
|
* \return Always 0.
|
||||||
|
*/
|
||||||
|
void _spi_m_dma_register_callback(struct _spi_m_dma_dev *dev, enum _spi_dma_dev_cb_type, _spi_dma_cb_t func);
|
||||||
|
|
||||||
|
/** \brief Do SPI data transfer (TX & RX) with DMA
|
||||||
|
* Log the TX & RX buffers and transfer them in background. It never blocks.
|
||||||
|
*
|
||||||
|
* \param[in] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] txbuf Pointer to the transfer information (\ref spi_transfer).
|
||||||
|
* \param[out] rxbuf Pointer to the receiver information (\ref spi_receive).
|
||||||
|
* \param[in] length spi transfer data length.
|
||||||
|
*
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_NONE Success.
|
||||||
|
* \retval ERR_BUSY Busy.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_dma_transfer(struct _spi_m_dma_dev *dev, uint8_t const *txbuf, uint8_t *const rxbuf,
|
||||||
|
const uint16_t length);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
#endif /* ifndef _HPL_SPI_M_DMA_H_INCLUDED */
|
||||||
166
hal/include/hpl_spi_m_sync.h
Normal file
166
hal/include/hpl_spi_m_sync.h
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief SPI related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_SPI_M_SYNC_H_INCLUDED
|
||||||
|
#define _HPL_SPI_M_SYNC_H_INCLUDED
|
||||||
|
|
||||||
|
#include <hpl_spi.h>
|
||||||
|
#include <hpl_spi_sync.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup hpl_spi HPL SPI
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Uses common SPI sync device driver. */
|
||||||
|
#define _spi_m_sync_dev _spi_sync_dev
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
* \brief Initialize SPI for access without interrupts
|
||||||
|
* It will load default hardware configuration and software struct.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] hw Pointer to the hardware base.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG Input parameter problem.
|
||||||
|
* \retval ERR_BUSY SPI hardware not ready (resetting).
|
||||||
|
* \retval ERR_DENIED SPI has been enabled.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_sync_init(struct _spi_m_sync_dev *dev, void *const hw);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Deinitialize SPI
|
||||||
|
* Disable, reset the hardware and the software struct.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_sync_deinit(struct _spi_m_sync_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable SPI for access without interrupts
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_BUSY SPI hardware not ready (resetting).
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_sync_enable(struct _spi_m_sync_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable SPI for access without interrupts
|
||||||
|
* Disable SPI. Deactivate all CS pins if works as master.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_sync_disable(struct _spi_m_sync_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI transfer mode
|
||||||
|
* Set SPI transfer mode (\ref spi_transfer_mode),
|
||||||
|
* which controls clock polarity and clock phase.
|
||||||
|
* Mode 0: leading edge is rising edge, data sample on leading edge.
|
||||||
|
* Mode 1: leading edge is rising edge, data sample on trailing edge.
|
||||||
|
* Mode 2: leading edge is falling edge, data sample on leading edge.
|
||||||
|
* Mode 3: leading edge is falling edge, data sample on trailing edge.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] mode The SPI transfer mode.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_sync_set_mode(struct _spi_m_sync_dev *dev, const enum spi_transfer_mode mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI baudrate
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] baud_val The SPI baudrate value, see \ref _spi_calc_baud_val() on
|
||||||
|
* how it's generated.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_sync_set_baudrate(struct _spi_m_sync_dev *dev, const uint32_t baud_val);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI char size
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] char_size The character size, see \ref spi_char_size.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG The character size is not supported.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_sync_set_char_size(struct _spi_m_sync_dev *dev, const enum spi_char_size char_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI data order
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] dord SPI data order (LSB/MSB first).
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG The character size is not supported.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_sync_set_data_order(struct _spi_m_sync_dev *dev, const enum spi_data_order dord);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Transfer the whole message without interrupt
|
||||||
|
* Transfer the message, it will keep waiting until the message finish or
|
||||||
|
* error.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] msg Pointer to the message instance to process.
|
||||||
|
* \return Error or number of characters transferred.
|
||||||
|
* \retval ERR_BUSY SPI hardware is not ready to start transfer (not
|
||||||
|
* enabled, busy applying settings, ...).
|
||||||
|
* \retval SPI_ERR_OVERFLOW Overflow error.
|
||||||
|
* \retval >=0 Number of characters transferred.
|
||||||
|
*/
|
||||||
|
int32_t _spi_m_sync_trans(struct _spi_m_sync_dev *dev, const struct spi_msg *msg);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
#endif /* ifndef _HPL_SPI_M_SYNC_H_INCLUDED */
|
||||||
232
hal/include/hpl_spi_s_async.h
Normal file
232
hal/include/hpl_spi_s_async.h
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief SPI Slave Async related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_SPI_S_ASYNC_H_INCLUDED
|
||||||
|
#define _HPL_SPI_S_ASYNC_H_INCLUDED
|
||||||
|
|
||||||
|
#include <hpl_spi_async.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup hpl_spi HPL SPI
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Uses common SPI async device driver. */
|
||||||
|
#define _spi_s_async_dev _spi_async_dev
|
||||||
|
|
||||||
|
#define _spi_s_async_dev_cb_type _spi_async_dev_cb_type
|
||||||
|
|
||||||
|
/** Uses common SPI async device driver complete callback type. */
|
||||||
|
#define _spi_m_async_dev_cb_error_t _spi_async_dev_cb_error_t
|
||||||
|
|
||||||
|
/** Uses common SPI async device driver transfer callback type. */
|
||||||
|
#define _spi_s_async_dev_cb_xfer_t _spi_async_dev_cb_xfer_t
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
* \brief Initialize SPI for access with interrupts
|
||||||
|
* It will load default hardware configuration and software struct.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] hw Pointer to the hardware base.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG Input parameter problem.
|
||||||
|
* \retval ERR_BUSY SPI hardware not ready (resetting).
|
||||||
|
* \retval ERR_DENIED SPI has been enabled.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_async_init(struct _spi_s_async_dev *dev, void *const hw);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize SPI for access with interrupts
|
||||||
|
* Disable, reset the hardware and the software struct.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_async_deinit(struct _spi_s_async_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable SPI for access with interrupts
|
||||||
|
* Enable the SPI and enable callback generation of receive and error
|
||||||
|
* interrupts.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG Input parameter problem.
|
||||||
|
* \retval ERR_BUSY SPI hardware not ready (resetting).
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_async_enable(struct _spi_s_async_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable SPI for access without interrupts
|
||||||
|
* Disable SPI and interrupts. Deactivate all CS pins if works as master.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_async_disable(struct _spi_s_async_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI transfer mode
|
||||||
|
* Set SPI transfer mode (\ref spi_transfer_mode),
|
||||||
|
* which controls clock polarity and clock phase.
|
||||||
|
* Mode 0: leading edge is rising edge, data sample on leading edge.
|
||||||
|
* Mode 1: leading edge is rising edge, data sample on trailing edge.
|
||||||
|
* Mode 2: leading edge is falling edge, data sample on leading edge.
|
||||||
|
* Mode 3: leading edge is falling edge, data sample on trailing edge.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] mode The SPI transfer mode.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_async_set_mode(struct _spi_s_async_dev *dev, const enum spi_transfer_mode mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI baudrate
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] char_size The character size, see \ref spi_char_size.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG The character size is not supported.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_async_set_char_size(struct _spi_s_async_dev *dev, const enum spi_char_size char_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI data order
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] dord SPI data order (LSB/MSB first).
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG The character size is not supported.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_async_set_data_order(struct _spi_s_async_dev *dev, const enum spi_data_order dord);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable interrupt on character output
|
||||||
|
*
|
||||||
|
* Enable interrupt when a new character can be written
|
||||||
|
* to the SPI device.
|
||||||
|
*
|
||||||
|
* \param[in] dev Pointer to the SPI device instance
|
||||||
|
* \param[in] state true = enable output interrupt
|
||||||
|
* false = disable output interrupt
|
||||||
|
*
|
||||||
|
* \return Status code
|
||||||
|
* \retval 0 Ok status
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_async_enable_tx(struct _spi_s_async_dev *dev, bool state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable interrupt on character input
|
||||||
|
*
|
||||||
|
* Enable interrupt when a new character is ready to be
|
||||||
|
* read from the SPI device.
|
||||||
|
*
|
||||||
|
* \param[in] dev Pointer to the SPI device instance
|
||||||
|
* \param[in] state true = enable input interrupts
|
||||||
|
* false = disable input interrupt
|
||||||
|
*
|
||||||
|
* \return Status code
|
||||||
|
* \retvat 0 OK Status
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_async_enable_rx(struct _spi_s_async_dev *dev, bool state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable interrupt on Slave Select (SS) rising
|
||||||
|
*
|
||||||
|
* \param[in] dev Pointer to the SPI device instance
|
||||||
|
* \param[in] state true = enable input interrupts
|
||||||
|
* false = disable input interrupt
|
||||||
|
*
|
||||||
|
* \return Status code
|
||||||
|
* \retvat 0 OK Status
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_async_enable_ss_detect(struct _spi_s_async_dev *dev, bool state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Read one character to SPI device instance
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
*
|
||||||
|
* \return Character read from SPI module
|
||||||
|
*/
|
||||||
|
uint16_t _spi_s_async_read_one(struct _spi_s_async_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Write one character to assigned buffer
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] data
|
||||||
|
*
|
||||||
|
* \return Status code of write operation
|
||||||
|
* \retval 0 Write operation OK
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_async_write_one(struct _spi_s_async_dev *dev, uint16_t data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Register the SPI device callback
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] cb_type The callback type.
|
||||||
|
* \param[in] func The callback function to register. NULL to disable callback.
|
||||||
|
* \return Always 0.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_async_register_callback(struct _spi_s_async_dev *dev, const enum _spi_s_async_dev_cb_type cb_type,
|
||||||
|
const FUNC_PTR func);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable/disable SPI slave interrupt
|
||||||
|
*
|
||||||
|
* param[in] device The pointer to SPI slave device instance
|
||||||
|
* param[in] type The type of interrupt to disable/enable if applicable
|
||||||
|
* param[in] state Enable or disable
|
||||||
|
*/
|
||||||
|
void _spi_s_async_set_irq_state(struct _spi_s_async_dev *const device, const enum _spi_async_dev_cb_type type,
|
||||||
|
const bool state);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
#endif /* ifndef _HPL_SPI_S_ASYNC_H_INCLUDED */
|
||||||
232
hal/include/hpl_spi_s_sync.h
Normal file
232
hal/include/hpl_spi_s_sync.h
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief SPI related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_SPI_S_SYNC_H_INCLUDED
|
||||||
|
#define _HPL_SPI_S_SYNC_H_INCLUDED
|
||||||
|
|
||||||
|
#include <hpl_spi_sync.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup hpl_spi HPL SPI
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Uses common SPI sync device driver. */
|
||||||
|
#define _spi_s_sync_dev _spi_sync_dev
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
* \brief Initialize SPI for access without interrupts
|
||||||
|
* It will load default hardware configuration and software struct.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] hw Pointer to the hardware base.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG Input parameter problem.
|
||||||
|
* \retval ERR_BUSY SPI hardware not ready (resetting).
|
||||||
|
* \retval ERR_DENIED SPI has been enabled.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_sync_init(struct _spi_s_sync_dev *dev, void *const hw);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize SPI for access with interrupts
|
||||||
|
* Disable, reset the hardware and the software struct.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_sync_deinit(struct _spi_s_sync_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable SPI for access without interrupts
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_BUSY SPI hardware not ready (resetting).
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_sync_enable(struct _spi_s_sync_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable SPI for access without interrupts
|
||||||
|
* Disable SPI. Deactivate all CS pins if works as master.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_sync_disable(struct _spi_s_sync_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI transfer mode
|
||||||
|
* Set SPI transfer mode (\ref spi_transfer_mode),
|
||||||
|
* which controls clock polarity and clock phase.
|
||||||
|
* Mode 0: leading edge is rising edge, data sample on leading edge.
|
||||||
|
* Mode 1: leading edge is rising edge, data sample on trailing edge.
|
||||||
|
* Mode 2: leading edge is falling edge, data sample on leading edge.
|
||||||
|
* Mode 3: leading edge is falling edge, data sample on trailing edge.
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] mode The SPI transfer mode.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_sync_set_mode(struct _spi_s_sync_dev *dev, const enum spi_transfer_mode mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI baudrate
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] char_size The character size, see \ref spi_char_size.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG The character size is not supported.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_sync_set_char_size(struct _spi_s_sync_dev *dev, const enum spi_char_size char_size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set SPI data order
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] dord SPI data order (LSB/MSB first).
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval ERR_INVALID_ARG The character size is not supported.
|
||||||
|
* \retval ERR_BUSY SPI is not ready to accept new setting.
|
||||||
|
* \retval 0 Operation done successfully.
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_sync_set_data_order(struct _spi_s_sync_dev *dev, const enum spi_data_order dord);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable interrupt on character output
|
||||||
|
*
|
||||||
|
* Enable interrupt when a new character can be written
|
||||||
|
* to the SPI device.
|
||||||
|
*
|
||||||
|
* \param[in] dev Pointer to the SPI device instance
|
||||||
|
* \param[in] state true = enable output interrupt
|
||||||
|
* false = disable output interrupt
|
||||||
|
*
|
||||||
|
* \return Status code
|
||||||
|
* \retval 0 Ok status
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_sync_enable_tx(struct _spi_s_sync_dev *dev, bool state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable interrupt on character input
|
||||||
|
*
|
||||||
|
* Enable interrupt when a new character is ready to be
|
||||||
|
* read from the SPI device.
|
||||||
|
*
|
||||||
|
* \param[in] dev Pointer to the SPI device instance
|
||||||
|
* \param[in] state true = enable input interrupts
|
||||||
|
* false = disable input interrupt
|
||||||
|
*
|
||||||
|
* \return Status code
|
||||||
|
* \retval 0 OK Status
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_sync_enable_rx(struct _spi_s_sync_dev *dev, bool state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Read one character to SPI device instance
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
*
|
||||||
|
* \return Character read from SPI module
|
||||||
|
*/
|
||||||
|
uint16_t _spi_s_sync_read_one(struct _spi_s_sync_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Write one character to assigned buffer
|
||||||
|
* \param[in, out] dev Pointer to the SPI device instance.
|
||||||
|
* \param[in] data
|
||||||
|
*
|
||||||
|
* \return Status code of write operation
|
||||||
|
* \retval 0 Write operation OK
|
||||||
|
*/
|
||||||
|
int32_t _spi_s_sync_write_one(struct _spi_s_sync_dev *dev, uint16_t data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if TX ready
|
||||||
|
*
|
||||||
|
* \param[in] dev Pointer to the SPI device instance
|
||||||
|
*
|
||||||
|
* \return TX ready state
|
||||||
|
* \retval true TX ready
|
||||||
|
* \retval false TX not ready
|
||||||
|
*/
|
||||||
|
bool _spi_s_sync_is_tx_ready(struct _spi_s_sync_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if RX character ready
|
||||||
|
*
|
||||||
|
* \param[in] dev Pointer to the SPI device instance
|
||||||
|
*
|
||||||
|
* \return RX character ready state
|
||||||
|
* \retval true RX character ready
|
||||||
|
* \retval false RX character not ready
|
||||||
|
*/
|
||||||
|
bool _spi_s_sync_is_rx_ready(struct _spi_s_sync_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if SS deactiviation detected
|
||||||
|
*
|
||||||
|
* \param[in] dev Pointer to the SPI device instance
|
||||||
|
*
|
||||||
|
* \return SS deactiviation state
|
||||||
|
* \retval true SS deactiviation detected
|
||||||
|
* \retval false SS deactiviation not detected
|
||||||
|
*/
|
||||||
|
bool _spi_s_sync_is_ss_deactivated(struct _spi_s_sync_dev *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if error is detected
|
||||||
|
*
|
||||||
|
* \param[in] dev Pointer to the SPI device instance
|
||||||
|
*
|
||||||
|
* \return Error detection state
|
||||||
|
* \retval true Error detected
|
||||||
|
* \retval false Error not detected
|
||||||
|
*/
|
||||||
|
bool _spi_s_sync_is_error(struct _spi_s_sync_dev *dev);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
#endif /* ifndef _HPL_SPI_S_SYNC_H_INCLUDED */
|
||||||
70
hal/include/hpl_spi_sync.h
Normal file
70
hal/include/hpl_spi_sync.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Common SPI related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_SPI_SYNC_H_INCLUDED
|
||||||
|
#define _HPL_SPI_SYNC_H_INCLUDED
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
#include <utils.h>
|
||||||
|
|
||||||
|
#include <hpl_spi.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup hpl_spi HPL SPI
|
||||||
|
*
|
||||||
|
* \section hpl_spi_rev Revision History
|
||||||
|
* - v1.0.0 Initial Release
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** SPI driver to support sync HAL */
|
||||||
|
struct _spi_sync_dev {
|
||||||
|
/** Pointer to the hardware base or private data for special device. */
|
||||||
|
void *prvt;
|
||||||
|
/** Data size, number of bytes for each character */
|
||||||
|
uint8_t char_size;
|
||||||
|
/** Dummy byte used in master mode when reading the slave */
|
||||||
|
uint16_t dummy_byte;
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
#endif /* ifndef _HPL_SPI_SYNC_H_INCLUDED */
|
||||||
113
hal/include/hpl_usart.h
Normal file
113
hal/include/hpl_usart.h
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief USART related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_USART_H_INCLUDED
|
||||||
|
#define _HPL_USART_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup HPL USART SYNC
|
||||||
|
*
|
||||||
|
* \section hpl_usart_sync_rev Revision History
|
||||||
|
* - v1.0.0 Initial Release
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART flow control state
|
||||||
|
*/
|
||||||
|
union usart_flow_control_state {
|
||||||
|
struct {
|
||||||
|
uint8_t cts : 1;
|
||||||
|
uint8_t rts : 1;
|
||||||
|
uint8_t unavailable : 1;
|
||||||
|
uint8_t reserved : 5;
|
||||||
|
} bit;
|
||||||
|
uint8_t value;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART baud rate mode
|
||||||
|
*/
|
||||||
|
enum usart_baud_rate_mode { USART_BAUDRATE_ASYNCH_ARITHMETIC, USART_BAUDRATE_ASYNCH_FRACTIONAL, USART_BAUDRATE_SYNCH };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART data order
|
||||||
|
*/
|
||||||
|
enum usart_data_order { USART_DATA_ORDER_MSB = 0, USART_DATA_ORDER_LSB = 1 };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART mode
|
||||||
|
*/
|
||||||
|
enum usart_mode { USART_MODE_ASYNCHRONOUS = 0, USART_MODE_SYNCHRONOUS = 1 };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART parity
|
||||||
|
*/
|
||||||
|
enum usart_parity {
|
||||||
|
USART_PARITY_EVEN = 0,
|
||||||
|
USART_PARITY_ODD = 1,
|
||||||
|
USART_PARITY_NONE = 2,
|
||||||
|
USART_PARITY_SPACE = 3,
|
||||||
|
USART_PARITY_MARK = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART stop bits mode
|
||||||
|
*/
|
||||||
|
enum usart_stop_bits { USART_STOP_BITS_ONE = 0, USART_STOP_BITS_TWO = 1, USART_STOP_BITS_ONE_P_FIVE = 2 };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART character size
|
||||||
|
*/
|
||||||
|
enum usart_character_size {
|
||||||
|
USART_CHARACTER_SIZE_8BITS = 0,
|
||||||
|
USART_CHARACTER_SIZE_9BITS = 1,
|
||||||
|
USART_CHARACTER_SIZE_5BITS = 5,
|
||||||
|
USART_CHARACTER_SIZE_6BITS = 6,
|
||||||
|
USART_CHARACTER_SIZE_7BITS = 7
|
||||||
|
};
|
||||||
|
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**@}*/
|
||||||
|
#endif /* _HPL_USART_H_INCLUDED */
|
||||||
270
hal/include/hpl_usart_async.h
Normal file
270
hal/include/hpl_usart_async.h
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief USART related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_USART_ASYNC_H_INCLUDED
|
||||||
|
#define _HPL_USART_ASYNC_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup HPL USART
|
||||||
|
*
|
||||||
|
* \section hpl_usart_rev Revision History
|
||||||
|
* - v1.0.0 Initial Release
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hpl_usart.h"
|
||||||
|
#include "hpl_irq.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART callback types
|
||||||
|
*/
|
||||||
|
enum _usart_async_callback_type { USART_ASYNC_BYTE_SENT, USART_ASYNC_RX_DONE, USART_ASYNC_TX_DONE, USART_ASYNC_ERROR };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART device structure
|
||||||
|
*
|
||||||
|
* The USART device structure forward declaration.
|
||||||
|
*/
|
||||||
|
struct _usart_async_device;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART interrupt callbacks
|
||||||
|
*/
|
||||||
|
struct _usart_async_callbacks {
|
||||||
|
void (*tx_byte_sent)(struct _usart_async_device *device);
|
||||||
|
void (*rx_done_cb)(struct _usart_async_device *device, uint8_t data);
|
||||||
|
void (*tx_done_cb)(struct _usart_async_device *device);
|
||||||
|
void (*error_cb)(struct _usart_async_device *device);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART descriptor device structure
|
||||||
|
*/
|
||||||
|
struct _usart_async_device {
|
||||||
|
struct _usart_async_callbacks usart_cb;
|
||||||
|
struct _irq_descriptor irq;
|
||||||
|
void * hw;
|
||||||
|
};
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
* \brief Initialize asynchronous USART
|
||||||
|
*
|
||||||
|
* This function does low level USART configuration.
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] hw The pointer to hardware instance
|
||||||
|
*
|
||||||
|
* \return Initialization status
|
||||||
|
*/
|
||||||
|
int32_t _usart_async_init(struct _usart_async_device *const device, void *const hw);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Deinitialize USART
|
||||||
|
*
|
||||||
|
* This function closes the given USART by disabling its clock.
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*/
|
||||||
|
void _usart_async_deinit(struct _usart_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable usart module
|
||||||
|
*
|
||||||
|
* This function will enable the usart module
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*/
|
||||||
|
void _usart_async_enable(struct _usart_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable usart module
|
||||||
|
*
|
||||||
|
* This function will disable the usart module
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*/
|
||||||
|
void _usart_async_disable(struct _usart_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Calculate baud rate register value
|
||||||
|
*
|
||||||
|
* \param[in] baud Required baud rate
|
||||||
|
* \param[in] clock_rate clock frequency
|
||||||
|
* \param[in] samples The number of samples
|
||||||
|
* \param[in] mode USART mode
|
||||||
|
* \param[in] fraction A fraction value
|
||||||
|
*
|
||||||
|
* \return Calculated baud rate register value
|
||||||
|
*/
|
||||||
|
uint16_t _usart_async_calculate_baud_rate(const uint32_t baud, const uint32_t clock_rate, const uint8_t samples,
|
||||||
|
const enum usart_baud_rate_mode mode, const uint8_t fraction);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set baud rate
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] baud_rate A baud rate to set
|
||||||
|
*/
|
||||||
|
void _usart_async_set_baud_rate(struct _usart_async_device *const device, const uint32_t baud_rate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set data order
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] order A data order to set
|
||||||
|
*/
|
||||||
|
void _usart_async_set_data_order(struct _usart_async_device *const device, const enum usart_data_order order);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set mode
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] mode A mode to set
|
||||||
|
*/
|
||||||
|
void _usart_async_set_mode(struct _usart_async_device *const device, const enum usart_mode mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set parity
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] parity A parity to set
|
||||||
|
*/
|
||||||
|
void _usart_async_set_parity(struct _usart_async_device *const device, const enum usart_parity parity);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set stop bits mode
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] stop_bits A stop bits mode to set
|
||||||
|
*/
|
||||||
|
void _usart_async_set_stop_bits(struct _usart_async_device *const device, const enum usart_stop_bits stop_bits);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set character size
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] size A character size to set
|
||||||
|
*/
|
||||||
|
void _usart_async_set_character_size(struct _usart_async_device *const device, const enum usart_character_size size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve usart status
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*/
|
||||||
|
uint32_t _usart_async_get_status(const struct _usart_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Write a byte to the given USART instance
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] data Data to write
|
||||||
|
*/
|
||||||
|
void _usart_async_write_byte(struct _usart_async_device *const device, uint8_t data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if USART is ready to send next byte
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*
|
||||||
|
* \return Status of the ready check.
|
||||||
|
* \retval true if the USART is ready to send next byte
|
||||||
|
* \retval false if the USART is not ready to send next byte
|
||||||
|
*/
|
||||||
|
bool _usart_async_is_byte_sent(const struct _usart_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set the state of flow control pins
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] state - A state of flow control pins to set
|
||||||
|
*/
|
||||||
|
void _usart_async_set_flow_control_state(struct _usart_async_device *const device,
|
||||||
|
const union usart_flow_control_state state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the state of flow control pins
|
||||||
|
*
|
||||||
|
* This function retrieves the of flow control pins.
|
||||||
|
*
|
||||||
|
* \return USART_FLOW_CONTROL_STATE_UNAVAILABLE.
|
||||||
|
*/
|
||||||
|
union usart_flow_control_state _usart_async_get_flow_control_state(const struct _usart_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable data register empty interrupt
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*/
|
||||||
|
void _usart_async_enable_byte_sent_irq(struct _usart_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable transmission complete interrupt
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*/
|
||||||
|
void _usart_async_enable_tx_done_irq(struct _usart_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve ordinal number of the given USART hardware instance
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*
|
||||||
|
* \return The ordinal number of the given USART hardware instance
|
||||||
|
*/
|
||||||
|
uint8_t _usart_async_get_hardware_index(const struct _usart_async_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable/disable USART interrupt
|
||||||
|
*
|
||||||
|
* param[in] device The pointer to USART device instance
|
||||||
|
* param[in] type The type of interrupt to disable/enable if applicable
|
||||||
|
* param[in] state Enable or disable
|
||||||
|
*/
|
||||||
|
void _usart_async_set_irq_state(struct _usart_async_device *const device, const enum _usart_async_callback_type type,
|
||||||
|
const bool state);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**@}*/
|
||||||
|
#endif /* _HPL_USART_ASYNC_H_INCLUDED */
|
||||||
254
hal/include/hpl_usart_sync.h
Normal file
254
hal/include/hpl_usart_sync.h
Normal file
@ -0,0 +1,254 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief USART related functionality declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _HPL_SYNC_USART_H_INCLUDED
|
||||||
|
#define _HPL_SYNC_USART_H_INCLUDED
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup HPL USART SYNC
|
||||||
|
*
|
||||||
|
* \section hpl_usart_sync_rev Revision History
|
||||||
|
* - v1.0.0 Initial Release
|
||||||
|
*
|
||||||
|
*@{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <hpl_usart.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief USART descriptor device structure
|
||||||
|
*/
|
||||||
|
struct _usart_sync_device {
|
||||||
|
void *hw;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \name HPL functions
|
||||||
|
*/
|
||||||
|
//@{
|
||||||
|
/**
|
||||||
|
* \brief Initialize synchronous USART
|
||||||
|
*
|
||||||
|
* This function does low level USART configuration.
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] hw The pointer to hardware instance
|
||||||
|
*
|
||||||
|
* \return Initialization status
|
||||||
|
*/
|
||||||
|
int32_t _usart_sync_init(struct _usart_sync_device *const device, void *const hw);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Deinitialize USART
|
||||||
|
*
|
||||||
|
* This function closes the given USART by disabling its clock.
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*/
|
||||||
|
void _usart_sync_deinit(struct _usart_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable usart module
|
||||||
|
*
|
||||||
|
* This function will enable the usart module
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*/
|
||||||
|
void _usart_sync_enable(struct _usart_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable usart module
|
||||||
|
*
|
||||||
|
* This function will disable the usart module
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*/
|
||||||
|
void _usart_sync_disable(struct _usart_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Calculate baud rate register value
|
||||||
|
*
|
||||||
|
* \param[in] baud Required baud rate
|
||||||
|
* \param[in] clock_rate clock frequency
|
||||||
|
* \param[in] samples The number of samples
|
||||||
|
* \param[in] mode USART mode
|
||||||
|
* \param[in] fraction A fraction value
|
||||||
|
*
|
||||||
|
* \return Calculated baud rate register value
|
||||||
|
*/
|
||||||
|
uint16_t _usart_sync_calculate_baud_rate(const uint32_t baud, const uint32_t clock_rate, const uint8_t samples,
|
||||||
|
const enum usart_baud_rate_mode mode, const uint8_t fraction);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set baud rate
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] baud_rate A baud rate to set
|
||||||
|
*/
|
||||||
|
void _usart_sync_set_baud_rate(struct _usart_sync_device *const device, const uint32_t baud_rate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set data order
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] order A data order to set
|
||||||
|
*/
|
||||||
|
void _usart_sync_set_data_order(struct _usart_sync_device *const device, const enum usart_data_order order);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set mode
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] mode A mode to set
|
||||||
|
*/
|
||||||
|
void _usart_sync_set_mode(struct _usart_sync_device *const device, const enum usart_mode mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set parity
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] parity A parity to set
|
||||||
|
*/
|
||||||
|
void _usart_sync_set_parity(struct _usart_sync_device *const device, const enum usart_parity parity);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set stop bits mode
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] stop_bits A stop bits mode to set
|
||||||
|
*/
|
||||||
|
void _usart_sync_set_stop_bits(struct _usart_sync_device *const device, const enum usart_stop_bits stop_bits);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set character size
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] size A character size to set
|
||||||
|
*/
|
||||||
|
void _usart_sync_set_character_size(struct _usart_sync_device *const device, const enum usart_character_size size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve usart status
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*/
|
||||||
|
uint32_t _usart_sync_get_status(const struct _usart_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Write a byte to the given USART instance
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] data Data to write
|
||||||
|
*/
|
||||||
|
void _usart_sync_write_byte(struct _usart_sync_device *const device, uint8_t data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Read a byte from the given USART instance
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] data Data to write
|
||||||
|
*
|
||||||
|
* \return Data received via USART interface.
|
||||||
|
*/
|
||||||
|
uint8_t _usart_sync_read_byte(const struct _usart_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if USART is ready to send next byte
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*
|
||||||
|
* \return Status of the ready check.
|
||||||
|
* \retval true if the USART is ready to send next byte
|
||||||
|
* \retval false if the USART is not ready to send next byte
|
||||||
|
*/
|
||||||
|
bool _usart_sync_is_ready_to_send(const struct _usart_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if USART transmitter has sent the byte
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*
|
||||||
|
* \return Status of the ready check.
|
||||||
|
* \retval true if the USART transmitter has sent the byte
|
||||||
|
* \retval false if the USART transmitter has not send the byte
|
||||||
|
*/
|
||||||
|
bool _usart_sync_is_transmit_done(const struct _usart_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if there is data received by USART
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*
|
||||||
|
* \return Status of the data received check.
|
||||||
|
* \retval true if the USART has received a byte
|
||||||
|
* \retval false if the USART has not received a byte
|
||||||
|
*/
|
||||||
|
bool _usart_sync_is_byte_received(const struct _usart_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set the state of flow control pins
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
* \param[in] state - A state of flow control pins to set
|
||||||
|
*/
|
||||||
|
void _usart_sync_set_flow_control_state(struct _usart_sync_device *const device,
|
||||||
|
const union usart_flow_control_state state);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the state of flow control pins
|
||||||
|
*
|
||||||
|
* This function retrieves the of flow control pins.
|
||||||
|
*
|
||||||
|
* \return USART_FLOW_CONTROL_STATE_UNAVAILABLE.
|
||||||
|
*/
|
||||||
|
union usart_flow_control_state _usart_sync_get_flow_control_state(const struct _usart_sync_device *const device);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve ordinal number of the given USART hardware instance
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to USART device instance
|
||||||
|
*
|
||||||
|
* \return The ordinal number of the given USART hardware instance
|
||||||
|
*/
|
||||||
|
uint8_t _usart_sync_get_hardware_index(const struct _usart_sync_device *const device);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
/**@}*/
|
||||||
|
#endif /* _HPL_SYNC_USART_H_INCLUDED */
|
||||||
66
hal/src/hal_atomic.c
Normal file
66
hal/src/hal_atomic.c
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Critical sections related functionality implementation.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hal_atomic.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Driver version
|
||||||
|
*/
|
||||||
|
#define DRIVER_VERSION 0x00000001u
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable interrupts, enter critical section
|
||||||
|
*/
|
||||||
|
void atomic_enter_critical(hal_atomic_t volatile *atomic)
|
||||||
|
{
|
||||||
|
*atomic = __get_PRIMASK();
|
||||||
|
__disable_irq();
|
||||||
|
__DMB();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Exit atomic section
|
||||||
|
*/
|
||||||
|
void atomic_leave_critical(hal_atomic_t volatile *atomic)
|
||||||
|
{
|
||||||
|
__DMB();
|
||||||
|
__set_PRIMASK(*atomic);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the current driver version
|
||||||
|
*/
|
||||||
|
uint32_t atomic_get_version(void)
|
||||||
|
{
|
||||||
|
return DRIVER_VERSION;
|
||||||
|
}
|
||||||
80
hal/src/hal_delay.c
Normal file
80
hal/src/hal_delay.c
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief HAL delay related functionality implementation.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <hpl_irq.h>
|
||||||
|
#include <hpl_reset.h>
|
||||||
|
#include <hpl_sleep.h>
|
||||||
|
#include "hal_delay.h"
|
||||||
|
#include <hpl_delay.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Driver version
|
||||||
|
*/
|
||||||
|
#define DRIVER_VERSION 0x00000001u
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief The pointer to a hardware instance used by the driver.
|
||||||
|
*/
|
||||||
|
static void *hardware;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize Delay driver
|
||||||
|
*/
|
||||||
|
void delay_init(void *const hw)
|
||||||
|
{
|
||||||
|
_delay_init(hardware = hw);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Perform delay in us
|
||||||
|
*/
|
||||||
|
void delay_us(const uint16_t us)
|
||||||
|
{
|
||||||
|
_delay_cycles(hardware, _get_cycles_for_us(us));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Perform delay in ms
|
||||||
|
*/
|
||||||
|
void delay_ms(const uint16_t ms)
|
||||||
|
{
|
||||||
|
_delay_cycles(hardware, _get_cycles_for_ms(ms));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the current driver version
|
||||||
|
*/
|
||||||
|
uint32_t delay_get_version(void)
|
||||||
|
{
|
||||||
|
return DRIVER_VERSION;
|
||||||
|
}
|
||||||
188
hal/src/hal_ext_irq.c
Normal file
188
hal/src/hal_ext_irq.c
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief External interrupt functionality imkplementation.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hal_ext_irq.h"
|
||||||
|
|
||||||
|
#define EXT_IRQ_AMOUNT 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Driver version
|
||||||
|
*/
|
||||||
|
#define DRIVER_VERSION 0x00000001u
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief External IRQ struct
|
||||||
|
*/
|
||||||
|
struct ext_irq {
|
||||||
|
ext_irq_cb_t cb;
|
||||||
|
uint32_t pin;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Remove KEIL compiling error in case no IRQ line selected */
|
||||||
|
#if EXT_IRQ_AMOUNT == 0
|
||||||
|
#undef EXT_IRQ_AMOUNT
|
||||||
|
#define EXT_IRQ_AMOUNT 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Array of external IRQs callbacks
|
||||||
|
*/
|
||||||
|
static struct ext_irq ext_irqs[EXT_IRQ_AMOUNT];
|
||||||
|
|
||||||
|
static void process_ext_irq(const uint32_t pin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize external irq component if any
|
||||||
|
*/
|
||||||
|
int32_t ext_irq_init(void)
|
||||||
|
{
|
||||||
|
uint16_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < EXT_IRQ_AMOUNT; i++) {
|
||||||
|
ext_irqs[i].pin = 0xFFFFFFFF;
|
||||||
|
ext_irqs[i].cb = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _ext_irq_init(process_ext_irq);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Deinitialize external irq if any
|
||||||
|
*/
|
||||||
|
int32_t ext_irq_deinit(void)
|
||||||
|
{
|
||||||
|
return _ext_irq_deinit();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Register callback for the given external interrupt
|
||||||
|
*/
|
||||||
|
int32_t ext_irq_register(const uint32_t pin, ext_irq_cb_t cb)
|
||||||
|
{
|
||||||
|
uint8_t i = 0, j = 0;
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
|
for (; i < EXT_IRQ_AMOUNT; i++) {
|
||||||
|
if (ext_irqs[i].pin == pin) {
|
||||||
|
ext_irqs[i].cb = cb;
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == cb) {
|
||||||
|
if (!found) {
|
||||||
|
return ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
return _ext_irq_enable(pin, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
for (i = 0; i < EXT_IRQ_AMOUNT; i++) {
|
||||||
|
if (NULL == ext_irqs[i].cb) {
|
||||||
|
ext_irqs[i].cb = cb;
|
||||||
|
ext_irqs[i].pin = pin;
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (; (j < EXT_IRQ_AMOUNT) && (i < EXT_IRQ_AMOUNT); j++) {
|
||||||
|
if ((ext_irqs[i].pin < ext_irqs[j].pin) && (ext_irqs[j].pin != 0xFFFFFFFF)) {
|
||||||
|
struct ext_irq tmp = ext_irqs[j];
|
||||||
|
|
||||||
|
ext_irqs[j] = ext_irqs[i];
|
||||||
|
ext_irqs[i] = tmp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
return ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
return _ext_irq_enable(pin, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable external irq
|
||||||
|
*/
|
||||||
|
int32_t ext_irq_enable(const uint32_t pin)
|
||||||
|
{
|
||||||
|
return _ext_irq_enable(pin, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable external irq
|
||||||
|
*/
|
||||||
|
int32_t ext_irq_disable(const uint32_t pin)
|
||||||
|
{
|
||||||
|
return _ext_irq_enable(pin, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the current driver version
|
||||||
|
*/
|
||||||
|
uint32_t ext_irq_get_version(void)
|
||||||
|
{
|
||||||
|
return DRIVER_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Interrupt processing routine
|
||||||
|
*
|
||||||
|
* \param[in] pin The pin which triggered the interrupt
|
||||||
|
*/
|
||||||
|
static void process_ext_irq(const uint32_t pin)
|
||||||
|
{
|
||||||
|
uint8_t lower = 0, middle, upper = EXT_IRQ_AMOUNT;
|
||||||
|
|
||||||
|
while (upper >= lower) {
|
||||||
|
middle = (upper + lower) >> 1;
|
||||||
|
if (middle >= EXT_IRQ_AMOUNT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ext_irqs[middle].pin == pin) {
|
||||||
|
if (ext_irqs[middle].cb) {
|
||||||
|
ext_irqs[middle].cb();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ext_irqs[middle].pin < pin) {
|
||||||
|
lower = middle + 1;
|
||||||
|
} else {
|
||||||
|
upper = middle - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
44
hal/src/hal_gpio.c
Normal file
44
hal/src/hal_gpio.c
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Port
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hal_gpio.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Driver version
|
||||||
|
*/
|
||||||
|
#define DRIVER_VERSION 0x00000001u
|
||||||
|
|
||||||
|
uint32_t gpio_get_version(void)
|
||||||
|
{
|
||||||
|
return DRIVER_VERSION;
|
||||||
|
}
|
||||||
47
hal/src/hal_init.c
Normal file
47
hal/src/hal_init.c
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief HAL initialization related functionality implementation.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hal_init.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Driver version
|
||||||
|
*/
|
||||||
|
#define HAL_INIT_VERSION 0x00000001u
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the current driver version
|
||||||
|
*/
|
||||||
|
uint32_t init_get_version(void)
|
||||||
|
{
|
||||||
|
return HAL_INIT_VERSION;
|
||||||
|
}
|
||||||
63
hal/src/hal_io.c
Normal file
63
hal/src/hal_io.c
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief I/O functionality implementation.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <hal_io.h>
|
||||||
|
#include <utils_assert.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Driver version
|
||||||
|
*/
|
||||||
|
#define DRIVER_VERSION 0x00000001u
|
||||||
|
|
||||||
|
uint32_t io_get_version(void)
|
||||||
|
{
|
||||||
|
return DRIVER_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief I/O write interface
|
||||||
|
*/
|
||||||
|
int32_t io_write(struct io_descriptor *const io_descr, const uint8_t *const buf, const uint16_t length)
|
||||||
|
{
|
||||||
|
ASSERT(io_descr && buf);
|
||||||
|
return io_descr->write(io_descr, buf, length);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief I/O read interface
|
||||||
|
*/
|
||||||
|
int32_t io_read(struct io_descriptor *const io_descr, uint8_t *const buf, const uint16_t length)
|
||||||
|
{
|
||||||
|
ASSERT(io_descr && buf);
|
||||||
|
return io_descr->read(io_descr, buf, length);
|
||||||
|
}
|
||||||
73
hal/src/hal_sleep.c
Normal file
73
hal/src/hal_sleep.c
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Sleep related functionality implementation.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hal_sleep.h"
|
||||||
|
#include <hpl_sleep.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Driver version
|
||||||
|
*/
|
||||||
|
#define DRIVER_VERSION 0x00000001u
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set the sleep mode of the device and put the MCU to sleep
|
||||||
|
*
|
||||||
|
* For an overview of which systems are disabled in sleep for the different
|
||||||
|
* sleep modes, see the data sheet.
|
||||||
|
*
|
||||||
|
* \param[in] mode Sleep mode to use
|
||||||
|
*
|
||||||
|
* \return The status of a sleep request
|
||||||
|
* \retval -1 The requested sleep mode was invalid or not available
|
||||||
|
* \retval 0 The operation completed successfully, returned after leaving the
|
||||||
|
* sleep
|
||||||
|
*/
|
||||||
|
int sleep(const uint8_t mode)
|
||||||
|
{
|
||||||
|
if (ERR_NONE != _set_sleep_mode(mode))
|
||||||
|
return ERR_INVALID_ARG;
|
||||||
|
|
||||||
|
_go_to_sleep();
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the current driver version
|
||||||
|
*
|
||||||
|
* \return Current driver version
|
||||||
|
*/
|
||||||
|
uint32_t sleep_get_version(void)
|
||||||
|
{
|
||||||
|
return DRIVER_VERSION;
|
||||||
|
}
|
||||||
201
hal/src/hal_spi_m_sync.c
Normal file
201
hal/src/hal_spi_m_sync.c
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief I/O SPI related functionality implementation.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hal_spi_m_sync.h"
|
||||||
|
#include <utils_assert.h>
|
||||||
|
#include <utils.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Driver version
|
||||||
|
*/
|
||||||
|
#define SPI_M_SYNC_DRIVER_VERSION 0x00000001u
|
||||||
|
|
||||||
|
#define SPI_DEACTIVATE_NEXT 0x8000
|
||||||
|
|
||||||
|
static int32_t _spi_m_sync_io_write(struct io_descriptor *const io, const uint8_t *const buf, const uint16_t length);
|
||||||
|
static int32_t _spi_m_sync_io_read(struct io_descriptor *const io, uint8_t *const buf, const uint16_t length);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize the SPI HAL instance function pointer for HPL APIs.
|
||||||
|
*/
|
||||||
|
void spi_m_sync_set_func_ptr(struct spi_m_sync_descriptor *spi, void *const func)
|
||||||
|
{
|
||||||
|
ASSERT(spi);
|
||||||
|
spi->func = (struct _spi_m_sync_hpl_interface *)func;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t spi_m_sync_init(struct spi_m_sync_descriptor *spi, void *const hw)
|
||||||
|
{
|
||||||
|
int32_t rc = 0;
|
||||||
|
ASSERT(spi && hw);
|
||||||
|
spi->dev.prvt = (void *)hw;
|
||||||
|
rc = _spi_m_sync_init(&spi->dev, hw);
|
||||||
|
|
||||||
|
if (rc < 0) {
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
spi->flags = SPI_DEACTIVATE_NEXT;
|
||||||
|
spi->io.read = _spi_m_sync_io_read;
|
||||||
|
spi->io.write = _spi_m_sync_io_write;
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_m_sync_deinit(struct spi_m_sync_descriptor *spi)
|
||||||
|
{
|
||||||
|
ASSERT(spi);
|
||||||
|
_spi_m_sync_deinit(&spi->dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_m_sync_enable(struct spi_m_sync_descriptor *spi)
|
||||||
|
{
|
||||||
|
ASSERT(spi);
|
||||||
|
_spi_m_sync_enable(&spi->dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void spi_m_sync_disable(struct spi_m_sync_descriptor *spi)
|
||||||
|
{
|
||||||
|
ASSERT(spi);
|
||||||
|
_spi_m_sync_disable(&spi->dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t spi_m_sync_set_baudrate(struct spi_m_sync_descriptor *spi, const uint32_t baud_val)
|
||||||
|
{
|
||||||
|
ASSERT(spi);
|
||||||
|
return _spi_m_sync_set_baudrate(&spi->dev, baud_val);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t spi_m_sync_set_mode(struct spi_m_sync_descriptor *spi, const enum spi_transfer_mode mode)
|
||||||
|
{
|
||||||
|
ASSERT(spi);
|
||||||
|
return _spi_m_sync_set_mode(&spi->dev, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t spi_m_sync_set_char_size(struct spi_m_sync_descriptor *spi, const enum spi_char_size char_size)
|
||||||
|
{
|
||||||
|
ASSERT(spi);
|
||||||
|
return _spi_m_sync_set_char_size(&spi->dev, char_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t spi_m_sync_set_data_order(struct spi_m_sync_descriptor *spi, const enum spi_data_order dord)
|
||||||
|
{
|
||||||
|
ASSERT(spi);
|
||||||
|
return _spi_m_sync_set_data_order(&spi->dev, dord);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Do SPI read in polling way
|
||||||
|
* For SPI master, activate CS, do send 0xFFs and read data, deactivate CS.
|
||||||
|
*
|
||||||
|
* It blocks until all data read or error.
|
||||||
|
*
|
||||||
|
* \param[in, out] spi Pointer to the HAL SPI instance.
|
||||||
|
* \param[out] buf Pointer to the buffer to store read data.
|
||||||
|
* \param[in] size Size of the data in number of characters.
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval size Success.
|
||||||
|
* \retval >=0 Time out, with number of characters read.
|
||||||
|
*/
|
||||||
|
static int32_t _spi_m_sync_io_read(struct io_descriptor *io, uint8_t *buf, const uint16_t length)
|
||||||
|
{
|
||||||
|
ASSERT(io);
|
||||||
|
|
||||||
|
struct spi_m_sync_descriptor *spi = CONTAINER_OF(io, struct spi_m_sync_descriptor, io);
|
||||||
|
struct spi_xfer xfer;
|
||||||
|
|
||||||
|
xfer.rxbuf = buf;
|
||||||
|
xfer.txbuf = 0;
|
||||||
|
xfer.size = length;
|
||||||
|
|
||||||
|
return spi_m_sync_transfer(spi, &xfer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** \brief Do SPI data write in polling way
|
||||||
|
* For SPI master, activate CS, do buffer send and deactivate CS. The data back
|
||||||
|
* is discarded.
|
||||||
|
*
|
||||||
|
* The data read back is discarded.
|
||||||
|
*
|
||||||
|
* It blocks until all data sent or error.
|
||||||
|
*
|
||||||
|
* \param[in, out] spi Pointer to the HAL SPI instance.
|
||||||
|
* \param[in] p_xfer Pointer to the transfer information (\ref spi_transfer).
|
||||||
|
* \return Operation status.
|
||||||
|
* \retval size Success.
|
||||||
|
* \retval >=0 Timeout, with number of characters transferred.
|
||||||
|
*/
|
||||||
|
static int32_t _spi_m_sync_io_write(struct io_descriptor *const io, const uint8_t *const buf, const uint16_t length)
|
||||||
|
{
|
||||||
|
ASSERT(io);
|
||||||
|
|
||||||
|
struct spi_m_sync_descriptor *spi = CONTAINER_OF(io, struct spi_m_sync_descriptor, io);
|
||||||
|
struct spi_xfer xfer;
|
||||||
|
|
||||||
|
xfer.rxbuf = 0;
|
||||||
|
xfer.txbuf = (uint8_t *)buf;
|
||||||
|
xfer.size = length;
|
||||||
|
|
||||||
|
return spi_m_sync_transfer(spi, &xfer);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t spi_m_sync_transfer(struct spi_m_sync_descriptor *spi, const struct spi_xfer *p_xfer)
|
||||||
|
{
|
||||||
|
struct spi_msg msg;
|
||||||
|
|
||||||
|
ASSERT(spi && p_xfer);
|
||||||
|
|
||||||
|
msg.txbuf = p_xfer->txbuf;
|
||||||
|
msg.rxbuf = p_xfer->rxbuf;
|
||||||
|
msg.size = p_xfer->size;
|
||||||
|
return _spi_m_sync_trans(&spi->dev, &msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t spi_m_sync_get_io_descriptor(struct spi_m_sync_descriptor *const spi, struct io_descriptor **io)
|
||||||
|
{
|
||||||
|
ASSERT(spi && io);
|
||||||
|
*io = &spi->io;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t spi_m_sync_get_version(void)
|
||||||
|
{
|
||||||
|
return SPI_M_SYNC_DRIVER_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
420
hal/src/hal_usart_async.c
Normal file
420
hal/src/hal_usart_async.c
Normal file
@ -0,0 +1,420 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief I/O USART related functionality implementation.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "hal_usart_async.h"
|
||||||
|
#include <utils_assert.h>
|
||||||
|
#include <hal_atomic.h>
|
||||||
|
#include <utils.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Driver version
|
||||||
|
*/
|
||||||
|
#define DRIVER_VERSION 0x00000001u
|
||||||
|
|
||||||
|
static int32_t usart_async_write(struct io_descriptor *const io_descr, const uint8_t *const buf, const uint16_t length);
|
||||||
|
static int32_t usart_async_read(struct io_descriptor *const io_descr, uint8_t *const buf, const uint16_t length);
|
||||||
|
static void usart_process_byte_sent(struct _usart_async_device *device);
|
||||||
|
static void usart_transmission_complete(struct _usart_async_device *device);
|
||||||
|
static void usart_error(struct _usart_async_device *device);
|
||||||
|
static void usart_fill_rx_buffer(struct _usart_async_device *device, uint8_t data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Initialize usart interface
|
||||||
|
*/
|
||||||
|
int32_t usart_async_init(struct usart_async_descriptor *const descr, void *const hw, uint8_t *rx_buffer,
|
||||||
|
uint16_t rx_buffer_length, void *const func)
|
||||||
|
{
|
||||||
|
int32_t init_status;
|
||||||
|
ASSERT(descr && hw && rx_buffer && rx_buffer_length);
|
||||||
|
|
||||||
|
if (ERR_NONE != ringbuffer_init(&descr->rx, rx_buffer, rx_buffer_length)) {
|
||||||
|
return ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
init_status = _usart_async_init(&descr->device, hw);
|
||||||
|
if (init_status) {
|
||||||
|
return init_status;
|
||||||
|
}
|
||||||
|
|
||||||
|
descr->io.read = usart_async_read;
|
||||||
|
descr->io.write = usart_async_write;
|
||||||
|
|
||||||
|
descr->device.usart_cb.tx_byte_sent = usart_process_byte_sent;
|
||||||
|
descr->device.usart_cb.rx_done_cb = usart_fill_rx_buffer;
|
||||||
|
descr->device.usart_cb.tx_done_cb = usart_transmission_complete;
|
||||||
|
descr->device.usart_cb.error_cb = usart_error;
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Deinitialize usart interface
|
||||||
|
*/
|
||||||
|
int32_t usart_async_deinit(struct usart_async_descriptor *const descr)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
_usart_async_deinit(&descr->device);
|
||||||
|
descr->io.read = NULL;
|
||||||
|
descr->io.write = NULL;
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Enable usart interface
|
||||||
|
*/
|
||||||
|
int32_t usart_async_enable(struct usart_async_descriptor *const descr)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
_usart_async_enable(&descr->device);
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Disable usart interface
|
||||||
|
*/
|
||||||
|
int32_t usart_async_disable(struct usart_async_descriptor *const descr)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
_usart_async_disable(&descr->device);
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve I/O descriptor
|
||||||
|
*/
|
||||||
|
int32_t usart_async_get_io_descriptor(struct usart_async_descriptor *const descr, struct io_descriptor **io)
|
||||||
|
{
|
||||||
|
ASSERT(descr && io);
|
||||||
|
|
||||||
|
*io = &descr->io;
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Register usart callback
|
||||||
|
*/
|
||||||
|
int32_t usart_async_register_callback(struct usart_async_descriptor *const descr,
|
||||||
|
const enum usart_async_callback_type type, usart_cb_t cb)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case USART_ASYNC_RXC_CB:
|
||||||
|
descr->usart_cb.rx_done = cb;
|
||||||
|
_usart_async_set_irq_state(&descr->device, USART_ASYNC_RX_DONE, NULL != cb);
|
||||||
|
break;
|
||||||
|
case USART_ASYNC_TXC_CB:
|
||||||
|
descr->usart_cb.tx_done = cb;
|
||||||
|
_usart_async_set_irq_state(&descr->device, USART_ASYNC_TX_DONE, NULL != cb);
|
||||||
|
break;
|
||||||
|
case USART_ASYNC_ERROR_CB:
|
||||||
|
descr->usart_cb.error = cb;
|
||||||
|
_usart_async_set_irq_state(&descr->device, USART_ASYNC_ERROR, NULL != cb);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return ERR_INVALID_ARG;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Specify action for flow control pins
|
||||||
|
*/
|
||||||
|
int32_t usart_async_set_flow_control(struct usart_async_descriptor *const descr,
|
||||||
|
const union usart_flow_control_state state)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
_usart_async_set_flow_control_state(&descr->device, state);
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set usart baud rate
|
||||||
|
*/
|
||||||
|
int32_t usart_async_set_baud_rate(struct usart_async_descriptor *const descr, const uint32_t baud_rate)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
_usart_async_set_baud_rate(&descr->device, baud_rate);
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set usart data order
|
||||||
|
*/
|
||||||
|
int32_t usart_async_set_data_order(struct usart_async_descriptor *const descr, const enum usart_data_order data_order)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
_usart_async_set_data_order(&descr->device, data_order);
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set usart mode
|
||||||
|
*/
|
||||||
|
int32_t usart_async_set_mode(struct usart_async_descriptor *const descr, const enum usart_mode mode)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
_usart_async_set_mode(&descr->device, mode);
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set usart parity
|
||||||
|
*/
|
||||||
|
int32_t usart_async_set_parity(struct usart_async_descriptor *const descr, const enum usart_parity parity)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
_usart_async_set_parity(&descr->device, parity);
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set usart stop bits
|
||||||
|
*/
|
||||||
|
int32_t usart_async_set_stopbits(struct usart_async_descriptor *const descr, const enum usart_stop_bits stop_bits)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
_usart_async_set_stop_bits(&descr->device, stop_bits);
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set usart character size
|
||||||
|
*/
|
||||||
|
int32_t usart_async_set_character_size(struct usart_async_descriptor *const descr, const enum usart_character_size size)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
_usart_async_set_character_size(&descr->device, size);
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the state of flow control pins
|
||||||
|
*/
|
||||||
|
int32_t usart_async_flow_control_status(const struct usart_async_descriptor *const descr,
|
||||||
|
union usart_flow_control_state *const state)
|
||||||
|
{
|
||||||
|
ASSERT(descr && state);
|
||||||
|
*state = _usart_async_get_flow_control_state(&descr->device);
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if the usart transmitter is empty
|
||||||
|
*/
|
||||||
|
int32_t usart_async_is_tx_empty(const struct usart_async_descriptor *const descr)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
return _usart_async_is_byte_sent(&descr->device);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check if the usart receiver is not empty
|
||||||
|
*/
|
||||||
|
int32_t usart_async_is_rx_not_empty(const struct usart_async_descriptor *const descr)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
|
||||||
|
return ringbuffer_num(&descr->rx) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the current interface status
|
||||||
|
*/
|
||||||
|
int32_t usart_async_get_status(struct usart_async_descriptor *const descr, struct usart_async_status *const status)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
|
||||||
|
volatile uint32_t *tmp_stat = &(descr->stat);
|
||||||
|
volatile uint16_t *tmp_txcnt = &(descr->tx_por);
|
||||||
|
|
||||||
|
if (status) {
|
||||||
|
status->flags = *tmp_stat;
|
||||||
|
status->txcnt = *tmp_txcnt;
|
||||||
|
status->rxcnt = ringbuffer_num(&descr->rx);
|
||||||
|
}
|
||||||
|
if (*tmp_stat & USART_ASYNC_STATUS_BUSY) {
|
||||||
|
return ERR_BUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ERR_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief flush usart rx ringbuf
|
||||||
|
*/
|
||||||
|
int32_t usart_async_flush_rx_buffer(struct usart_async_descriptor *const descr)
|
||||||
|
{
|
||||||
|
ASSERT(descr);
|
||||||
|
|
||||||
|
return ringbuffer_flush(&descr->rx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the current driver version
|
||||||
|
*/
|
||||||
|
uint32_t usart_async_get_version(void)
|
||||||
|
{
|
||||||
|
return DRIVER_VERSION;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* \internal Write the given data to usart interface
|
||||||
|
*
|
||||||
|
* \param[in] descr The pointer to an io descriptor
|
||||||
|
* \param[in] buf Data to write to usart
|
||||||
|
* \param[in] length The number of bytes to write
|
||||||
|
*
|
||||||
|
* \return The number of bytes written.
|
||||||
|
*/
|
||||||
|
static int32_t usart_async_write(struct io_descriptor *const io_descr, const uint8_t *const buf, const uint16_t length)
|
||||||
|
{
|
||||||
|
struct usart_async_descriptor *descr = CONTAINER_OF(io_descr, struct usart_async_descriptor, io);
|
||||||
|
|
||||||
|
ASSERT(descr && buf && length);
|
||||||
|
|
||||||
|
if (descr->tx_por != descr->tx_buffer_length) {
|
||||||
|
return ERR_NO_RESOURCE;
|
||||||
|
}
|
||||||
|
descr->tx_buffer = (uint8_t *)buf;
|
||||||
|
descr->tx_buffer_length = length;
|
||||||
|
descr->tx_por = 0;
|
||||||
|
descr->stat = USART_ASYNC_STATUS_BUSY;
|
||||||
|
_usart_async_enable_byte_sent_irq(&descr->device);
|
||||||
|
|
||||||
|
return (int32_t)length;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* \internal Read data from usart interface
|
||||||
|
*
|
||||||
|
* \param[in] descr The pointer to an io descriptor
|
||||||
|
* \param[in] buf A buffer to read data to
|
||||||
|
* \param[in] length The size of a buffer
|
||||||
|
*
|
||||||
|
* \return The number of bytes read.
|
||||||
|
*/
|
||||||
|
static int32_t usart_async_read(struct io_descriptor *const io_descr, uint8_t *const buf, const uint16_t length)
|
||||||
|
{
|
||||||
|
uint16_t was_read = 0;
|
||||||
|
uint32_t num;
|
||||||
|
struct usart_async_descriptor *descr = CONTAINER_OF(io_descr, struct usart_async_descriptor, io);
|
||||||
|
|
||||||
|
ASSERT(descr && buf && length);
|
||||||
|
|
||||||
|
CRITICAL_SECTION_ENTER()
|
||||||
|
num = ringbuffer_num(&descr->rx);
|
||||||
|
CRITICAL_SECTION_LEAVE()
|
||||||
|
|
||||||
|
while ((was_read < num) && (was_read < length)) {
|
||||||
|
ringbuffer_get(&descr->rx, &buf[was_read++]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (int32_t)was_read;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Process "byte is sent" interrupt
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to device structure
|
||||||
|
*/
|
||||||
|
static void usart_process_byte_sent(struct _usart_async_device *device)
|
||||||
|
{
|
||||||
|
struct usart_async_descriptor *descr = CONTAINER_OF(device, struct usart_async_descriptor, device);
|
||||||
|
if (descr->tx_por != descr->tx_buffer_length) {
|
||||||
|
_usart_async_write_byte(&descr->device, descr->tx_buffer[descr->tx_por++]);
|
||||||
|
_usart_async_enable_byte_sent_irq(&descr->device);
|
||||||
|
} else {
|
||||||
|
_usart_async_enable_tx_done_irq(&descr->device);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Process completion of data sending
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to device structure
|
||||||
|
*/
|
||||||
|
static void usart_transmission_complete(struct _usart_async_device *device)
|
||||||
|
{
|
||||||
|
struct usart_async_descriptor *descr = CONTAINER_OF(device, struct usart_async_descriptor, device);
|
||||||
|
|
||||||
|
descr->stat = 0;
|
||||||
|
if (descr->usart_cb.tx_done) {
|
||||||
|
descr->usart_cb.tx_done(descr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Process byte reception
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to device structure
|
||||||
|
* \param[in] data Data read
|
||||||
|
*/
|
||||||
|
static void usart_fill_rx_buffer(struct _usart_async_device *device, uint8_t data)
|
||||||
|
{
|
||||||
|
struct usart_async_descriptor *descr = CONTAINER_OF(device, struct usart_async_descriptor, device);
|
||||||
|
|
||||||
|
ringbuffer_put(&descr->rx, data);
|
||||||
|
|
||||||
|
if (descr->usart_cb.rx_done) {
|
||||||
|
descr->usart_cb.rx_done(descr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Process error interrupt
|
||||||
|
*
|
||||||
|
* \param[in] device The pointer to device structure
|
||||||
|
*/
|
||||||
|
static void usart_error(struct _usart_async_device *device)
|
||||||
|
{
|
||||||
|
struct usart_async_descriptor *descr = CONTAINER_OF(device, struct usart_async_descriptor, device);
|
||||||
|
|
||||||
|
descr->stat = 0;
|
||||||
|
if (descr->usart_cb.error) {
|
||||||
|
descr->usart_cb.error(descr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//@}
|
||||||
64
hal/utils/include/compiler.h
Normal file
64
hal/utils/include/compiler.h
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Header
|
||||||
|
*
|
||||||
|
* Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
* Support and FAQ: visit <a href="https://www.microchip.com/support/">Microchip Support</a>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* compiler.h
|
||||||
|
*
|
||||||
|
* Created: 05.05.2014
|
||||||
|
* Author: N. Fomin
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _COMPILER_H
|
||||||
|
#define _COMPILER_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#ifndef _UNIT_TEST_
|
||||||
|
#include "parts.h"
|
||||||
|
#endif
|
||||||
|
#include "err_codes.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _COMPILER_H */
|
||||||
73
hal/utils/include/err_codes.h
Normal file
73
hal/utils/include/err_codes.h
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Error code definitions.
|
||||||
|
*
|
||||||
|
* This file defines various status codes returned by functions,
|
||||||
|
* indicating success or failure as well as what kind of failure.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ERROR_CODES_H_INCLUDED
|
||||||
|
#define ERROR_CODES_H_INCLUDED
|
||||||
|
|
||||||
|
#define ERR_NONE 0
|
||||||
|
#define ERR_INVALID_DATA -1
|
||||||
|
#define ERR_NO_CHANGE -2
|
||||||
|
#define ERR_ABORTED -3
|
||||||
|
#define ERR_BUSY -4
|
||||||
|
#define ERR_SUSPEND -5
|
||||||
|
#define ERR_IO -6
|
||||||
|
#define ERR_REQ_FLUSHED -7
|
||||||
|
#define ERR_TIMEOUT -8
|
||||||
|
#define ERR_BAD_DATA -9
|
||||||
|
#define ERR_NOT_FOUND -10
|
||||||
|
#define ERR_UNSUPPORTED_DEV -11
|
||||||
|
#define ERR_NO_MEMORY -12
|
||||||
|
#define ERR_INVALID_ARG -13
|
||||||
|
#define ERR_BAD_ADDRESS -14
|
||||||
|
#define ERR_BAD_FORMAT -15
|
||||||
|
#define ERR_BAD_FRQ -16
|
||||||
|
#define ERR_DENIED -17
|
||||||
|
#define ERR_ALREADY_INITIALIZED -18
|
||||||
|
#define ERR_OVERFLOW -19
|
||||||
|
#define ERR_NOT_INITIALIZED -20
|
||||||
|
#define ERR_SAMPLERATE_UNAVAILABLE -21
|
||||||
|
#define ERR_RESOLUTION_UNAVAILABLE -22
|
||||||
|
#define ERR_BAUDRATE_UNAVAILABLE -23
|
||||||
|
#define ERR_PACKET_COLLISION -24
|
||||||
|
#define ERR_PROTOCOL -25
|
||||||
|
#define ERR_PIN_MUX_INVALID -26
|
||||||
|
#define ERR_UNSUPPORTED_OP -27
|
||||||
|
#define ERR_NO_RESOURCE -28
|
||||||
|
#define ERR_NOT_READY -29
|
||||||
|
#define ERR_FAILURE -30
|
||||||
|
#define ERR_WRONG_LENGTH -31
|
||||||
|
|
||||||
|
#endif
|
||||||
54
hal/utils/include/events.h
Normal file
54
hal/utils/include/events.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Events declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _EVENTS_H_INCLUDED
|
||||||
|
#define _EVENTS_H_INCLUDED
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief List of events. Must start with 0, be unique and follow numerical order.
|
||||||
|
*/
|
||||||
|
#define EVENT_IS_READY_TO_SLEEP_ID 0
|
||||||
|
#define EVENT_PREPARE_TO_SLEEP_ID 1
|
||||||
|
#define EVENT_WOKEN_UP_ID 2
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _EVENTS_H_INCLUDED */
|
||||||
41
hal/utils/include/parts.h
Normal file
41
hal/utils/include/parts.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Atmel part identification macros
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2019 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef ATMEL_PARTS_H
|
||||||
|
#define ATMEL_PARTS_H
|
||||||
|
|
||||||
|
#include "samd21.h"
|
||||||
|
|
||||||
|
#include "hri_d21.h"
|
||||||
|
|
||||||
|
#endif /* ATMEL_PARTS_H */
|
||||||
368
hal/utils/include/utils.h
Normal file
368
hal/utils/include/utils.h
Normal file
@ -0,0 +1,368 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Different macros.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef UTILS_H_INCLUDED
|
||||||
|
#define UTILS_H_INCLUDED
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup doc_driver_hal_utils_macro
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve pointer to parent structure
|
||||||
|
*/
|
||||||
|
#define CONTAINER_OF(ptr, type, field_name) ((type *)(((uint8_t *)ptr) - offsetof(type, field_name)))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve array size
|
||||||
|
*/
|
||||||
|
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Emit the compiler pragma \a arg.
|
||||||
|
*
|
||||||
|
* \param[in] arg The pragma directive as it would appear after \e \#pragma
|
||||||
|
* (i.e. not stringified).
|
||||||
|
*/
|
||||||
|
#define COMPILER_PRAGMA(arg) _Pragma(#arg)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \def COMPILER_PACK_SET(alignment)
|
||||||
|
* \brief Set maximum alignment for subsequent struct and union definitions to \a alignment.
|
||||||
|
*/
|
||||||
|
#define COMPILER_PACK_SET(alignment) COMPILER_PRAGMA(pack(alignment))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \def COMPILER_PACK_RESET()
|
||||||
|
* \brief Set default alignment for subsequent struct and union definitions.
|
||||||
|
*/
|
||||||
|
#define COMPILER_PACK_RESET() COMPILER_PRAGMA(pack())
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set aligned boundary.
|
||||||
|
*/
|
||||||
|
#if defined __GNUC__
|
||||||
|
#define COMPILER_ALIGNED(a) __attribute__((__aligned__(a)))
|
||||||
|
#elif defined __ICCARM__
|
||||||
|
#define COMPILER_ALIGNED(a) COMPILER_PRAGMA(data_alignment = a)
|
||||||
|
#elif defined __CC_ARM
|
||||||
|
#define COMPILER_ALIGNED(a) __attribute__((__aligned__(a)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Flash located data macros
|
||||||
|
*/
|
||||||
|
#if defined __GNUC__
|
||||||
|
#define PROGMEM_DECLARE(type, name) const type name
|
||||||
|
#define PROGMEM_T const
|
||||||
|
#define PROGMEM_READ_BYTE(x) *((uint8_t *)(x))
|
||||||
|
#define PROGMEM_PTR_T const *
|
||||||
|
#define PROGMEM_STRING_T const uint8_t *
|
||||||
|
#elif defined __ICCARM__
|
||||||
|
#define PROGMEM_DECLARE(type, name) const type name
|
||||||
|
#define PROGMEM_T const
|
||||||
|
#define PROGMEM_READ_BYTE(x) *((uint8_t *)(x))
|
||||||
|
#define PROGMEM_PTR_T const *
|
||||||
|
#define PROGMEM_STRING_T const uint8_t *
|
||||||
|
#elif defined __CC_ARM
|
||||||
|
#define PROGMEM_DECLARE(type, name) const type name
|
||||||
|
#define PROGMEM_T const
|
||||||
|
#define PROGMEM_READ_BYTE(x) *((uint8_t *)(x))
|
||||||
|
#define PROGMEM_PTR_T const *
|
||||||
|
#define PROGMEM_STRING_T const uint8_t *
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Optimization
|
||||||
|
*/
|
||||||
|
#if defined __GNUC__
|
||||||
|
#define OPTIMIZE_HIGH __attribute__((optimize(s)))
|
||||||
|
#elif defined __CC_ARM
|
||||||
|
#define OPTIMIZE_HIGH _Pragma("O3")
|
||||||
|
#elif defined __ICCARM__
|
||||||
|
#define OPTIMIZE_HIGH _Pragma("optimize=high")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief RAM located function attribute
|
||||||
|
*/
|
||||||
|
#if defined(__CC_ARM) /* Keil ?Vision 4 */
|
||||||
|
#define RAMFUNC __attribute__((section(".ramfunc")))
|
||||||
|
#elif defined(__ICCARM__) /* IAR Ewarm 5.41+ */
|
||||||
|
#define RAMFUNC __ramfunc
|
||||||
|
#elif defined(__GNUC__) /* GCC CS3 2009q3-68 */
|
||||||
|
#define RAMFUNC __attribute__((section(".ramfunc")))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief No-init section.
|
||||||
|
* Place a data object or a function in a no-init section.
|
||||||
|
*/
|
||||||
|
#if defined(__CC_ARM)
|
||||||
|
#define NO_INIT(a) __attribute__((zero_init))
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
#define NO_INIT(a) __no_init
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
#define NO_INIT(a) __attribute__((section(".no_init")))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Set user-defined section.
|
||||||
|
* Place a data object or a function in a user-defined section.
|
||||||
|
*/
|
||||||
|
#if defined(__CC_ARM)
|
||||||
|
#define COMPILER_SECTION(a) __attribute__((__section__(a)))
|
||||||
|
#elif defined(__ICCARM__)
|
||||||
|
#define COMPILER_SECTION(a) COMPILER_PRAGMA(location = a)
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
#define COMPILER_SECTION(a) __attribute__((__section__(a)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Define WEAK attribute.
|
||||||
|
*/
|
||||||
|
#if defined(__CC_ARM) /* Keil ?Vision 4 */
|
||||||
|
#define WEAK __attribute__((weak))
|
||||||
|
#elif defined(__ICCARM__) /* IAR Ewarm 5.41+ */
|
||||||
|
#define WEAK __weak
|
||||||
|
#elif defined(__GNUC__) /* GCC CS3 2009q3-68 */
|
||||||
|
#define WEAK __attribute__((weak))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Pointer to function
|
||||||
|
*/
|
||||||
|
typedef void (*FUNC_PTR)(void);
|
||||||
|
|
||||||
|
#define LE_BYTE0(a) ((uint8_t)(a))
|
||||||
|
#define LE_BYTE1(a) ((uint8_t)((a) >> 8))
|
||||||
|
#define LE_BYTE2(a) ((uint8_t)((a) >> 16))
|
||||||
|
#define LE_BYTE3(a) ((uint8_t)((a) >> 24))
|
||||||
|
|
||||||
|
#define LE_2_U16(p) ((p)[0] + ((p)[1] << 8))
|
||||||
|
#define LE_2_U32(p) ((p)[0] + ((p)[1] << 8) + ((p)[2] << 16) + ((p)[3] << 24))
|
||||||
|
|
||||||
|
/** \name Zero-Bit Counting
|
||||||
|
*
|
||||||
|
* Under GCC, __builtin_clz and __builtin_ctz behave like macros when
|
||||||
|
* applied to constant expressions (values known at compile time), so they are
|
||||||
|
* more optimized than the use of the corresponding assembly instructions and
|
||||||
|
* they can be used as constant expressions e.g. to initialize objects having
|
||||||
|
* static storage duration, and like the corresponding assembly instructions
|
||||||
|
* when applied to non-constant expressions (values unknown at compile time), so
|
||||||
|
* they are more optimized than an assembly periphrasis. Hence, clz and ctz
|
||||||
|
* ensure a possible and optimized behavior for both constant and non-constant
|
||||||
|
* expressions.
|
||||||
|
*
|
||||||
|
* @{ */
|
||||||
|
|
||||||
|
/** \brief Counts the leading zero bits of the given value considered as a 32-bit integer.
|
||||||
|
*
|
||||||
|
* \param[in] u Value of which to count the leading zero bits.
|
||||||
|
*
|
||||||
|
* \return The count of leading zero bits in \a u.
|
||||||
|
*/
|
||||||
|
#if (defined __GNUC__) || (defined __CC_ARM)
|
||||||
|
#define clz(u) __builtin_clz(u)
|
||||||
|
#else
|
||||||
|
#define clz(u) \
|
||||||
|
( \
|
||||||
|
((u) == 0) \
|
||||||
|
? 32 \
|
||||||
|
: ((u) & (1ul << 31)) \
|
||||||
|
? 0 \
|
||||||
|
: ((u) & (1ul << 30)) \
|
||||||
|
? 1 \
|
||||||
|
: ((u) & (1ul << 29)) \
|
||||||
|
? 2 \
|
||||||
|
: ((u) & (1ul << 28)) \
|
||||||
|
? 3 \
|
||||||
|
: ((u) & (1ul << 27)) \
|
||||||
|
? 4 \
|
||||||
|
: ((u) & (1ul << 26)) \
|
||||||
|
? 5 \
|
||||||
|
: ((u) & (1ul << 25)) \
|
||||||
|
? 6 \
|
||||||
|
: ((u) & (1ul << 24)) \
|
||||||
|
? 7 \
|
||||||
|
: ((u) & (1ul << 23)) \
|
||||||
|
? 8 \
|
||||||
|
: ((u) & (1ul << 22)) \
|
||||||
|
? 9 \
|
||||||
|
: ((u) & (1ul << 21)) \
|
||||||
|
? 10 \
|
||||||
|
: ((u) & (1ul << 20)) \
|
||||||
|
? 11 \
|
||||||
|
: ((u) & (1ul << 19)) \
|
||||||
|
? 12 \
|
||||||
|
: ((u) & (1ul << 18)) \
|
||||||
|
? 13 \
|
||||||
|
: ((u) & (1ul << 17)) ? 14 \
|
||||||
|
: ((u) & (1ul << 16)) ? 15 \
|
||||||
|
: ((u) & (1ul << 15)) ? 16 \
|
||||||
|
: ((u) & (1ul << 14)) ? 17 \
|
||||||
|
: ((u) & (1ul << 13)) ? 18 \
|
||||||
|
: ((u) & (1ul << 12)) ? 19 \
|
||||||
|
: ((u) \
|
||||||
|
& (1ul \
|
||||||
|
<< 11)) \
|
||||||
|
? 20 \
|
||||||
|
: ((u) \
|
||||||
|
& (1ul \
|
||||||
|
<< 10)) \
|
||||||
|
? 21 \
|
||||||
|
: ((u) \
|
||||||
|
& (1ul \
|
||||||
|
<< 9)) \
|
||||||
|
? 22 \
|
||||||
|
: ((u) \
|
||||||
|
& (1ul \
|
||||||
|
<< 8)) \
|
||||||
|
? 23 \
|
||||||
|
: ((u) & (1ul << 7)) ? 24 \
|
||||||
|
: ((u) & (1ul << 6)) ? 25 \
|
||||||
|
: ((u) \
|
||||||
|
& (1ul \
|
||||||
|
<< 5)) \
|
||||||
|
? 26 \
|
||||||
|
: ((u) & (1ul << 4)) ? 27 \
|
||||||
|
: ((u) & (1ul << 3)) ? 28 \
|
||||||
|
: ((u) & (1ul << 2)) ? 29 \
|
||||||
|
: ( \
|
||||||
|
(u) & (1ul << 1)) \
|
||||||
|
? 30 \
|
||||||
|
: 31)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** \brief Counts the trailing zero bits of the given value considered as a 32-bit integer.
|
||||||
|
*
|
||||||
|
* \param[in] u Value of which to count the trailing zero bits.
|
||||||
|
*
|
||||||
|
* \return The count of trailing zero bits in \a u.
|
||||||
|
*/
|
||||||
|
#if (defined __GNUC__) || (defined __CC_ARM)
|
||||||
|
#define ctz(u) __builtin_ctz(u)
|
||||||
|
#else
|
||||||
|
#define ctz(u) \
|
||||||
|
( \
|
||||||
|
(u) & (1ul << 0) \
|
||||||
|
? 0 \
|
||||||
|
: (u) & (1ul << 1) \
|
||||||
|
? 1 \
|
||||||
|
: (u) & (1ul << 2) \
|
||||||
|
? 2 \
|
||||||
|
: (u) & (1ul << 3) \
|
||||||
|
? 3 \
|
||||||
|
: (u) & (1ul << 4) \
|
||||||
|
? 4 \
|
||||||
|
: (u) & (1ul << 5) \
|
||||||
|
? 5 \
|
||||||
|
: (u) & (1ul << 6) \
|
||||||
|
? 6 \
|
||||||
|
: (u) & (1ul << 7) \
|
||||||
|
? 7 \
|
||||||
|
: (u) & (1ul << 8) \
|
||||||
|
? 8 \
|
||||||
|
: (u) & (1ul << 9) \
|
||||||
|
? 9 \
|
||||||
|
: (u) & (1ul << 10) \
|
||||||
|
? 10 \
|
||||||
|
: (u) & (1ul << 11) \
|
||||||
|
? 11 \
|
||||||
|
: (u) & (1ul << 12) \
|
||||||
|
? 12 \
|
||||||
|
: (u) & (1ul << 13) \
|
||||||
|
? 13 \
|
||||||
|
: (u) & (1ul << 14) \
|
||||||
|
? 14 \
|
||||||
|
: (u) & (1ul << 15) \
|
||||||
|
? 15 \
|
||||||
|
: (u) & (1ul << 16) \
|
||||||
|
? 16 \
|
||||||
|
: (u) & (1ul << 17) \
|
||||||
|
? 17 \
|
||||||
|
: (u) & (1ul << 18) \
|
||||||
|
? 18 \
|
||||||
|
: (u) & (1ul << 19) ? 19 \
|
||||||
|
: (u) & (1ul << 20) ? 20 \
|
||||||
|
: (u) & (1ul << 21) ? 21 \
|
||||||
|
: (u) & (1ul << 22) ? 22 \
|
||||||
|
: (u) & (1ul << 23) ? 23 \
|
||||||
|
: (u) & (1ul << 24) ? 24 \
|
||||||
|
: (u) & (1ul << 25) ? 25 \
|
||||||
|
: (u) & (1ul << 26) ? 26 \
|
||||||
|
: (u) & (1ul << 27) ? 27 \
|
||||||
|
: (u) & (1ul << 28) ? 28 : (u) & (1ul << 29) ? 29 : (u) & (1ul << 30) ? 30 : (u) & (1ul << 31) ? 31 : 32)
|
||||||
|
#endif
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Counts the number of bits in a mask (no more than 32 bits)
|
||||||
|
* \param[in] mask Mask of which to count the bits.
|
||||||
|
*/
|
||||||
|
#define size_of_mask(mask) (32 - clz(mask) - ctz(mask))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve the start position of bits mask (no more than 32 bits)
|
||||||
|
* \param[in] mask Mask of which to retrieve the start position.
|
||||||
|
*/
|
||||||
|
#define pos_of_mask(mask) ctz(mask)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Return division result of a/b and round up the result to the closest
|
||||||
|
* number divisible by "b"
|
||||||
|
*/
|
||||||
|
#define round_up(a, b) (((a)-1) / (b) + 1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Get the minimum of x and y
|
||||||
|
*/
|
||||||
|
#define min(x, y) ((x) > (y) ? (y) : (x))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Get the maximum of x and y
|
||||||
|
*/
|
||||||
|
#define max(x, y) ((x) > (y) ? (x) : (y))
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* UTILS_H_INCLUDED */
|
||||||
93
hal/utils/include/utils_assert.h
Normal file
93
hal/utils/include/utils_assert.h
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Asserts related functionality.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ASSERT_H_INCLUDED
|
||||||
|
#define _ASSERT_H_INCLUDED
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
#ifndef USE_SIMPLE_ASSERT
|
||||||
|
//# define USE_SIMPLE_ASSERT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Assert macro
|
||||||
|
*
|
||||||
|
* This macro is used to throw asserts. It can be mapped to different function
|
||||||
|
* based on debug level.
|
||||||
|
*
|
||||||
|
* \param[in] condition A condition to be checked;
|
||||||
|
* assert is thrown if the given condition is false
|
||||||
|
*/
|
||||||
|
#define ASSERT(condition) ASSERT_IMPL((condition), __FILE__, __LINE__)
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
|
||||||
|
#ifdef USE_SIMPLE_ASSERT
|
||||||
|
#define ASSERT_IMPL(condition, file, line) \
|
||||||
|
if (!(condition)) \
|
||||||
|
__asm("BKPT #0");
|
||||||
|
#else
|
||||||
|
#define ASSERT_IMPL(condition, file, line) assert((condition), file, line)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else /* DEBUG */
|
||||||
|
|
||||||
|
#ifdef USE_SIMPLE_ASSERT
|
||||||
|
#define ASSERT_IMPL(condition, file, line) ((void)0)
|
||||||
|
#else
|
||||||
|
#define ASSERT_IMPL(condition, file, line) ((void)0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* DEBUG */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Assert function
|
||||||
|
*
|
||||||
|
* This function is used to throw asserts.
|
||||||
|
*
|
||||||
|
* \param[in] condition A condition to be checked; assert is thrown if the given
|
||||||
|
* condition is false
|
||||||
|
* \param[in] file File name
|
||||||
|
* \param[in] line Line number
|
||||||
|
*/
|
||||||
|
void assert(const bool condition, const char *const file, const int line);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* _ASSERT_H_INCLUDED */
|
||||||
115
hal/utils/include/utils_event.h
Normal file
115
hal/utils/include/utils_event.h
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Events declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _UTILS_EVENT_H_INCLUDED
|
||||||
|
#define _UTILS_EVENT_H_INCLUDED
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <utils.h>
|
||||||
|
#include <utils_list.h>
|
||||||
|
#include <events.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief The maximum amount of events
|
||||||
|
*/
|
||||||
|
#define EVENT_MAX_AMOUNT 8
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief The size of event mask used, it is EVENT_MAX_AMOUNT rounded up to the
|
||||||
|
* closest number divisible by 8.
|
||||||
|
*/
|
||||||
|
#define EVENT_MASK_SIZE (round_up(EVENT_MAX_AMOUNT, 8))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief The type of event ID. IDs should start with 0 and be in numerical order.
|
||||||
|
*/
|
||||||
|
typedef uint8_t event_id_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief The type of returned parameter. This type is big enough to contain
|
||||||
|
* pointer to data on any platform.
|
||||||
|
*/
|
||||||
|
typedef uintptr_t event_data_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief The type of returned parameter. This type is big enough to contain
|
||||||
|
* pointer to data on any platform.
|
||||||
|
*/
|
||||||
|
typedef void (*event_cb_t)(event_id_t id, event_data_t data);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Event structure
|
||||||
|
*/
|
||||||
|
struct event {
|
||||||
|
struct list_element elem; /*! The pointer to next event */
|
||||||
|
uint8_t mask[EVENT_MASK_SIZE]; /*! Mask of event IDs callback is called for */
|
||||||
|
event_cb_t cb; /*! Callback to be called when an event occurs */
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Subscribe to event
|
||||||
|
*
|
||||||
|
* \param[in] event The pointer to event structure
|
||||||
|
* \param[in] id The event ID to subscribe to
|
||||||
|
* \param[in] cb The callback function to call when the given event occurs
|
||||||
|
*
|
||||||
|
* \return The status of subscription
|
||||||
|
*/
|
||||||
|
int32_t event_subscribe(struct event *const event, const event_id_t id, event_cb_t cb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Remove event from subscription
|
||||||
|
*
|
||||||
|
* \param[in] event The pointer to event structure
|
||||||
|
* \param[in] id The event ID to remove subscription from
|
||||||
|
*
|
||||||
|
* \return The status of subscription removing
|
||||||
|
*/
|
||||||
|
int32_t event_unsubscribe(struct event *const event, const event_id_t id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Post event
|
||||||
|
*
|
||||||
|
* \param[in] id The event ID to post
|
||||||
|
* \param[in] data The event data to be passed to event subscribers
|
||||||
|
*/
|
||||||
|
void event_post(const event_id_t id, const event_data_t data);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _UTILS_EVENT_H_INCLUDED */
|
||||||
308
hal/utils/include/utils_increment_macro.h
Normal file
308
hal/utils/include/utils_increment_macro.h
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Increment macro.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _UTILS_INCREMENT_MACRO_H
|
||||||
|
#define _UTILS_INCREMENT_MACRO_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Compile time increment, result value is entire integer literal
|
||||||
|
*
|
||||||
|
* \param[in] val - value to be incremented (254 max)
|
||||||
|
*/
|
||||||
|
#define INC_VALUE(val) SP_INC_##val
|
||||||
|
|
||||||
|
// Preprocessor increment implementation
|
||||||
|
#define SP_INC_0 1
|
||||||
|
#define SP_INC_1 2
|
||||||
|
#define SP_INC_2 3
|
||||||
|
#define SP_INC_3 4
|
||||||
|
#define SP_INC_4 5
|
||||||
|
#define SP_INC_5 6
|
||||||
|
#define SP_INC_6 7
|
||||||
|
#define SP_INC_7 8
|
||||||
|
#define SP_INC_8 9
|
||||||
|
#define SP_INC_9 10
|
||||||
|
#define SP_INC_10 11
|
||||||
|
#define SP_INC_11 12
|
||||||
|
#define SP_INC_12 13
|
||||||
|
#define SP_INC_13 14
|
||||||
|
#define SP_INC_14 15
|
||||||
|
#define SP_INC_15 16
|
||||||
|
#define SP_INC_16 17
|
||||||
|
#define SP_INC_17 18
|
||||||
|
#define SP_INC_18 19
|
||||||
|
#define SP_INC_19 20
|
||||||
|
#define SP_INC_20 21
|
||||||
|
#define SP_INC_21 22
|
||||||
|
#define SP_INC_22 23
|
||||||
|
#define SP_INC_23 24
|
||||||
|
#define SP_INC_24 25
|
||||||
|
#define SP_INC_25 26
|
||||||
|
#define SP_INC_26 27
|
||||||
|
#define SP_INC_27 28
|
||||||
|
#define SP_INC_28 29
|
||||||
|
#define SP_INC_29 30
|
||||||
|
#define SP_INC_30 31
|
||||||
|
#define SP_INC_31 32
|
||||||
|
#define SP_INC_32 33
|
||||||
|
#define SP_INC_33 34
|
||||||
|
#define SP_INC_34 35
|
||||||
|
#define SP_INC_35 36
|
||||||
|
#define SP_INC_36 37
|
||||||
|
#define SP_INC_37 38
|
||||||
|
#define SP_INC_38 39
|
||||||
|
#define SP_INC_39 40
|
||||||
|
#define SP_INC_40 41
|
||||||
|
#define SP_INC_41 42
|
||||||
|
#define SP_INC_42 43
|
||||||
|
#define SP_INC_43 44
|
||||||
|
#define SP_INC_44 45
|
||||||
|
#define SP_INC_45 46
|
||||||
|
#define SP_INC_46 47
|
||||||
|
#define SP_INC_47 48
|
||||||
|
#define SP_INC_48 49
|
||||||
|
#define SP_INC_49 50
|
||||||
|
#define SP_INC_50 51
|
||||||
|
#define SP_INC_51 52
|
||||||
|
#define SP_INC_52 53
|
||||||
|
#define SP_INC_53 54
|
||||||
|
#define SP_INC_54 55
|
||||||
|
#define SP_INC_55 56
|
||||||
|
#define SP_INC_56 57
|
||||||
|
#define SP_INC_57 58
|
||||||
|
#define SP_INC_58 59
|
||||||
|
#define SP_INC_59 60
|
||||||
|
#define SP_INC_60 61
|
||||||
|
#define SP_INC_61 62
|
||||||
|
#define SP_INC_62 63
|
||||||
|
#define SP_INC_63 64
|
||||||
|
#define SP_INC_64 65
|
||||||
|
#define SP_INC_65 66
|
||||||
|
#define SP_INC_66 67
|
||||||
|
#define SP_INC_67 68
|
||||||
|
#define SP_INC_68 69
|
||||||
|
#define SP_INC_69 70
|
||||||
|
#define SP_INC_70 71
|
||||||
|
#define SP_INC_71 72
|
||||||
|
#define SP_INC_72 73
|
||||||
|
#define SP_INC_73 74
|
||||||
|
#define SP_INC_74 75
|
||||||
|
#define SP_INC_75 76
|
||||||
|
#define SP_INC_76 77
|
||||||
|
#define SP_INC_77 78
|
||||||
|
#define SP_INC_78 79
|
||||||
|
#define SP_INC_79 80
|
||||||
|
#define SP_INC_80 81
|
||||||
|
#define SP_INC_81 82
|
||||||
|
#define SP_INC_82 83
|
||||||
|
#define SP_INC_83 84
|
||||||
|
#define SP_INC_84 85
|
||||||
|
#define SP_INC_85 86
|
||||||
|
#define SP_INC_86 87
|
||||||
|
#define SP_INC_87 88
|
||||||
|
#define SP_INC_88 89
|
||||||
|
#define SP_INC_89 90
|
||||||
|
#define SP_INC_90 91
|
||||||
|
#define SP_INC_91 92
|
||||||
|
#define SP_INC_92 93
|
||||||
|
#define SP_INC_93 94
|
||||||
|
#define SP_INC_94 95
|
||||||
|
#define SP_INC_95 96
|
||||||
|
#define SP_INC_96 97
|
||||||
|
#define SP_INC_97 98
|
||||||
|
#define SP_INC_98 99
|
||||||
|
#define SP_INC_99 100
|
||||||
|
#define SP_INC_100 101
|
||||||
|
#define SP_INC_101 102
|
||||||
|
#define SP_INC_102 103
|
||||||
|
#define SP_INC_103 104
|
||||||
|
#define SP_INC_104 105
|
||||||
|
#define SP_INC_105 106
|
||||||
|
#define SP_INC_106 107
|
||||||
|
#define SP_INC_107 108
|
||||||
|
#define SP_INC_108 109
|
||||||
|
#define SP_INC_109 110
|
||||||
|
#define SP_INC_110 111
|
||||||
|
#define SP_INC_111 112
|
||||||
|
#define SP_INC_112 113
|
||||||
|
#define SP_INC_113 114
|
||||||
|
#define SP_INC_114 115
|
||||||
|
#define SP_INC_115 116
|
||||||
|
#define SP_INC_116 117
|
||||||
|
#define SP_INC_117 118
|
||||||
|
#define SP_INC_118 119
|
||||||
|
#define SP_INC_119 120
|
||||||
|
#define SP_INC_120 121
|
||||||
|
#define SP_INC_121 122
|
||||||
|
#define SP_INC_122 123
|
||||||
|
#define SP_INC_123 124
|
||||||
|
#define SP_INC_124 125
|
||||||
|
#define SP_INC_125 126
|
||||||
|
#define SP_INC_126 127
|
||||||
|
#define SP_INC_127 128
|
||||||
|
#define SP_INC_128 129
|
||||||
|
#define SP_INC_129 130
|
||||||
|
#define SP_INC_130 131
|
||||||
|
#define SP_INC_131 132
|
||||||
|
#define SP_INC_132 133
|
||||||
|
#define SP_INC_133 134
|
||||||
|
#define SP_INC_134 135
|
||||||
|
#define SP_INC_135 136
|
||||||
|
#define SP_INC_136 137
|
||||||
|
#define SP_INC_137 138
|
||||||
|
#define SP_INC_138 139
|
||||||
|
#define SP_INC_139 140
|
||||||
|
#define SP_INC_140 141
|
||||||
|
#define SP_INC_141 142
|
||||||
|
#define SP_INC_142 143
|
||||||
|
#define SP_INC_143 144
|
||||||
|
#define SP_INC_144 145
|
||||||
|
#define SP_INC_145 146
|
||||||
|
#define SP_INC_146 147
|
||||||
|
#define SP_INC_147 148
|
||||||
|
#define SP_INC_148 149
|
||||||
|
#define SP_INC_149 150
|
||||||
|
#define SP_INC_150 151
|
||||||
|
#define SP_INC_151 152
|
||||||
|
#define SP_INC_152 153
|
||||||
|
#define SP_INC_153 154
|
||||||
|
#define SP_INC_154 155
|
||||||
|
#define SP_INC_155 156
|
||||||
|
#define SP_INC_156 157
|
||||||
|
#define SP_INC_157 158
|
||||||
|
#define SP_INC_158 159
|
||||||
|
#define SP_INC_159 160
|
||||||
|
#define SP_INC_160 161
|
||||||
|
#define SP_INC_161 162
|
||||||
|
#define SP_INC_162 163
|
||||||
|
#define SP_INC_163 164
|
||||||
|
#define SP_INC_164 165
|
||||||
|
#define SP_INC_165 166
|
||||||
|
#define SP_INC_166 167
|
||||||
|
#define SP_INC_167 168
|
||||||
|
#define SP_INC_168 169
|
||||||
|
#define SP_INC_169 170
|
||||||
|
#define SP_INC_170 171
|
||||||
|
#define SP_INC_171 172
|
||||||
|
#define SP_INC_172 173
|
||||||
|
#define SP_INC_173 174
|
||||||
|
#define SP_INC_174 175
|
||||||
|
#define SP_INC_175 176
|
||||||
|
#define SP_INC_176 177
|
||||||
|
#define SP_INC_177 178
|
||||||
|
#define SP_INC_178 179
|
||||||
|
#define SP_INC_179 180
|
||||||
|
#define SP_INC_180 181
|
||||||
|
#define SP_INC_181 182
|
||||||
|
#define SP_INC_182 183
|
||||||
|
#define SP_INC_183 184
|
||||||
|
#define SP_INC_184 185
|
||||||
|
#define SP_INC_185 186
|
||||||
|
#define SP_INC_186 187
|
||||||
|
#define SP_INC_187 188
|
||||||
|
#define SP_INC_188 189
|
||||||
|
#define SP_INC_189 190
|
||||||
|
#define SP_INC_190 191
|
||||||
|
#define SP_INC_191 192
|
||||||
|
#define SP_INC_192 193
|
||||||
|
#define SP_INC_193 194
|
||||||
|
#define SP_INC_194 195
|
||||||
|
#define SP_INC_195 196
|
||||||
|
#define SP_INC_196 197
|
||||||
|
#define SP_INC_197 198
|
||||||
|
#define SP_INC_198 199
|
||||||
|
#define SP_INC_199 200
|
||||||
|
#define SP_INC_200 201
|
||||||
|
#define SP_INC_201 202
|
||||||
|
#define SP_INC_202 203
|
||||||
|
#define SP_INC_203 204
|
||||||
|
#define SP_INC_204 205
|
||||||
|
#define SP_INC_205 206
|
||||||
|
#define SP_INC_206 207
|
||||||
|
#define SP_INC_207 208
|
||||||
|
#define SP_INC_208 209
|
||||||
|
#define SP_INC_209 210
|
||||||
|
#define SP_INC_210 211
|
||||||
|
#define SP_INC_211 212
|
||||||
|
#define SP_INC_212 213
|
||||||
|
#define SP_INC_213 214
|
||||||
|
#define SP_INC_214 215
|
||||||
|
#define SP_INC_215 216
|
||||||
|
#define SP_INC_216 217
|
||||||
|
#define SP_INC_217 218
|
||||||
|
#define SP_INC_218 219
|
||||||
|
#define SP_INC_219 220
|
||||||
|
#define SP_INC_220 221
|
||||||
|
#define SP_INC_221 222
|
||||||
|
#define SP_INC_222 223
|
||||||
|
#define SP_INC_223 224
|
||||||
|
#define SP_INC_224 225
|
||||||
|
#define SP_INC_225 226
|
||||||
|
#define SP_INC_226 227
|
||||||
|
#define SP_INC_227 228
|
||||||
|
#define SP_INC_228 229
|
||||||
|
#define SP_INC_229 230
|
||||||
|
#define SP_INC_230 231
|
||||||
|
#define SP_INC_231 232
|
||||||
|
#define SP_INC_232 233
|
||||||
|
#define SP_INC_233 234
|
||||||
|
#define SP_INC_234 235
|
||||||
|
#define SP_INC_235 236
|
||||||
|
#define SP_INC_236 237
|
||||||
|
#define SP_INC_237 238
|
||||||
|
#define SP_INC_238 239
|
||||||
|
#define SP_INC_239 240
|
||||||
|
#define SP_INC_240 241
|
||||||
|
#define SP_INC_241 242
|
||||||
|
#define SP_INC_242 243
|
||||||
|
#define SP_INC_243 244
|
||||||
|
#define SP_INC_244 245
|
||||||
|
#define SP_INC_245 246
|
||||||
|
#define SP_INC_246 247
|
||||||
|
#define SP_INC_247 248
|
||||||
|
#define SP_INC_248 249
|
||||||
|
#define SP_INC_249 250
|
||||||
|
#define SP_INC_250 251
|
||||||
|
#define SP_INC_251 252
|
||||||
|
#define SP_INC_252 253
|
||||||
|
#define SP_INC_253 254
|
||||||
|
#define SP_INC_254 255
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* _UTILS_INCREMENT_MACRO_H */
|
||||||
164
hal/utils/include/utils_list.h
Normal file
164
hal/utils/include/utils_list.h
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief List declaration.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _UTILS_LIST_H_INCLUDED
|
||||||
|
#define _UTILS_LIST_H_INCLUDED
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \addtogroup doc_driver_hal_utils_list
|
||||||
|
*
|
||||||
|
* @{
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <compiler.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief List element type
|
||||||
|
*/
|
||||||
|
struct list_element {
|
||||||
|
struct list_element *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief List head type
|
||||||
|
*/
|
||||||
|
struct list_descriptor {
|
||||||
|
struct list_element *head;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Reset list
|
||||||
|
*
|
||||||
|
* \param[in] list The pointer to a list descriptor
|
||||||
|
*/
|
||||||
|
static inline void list_reset(struct list_descriptor *const list)
|
||||||
|
{
|
||||||
|
list->head = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve list head
|
||||||
|
*
|
||||||
|
* \param[in] list The pointer to a list descriptor
|
||||||
|
*
|
||||||
|
* \return A pointer to the head of the given list or NULL if the list is
|
||||||
|
* empty
|
||||||
|
*/
|
||||||
|
static inline void *list_get_head(const struct list_descriptor *const list)
|
||||||
|
{
|
||||||
|
return (void *)list->head;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Retrieve next list head
|
||||||
|
*
|
||||||
|
* \param[in] list The pointer to a list element
|
||||||
|
*
|
||||||
|
* \return A pointer to the next list element or NULL if there is not next
|
||||||
|
* element
|
||||||
|
*/
|
||||||
|
static inline void *list_get_next_element(const void *const element)
|
||||||
|
{
|
||||||
|
return element ? ((struct list_element *)element)->next : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Insert an element as list head
|
||||||
|
*
|
||||||
|
* \param[in] list The pointer to a list element
|
||||||
|
* \param[in] element An element to insert to the given list
|
||||||
|
*/
|
||||||
|
void list_insert_as_head(struct list_descriptor *const list, void *const element);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Insert an element after the given list element
|
||||||
|
*
|
||||||
|
* \param[in] after An element to insert after
|
||||||
|
* \param[in] element Element to insert to the given list
|
||||||
|
*/
|
||||||
|
void list_insert_after(void *const after, void *const element);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Insert an element at list end
|
||||||
|
*
|
||||||
|
* \param[in] after An element to insert after
|
||||||
|
* \param[in] element Element to insert to the given list
|
||||||
|
*/
|
||||||
|
void list_insert_at_end(struct list_descriptor *const list, void *const element);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Check whether an element belongs to a list
|
||||||
|
*
|
||||||
|
* \param[in] list The pointer to a list
|
||||||
|
* \param[in] element An element to check
|
||||||
|
*
|
||||||
|
* \return The result of checking
|
||||||
|
* \retval true If the given element is an element of the given list
|
||||||
|
* \retval false Otherwise
|
||||||
|
*/
|
||||||
|
bool is_list_element(const struct list_descriptor *const list, const void *const element);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Removes list head
|
||||||
|
*
|
||||||
|
* This function removes the list head and sets the next element after the list
|
||||||
|
* head as a new list head.
|
||||||
|
*
|
||||||
|
* \param[in] list The pointer to a list
|
||||||
|
*
|
||||||
|
* \return The pointer to the new list head of NULL if the list head is NULL
|
||||||
|
*/
|
||||||
|
void *list_remove_head(struct list_descriptor *const list);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Removes the list element
|
||||||
|
*
|
||||||
|
* \param[in] list The pointer to a list
|
||||||
|
* \param[in] element An element to remove
|
||||||
|
*
|
||||||
|
* \return The result of element removing
|
||||||
|
* \retval true The given element is removed from the given list
|
||||||
|
* \retval false The given element is not an element of the given list
|
||||||
|
*/
|
||||||
|
bool list_delete_element(struct list_descriptor *const list, const void *const element);
|
||||||
|
|
||||||
|
/**@}*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif /* _UTILS_LIST_H_INCLUDED */
|
||||||
322
hal/utils/include/utils_repeat_macro.h
Normal file
322
hal/utils/include/utils_repeat_macro.h
Normal file
@ -0,0 +1,322 @@
|
|||||||
|
/**
|
||||||
|
* \file
|
||||||
|
*
|
||||||
|
* \brief Repeat macro.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2014-2018 Microchip Technology Inc. and its subsidiaries.
|
||||||
|
*
|
||||||
|
* \asf_license_start
|
||||||
|
*
|
||||||
|
* \page License
|
||||||
|
*
|
||||||
|
* Subject to your compliance with these terms, you may use Microchip
|
||||||
|
* software and any derivatives exclusively with Microchip products.
|
||||||
|
* It is your responsibility to comply with third party license terms applicable
|
||||||
|
* to your use of third party software (including open source software) that
|
||||||
|
* may accompany Microchip software.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
|
||||||
|
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
|
||||||
|
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
|
||||||
|
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
|
||||||
|
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
|
||||||
|
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
|
||||||
|
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
|
||||||
|
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
|
||||||
|
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
|
||||||
|
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* \asf_license_stop
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _UTILS_REPEAT_MACRO_H
|
||||||
|
#define _UTILS_REPEAT_MACRO_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* \brief Sequently repeates specified macro for n times (255 max).
|
||||||
|
*
|
||||||
|
* Specified macro shall have two arguments: macro(arg, i)
|
||||||
|
* arg - user defined argument, which have the same value for all iterations.
|
||||||
|
* i - iteration number; numbering begins from zero and increments on each
|
||||||
|
* iteration.
|
||||||
|
*
|
||||||
|
* \param[in] macro - macro to be repeated
|
||||||
|
* \param[in] arg - user defined argument for repeated macro
|
||||||
|
* \param[in] n - total number of iterations (255 max)
|
||||||
|
*/
|
||||||
|
#define REPEAT_MACRO(macro, arg, n) REPEAT_MACRO_I(macro, arg, n)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* \brief Second level is needed to get integer literal from "n" if it is
|
||||||
|
* defined as macro
|
||||||
|
*/
|
||||||
|
#define REPEAT_MACRO_I(macro, arg, n) REPEAT##n(macro, arg, 0)
|
||||||
|
|
||||||
|
#define REPEAT1(macro, arg, n) macro(arg, n)
|
||||||
|
#define REPEAT2(macro, arg, n) macro(arg, n) REPEAT1(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT3(macro, arg, n) macro(arg, n) REPEAT2(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT4(macro, arg, n) macro(arg, n) REPEAT3(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT5(macro, arg, n) macro(arg, n) REPEAT4(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT6(macro, arg, n) macro(arg, n) REPEAT5(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT7(macro, arg, n) macro(arg, n) REPEAT6(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT8(macro, arg, n) macro(arg, n) REPEAT7(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT9(macro, arg, n) macro(arg, n) REPEAT8(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT10(macro, arg, n) macro(arg, n) REPEAT9(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT11(macro, arg, n) macro(arg, n) REPEAT10(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT12(macro, arg, n) macro(arg, n) REPEAT11(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT13(macro, arg, n) macro(arg, n) REPEAT12(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT14(macro, arg, n) macro(arg, n) REPEAT13(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT15(macro, arg, n) macro(arg, n) REPEAT14(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT16(macro, arg, n) macro(arg, n) REPEAT15(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT17(macro, arg, n) macro(arg, n) REPEAT16(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT18(macro, arg, n) macro(arg, n) REPEAT17(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT19(macro, arg, n) macro(arg, n) REPEAT18(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT20(macro, arg, n) macro(arg, n) REPEAT19(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT21(macro, arg, n) macro(arg, n) REPEAT20(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT22(macro, arg, n) macro(arg, n) REPEAT21(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT23(macro, arg, n) macro(arg, n) REPEAT22(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT24(macro, arg, n) macro(arg, n) REPEAT23(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT25(macro, arg, n) macro(arg, n) REPEAT24(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT26(macro, arg, n) macro(arg, n) REPEAT25(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT27(macro, arg, n) macro(arg, n) REPEAT26(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT28(macro, arg, n) macro(arg, n) REPEAT27(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT29(macro, arg, n) macro(arg, n) REPEAT28(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT30(macro, arg, n) macro(arg, n) REPEAT29(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT31(macro, arg, n) macro(arg, n) REPEAT30(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT32(macro, arg, n) macro(arg, n) REPEAT31(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT33(macro, arg, n) macro(arg, n) REPEAT32(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT34(macro, arg, n) macro(arg, n) REPEAT33(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT35(macro, arg, n) macro(arg, n) REPEAT34(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT36(macro, arg, n) macro(arg, n) REPEAT35(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT37(macro, arg, n) macro(arg, n) REPEAT36(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT38(macro, arg, n) macro(arg, n) REPEAT37(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT39(macro, arg, n) macro(arg, n) REPEAT38(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT40(macro, arg, n) macro(arg, n) REPEAT39(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT41(macro, arg, n) macro(arg, n) REPEAT40(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT42(macro, arg, n) macro(arg, n) REPEAT41(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT43(macro, arg, n) macro(arg, n) REPEAT42(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT44(macro, arg, n) macro(arg, n) REPEAT43(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT45(macro, arg, n) macro(arg, n) REPEAT44(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT46(macro, arg, n) macro(arg, n) REPEAT45(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT47(macro, arg, n) macro(arg, n) REPEAT46(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT48(macro, arg, n) macro(arg, n) REPEAT47(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT49(macro, arg, n) macro(arg, n) REPEAT48(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT50(macro, arg, n) macro(arg, n) REPEAT49(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT51(macro, arg, n) macro(arg, n) REPEAT50(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT52(macro, arg, n) macro(arg, n) REPEAT51(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT53(macro, arg, n) macro(arg, n) REPEAT52(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT54(macro, arg, n) macro(arg, n) REPEAT53(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT55(macro, arg, n) macro(arg, n) REPEAT54(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT56(macro, arg, n) macro(arg, n) REPEAT55(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT57(macro, arg, n) macro(arg, n) REPEAT56(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT58(macro, arg, n) macro(arg, n) REPEAT57(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT59(macro, arg, n) macro(arg, n) REPEAT58(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT60(macro, arg, n) macro(arg, n) REPEAT59(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT61(macro, arg, n) macro(arg, n) REPEAT60(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT62(macro, arg, n) macro(arg, n) REPEAT61(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT63(macro, arg, n) macro(arg, n) REPEAT62(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT64(macro, arg, n) macro(arg, n) REPEAT63(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT65(macro, arg, n) macro(arg, n) REPEAT64(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT66(macro, arg, n) macro(arg, n) REPEAT65(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT67(macro, arg, n) macro(arg, n) REPEAT66(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT68(macro, arg, n) macro(arg, n) REPEAT67(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT69(macro, arg, n) macro(arg, n) REPEAT68(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT70(macro, arg, n) macro(arg, n) REPEAT69(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT71(macro, arg, n) macro(arg, n) REPEAT70(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT72(macro, arg, n) macro(arg, n) REPEAT71(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT73(macro, arg, n) macro(arg, n) REPEAT72(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT74(macro, arg, n) macro(arg, n) REPEAT73(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT75(macro, arg, n) macro(arg, n) REPEAT74(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT76(macro, arg, n) macro(arg, n) REPEAT75(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT77(macro, arg, n) macro(arg, n) REPEAT76(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT78(macro, arg, n) macro(arg, n) REPEAT77(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT79(macro, arg, n) macro(arg, n) REPEAT78(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT80(macro, arg, n) macro(arg, n) REPEAT79(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT81(macro, arg, n) macro(arg, n) REPEAT80(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT82(macro, arg, n) macro(arg, n) REPEAT81(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT83(macro, arg, n) macro(arg, n) REPEAT82(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT84(macro, arg, n) macro(arg, n) REPEAT83(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT85(macro, arg, n) macro(arg, n) REPEAT84(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT86(macro, arg, n) macro(arg, n) REPEAT85(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT87(macro, arg, n) macro(arg, n) REPEAT86(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT88(macro, arg, n) macro(arg, n) REPEAT87(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT89(macro, arg, n) macro(arg, n) REPEAT88(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT90(macro, arg, n) macro(arg, n) REPEAT89(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT91(macro, arg, n) macro(arg, n) REPEAT90(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT92(macro, arg, n) macro(arg, n) REPEAT91(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT93(macro, arg, n) macro(arg, n) REPEAT92(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT94(macro, arg, n) macro(arg, n) REPEAT93(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT95(macro, arg, n) macro(arg, n) REPEAT94(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT96(macro, arg, n) macro(arg, n) REPEAT95(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT97(macro, arg, n) macro(arg, n) REPEAT96(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT98(macro, arg, n) macro(arg, n) REPEAT97(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT99(macro, arg, n) macro(arg, n) REPEAT98(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT100(macro, arg, n) macro(arg, n) REPEAT99(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT101(macro, arg, n) macro(arg, n) REPEAT100(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT102(macro, arg, n) macro(arg, n) REPEAT101(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT103(macro, arg, n) macro(arg, n) REPEAT102(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT104(macro, arg, n) macro(arg, n) REPEAT103(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT105(macro, arg, n) macro(arg, n) REPEAT104(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT106(macro, arg, n) macro(arg, n) REPEAT105(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT107(macro, arg, n) macro(arg, n) REPEAT106(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT108(macro, arg, n) macro(arg, n) REPEAT107(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT109(macro, arg, n) macro(arg, n) REPEAT108(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT110(macro, arg, n) macro(arg, n) REPEAT109(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT111(macro, arg, n) macro(arg, n) REPEAT110(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT112(macro, arg, n) macro(arg, n) REPEAT111(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT113(macro, arg, n) macro(arg, n) REPEAT112(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT114(macro, arg, n) macro(arg, n) REPEAT113(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT115(macro, arg, n) macro(arg, n) REPEAT114(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT116(macro, arg, n) macro(arg, n) REPEAT115(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT117(macro, arg, n) macro(arg, n) REPEAT116(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT118(macro, arg, n) macro(arg, n) REPEAT117(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT119(macro, arg, n) macro(arg, n) REPEAT118(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT120(macro, arg, n) macro(arg, n) REPEAT119(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT121(macro, arg, n) macro(arg, n) REPEAT120(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT122(macro, arg, n) macro(arg, n) REPEAT121(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT123(macro, arg, n) macro(arg, n) REPEAT122(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT124(macro, arg, n) macro(arg, n) REPEAT123(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT125(macro, arg, n) macro(arg, n) REPEAT124(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT126(macro, arg, n) macro(arg, n) REPEAT125(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT127(macro, arg, n) macro(arg, n) REPEAT126(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT128(macro, arg, n) macro(arg, n) REPEAT127(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT129(macro, arg, n) macro(arg, n) REPEAT128(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT130(macro, arg, n) macro(arg, n) REPEAT129(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT131(macro, arg, n) macro(arg, n) REPEAT130(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT132(macro, arg, n) macro(arg, n) REPEAT131(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT133(macro, arg, n) macro(arg, n) REPEAT132(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT134(macro, arg, n) macro(arg, n) REPEAT133(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT135(macro, arg, n) macro(arg, n) REPEAT134(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT136(macro, arg, n) macro(arg, n) REPEAT135(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT137(macro, arg, n) macro(arg, n) REPEAT136(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT138(macro, arg, n) macro(arg, n) REPEAT137(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT139(macro, arg, n) macro(arg, n) REPEAT138(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT140(macro, arg, n) macro(arg, n) REPEAT139(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT141(macro, arg, n) macro(arg, n) REPEAT140(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT142(macro, arg, n) macro(arg, n) REPEAT141(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT143(macro, arg, n) macro(arg, n) REPEAT142(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT144(macro, arg, n) macro(arg, n) REPEAT143(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT145(macro, arg, n) macro(arg, n) REPEAT144(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT146(macro, arg, n) macro(arg, n) REPEAT145(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT147(macro, arg, n) macro(arg, n) REPEAT146(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT148(macro, arg, n) macro(arg, n) REPEAT147(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT149(macro, arg, n) macro(arg, n) REPEAT148(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT150(macro, arg, n) macro(arg, n) REPEAT149(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT151(macro, arg, n) macro(arg, n) REPEAT150(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT152(macro, arg, n) macro(arg, n) REPEAT151(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT153(macro, arg, n) macro(arg, n) REPEAT152(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT154(macro, arg, n) macro(arg, n) REPEAT153(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT155(macro, arg, n) macro(arg, n) REPEAT154(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT156(macro, arg, n) macro(arg, n) REPEAT155(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT157(macro, arg, n) macro(arg, n) REPEAT156(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT158(macro, arg, n) macro(arg, n) REPEAT157(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT159(macro, arg, n) macro(arg, n) REPEAT158(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT160(macro, arg, n) macro(arg, n) REPEAT159(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT161(macro, arg, n) macro(arg, n) REPEAT160(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT162(macro, arg, n) macro(arg, n) REPEAT161(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT163(macro, arg, n) macro(arg, n) REPEAT162(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT164(macro, arg, n) macro(arg, n) REPEAT163(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT165(macro, arg, n) macro(arg, n) REPEAT164(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT166(macro, arg, n) macro(arg, n) REPEAT165(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT167(macro, arg, n) macro(arg, n) REPEAT166(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT168(macro, arg, n) macro(arg, n) REPEAT167(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT169(macro, arg, n) macro(arg, n) REPEAT168(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT170(macro, arg, n) macro(arg, n) REPEAT169(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT171(macro, arg, n) macro(arg, n) REPEAT170(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT172(macro, arg, n) macro(arg, n) REPEAT171(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT173(macro, arg, n) macro(arg, n) REPEAT172(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT174(macro, arg, n) macro(arg, n) REPEAT173(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT175(macro, arg, n) macro(arg, n) REPEAT174(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT176(macro, arg, n) macro(arg, n) REPEAT175(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT177(macro, arg, n) macro(arg, n) REPEAT176(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT178(macro, arg, n) macro(arg, n) REPEAT177(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT179(macro, arg, n) macro(arg, n) REPEAT178(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT180(macro, arg, n) macro(arg, n) REPEAT179(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT181(macro, arg, n) macro(arg, n) REPEAT180(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT182(macro, arg, n) macro(arg, n) REPEAT181(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT183(macro, arg, n) macro(arg, n) REPEAT182(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT184(macro, arg, n) macro(arg, n) REPEAT183(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT185(macro, arg, n) macro(arg, n) REPEAT184(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT186(macro, arg, n) macro(arg, n) REPEAT185(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT187(macro, arg, n) macro(arg, n) REPEAT186(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT188(macro, arg, n) macro(arg, n) REPEAT187(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT189(macro, arg, n) macro(arg, n) REPEAT188(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT190(macro, arg, n) macro(arg, n) REPEAT189(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT191(macro, arg, n) macro(arg, n) REPEAT190(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT192(macro, arg, n) macro(arg, n) REPEAT191(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT193(macro, arg, n) macro(arg, n) REPEAT192(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT194(macro, arg, n) macro(arg, n) REPEAT193(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT195(macro, arg, n) macro(arg, n) REPEAT194(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT196(macro, arg, n) macro(arg, n) REPEAT195(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT197(macro, arg, n) macro(arg, n) REPEAT196(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT198(macro, arg, n) macro(arg, n) REPEAT197(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT199(macro, arg, n) macro(arg, n) REPEAT198(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT200(macro, arg, n) macro(arg, n) REPEAT199(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT201(macro, arg, n) macro(arg, n) REPEAT200(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT202(macro, arg, n) macro(arg, n) REPEAT201(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT203(macro, arg, n) macro(arg, n) REPEAT202(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT204(macro, arg, n) macro(arg, n) REPEAT203(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT205(macro, arg, n) macro(arg, n) REPEAT204(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT206(macro, arg, n) macro(arg, n) REPEAT205(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT207(macro, arg, n) macro(arg, n) REPEAT206(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT208(macro, arg, n) macro(arg, n) REPEAT207(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT209(macro, arg, n) macro(arg, n) REPEAT208(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT210(macro, arg, n) macro(arg, n) REPEAT209(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT211(macro, arg, n) macro(arg, n) REPEAT210(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT212(macro, arg, n) macro(arg, n) REPEAT211(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT213(macro, arg, n) macro(arg, n) REPEAT212(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT214(macro, arg, n) macro(arg, n) REPEAT213(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT215(macro, arg, n) macro(arg, n) REPEAT214(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT216(macro, arg, n) macro(arg, n) REPEAT215(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT217(macro, arg, n) macro(arg, n) REPEAT216(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT218(macro, arg, n) macro(arg, n) REPEAT217(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT219(macro, arg, n) macro(arg, n) REPEAT218(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT220(macro, arg, n) macro(arg, n) REPEAT219(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT221(macro, arg, n) macro(arg, n) REPEAT220(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT222(macro, arg, n) macro(arg, n) REPEAT221(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT223(macro, arg, n) macro(arg, n) REPEAT222(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT224(macro, arg, n) macro(arg, n) REPEAT223(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT225(macro, arg, n) macro(arg, n) REPEAT224(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT226(macro, arg, n) macro(arg, n) REPEAT225(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT227(macro, arg, n) macro(arg, n) REPEAT226(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT228(macro, arg, n) macro(arg, n) REPEAT227(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT229(macro, arg, n) macro(arg, n) REPEAT228(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT230(macro, arg, n) macro(arg, n) REPEAT229(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT231(macro, arg, n) macro(arg, n) REPEAT230(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT232(macro, arg, n) macro(arg, n) REPEAT231(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT233(macro, arg, n) macro(arg, n) REPEAT232(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT234(macro, arg, n) macro(arg, n) REPEAT233(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT235(macro, arg, n) macro(arg, n) REPEAT234(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT236(macro, arg, n) macro(arg, n) REPEAT235(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT237(macro, arg, n) macro(arg, n) REPEAT236(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT238(macro, arg, n) macro(arg, n) REPEAT237(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT239(macro, arg, n) macro(arg, n) REPEAT238(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT240(macro, arg, n) macro(arg, n) REPEAT239(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT241(macro, arg, n) macro(arg, n) REPEAT240(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT242(macro, arg, n) macro(arg, n) REPEAT241(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT243(macro, arg, n) macro(arg, n) REPEAT242(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT244(macro, arg, n) macro(arg, n) REPEAT243(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT245(macro, arg, n) macro(arg, n) REPEAT244(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT246(macro, arg, n) macro(arg, n) REPEAT245(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT247(macro, arg, n) macro(arg, n) REPEAT246(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT248(macro, arg, n) macro(arg, n) REPEAT247(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT249(macro, arg, n) macro(arg, n) REPEAT248(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT250(macro, arg, n) macro(arg, n) REPEAT249(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT251(macro, arg, n) macro(arg, n) REPEAT250(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT252(macro, arg, n) macro(arg, n) REPEAT251(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT253(macro, arg, n) macro(arg, n) REPEAT252(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT254(macro, arg, n) macro(arg, n) REPEAT253(macro, arg, INC_VALUE(n))
|
||||||
|
#define REPEAT255(macro, arg, n) macro(arg, n) REPEAT254(macro, arg, INC_VALUE(n))
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <utils_increment_macro.h>
|
||||||
|
#endif /* _UTILS_REPEAT_MACRO_H */
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user