I2C. Syncing with trunk (step 2)
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/branches/i2c_dev@3216 35acf78f-673a-0410-8e92-d51de3d6d3f4master
parent
0752e9d7e9
commit
1bcc0f1dc2
|
@ -127,7 +127,7 @@ typedef struct {
|
|||
/**
|
||||
* @brief Offset, within the port, of the least significant bit of the bus.
|
||||
*/
|
||||
uint_fast8_t offset;
|
||||
iomode_t offset;
|
||||
} IOBus;
|
||||
|
||||
/*===========================================================================*/
|
||||
|
|
|
@ -121,7 +121,7 @@ void _pal_lld_init(const PALConfig *config) {
|
|||
*/
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode) {
|
||||
iomode_t mode) {
|
||||
|
||||
switch (mode) {
|
||||
case PAL_MODE_RESET:
|
||||
|
|
|
@ -241,7 +241,7 @@ extern "C" {
|
|||
void _pal_lld_init(const PALConfig *config);
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode);
|
||||
iomode_t mode);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -1,985 +0,0 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Parts of this files have been modified in ChibiOS/RT in order to fix
|
||||
* some code quality issues and conflicting declarations.
|
||||
*/
|
||||
|
||||
/**************************************************************************//**
|
||||
* @file core_cm0.h
|
||||
* @brief CMSIS Cortex-M0 Core Peripheral Access Layer Header File
|
||||
* @version V1.30
|
||||
* @date 30. October 2009
|
||||
*
|
||||
* @note
|
||||
* Copyright (C) 2009 ARM Limited. All rights reserved.
|
||||
*
|
||||
* @par
|
||||
* ARM Limited (ARM) is supplying this software for use with Cortex-M
|
||||
* processor based microcontrollers. This file can be freely distributed
|
||||
* within development tools that are supporting such ARM based processors.
|
||||
*
|
||||
* @par
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
|
||||
* OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
|
||||
* ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
|
||||
* CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
#ifndef __CM0_CORE_H__
|
||||
#define __CM0_CORE_H__
|
||||
|
||||
/** @addtogroup CMSIS_CM0_core_LintCinfiguration CMSIS CM0 Core Lint Configuration
|
||||
*
|
||||
* List of Lint messages which will be suppressed and not shown:
|
||||
* - not yet checked
|
||||
* .
|
||||
* Note: To re-enable a Message, insert a space before 'lint' *
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/** @addtogroup CMSIS_CM0_core_definitions CM0 Core Definitions
|
||||
This file defines all structures and symbols for CMSIS core:
|
||||
- CMSIS version number
|
||||
- Cortex-M core registers and bitfields
|
||||
- Cortex-M core peripheral base address
|
||||
@{
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define __CM0_CMSIS_VERSION_MAIN (0x01) /*!< [31:16] CMSIS HAL main version */
|
||||
#define __CM0_CMSIS_VERSION_SUB (0x30) /*!< [15:0] CMSIS HAL sub version */
|
||||
#define __CM0_CMSIS_VERSION ((__CM0_CMSIS_VERSION_MAIN << 16) | __CM0_CMSIS_VERSION_SUB) /*!< CMSIS HAL version number */
|
||||
|
||||
#define __CORTEX_M (0x00) /*!< Cortex core */
|
||||
|
||||
#include <stdint.h> /* Include standard types */
|
||||
|
||||
#if defined (__ICCARM__)
|
||||
#include <intrinsics.h> /* IAR Intrinsics */
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef __NVIC_PRIO_BITS
|
||||
#define __NVIC_PRIO_BITS 2 /*!< standard definition for NVIC Priority Bits */
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* IO definitions
|
||||
*
|
||||
* define access restrictions to peripheral registers
|
||||
*/
|
||||
|
||||
#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 */
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Register Abstraction
|
||||
******************************************************************************/
|
||||
/** @addtogroup CMSIS_CM0_core_register CMSIS CM0 Core Register
|
||||
@{
|
||||
*/
|
||||
|
||||
|
||||
/** @addtogroup CMSIS_CM0_NVIC CMSIS CM0 NVIC
|
||||
memory mapped structure for Nested Vectored Interrupt Controller (NVIC)
|
||||
@{
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t ISER[1]; /*!< (Offset: 0x000) Interrupt Set Enable Register */
|
||||
uint32_t RESERVED0[31];
|
||||
__IO uint32_t ICER[1]; /*!< (Offset: 0x080) Interrupt Clear Enable Register */
|
||||
uint32_t RSERVED1[31];
|
||||
__IO uint32_t ISPR[1]; /*!< (Offset: 0x100) Interrupt Set Pending Register */
|
||||
uint32_t RESERVED2[31];
|
||||
__IO uint32_t ICPR[1]; /*!< (Offset: 0x180) Interrupt Clear Pending Register */
|
||||
uint32_t RESERVED3[31];
|
||||
uint32_t RESERVED4[64];
|
||||
__IO uint32_t IPR[8]; /*!< (Offset: 0x3EC) Interrupt Priority Register */
|
||||
} NVIC_Type;
|
||||
/*@}*/ /* end of group CMSIS_CM0_NVIC */
|
||||
|
||||
|
||||
/** @addtogroup CMSIS_CM0_SCB CMSIS CM0 SCB
|
||||
memory mapped structure for System Control Block (SCB)
|
||||
@{
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
__I uint32_t CPUID; /*!< Offset: 0x00 CPU ID Base Register */
|
||||
__IO uint32_t ICSR; /*!< Offset: 0x04 Interrupt Control State Register */
|
||||
uint32_t RESERVED0;
|
||||
__IO uint32_t AIRCR; /*!< Offset: 0x0C Application Interrupt / Reset Control Register */
|
||||
__IO uint32_t SCR; /*!< Offset: 0x10 System Control Register */
|
||||
__IO uint32_t CCR; /*!< Offset: 0x14 Configuration Control Register */
|
||||
uint32_t RESERVED1;
|
||||
__IO uint32_t SHP[2]; /*!< Offset: 0x1C System Handlers Priority Registers. [0] is RESERVED */
|
||||
__IO uint32_t SHCSR; /*!< Offset: 0x24 System Handler Control and State Register */
|
||||
uint32_t RESERVED2[2];
|
||||
__IO uint32_t DFSR; /*!< Offset: 0x30 Debug Fault Status Register */
|
||||
} SCB_Type;
|
||||
|
||||
/* SCB CPUID Register Definitions */
|
||||
#define SCB_CPUID_IMPLEMENTER_Pos 24 /*!< SCB CPUID: IMPLEMENTER Position */
|
||||
#define SCB_CPUID_IMPLEMENTER_Msk (0xFFul << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */
|
||||
|
||||
#define SCB_CPUID_VARIANT_Pos 20 /*!< SCB CPUID: VARIANT Position */
|
||||
#define SCB_CPUID_VARIANT_Msk (0xFul << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */
|
||||
|
||||
#define SCB_CPUID_ARCHITECTURE_Pos 16 /*!< SCB CPUID: ARCHITECTURE Position */
|
||||
#define SCB_CPUID_ARCHITECTURE_Msk (0xFul << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */
|
||||
|
||||
#define SCB_CPUID_PARTNO_Pos 4 /*!< SCB CPUID: PARTNO Position */
|
||||
#define SCB_CPUID_PARTNO_Msk (0xFFFul << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */
|
||||
|
||||
#define SCB_CPUID_REVISION_Pos 0 /*!< 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 31 /*!< SCB ICSR: NMIPENDSET Position */
|
||||
#define SCB_ICSR_NMIPENDSET_Msk (1ul << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */
|
||||
|
||||
#define SCB_ICSR_PENDSVSET_Pos 28 /*!< SCB ICSR: PENDSVSET Position */
|
||||
#define SCB_ICSR_PENDSVSET_Msk (1ul << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */
|
||||
|
||||
#define SCB_ICSR_PENDSVCLR_Pos 27 /*!< SCB ICSR: PENDSVCLR Position */
|
||||
#define SCB_ICSR_PENDSVCLR_Msk (1ul << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */
|
||||
|
||||
#define SCB_ICSR_PENDSTSET_Pos 26 /*!< SCB ICSR: PENDSTSET Position */
|
||||
#define SCB_ICSR_PENDSTSET_Msk (1ul << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */
|
||||
|
||||
#define SCB_ICSR_PENDSTCLR_Pos 25 /*!< SCB ICSR: PENDSTCLR Position */
|
||||
#define SCB_ICSR_PENDSTCLR_Msk (1ul << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */
|
||||
|
||||
#define SCB_ICSR_ISRPREEMPT_Pos 23 /*!< SCB ICSR: ISRPREEMPT Position */
|
||||
#define SCB_ICSR_ISRPREEMPT_Msk (1ul << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */
|
||||
|
||||
#define SCB_ICSR_ISRPENDING_Pos 22 /*!< SCB ICSR: ISRPENDING Position */
|
||||
#define SCB_ICSR_ISRPENDING_Msk (1ul << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */
|
||||
|
||||
#define SCB_ICSR_VECTPENDING_Pos 12 /*!< SCB ICSR: VECTPENDING Position */
|
||||
#define SCB_ICSR_VECTPENDING_Msk (0x1FFul << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */
|
||||
|
||||
#define SCB_ICSR_VECTACTIVE_Pos 0 /*!< 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 16 /*!< SCB AIRCR: VECTKEY Position */
|
||||
#define SCB_AIRCR_VECTKEY_Msk (0xFFFFul << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */
|
||||
|
||||
#define SCB_AIRCR_VECTKEYSTAT_Pos 16 /*!< SCB AIRCR: VECTKEYSTAT Position */
|
||||
#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFul << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */
|
||||
|
||||
#define SCB_AIRCR_ENDIANESS_Pos 15 /*!< SCB AIRCR: ENDIANESS Position */
|
||||
#define SCB_AIRCR_ENDIANESS_Msk (1ul << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */
|
||||
|
||||
#define SCB_AIRCR_SYSRESETREQ_Pos 2 /*!< SCB AIRCR: SYSRESETREQ Position */
|
||||
#define SCB_AIRCR_SYSRESETREQ_Msk (1ul << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */
|
||||
|
||||
#define SCB_AIRCR_VECTCLRACTIVE_Pos 1 /*!< 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 4 /*!< SCB SCR: SEVONPEND Position */
|
||||
#define SCB_SCR_SEVONPEND_Msk (1ul << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */
|
||||
|
||||
#define SCB_SCR_SLEEPDEEP_Pos 2 /*!< SCB SCR: SLEEPDEEP Position */
|
||||
#define SCB_SCR_SLEEPDEEP_Msk (1ul << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */
|
||||
|
||||
#define SCB_SCR_SLEEPONEXIT_Pos 1 /*!< 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 9 /*!< SCB CCR: STKALIGN Position */
|
||||
#define SCB_CCR_STKALIGN_Msk (1ul << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */
|
||||
|
||||
#define SCB_CCR_UNALIGN_TRP_Pos 3 /*!< 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 15 /*!< SCB SHCSR: SVCALLPENDED Position */
|
||||
#define SCB_SHCSR_SVCALLPENDED_Msk (1ul << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */
|
||||
|
||||
/* SCB Debug Fault Status Register Definitions */
|
||||
#define SCB_DFSR_EXTERNAL_Pos 4 /*!< SCB DFSR: EXTERNAL Position */
|
||||
#define SCB_DFSR_EXTERNAL_Msk (1ul << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */
|
||||
|
||||
#define SCB_DFSR_VCATCH_Pos 3 /*!< SCB DFSR: VCATCH Position */
|
||||
#define SCB_DFSR_VCATCH_Msk (1ul << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */
|
||||
|
||||
#define SCB_DFSR_DWTTRAP_Pos 2 /*!< SCB DFSR: DWTTRAP Position */
|
||||
#define SCB_DFSR_DWTTRAP_Msk (1ul << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */
|
||||
|
||||
#define SCB_DFSR_BKPT_Pos 1 /*!< SCB DFSR: BKPT Position */
|
||||
#define SCB_DFSR_BKPT_Msk (1ul << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */
|
||||
|
||||
#define SCB_DFSR_HALTED_Pos 0 /*!< SCB DFSR: HALTED Position */
|
||||
#define SCB_DFSR_HALTED_Msk (1ul << SCB_DFSR_HALTED_Pos) /*!< SCB DFSR: HALTED Mask */
|
||||
/*@}*/ /* end of group CMSIS_CM0_SCB */
|
||||
|
||||
|
||||
/** @addtogroup CMSIS_CM0_SysTick CMSIS CM0 SysTick
|
||||
memory mapped structure for SysTick
|
||||
@{
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t CTRL; /*!< Offset: 0x00 SysTick Control and Status Register */
|
||||
__IO uint32_t LOAD; /*!< Offset: 0x04 SysTick Reload Value Register */
|
||||
__IO uint32_t VAL; /*!< Offset: 0x08 SysTick Current Value Register */
|
||||
__I uint32_t CALIB; /*!< Offset: 0x0C SysTick Calibration Register */
|
||||
} SysTick_Type;
|
||||
|
||||
/* SysTick Control / Status Register Definitions */
|
||||
#define SysTick_CTRL_COUNTFLAG_Pos 16 /*!< SysTick CTRL: COUNTFLAG Position */
|
||||
#define SysTick_CTRL_COUNTFLAG_Msk (1ul << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */
|
||||
|
||||
#define SysTick_CTRL_CLKSOURCE_Pos 2 /*!< SysTick CTRL: CLKSOURCE Position */
|
||||
#define SysTick_CTRL_CLKSOURCE_Msk (1ul << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */
|
||||
|
||||
#define SysTick_CTRL_TICKINT_Pos 1 /*!< SysTick CTRL: TICKINT Position */
|
||||
#define SysTick_CTRL_TICKINT_Msk (1ul << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */
|
||||
|
||||
#define SysTick_CTRL_ENABLE_Pos 0 /*!< 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 0 /*!< 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 0 /*!< 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 31 /*!< SysTick CALIB: NOREF Position */
|
||||
#define SysTick_CALIB_NOREF_Msk (1ul << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */
|
||||
|
||||
#define SysTick_CALIB_SKEW_Pos 30 /*!< SysTick CALIB: SKEW Position */
|
||||
#define SysTick_CALIB_SKEW_Msk (1ul << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */
|
||||
|
||||
#define SysTick_CALIB_TENMS_Pos 0 /*!< SysTick CALIB: TENMS Position */
|
||||
#define SysTick_CALIB_TENMS_Msk (0xFFFFFFul << SysTick_VAL_CURRENT_Pos) /*!< SysTick CALIB: TENMS Mask */
|
||||
/*@}*/ /* end of group CMSIS_CM0_SysTick */
|
||||
|
||||
|
||||
/** @addtogroup CMSIS_CM0_CoreDebug CMSIS CM0 Core Debug
|
||||
memory mapped structure for Core Debug Register
|
||||
@{
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
__IO uint32_t DHCSR; /*!< Offset: 0x00 Debug Halting Control and Status Register */
|
||||
__O uint32_t DCRSR; /*!< Offset: 0x04 Debug Core Register Selector Register */
|
||||
__IO uint32_t DCRDR; /*!< Offset: 0x08 Debug Core Register Data Register */
|
||||
__IO uint32_t DEMCR; /*!< Offset: 0x0C Debug Exception and Monitor Control Register */
|
||||
} CoreDebug_Type;
|
||||
|
||||
/* Debug Halting Control and Status Register */
|
||||
#define CoreDebug_DHCSR_DBGKEY_Pos 16 /*!< CoreDebug DHCSR: DBGKEY Position */
|
||||
#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFul << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */
|
||||
|
||||
#define CoreDebug_DHCSR_S_RESET_ST_Pos 25 /*!< CoreDebug DHCSR: S_RESET_ST Position */
|
||||
#define CoreDebug_DHCSR_S_RESET_ST_Msk (1ul << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */
|
||||
|
||||
#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24 /*!< CoreDebug DHCSR: S_RETIRE_ST Position */
|
||||
#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1ul << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */
|
||||
|
||||
#define CoreDebug_DHCSR_S_LOCKUP_Pos 19 /*!< CoreDebug DHCSR: S_LOCKUP Position */
|
||||
#define CoreDebug_DHCSR_S_LOCKUP_Msk (1ul << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */
|
||||
|
||||
#define CoreDebug_DHCSR_S_SLEEP_Pos 18 /*!< CoreDebug DHCSR: S_SLEEP Position */
|
||||
#define CoreDebug_DHCSR_S_SLEEP_Msk (1ul << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */
|
||||
|
||||
#define CoreDebug_DHCSR_S_HALT_Pos 17 /*!< CoreDebug DHCSR: S_HALT Position */
|
||||
#define CoreDebug_DHCSR_S_HALT_Msk (1ul << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */
|
||||
|
||||
#define CoreDebug_DHCSR_S_REGRDY_Pos 16 /*!< CoreDebug DHCSR: S_REGRDY Position */
|
||||
#define CoreDebug_DHCSR_S_REGRDY_Msk (1ul << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */
|
||||
|
||||
#define CoreDebug_DHCSR_C_MASKINTS_Pos 3 /*!< CoreDebug DHCSR: C_MASKINTS Position */
|
||||
#define CoreDebug_DHCSR_C_MASKINTS_Msk (1ul << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */
|
||||
|
||||
#define CoreDebug_DHCSR_C_STEP_Pos 2 /*!< CoreDebug DHCSR: C_STEP Position */
|
||||
#define CoreDebug_DHCSR_C_STEP_Msk (1ul << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */
|
||||
|
||||
#define CoreDebug_DHCSR_C_HALT_Pos 1 /*!< CoreDebug DHCSR: C_HALT Position */
|
||||
#define CoreDebug_DHCSR_C_HALT_Msk (1ul << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */
|
||||
|
||||
#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0 /*!< CoreDebug DHCSR: C_DEBUGEN Position */
|
||||
#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1ul << CoreDebug_DHCSR_C_DEBUGEN_Pos) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */
|
||||
|
||||
/* Debug Core Register Selector Register */
|
||||
#define CoreDebug_DCRSR_REGWnR_Pos 16 /*!< CoreDebug DCRSR: REGWnR Position */
|
||||
#define CoreDebug_DCRSR_REGWnR_Msk (1ul << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */
|
||||
|
||||
#define CoreDebug_DCRSR_REGSEL_Pos 0 /*!< CoreDebug DCRSR: REGSEL Position */
|
||||
#define CoreDebug_DCRSR_REGSEL_Msk (0x1Ful << CoreDebug_DCRSR_REGSEL_Pos) /*!< CoreDebug DCRSR: REGSEL Mask */
|
||||
|
||||
/* Debug Exception and Monitor Control Register */
|
||||
#define CoreDebug_DEMCR_DWTENA_Pos 24 /*!< CoreDebug DEMCR: DWTENA Position */
|
||||
#define CoreDebug_DEMCR_DWTENA_Msk (1ul << CoreDebug_DEMCR_DWTENA_Pos) /*!< CoreDebug DEMCR: DWTENA Mask */
|
||||
|
||||
#define CoreDebug_DEMCR_VC_HARDERR_Pos 10 /*!< CoreDebug DEMCR: VC_HARDERR Position */
|
||||
#define CoreDebug_DEMCR_VC_HARDERR_Msk (1ul << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */
|
||||
|
||||
#define CoreDebug_DEMCR_VC_CORERESET_Pos 0 /*!< CoreDebug DEMCR: VC_CORERESET Position */
|
||||
#define CoreDebug_DEMCR_VC_CORERESET_Msk (1ul << CoreDebug_DEMCR_VC_CORERESET_Pos) /*!< CoreDebug DEMCR: VC_CORERESET Mask */
|
||||
/*@}*/ /* end of group CMSIS_CM0_CoreDebug */
|
||||
|
||||
|
||||
/* Memory mapping of Cortex-M0 Hardware */
|
||||
#define SCS_BASE (0xE000E000) /*!< System Control Space Base Address */
|
||||
#define CoreDebug_BASE (0xE000EDF0) /*!< Core Debug Base Address */
|
||||
#define SysTick_BASE (SCS_BASE + 0x0010) /*!< SysTick Base Address */
|
||||
#define NVIC_BASE (SCS_BASE + 0x0100) /*!< NVIC Base Address */
|
||||
#define SCB_BASE (SCS_BASE + 0x0D00) /*!< 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 */
|
||||
#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */
|
||||
|
||||
/*@}*/ /* end of group CMSIS_CM0_core_register */
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* Hardware Abstraction Layer
|
||||
******************************************************************************/
|
||||
|
||||
#if defined ( __CC_ARM )
|
||||
#define __ASM __asm /*!< asm keyword for ARM Compiler */
|
||||
#define __INLINE __inline /*!< inline keyword for ARM Compiler */
|
||||
|
||||
#elif defined ( __ICCARM__ )
|
||||
#define __ASM __asm /*!< asm keyword for IAR Compiler */
|
||||
#define __INLINE inline /*!< inline keyword for IAR Compiler. Only avaiable in High optimization mode! */
|
||||
|
||||
#elif defined ( __GNUC__ )
|
||||
#define __ASM __asm /*!< asm keyword for GNU Compiler */
|
||||
#define __INLINE inline /*!< inline keyword for GNU Compiler */
|
||||
|
||||
#elif defined ( __TASKING__ )
|
||||
#define __ASM __asm /*!< asm keyword for TASKING Compiler */
|
||||
#define __INLINE inline /*!< inline keyword for TASKING Compiler */
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/* ################### Compiler specific Intrinsics ########################### */
|
||||
|
||||
#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
|
||||
/* ARM armcc specific functions */
|
||||
|
||||
#define __enable_fault_irq __enable_fiq
|
||||
#define __disable_fault_irq __disable_fiq
|
||||
|
||||
#define __NOP __nop
|
||||
#define __WFI __wfi
|
||||
#define __WFE __wfe
|
||||
#define __SEV __sev
|
||||
#define __ISB() __isb(0)
|
||||
#define __DSB() __dsb(0)
|
||||
#define __DMB() __dmb(0)
|
||||
#define __REV __rev
|
||||
|
||||
|
||||
/* intrinsic void __enable_irq(); */
|
||||
/* intrinsic void __disable_irq(); */
|
||||
|
||||
|
||||
/**
|
||||
* @brief Return the Process Stack Pointer
|
||||
*
|
||||
* @return ProcessStackPointer
|
||||
*
|
||||
* Return the actual process stack pointer
|
||||
*/
|
||||
extern uint32_t __get_PSP(void);
|
||||
|
||||
/**
|
||||
* @brief Set the Process Stack Pointer
|
||||
*
|
||||
* @param topOfProcStack Process Stack Pointer
|
||||
*
|
||||
* Assign the value ProcessStackPointer to the MSP
|
||||
* (process stack pointer) Cortex processor register
|
||||
*/
|
||||
extern void __set_PSP(uint32_t topOfProcStack);
|
||||
|
||||
/**
|
||||
* @brief Return the Main Stack Pointer
|
||||
*
|
||||
* @return Main Stack Pointer
|
||||
*
|
||||
* Return the current value of the MSP (main stack pointer)
|
||||
* Cortex processor register
|
||||
*/
|
||||
extern uint32_t __get_MSP(void);
|
||||
|
||||
/**
|
||||
* @brief Set the Main Stack Pointer
|
||||
*
|
||||
* @param topOfMainStack Main Stack Pointer
|
||||
*
|
||||
* Assign the value mainStackPointer to the MSP
|
||||
* (main stack pointer) Cortex processor register
|
||||
*/
|
||||
extern void __set_MSP(uint32_t topOfMainStack);
|
||||
|
||||
/**
|
||||
* @brief Reverse byte order in unsigned short value
|
||||
*
|
||||
* @param value value to reverse
|
||||
* @return reversed value
|
||||
*
|
||||
* Reverse byte order in unsigned short value
|
||||
*/
|
||||
extern uint32_t __REV16(uint16_t value);
|
||||
|
||||
/**
|
||||
* @brief Reverse byte order in signed short value with sign extension to integer
|
||||
*
|
||||
* @param value value to reverse
|
||||
* @return reversed value
|
||||
*
|
||||
* Reverse byte order in signed short value with sign extension to integer
|
||||
*/
|
||||
extern int32_t __REVSH(int16_t value);
|
||||
|
||||
|
||||
#if (__ARMCC_VERSION < 400000)
|
||||
|
||||
/**
|
||||
* @brief Return the Priority Mask value
|
||||
*
|
||||
* @return PriMask
|
||||
*
|
||||
* Return state of the priority mask bit from the priority mask register
|
||||
*/
|
||||
extern uint32_t __get_PRIMASK(void);
|
||||
|
||||
/**
|
||||
* @brief Set the Priority Mask value
|
||||
*
|
||||
* @param priMask PriMask
|
||||
*
|
||||
* Set the priority mask bit in the priority mask register
|
||||
*/
|
||||
extern void __set_PRIMASK(uint32_t priMask);
|
||||
|
||||
/**
|
||||
* @brief Return the Control Register value
|
||||
*
|
||||
* @return Control value
|
||||
*
|
||||
* Return the content of the control register
|
||||
*/
|
||||
extern uint32_t __get_CONTROL(void);
|
||||
|
||||
/**
|
||||
* @brief Set the Control Register value
|
||||
*
|
||||
* @param control Control value
|
||||
*
|
||||
* Set the control register
|
||||
*/
|
||||
extern void __set_CONTROL(uint32_t control);
|
||||
|
||||
#else /* (__ARMCC_VERSION >= 400000) */
|
||||
|
||||
|
||||
/**
|
||||
* @brief Return the Priority Mask value
|
||||
*
|
||||
* @return PriMask
|
||||
*
|
||||
* Return state of the priority mask bit from the priority mask register
|
||||
*/
|
||||
static __INLINE uint32_t __get_PRIMASK(void)
|
||||
{
|
||||
register uint32_t __regPriMask __ASM("primask");
|
||||
return(__regPriMask);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the Priority Mask value
|
||||
*
|
||||
* @param priMask PriMask
|
||||
*
|
||||
* Set the priority mask bit in the priority mask register
|
||||
*/
|
||||
static __INLINE void __set_PRIMASK(uint32_t priMask)
|
||||
{
|
||||
register uint32_t __regPriMask __ASM("primask");
|
||||
__regPriMask = (priMask);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Return the Control Register value
|
||||
*
|
||||
* @return Control value
|
||||
*
|
||||
* Return the content of the control register
|
||||
*/
|
||||
static __INLINE uint32_t __get_CONTROL(void)
|
||||
{
|
||||
register uint32_t __regControl __ASM("control");
|
||||
return(__regControl);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the Control Register value
|
||||
*
|
||||
* @param control Control value
|
||||
*
|
||||
* Set the control register
|
||||
*/
|
||||
static __INLINE void __set_CONTROL(uint32_t control)
|
||||
{
|
||||
register uint32_t __regControl __ASM("control");
|
||||
__regControl = control;
|
||||
}
|
||||
|
||||
#endif /* __ARMCC_VERSION */
|
||||
|
||||
|
||||
|
||||
#elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/
|
||||
/* IAR iccarm specific functions */
|
||||
|
||||
#define __enable_irq __enable_interrupt /*!< global Interrupt enable */
|
||||
#define __disable_irq __disable_interrupt /*!< global Interrupt disable */
|
||||
|
||||
static __INLINE void __enable_fault_irq() { __ASM ("cpsie f"); }
|
||||
static __INLINE void __disable_fault_irq() { __ASM ("cpsid f"); }
|
||||
|
||||
#define __NOP __no_operation /*!< no operation intrinsic in IAR Compiler */
|
||||
static __INLINE void __WFI() { __ASM ("wfi"); }
|
||||
static __INLINE void __WFE() { __ASM ("wfe"); }
|
||||
static __INLINE void __SEV() { __ASM ("sev"); }
|
||||
|
||||
/* intrinsic void __ISB(void) */
|
||||
/* intrinsic void __DSB(void) */
|
||||
/* intrinsic void __DMB(void) */
|
||||
/* intrinsic void __set_PRIMASK(); */
|
||||
/* intrinsic void __get_PRIMASK(); */
|
||||
|
||||
|
||||
/* intrinsic uint32_t __REV(uint32_t value); */
|
||||
/* intrinsic uint32_t __REVSH(uint32_t value); */
|
||||
|
||||
|
||||
/**
|
||||
* @brief Return the Process Stack Pointer
|
||||
*
|
||||
* @return ProcessStackPointer
|
||||
*
|
||||
* Return the actual process stack pointer
|
||||
*/
|
||||
//extern uint32_t __get_PSP(void);
|
||||
|
||||
/**
|
||||
* @brief Set the Process Stack Pointer
|
||||
*
|
||||
* @param topOfProcStack Process Stack Pointer
|
||||
*
|
||||
* Assign the value ProcessStackPointer to the MSP
|
||||
* (process stack pointer) Cortex processor register
|
||||
*/
|
||||
//extern void __set_PSP(uint32_t topOfProcStack);
|
||||
|
||||
/**
|
||||
* @brief Return the Main Stack Pointer
|
||||
*
|
||||
* @return Main Stack Pointer
|
||||
*
|
||||
* Return the current value of the MSP (main stack pointer)
|
||||
* Cortex processor register
|
||||
*/
|
||||
//extern uint32_t __get_MSP(void);
|
||||
|
||||
/**
|
||||
* @brief Set the Main Stack Pointer
|
||||
*
|
||||
* @param topOfMainStack Main Stack Pointer
|
||||
*
|
||||
* Assign the value mainStackPointer to the MSP
|
||||
* (main stack pointer) Cortex processor register
|
||||
*/
|
||||
//extern void __set_MSP(uint32_t topOfMainStack);
|
||||
|
||||
/**
|
||||
* @brief Reverse byte order in unsigned short value
|
||||
*
|
||||
* @param value value to reverse
|
||||
* @return reversed value
|
||||
*
|
||||
* Reverse byte order in unsigned short value
|
||||
*/
|
||||
//extern uint32_t __REV16(uint16_t value);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/
|
||||
/* GNU gcc specific functions */
|
||||
|
||||
static __INLINE void __enable_irq(void) { __ASM volatile ("cpsie i"); }
|
||||
static __INLINE void __disable_irq(void) { __ASM volatile ("cpsid i"); }
|
||||
|
||||
static __INLINE void __enable_fault_irq(void) { __ASM volatile ("cpsie f"); }
|
||||
static __INLINE void __disable_fault_irq(void) { __ASM volatile ("cpsid f"); }
|
||||
|
||||
static __INLINE void __NOP(void) { __ASM volatile ("nop"); }
|
||||
static __INLINE void __WFI(void) { __ASM volatile ("wfi"); }
|
||||
static __INLINE void __WFE(void) { __ASM volatile ("wfe"); }
|
||||
static __INLINE void __SEV(void) { __ASM volatile ("sev"); }
|
||||
static __INLINE void __ISB(void) { __ASM volatile ("isb"); }
|
||||
static __INLINE void __DSB(void) { __ASM volatile ("dsb"); }
|
||||
static __INLINE void __DMB(void) { __ASM volatile ("dmb"); }
|
||||
|
||||
|
||||
/**
|
||||
* @brief Return the Process Stack Pointer
|
||||
*
|
||||
* @return ProcessStackPointer
|
||||
*
|
||||
* Return the actual process stack pointer
|
||||
*/
|
||||
extern uint32_t __get_PSP(void);
|
||||
|
||||
/**
|
||||
* @brief Set the Process Stack Pointer
|
||||
*
|
||||
* @param topOfProcStack Process Stack Pointer
|
||||
*
|
||||
* Assign the value ProcessStackPointer to the MSP
|
||||
* (process stack pointer) Cortex processor register
|
||||
*/
|
||||
extern void __set_PSP(uint32_t topOfProcStack);
|
||||
|
||||
/**
|
||||
* @brief Return the Main Stack Pointer
|
||||
*
|
||||
* @return Main Stack Pointer
|
||||
*
|
||||
* Return the current value of the MSP (main stack pointer)
|
||||
* Cortex processor register
|
||||
*/
|
||||
extern uint32_t __get_MSP(void);
|
||||
|
||||
/**
|
||||
* @brief Set the Main Stack Pointer
|
||||
*
|
||||
* @param topOfMainStack Main Stack Pointer
|
||||
*
|
||||
* Assign the value mainStackPointer to the MSP
|
||||
* (main stack pointer) Cortex processor register
|
||||
*/
|
||||
extern void __set_MSP(uint32_t topOfMainStack);
|
||||
|
||||
/**
|
||||
* @brief Return the Priority Mask value
|
||||
*
|
||||
* @return PriMask
|
||||
*
|
||||
* Return state of the priority mask bit from the priority mask register
|
||||
*/
|
||||
extern uint32_t __get_PRIMASK(void);
|
||||
|
||||
/**
|
||||
* @brief Set the Priority Mask value
|
||||
*
|
||||
* @param priMask PriMask
|
||||
*
|
||||
* Set the priority mask bit in the priority mask register
|
||||
*/
|
||||
extern void __set_PRIMASK(uint32_t priMask);
|
||||
|
||||
/**
|
||||
* @brief Return the Control Register value
|
||||
*
|
||||
* @return Control value
|
||||
*
|
||||
* Return the content of the control register
|
||||
*/
|
||||
extern uint32_t __get_CONTROL(void);
|
||||
|
||||
/**
|
||||
* @brief Set the Control Register value
|
||||
*
|
||||
* @param control Control value
|
||||
*
|
||||
* Set the control register
|
||||
*/
|
||||
extern void __set_CONTROL(uint32_t control);
|
||||
|
||||
/**
|
||||
* @brief Reverse byte order in integer value
|
||||
*
|
||||
* @param value value to reverse
|
||||
* @return reversed value
|
||||
*
|
||||
* Reverse byte order in integer value
|
||||
*/
|
||||
extern uint32_t __REV(uint32_t value);
|
||||
|
||||
/**
|
||||
* @brief Reverse byte order in unsigned short value
|
||||
*
|
||||
* @param value value to reverse
|
||||
* @return reversed value
|
||||
*
|
||||
* Reverse byte order in unsigned short value
|
||||
*/
|
||||
extern uint32_t __REV16(uint16_t value);
|
||||
|
||||
/**
|
||||
* @brief Reverse byte order in signed short value with sign extension to integer
|
||||
*
|
||||
* @param value value to reverse
|
||||
* @return reversed value
|
||||
*
|
||||
* Reverse byte order in signed short value with sign extension to integer
|
||||
*/
|
||||
extern int32_t __REVSH(int16_t value);
|
||||
|
||||
|
||||
#elif (defined (__TASKING__)) /*------------------ TASKING Compiler ---------------------*/
|
||||
/* TASKING carm specific functions */
|
||||
|
||||
/*
|
||||
* The CMSIS functions have been implemented as intrinsics in the compiler.
|
||||
* Please use "carm -?i" to get an up to date list of all instrinsics,
|
||||
* Including the CMSIS ones.
|
||||
*/
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/** @addtogroup CMSIS_CM0_Core_FunctionInterface CMSIS CM0 Core Function Interface
|
||||
Core Function Interface containing:
|
||||
- Core NVIC Functions
|
||||
- Core SysTick Functions
|
||||
- Core Reset Functions
|
||||
*/
|
||||
/*@{*/
|
||||
|
||||
/* ########################## NVIC functions #################################### */
|
||||
|
||||
/* Interrupt Priorities are WORD accessible only under ARMv6M */
|
||||
/* The following MACROS handle generation of the register offset and byte masks */
|
||||
#define _BIT_SHIFT(IRQn) ( (((uint32_t)(IRQn) ) & 0x03) * 8 )
|
||||
#define _SHP_IDX(IRQn) ( ((((uint32_t)(IRQn) & 0x0F)-8) >> 2) )
|
||||
#define _IP_IDX(IRQn) ( ((uint32_t)(IRQn) >> 2) )
|
||||
|
||||
|
||||
/**
|
||||
* @brief Enable Interrupt in NVIC Interrupt Controller
|
||||
*
|
||||
* @param IRQn The positive number of the external interrupt to enable
|
||||
*
|
||||
* Enable a device specific interupt in the NVIC interrupt controller.
|
||||
* The interrupt number cannot be a negative value.
|
||||
*/
|
||||
static __INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
|
||||
{
|
||||
NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* enable interrupt */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Disable the interrupt line for external interrupt specified
|
||||
*
|
||||
* @param IRQn The positive number of the external interrupt to disable
|
||||
*
|
||||
* Disable a device specific interupt in the NVIC interrupt controller.
|
||||
* The interrupt number cannot be a negative value.
|
||||
*/
|
||||
static __INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
|
||||
{
|
||||
NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* disable interrupt */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Read the interrupt pending bit for a device specific interrupt source
|
||||
*
|
||||
* @param IRQn The number of the device specifc interrupt
|
||||
* @return 1 = interrupt pending, 0 = interrupt not pending
|
||||
*
|
||||
* Read the pending register in NVIC and return 1 if its status is pending,
|
||||
* otherwise it returns 0
|
||||
*/
|
||||
static __INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
|
||||
{
|
||||
return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0)); /* Return 1 if pending else 0 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the pending bit for an external interrupt
|
||||
*
|
||||
* @param IRQn The number of the interrupt for set pending
|
||||
*
|
||||
* Set the pending bit for the specified interrupt.
|
||||
* The interrupt number cannot be a negative value.
|
||||
*/
|
||||
static __INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
|
||||
{
|
||||
NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* set interrupt pending */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Clear the pending bit for an external interrupt
|
||||
*
|
||||
* @param IRQn The number of the interrupt for clear pending
|
||||
*
|
||||
* Clear the pending bit for the specified interrupt.
|
||||
* The interrupt number cannot be a negative value.
|
||||
*/
|
||||
static __INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
|
||||
{
|
||||
NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the priority for an interrupt
|
||||
*
|
||||
* @param IRQn The number of the interrupt for set priority
|
||||
* @param priority The priority to set
|
||||
*
|
||||
* Set the priority for the specified interrupt. The interrupt
|
||||
* number can be positive to specify an external (device specific)
|
||||
* interrupt, or negative to specify an internal (core) interrupt.
|
||||
*
|
||||
* Note: The priority cannot be set for every core interrupt.
|
||||
*/
|
||||
static __INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
|
||||
{
|
||||
if(IRQn < 0) {
|
||||
SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
|
||||
(((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
|
||||
else {
|
||||
NVIC->IPR[_IP_IDX(IRQn)] = (NVIC->IPR[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
|
||||
(((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Read the priority for an interrupt
|
||||
*
|
||||
* @param IRQn The number of the interrupt for get priority
|
||||
* @return The priority for the interrupt
|
||||
*
|
||||
* Read the priority for the specified interrupt. The interrupt
|
||||
* number can be positive to specify an external (device specific)
|
||||
* interrupt, or negative to specify an internal (core) interrupt.
|
||||
*
|
||||
* The returned priority value is automatically aligned to the implemented
|
||||
* priority bits of the microcontroller.
|
||||
*
|
||||
* Note: The priority cannot be set for every core interrupt.
|
||||
*/
|
||||
static __INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
|
||||
{
|
||||
|
||||
if(IRQn < 0) {
|
||||
return((uint32_t)((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for Cortex-M0 system interrupts */
|
||||
else {
|
||||
return((uint32_t)((NVIC->IPR[_IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) >> (8 - __NVIC_PRIO_BITS))); } /* get priority for device specific interrupts */
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* ################################## SysTick function ############################################ */
|
||||
|
||||
#if (!defined (__Vendor_SysTickConfig)) || (__Vendor_SysTickConfig == 0)
|
||||
|
||||
/**
|
||||
* @brief Initialize and start the SysTick counter and its interrupt.
|
||||
*
|
||||
* @param ticks number of ticks between two interrupts
|
||||
* @return 1 = failed, 0 = successful
|
||||
*
|
||||
* Initialise the system tick timer and its interrupt and start the
|
||||
* system tick timer / counter in free running mode to generate
|
||||
* periodical interrupts.
|
||||
*/
|
||||
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
|
||||
{
|
||||
if (ticks > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
|
||||
|
||||
SysTick->LOAD = (ticks & SysTick_LOAD_RELOAD_Msk) - 1; /* set reload register */
|
||||
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Cortex-M0 System Interrupts */
|
||||
SysTick->VAL = 0; /* 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 (0); /* Function successful */
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/* ################################## Reset function ############################################ */
|
||||
|
||||
/**
|
||||
* @brief Initiate a system reset request.
|
||||
*
|
||||
* Initiate a system reset request to reset the MCU
|
||||
*/
|
||||
static __INLINE void NVIC_SystemReset(void)
|
||||
{
|
||||
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
|
||||
SCB_AIRCR_SYSRESETREQ_Msk);
|
||||
__DSB(); /* Ensure completion of memory access */
|
||||
while(1); /* wait until reset */
|
||||
}
|
||||
|
||||
/*@}*/ /* end of group CMSIS_CM0_Core_FunctionInterface */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
/*@}*/ /* end of group CMSIS_CM0_core_definitions */
|
||||
|
||||
#endif /* __CM0_CORE_H__ */
|
||||
|
||||
/*lint -restore */
|
|
@ -87,7 +87,7 @@ void _pal_lld_init(const PALConfig *config) {
|
|||
*/
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode) {
|
||||
iomode_t mode) {
|
||||
|
||||
switch (mode) {
|
||||
case PAL_MODE_RESET:
|
||||
|
|
|
@ -327,7 +327,7 @@ extern "C" {
|
|||
void _pal_lld_init(const PALConfig *config);
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode);
|
||||
iomode_t mode);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -87,7 +87,7 @@ void _pal_lld_init(const PALConfig *config) {
|
|||
*/
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode) {
|
||||
iomode_t mode) {
|
||||
|
||||
switch (mode) {
|
||||
case PAL_MODE_RESET:
|
||||
|
|
|
@ -327,7 +327,7 @@ extern "C" {
|
|||
void _pal_lld_init(const PALConfig *config);
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode);
|
||||
iomode_t mode);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -96,7 +96,7 @@ void _pal_lld_init(const PALConfig *config) {
|
|||
*/
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode) {
|
||||
iomode_t mode) {
|
||||
|
||||
switch (mode) {
|
||||
case PAL_MODE_RESET:
|
||||
|
|
|
@ -250,7 +250,7 @@ extern "C" {
|
|||
void _pal_lld_init(const PALConfig *config);
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode);
|
||||
iomode_t mode);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -121,7 +121,7 @@ void _pal_lld_init(const PALConfig *config) {
|
|||
*/
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode) {
|
||||
iomode_t mode) {
|
||||
|
||||
switch (mode) {
|
||||
case PAL_MODE_RESET:
|
||||
|
|
|
@ -288,7 +288,7 @@ extern "C" {
|
|||
void _pal_lld_init(const PALConfig *config);
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode);
|
||||
iomode_t mode);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -79,7 +79,7 @@ sim_vio_port_t vio_port_2;
|
|||
*/
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode) {
|
||||
iomode_t mode) {
|
||||
|
||||
switch (mode) {
|
||||
case PAL_MODE_RESET:
|
||||
|
|
|
@ -196,7 +196,7 @@ extern "C" {
|
|||
#endif
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode);
|
||||
iomode_t mode);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -132,7 +132,7 @@ void _pal_lld_init(const PALConfig *config) {
|
|||
*/
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode) {
|
||||
iomode_t mode) {
|
||||
static const uint8_t cfgtab[] = {
|
||||
4, /* PAL_MODE_RESET, implemented as input.*/
|
||||
2, /* PAL_MODE_UNCONNECTED, implemented as push pull output 2MHz.*/
|
|
@ -332,7 +332,7 @@ extern "C" {
|
|||
void _pal_lld_init(const PALConfig *config);
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode);
|
||||
iomode_t mode);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,221 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file STM32/GPIOv2/pal_lld.c
|
||||
* @brief STM32L1xx/STM32F2xx GPIO low level driver code.
|
||||
*
|
||||
* @addtogroup PAL
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include "ch.h"
|
||||
#include "hal.h"
|
||||
|
||||
#if HAL_USE_PAL || defined(__DOXYGEN__)
|
||||
|
||||
#if defined(STM32L1XX_MD)
|
||||
#define AHB_EN_MASK (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN | \
|
||||
RCC_AHBENR_GPIOCEN | RCC_AHBENR_GPIODEN | \
|
||||
RCC_AHBENR_GPIOEEN | RCC_AHBENR_GPIOHEN)
|
||||
#define AHB_LPEN_MASK AHB_EN_MASK
|
||||
#elif defined(STM32F2XX)
|
||||
#define AHB1_EN_MASK (RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | \
|
||||
RCC_AHB1ENR_GPIOCEN | RCC_AHB1ENR_GPIODEN | \
|
||||
RCC_AHB1ENR_GPIOEEN | RCC_AHB1ENR_GPIOFEN | \
|
||||
RCC_AHB1ENR_GPIOGEN | RCC_AHB1ENR_GPIOHEN | \
|
||||
RCC_AHB1ENR_GPIOIEN)
|
||||
#define AHB1_LPEN_MASK AHB1_EN_MASK
|
||||
#else
|
||||
#error "missing or usupported platform for GPIOv2 PAL driver"
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported variables. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local variables. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
static void initgpio(GPIO_TypeDef *gpiop, const stm32_gpio_setup_t *config) {
|
||||
|
||||
gpiop->MODER = config->moder;
|
||||
gpiop->OTYPER = config->otyper;
|
||||
gpiop->OSPEEDR = config->ospeedr;
|
||||
gpiop->PUPDR = config->pupdr;
|
||||
gpiop->ODR = config->odr;
|
||||
gpiop->AFRL = config->afrl;
|
||||
gpiop->AFRH = config->afrh;
|
||||
}
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver interrupt handlers. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief STM32 I/O ports configuration.
|
||||
* @details Ports A-D(E, F, G, H) clocks enabled.
|
||||
*
|
||||
* @param[in] config the STM32 ports configuration
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
void _pal_lld_init(const PALConfig *config) {
|
||||
|
||||
/*
|
||||
* Enables the GPIO related clocks.
|
||||
*/
|
||||
#if defined(STM32L1XX_MD)
|
||||
RCC->AHBENR |= AHB_EN_MASK;
|
||||
RCC->AHBLPENR |= AHB_LPEN_MASK;
|
||||
#elif defined(STM32F2XX)
|
||||
RCC->AHB1ENR |= AHB1_EN_MASK;
|
||||
RCC->AHB1LPENR |= AHB1_LPEN_MASK;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Initial GPIO setup.
|
||||
*/
|
||||
initgpio(GPIOA, &config->PAData);
|
||||
initgpio(GPIOB, &config->PBData);
|
||||
initgpio(GPIOC, &config->PCData);
|
||||
initgpio(GPIOD, &config->PDData);
|
||||
#if STM32_HAS_GPIOE
|
||||
initgpio(GPIOE, &config->PEData);
|
||||
#endif
|
||||
#if STM32_HAS_GPIOF
|
||||
initgpio(GPIOF, &config->PFData);
|
||||
#endif
|
||||
#if STM32_HAS_GPIOG
|
||||
initgpio(GPIOG, &config->PGData);
|
||||
#endif
|
||||
#if STM32_HAS_GPIOH
|
||||
initgpio(GPIOH, &config->PHData);
|
||||
#endif
|
||||
#if STM32_HAS_GPIOI
|
||||
initgpio(GPIOI, &config->PIData);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Pads mode setup.
|
||||
* @details This function programs a pads group belonging to the same port
|
||||
* with the specified mode.
|
||||
* @note This function is not meant to be invoked directly by the
|
||||
* application code.
|
||||
* @note @p PAL_MODE_UNCONNECTED is implemented as push pull at minimum
|
||||
* speed.
|
||||
*
|
||||
* @param[in] port the port identifier
|
||||
* @param[in] mask the group mask
|
||||
* @param[in] mode the mode
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
#if 1
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
iomode_t mode) {
|
||||
|
||||
uint32_t moder = (mode & PAL_STM32_MODE_MASK) >> 0;
|
||||
uint32_t otyper = (mode & PAL_STM32_OTYPE_MASK) >> 2;
|
||||
uint32_t ospeedr = (mode & PAL_STM32_OSPEED_MASK) >> 3;
|
||||
uint32_t pupdr = (mode & PAL_STM32_PUDR_MASK) >> 5;
|
||||
uint32_t altr = (mode & PAL_STM32_ALTERNATE_MASK) >> 7;
|
||||
uint32_t bit = 0;
|
||||
while (TRUE) {
|
||||
if ((mask & 1) != 0) {
|
||||
uint32_t altrmask, m1, m2, m4;
|
||||
|
||||
altrmask = altr << ((bit & 7) * 4);
|
||||
m4 = 15 << ((bit & 7) * 4);
|
||||
if (bit < 8)
|
||||
port->AFRL = (port->AFRL & ~m4) | altrmask;
|
||||
else
|
||||
port->AFRH = (port->AFRH & ~m4) | altrmask;
|
||||
m1 = 1 << bit;
|
||||
port->OTYPER = (port->OTYPER & ~m1) | otyper;
|
||||
m2 = 3 << (bit * 2);
|
||||
port->OSPEEDR = (port->OSPEEDR & ~m2) | ospeedr;
|
||||
port->PUPDR = (port->PUPDR & ~m2) | pupdr;
|
||||
port->MODER = (port->MODER & ~m2) | moder;
|
||||
}
|
||||
mask >>= 1;
|
||||
if (!mask)
|
||||
return;
|
||||
otyper <<= 1;
|
||||
ospeedr <<= 2;
|
||||
pupdr <<= 2;
|
||||
moder <<= 2;
|
||||
bit++;
|
||||
}
|
||||
}
|
||||
#else
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
iomode_t mode) {
|
||||
uint32_t afrm, moderm, pupdrm, otyperm, ospeedrm;
|
||||
uint32_t m1 = (uint32_t)mask;
|
||||
uint32_t m2 = 0;
|
||||
uint32_t m4l = 0;
|
||||
uint32_t m4h = 0;
|
||||
uint32_t bit = 0;
|
||||
do {
|
||||
if ((mask & 1) != 0) {
|
||||
m2 |= 3 << bit;
|
||||
if (bit < 16)
|
||||
m4l |= 15 << ((bit & 14) * 2);
|
||||
else
|
||||
m4h |= 15 << ((bit & 14) * 2);
|
||||
}
|
||||
bit += 2;
|
||||
mask >>= 1;
|
||||
} while (mask);
|
||||
|
||||
afrm = ((mode & PAL_STM32_ALTERNATE_MASK) >> 7) * 0x1111;
|
||||
port->AFRL = (port->AFRL & ~m4l) | (afrm & m4l);
|
||||
port->AFRH = (port->AFRH & ~m4h) | (afrm & m4h);
|
||||
|
||||
ospeedrm = ((mode & PAL_STM32_OSPEED_MASK) >> 3) * 0x5555;
|
||||
port->OSPEEDR = (port->OSPEEDR & ~m2) | (ospeedrm & m2);
|
||||
|
||||
otyperm = ((mode & PAL_STM32_OTYPE_MASK) >> 2) * 0xffff;
|
||||
port->OTYPER = (port->OTYPER & ~m1) | (otyperm & m1);
|
||||
|
||||
pupdrm = ((mode & PAL_STM32_PUDR_MASK) >> 5) * 0x5555;
|
||||
port->PUPDR = (port->PUPDR & ~m2) | (pupdrm & m2);
|
||||
|
||||
moderm = ((mode & PAL_STM32_MODE_MASK) >> 0) * 0x5555;
|
||||
port->MODER = (port->MODER & ~m2) | (moderm & m2);
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* HAL_USE_PAL */
|
||||
|
||||
/** @} */
|
|
@ -19,8 +19,8 @@
|
|||
*/
|
||||
|
||||
/**
|
||||
* @file STM32L1xx/pal_lld.h
|
||||
* @brief STM32L1xx GPIO low level driver header.
|
||||
* @file STM32/GPIOv2/pal_lld.h
|
||||
* @brief STM32L1xx/STM32F2xx GPIO low level driver header.
|
||||
*
|
||||
* @addtogroup PAL
|
||||
* @{
|
||||
|
@ -44,29 +44,29 @@
|
|||
#undef PAL_MODE_OUTPUT_PUSHPULL
|
||||
#undef PAL_MODE_OUTPUT_OPENDRAIN
|
||||
|
||||
#define PAL_STM32_MODE_MASK (3 >> 0)
|
||||
#define PAL_STM32_MODE_INPUT (0 >> 0)
|
||||
#define PAL_STM32_MODE_OUTPUT (1 >> 0)
|
||||
#define PAL_STM32_MODE_ALTERNATE (2 >> 0)
|
||||
#define PAL_STM32_MODE_ANALOG (3 >> 0)
|
||||
#define PAL_STM32_MODE_MASK (3 << 0)
|
||||
#define PAL_STM32_MODE_INPUT (0 << 0)
|
||||
#define PAL_STM32_MODE_OUTPUT (1 << 0)
|
||||
#define PAL_STM32_MODE_ALTERNATE (2 << 0)
|
||||
#define PAL_STM32_MODE_ANALOG (3 << 0)
|
||||
|
||||
#define PAL_STM32_OTYPE_MASK (1 >> 2)
|
||||
#define PAL_STM32_OTYPE_PUSHPULL (0 >> 2)
|
||||
#define PAL_STM32_OTYPE_OPENDRAIN (1 >> 2)
|
||||
#define PAL_STM32_OTYPE_MASK (1 << 2)
|
||||
#define PAL_STM32_OTYPE_PUSHPULL (0 << 2)
|
||||
#define PAL_STM32_OTYPE_OPENDRAIN (1 << 2)
|
||||
|
||||
#define PAL_STM32_OSPEED_MASK (3 >> 3)
|
||||
#define PAL_STM32_OSPEED_400K (0 >> 3)
|
||||
#define PAL_STM32_OSPEED_2M (1 >> 3)
|
||||
#define PAL_STM32_OSPEED_10M (2 >> 3)
|
||||
#define PAL_STM32_OSPEED_40M (3 >> 3)
|
||||
#define PAL_STM32_OSPEED_MASK (3 << 3)
|
||||
#define PAL_STM32_OSPEED_400K (0 << 3)
|
||||
#define PAL_STM32_OSPEED_2M (1 << 3)
|
||||
#define PAL_STM32_OSPEED_10M (2 << 3)
|
||||
#define PAL_STM32_OSPEED_40M (3 << 3)
|
||||
|
||||
#define PAL_STM32_PUDR_MASK (3 >> 5)
|
||||
#define PAL_STM32_PUDR_FLOATING (0 >> 5)
|
||||
#define PAL_STM32_PUDR_PULLUP (1 >> 5)
|
||||
#define PAL_STM32_PUDR_PULLDOWN (2 >> 5)
|
||||
#define PAL_STM32_PUDR_MASK (3 << 5)
|
||||
#define PAL_STM32_PUDR_FLOATING (0 << 5)
|
||||
#define PAL_STM32_PUDR_PULLUP (1 << 5)
|
||||
#define PAL_STM32_PUDR_PULLDOWN (2 << 5)
|
||||
|
||||
#define PAL_STM32_ALTERNATE_MASK (15 >> 7)
|
||||
#define PAL_STM32_ALTERNATE(n) ((n) >> 7)
|
||||
#define PAL_STM32_ALTERNATE_MASK (15 << 7)
|
||||
#define PAL_STM32_ALTERNATE(n) ((n) << 7)
|
||||
|
||||
/**
|
||||
* @brief This mode is implemented as input.
|
||||
|
@ -171,6 +171,10 @@ typedef struct {
|
|||
uint32_t pupdr;
|
||||
/** Initial value for ODR register.*/
|
||||
uint32_t odr;
|
||||
/** Initial value for AFRL register.*/
|
||||
uint32_t afrl;
|
||||
/** Initial value for AFRH register.*/
|
||||
uint32_t afrh;
|
||||
} stm32_gpio_setup_t;
|
||||
|
||||
/**
|
||||
|
@ -205,6 +209,10 @@ typedef struct {
|
|||
/** @brief Port H setup data.*/
|
||||
stm32_gpio_setup_t PHData;
|
||||
#endif
|
||||
#if STM32_HAS_GPIOI
|
||||
/** @brief Port I setup data.*/
|
||||
stm32_gpio_setup_t PIData;
|
||||
#endif
|
||||
} PALConfig;
|
||||
|
||||
/**
|
||||
|
@ -291,6 +299,20 @@ typedef GPIO_TypeDef * ioportid_t;
|
|||
#define IOPORT7 GPIOG
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief GPIO port H identifier.
|
||||
*/
|
||||
#if STM32_HAS_GPIOH || defined(__DOXYGEN__)
|
||||
#define IOPORT8 GPIOH
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief GPIO port I identifier.
|
||||
*/
|
||||
#if STM32_HAS_GPIOI || defined(__DOXYGEN__)
|
||||
#define IOPORT9 GPIOI
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Implementation, some of the following macros could be implemented as */
|
||||
/* functions, please put them in a file named ioports_lld.c if so. */
|
||||
|
@ -448,7 +470,7 @@ extern "C" {
|
|||
void _pal_lld_init(const PALConfig *config);
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode);
|
||||
iomode_t mode);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
|
@ -171,7 +171,7 @@ static size_t read_packet(usbep_t ep, uint8_t *buf, size_t n){
|
|||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(USB_HP_IRQHandler) {
|
||||
CH_IRQ_HANDLER(Vector8C) {
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
|
@ -183,7 +183,7 @@ CH_IRQ_HANDLER(USB_HP_IRQHandler) {
|
|||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(USB_LP_IRQHandler) {
|
||||
CH_IRQ_HANDLER(Vector90) {
|
||||
uint32_t istr;
|
||||
size_t n;
|
||||
USBDriver *usbp = &USBD1;
|
||||
|
@ -335,9 +335,9 @@ void usb_lld_start(USBDriver *usbp) {
|
|||
STM32_USB->CNTR = CNTR_FRES;
|
||||
/* Enabling the USB IRQ vectors, this also gives enough time to allow
|
||||
the transceiver power up (1uS).*/
|
||||
NVICEnableVector(USB_HP_CAN1_TX_IRQn,
|
||||
NVICEnableVector(19,
|
||||
CORTEX_PRIORITY_MASK(STM32_USB_USB1_HP_IRQ_PRIORITY));
|
||||
NVICEnableVector(USB_LP_CAN1_RX0_IRQn,
|
||||
NVICEnableVector(20,
|
||||
CORTEX_PRIORITY_MASK(STM32_USB_USB1_LP_IRQ_PRIORITY));
|
||||
/* Releases the USB reset.*/
|
||||
STM32_USB->CNTR = 0;
|
||||
|
@ -362,8 +362,8 @@ void usb_lld_stop(USBDriver *usbp) {
|
|||
if (usbp->state == USB_STOP) {
|
||||
#if STM32_ADC_USE_ADC1
|
||||
if (&USBD1 == usbp) {
|
||||
NVICDisableVector(USB_HP_CAN1_TX_IRQn);
|
||||
NVICDisableVector(USB_LP_CAN1_RX0_IRQn);
|
||||
NVICDisableVector(19);
|
||||
NVICDisableVector(20);
|
||||
STM32_USB->CNTR = CNTR_PDWN | CNTR_FRES;
|
||||
RCC->APB1ENR &= ~RCC_APB1ENR_USBEN;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -1,17 +0,0 @@
|
|||
# List of all the STM32 platform files.
|
||||
PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/STM32/hal_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/adc_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/can_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/gpt_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/icu_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/pal_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/pwm_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/sdc_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/serial_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/spi_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/uart_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/stm32_dma.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/i2c_lld.c
|
||||
|
||||
# Required include directories
|
||||
PLATFORMINC = ${CHIBIOS}/os/hal/platforms/STM32
|
|
@ -519,10 +519,12 @@ void pwm_lld_start(PWMDriver *pwmp) {
|
|||
pwmp->tim->EGR = TIM_EGR_UG; /* Update event. */
|
||||
pwmp->tim->DIER = pwmp->config->callback == NULL ? 0 : TIM_DIER_UIE;
|
||||
pwmp->tim->SR = 0; /* Clear pending IRQs. */
|
||||
#if STM32_PWM_USE_TIM1 || STM32_PWM_USE_TIM8
|
||||
#if STM32_PWM_USE_ADVANCED
|
||||
pwmp->tim->BDTR = pwmp->config->bdtr | TIM_BDTR_MOE;
|
||||
#else
|
||||
pwmp->tim->BDTR = TIM_BDTR_MOE;
|
||||
#endif
|
||||
#endif
|
||||
/* Timer configured and started.*/
|
||||
pwmp->tim->CR1 = TIM_CR1_ARPE | TIM_CR1_URS | TIM_CR1_CEN;
|
||||
|
@ -542,7 +544,9 @@ void pwm_lld_stop(PWMDriver *pwmp) {
|
|||
pwmp->tim->CR1 = 0; /* Timer disabled. */
|
||||
pwmp->tim->DIER = 0; /* All IRQs disabled. */
|
||||
pwmp->tim->SR = 0; /* Clear eventual pending IRQs. */
|
||||
#if STM32_PWM_USE_TIM1 || STM32_PWM_USE_TIM8
|
||||
pwmp->tim->BDTR = 0;
|
||||
#endif
|
||||
|
||||
#if STM32_PWM_USE_TIM1
|
||||
if (&PWMD1 == pwmp) {
|
||||
|
|
|
@ -343,7 +343,7 @@
|
|||
#endif
|
||||
|
||||
/* APB1 frequency check.*/
|
||||
#if STM32_PCLK2 > 24000000
|
||||
#if STM32_PCLK1 > 24000000
|
||||
#error "STM32_PCLK1 exceeding maximum frequency (24MHz)"
|
||||
#endif
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
# List of all the STM32F1xx platform files.
|
||||
PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/STM32F1xx/hal_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32F1xx/adc_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/can_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/gpt_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/icu_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/i2c_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/pwm_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/serial_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/GPIOv1/pal_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/DMAv1/sdc_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/DMAv1/spi_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/DMAv1/uart_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/DMAv1/stm32_dma.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/USBv1/usb_lld.c
|
||||
|
||||
# Required include directories
|
||||
PLATFORMINC = ${CHIBIOS}/os/hal/platforms/STM32F1xx \
|
||||
${CHIBIOS}/os/hal/platforms/STM32 \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/GPIOv1 \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/DMAv1 \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/USBv1
|
|
@ -0,0 +1,164 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file STM32F2xx/hal_lld.c
|
||||
* @brief STM32F2xx HAL subsystem low level driver source.
|
||||
*
|
||||
* @addtogroup HAL
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include "ch.h"
|
||||
#include "hal.h"
|
||||
|
||||
#define AIRCR_VECTKEY 0x05FA0000
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported variables. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local variables. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver interrupt handlers. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Low level HAL driver initialization.
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
void hal_lld_init(void) {
|
||||
|
||||
/* Reset of all peripherals.*/
|
||||
// RCC->APB1RSTR = 0xFFFFFFFF;
|
||||
// RCC->APB2RSTR = 0xFFFFFFFF;
|
||||
// RCC->APB1RSTR = 0;
|
||||
// RCC->APB2RSTR = 0;
|
||||
|
||||
/* SysTick initialization using the system clock.*/
|
||||
SysTick->LOAD = STM32_HCLK / CH_FREQUENCY - 1;
|
||||
SysTick->VAL = 0;
|
||||
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
|
||||
SysTick_CTRL_ENABLE_Msk |
|
||||
SysTick_CTRL_TICKINT_Msk;
|
||||
|
||||
|
||||
|
||||
#if defined(STM32_DMA_REQUIRED)
|
||||
dmaInit();
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief STM32F2xx clocks and PLL initialization.
|
||||
* @note All the involved constants come from the file @p board.h.
|
||||
* @note This function should be invoked just after the system reset.
|
||||
*
|
||||
* @special
|
||||
*/
|
||||
#if defined(STM32F2XX) || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Clocks and internal voltage initialization.
|
||||
*/
|
||||
void stm32_clock_init(void) {
|
||||
|
||||
#if !STM32_NO_INIT
|
||||
/* PWR clock enable.*/
|
||||
RCC->APB1ENR = RCC_APB1ENR_PWREN;
|
||||
|
||||
/* Initial clocks setup and wait for HSI stabilization, the MSI clock is
|
||||
always enabled because it is the fallback clock when PLL the fails.*/
|
||||
RCC->CR |= RCC_CR_HSION;
|
||||
while ((RCC->CR & RCC_CR_HSIRDY) == 0)
|
||||
; /* Waits until HSI is stable. */
|
||||
|
||||
#if STM32_HSE_ENABLED
|
||||
/* HSE activation.*/
|
||||
RCC->CR |= RCC_CR_HSEON;
|
||||
while ((RCC->CR & RCC_CR_HSERDY) == 0)
|
||||
; /* Waits until HSE is stable. */
|
||||
#endif
|
||||
|
||||
#if STM32_LSI_ENABLED
|
||||
/* LSI activation.*/
|
||||
RCC->CSR |= RCC_CSR_LSION;
|
||||
while ((RCC->CSR & RCC_CSR_LSIRDY) == 0)
|
||||
; /* Waits until LSI is stable. */
|
||||
#endif
|
||||
|
||||
#if STM32_LSE_ENABLED
|
||||
/* LSE activation, have to unlock the register.*/
|
||||
if ((RCC->BDCR & RCC_BDCR_LSEON) == 0) {
|
||||
PWR->CR |= PWR_CR_DBP;
|
||||
RCC->BDCR |= RCC_BDCR_LSEON;
|
||||
PWR->CR &= ~PWR_CR_DBP;
|
||||
}
|
||||
while ((RCC->BDCR & RCC_BDCR_LSERDY) == 0)
|
||||
; /* Waits until LSE is stable. */
|
||||
#endif
|
||||
|
||||
#if STM32_ACTIVATE_PLL
|
||||
/* PLL activation.*/
|
||||
RCC->PLLCFGR = STM32_PLLQ | STM32_PLLSRC | STM32_PLLP | STM32_PLLN | STM32_PLLM;
|
||||
RCC->CR |= RCC_CR_PLLON;
|
||||
while (!(RCC->CR & RCC_CR_PLLRDY))
|
||||
; /* Waits until PLL is stable. */
|
||||
#endif
|
||||
|
||||
#if STM32_ACTIVATE_PLLI2S
|
||||
/* PLLI2S activation.*/
|
||||
RCC->PLLI2SCFGR = STM32_PLI2SR_VALUE | STM32_PLLI2SN_VALUE;
|
||||
RCC->CR |= RCC_CR_PLLI2SON;
|
||||
while (!(RCC->CR & RCC_CR_PLLI2SRDY))
|
||||
; /* Waits until PLLI2S is stable. */
|
||||
#endif
|
||||
|
||||
/* Other clock-related settings (dividers, MCO etc).*/
|
||||
RCC->CFGR |= STM32_MCO2PRE | STM32_MCO2SEL | STM32_MCO1PRE | STM32_MCO1SEL |
|
||||
STM32_RTCPRE | STM32_PPRE2 | STM32_PPRE1 | STM32_HPRE;
|
||||
|
||||
/* Flash setup. */
|
||||
FLASH->ACR = FLASH_ACR_PRFTEN | FLASH_ACR_ICEN | FLASH_ACR_DCEN | STM32_FLASHBITS;
|
||||
|
||||
/* Switching to the configured clock source if it is different from MSI. */
|
||||
#if (STM32_SW != STM32_SW_HSI)
|
||||
RCC->CFGR |= STM32_SW; /* Switches on the selected clock source. */
|
||||
while ((RCC->CFGR & RCC_CFGR_SWS) != (STM32_SW << 2))
|
||||
;
|
||||
#endif
|
||||
#endif /* STM32_NO_INIT */
|
||||
}
|
||||
#else
|
||||
void stm32_clock_init(void) {}
|
||||
#endif
|
||||
|
||||
/** @} */
|
|
@ -0,0 +1,957 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file STM32F2xx/hal_lld.h
|
||||
* @brief STM32F2xx HAL subsystem low level driver header.
|
||||
* @pre This module requires the following macros to be defined in the
|
||||
* @p board.h file:
|
||||
* - STM32_LSECLK.
|
||||
* - STM32_HSECLK.
|
||||
* .
|
||||
* One of the following macros must also be defined:
|
||||
* - STM32F2XX for High-performance STM32 F-2 devices.
|
||||
* .
|
||||
*
|
||||
* @addtogroup HAL
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef _HAL_LLD_H_
|
||||
#define _HAL_LLD_H_
|
||||
|
||||
/* Tricks required to make the TRUE/FALSE declaration inside the library
|
||||
compatible.*/
|
||||
#undef FALSE
|
||||
#undef TRUE
|
||||
#include "stm32f2xx.h"
|
||||
#define FALSE 0
|
||||
#define TRUE (!FALSE)
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver constants. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Platform name.
|
||||
*/
|
||||
#define PLATFORM_NAME "STM32F2 High performance"
|
||||
|
||||
#define STM32_HSICLK 16000000 /**< High speed internal clock. */
|
||||
#define STM32_LSICLK 38000 /**< Low speed internal clock. */
|
||||
|
||||
/* RCC_PLLCFGR register bits definitions.*/
|
||||
#define STM32_PLLP_MASK (3 << 16) /**< PLLP mask. */
|
||||
#define STM32_PLLP_DIV2 (0 << 16) /**< PLL clock divided by 2. */
|
||||
#define STM32_PLLP_DIV4 (1 << 16) /**< PLL clock divided by 4. */
|
||||
#define STM32_PLLP_DIV6 (2 << 16) /**< PLL clock divided by 6. */
|
||||
#define STM32_PLLP_DIV8 (3 << 16) /**< PLL clock divided by 8. */
|
||||
|
||||
#define STM32_PLLSRC_HSI (0 << 22) /**< PLL clock source is HSI. */
|
||||
#define STM32_PLLSRC_HSE (1 << 22) /**< PLL clock source is HSE. */
|
||||
|
||||
/* RCC_CFGR register bits definitions.*/
|
||||
#define STM32_SW_MASK (3 << 0) /**< SW mask. */
|
||||
#define STM32_SW_HSI (0 << 0) /**< SYSCLK source is HSI. */
|
||||
#define STM32_SW_HSE (1 << 0) /**< SYSCLK source is HSE. */
|
||||
#define STM32_SW_PLL (2 << 0) /**< SYSCLK source is PLL. */
|
||||
|
||||
#define STM32_HPRE_MASK (15 << 4) /**< HPRE mask. */
|
||||
#define STM32_HPRE_DIV1 (0 << 4) /**< SYSCLK divided by 1. */
|
||||
#define STM32_HPRE_DIV2 (8 << 4) /**< SYSCLK divided by 2. */
|
||||
#define STM32_HPRE_DIV4 (9 << 4) /**< SYSCLK divided by 4. */
|
||||
#define STM32_HPRE_DIV8 (10 << 4) /**< SYSCLK divided by 8. */
|
||||
#define STM32_HPRE_DIV16 (11 << 4) /**< SYSCLK divided by 16. */
|
||||
#define STM32_HPRE_DIV64 (12 << 4) /**< SYSCLK divided by 64. */
|
||||
#define STM32_HPRE_DIV128 (13 << 4) /**< SYSCLK divided by 128. */
|
||||
#define STM32_HPRE_DIV256 (14 << 4) /**< SYSCLK divided by 256. */
|
||||
#define STM32_HPRE_DIV512 (15 << 4) /**< SYSCLK divided by 512. */
|
||||
|
||||
#define STM32_PPRE1_MASK (7 << 10) /**< PPRE1 mask. */
|
||||
#define STM32_PPRE1_DIV1 (0 << 10) /**< HCLK divided by 1. */
|
||||
#define STM32_PPRE1_DIV2 (4 << 10) /**< HCLK divided by 2. */
|
||||
#define STM32_PPRE1_DIV4 (5 << 10) /**< HCLK divided by 4. */
|
||||
#define STM32_PPRE1_DIV8 (6 << 10) /**< HCLK divided by 8. */
|
||||
#define STM32_PPRE1_DIV16 (7 << 10) /**< HCLK divided by 16. */
|
||||
|
||||
#define STM32_PPRE2_MASK (7 << 13) /**< PPRE2 mask. */
|
||||
#define STM32_PPRE2_DIV1 (0 << 13) /**< HCLK divided by 1. */
|
||||
#define STM32_PPRE2_DIV2 (4 << 13) /**< HCLK divided by 2. */
|
||||
#define STM32_PPRE2_DIV4 (5 << 13) /**< HCLK divided by 4. */
|
||||
#define STM32_PPRE2_DIV8 (6 << 13) /**< HCLK divided by 8. */
|
||||
#define STM32_PPRE2_DIV16 (7 << 13) /**< HCLK divided by 16. */
|
||||
|
||||
#define STM32_RTCPRE_MASK (31 << 16) /**< RTCPRE mask. */
|
||||
|
||||
#define STM32_MCO1SEL_MASK (3 << 21) /**< MCO1 mask. */
|
||||
#define STM32_MCO1SEL_HSI (0 << 21) /**< HSI clock on MCO1 pin. */
|
||||
#define STM32_MCO1SEL_LSE (1 << 21) /**< LSE clock on MCO1 pin. */
|
||||
#define STM32_MCO1SEL_HSE (2 << 21) /**< HSE clock on MCO1 pin. */
|
||||
#define STM32_MCO1SEL_PLL (3 << 21) /**< PLL clock on MCO1 pin. */
|
||||
|
||||
#define STM32_MCO1PRE_MASK (7 << 24) /**< MCO1PRE mask. */
|
||||
#define STM32_MCO1PRE_DIV1 (0 << 24) /**< MCO1 divided by 1. */
|
||||
#define STM32_MCO1PRE_DIV2 (1 << 24) /**< MCO1 divided by 2. */
|
||||
#define STM32_MCO1PRE_DIV3 (2 << 24) /**< MCO1 divided by 3. */
|
||||
#define STM32_MCO1PRE_DIV4 (3 << 24) /**< MCO1 divided by 4. */
|
||||
#define STM32_MCO1PRE_DIV5 (4 << 24) /**< MCO1 divided by 5. */
|
||||
|
||||
#define STM32_MCO2PRE_MASK (7 << 27) /**< MCO2PRE mask. */
|
||||
#define STM32_MCO2PRE_DIV1 (0 << 27) /**< MCO2 divided by 1. */
|
||||
#define STM32_MCO2PRE_DIV2 (4 << 27) /**< MCO2 divided by 2. */
|
||||
#define STM32_MCO2PRE_DIV3 (5 << 27) /**< MCO2 divided by 3. */
|
||||
#define STM32_MCO2PRE_DIV4 (6 << 27) /**< MCO2 divided by 4. */
|
||||
#define STM32_MCO2PRE_DIV5 (7 << 27) /**< MCO2 divided by 5. */
|
||||
|
||||
#define STM32_MCO2SEL_MASK (3 << 30) /**< MCO2 mask. */
|
||||
#define STM32_MCO2SEL_SYSCLK (0 << 30) /**< SYSCLK clock on MCO2 pin. */
|
||||
#define STM32_MCO2SEL_PLLI2S (1 << 30) /**< PLLI2S clock on MCO2 pin. */
|
||||
#define STM32_MCO2SEL_HSE (2 << 30) /**< HSE clock on MCO2 pin. */
|
||||
#define STM32_MCO2SEL_PLL (3 << 30) /**< PLL clock on MCO2 pin. */
|
||||
|
||||
/* RCC_PLLI2SCFGR register bits definitions.*/
|
||||
#define STM32_PLLI2SN_MASK (511 << 6) /**< PLLI2SN mask. */
|
||||
#define STM32_PLLI2SR_MASK (7 << 28) /**< PLLI2SR mask. */
|
||||
|
||||
/* STM32F2xx capabilities.*/
|
||||
#define STM32_HAS_ADC1 TRUE
|
||||
#define STM32_HAS_ADC2 TRUE
|
||||
#define STM32_HAS_ADC3 FALSE
|
||||
|
||||
#define STM32_HAS_CAN1 TRUE
|
||||
#define STM32_HAS_CAN2 TRUE
|
||||
|
||||
#define STM32_HAS_DAC TRUE
|
||||
|
||||
#define STM32_HAS_DMA1 TRUE
|
||||
#define STM32_HAS_DMA2 TRUE
|
||||
|
||||
#define STM32_HAS_ETH TRUE
|
||||
|
||||
#define STM32_HAS_GPIOA TRUE
|
||||
#define STM32_HAS_GPIOB TRUE
|
||||
#define STM32_HAS_GPIOC TRUE
|
||||
#define STM32_HAS_GPIOD TRUE
|
||||
#define STM32_HAS_GPIOE TRUE
|
||||
#define STM32_HAS_GPIOF TRUE
|
||||
#define STM32_HAS_GPIOG TRUE
|
||||
#define STM32_HAS_GPIOH TRUE
|
||||
|
||||
#define STM32_HAS_I2C1 TRUE
|
||||
#define STM32_HAS_I2C2 TRUE
|
||||
|
||||
#define STM32_HAS_RTC TRUE
|
||||
|
||||
#define STM32_HAS_SDIO TRUE
|
||||
|
||||
#define STM32_HAS_SPI1 TRUE
|
||||
#define STM32_HAS_SPI2 TRUE
|
||||
#define STM32_HAS_SPI3 TRUE
|
||||
|
||||
#define STM32_HAS_TIM1 TRUE
|
||||
#define STM32_HAS_TIM2 TRUE
|
||||
#define STM32_HAS_TIM3 TRUE
|
||||
#define STM32_HAS_TIM4 TRUE
|
||||
#define STM32_HAS_TIM5 TRUE
|
||||
#define STM32_HAS_TIM6 TRUE
|
||||
#define STM32_HAS_TIM7 TRUE
|
||||
#define STM32_HAS_TIM8 TRUE
|
||||
#define STM32_HAS_TIM9 TRUE
|
||||
#define STM32_HAS_TIM10 TRUE
|
||||
#define STM32_HAS_TIM11 TRUE
|
||||
#define STM32_HAS_TIM12 TRUE
|
||||
#define STM32_HAS_TIM13 TRUE
|
||||
#define STM32_HAS_TIM14 TRUE
|
||||
#define STM32_HAS_TIM15 FALSE
|
||||
#define STM32_HAS_TIM16 FALSE
|
||||
#define STM32_HAS_TIM17 FALSE
|
||||
|
||||
#define STM32_HAS_USART1 TRUE
|
||||
#define STM32_HAS_USART2 TRUE
|
||||
#define STM32_HAS_USART3 TRUE
|
||||
#define STM32_HAS_UART3 FALSE
|
||||
#define STM32_HAS_UART4 FALSE
|
||||
|
||||
#define STM32_HAS_USB TRUE
|
||||
#define STM32_HAS_OTG1 TRUE
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Platform specific friendly IRQ names. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#define WWDG_IRQHandler Vector40 /**< Window Watchdog. */
|
||||
#define PVD_IRQHandler Vector44 /**< PVD through EXTI Line
|
||||
detect. */
|
||||
#define TAMPER_IRQHandler Vector48 /**< Tamper. */
|
||||
#define RTC_IRQHandler Vector4C /**< RTC. */
|
||||
#define FLASH_IRQHandler Vector50 /**< Flash. */
|
||||
#define RCC_IRQHandler Vector54 /**< RCC. */
|
||||
#define EXTI0_IRQHandler Vector58 /**< EXTI Line 0. */
|
||||
#define EXTI1_IRQHandler Vector5C /**< EXTI Line 1. */
|
||||
#define EXTI2_IRQHandler Vector60 /**< EXTI Line 2. */
|
||||
#define EXTI3_IRQHandler Vector64 /**< EXTI Line 3. */
|
||||
#define EXTI4_IRQHandler Vector68 /**< EXTI Line 4. */
|
||||
#define DMA1_Stream0_IRQHandler Vector6C /**< DMA1 Stream 0. */
|
||||
#define DMA1_Stream1_IRQHandler Vector70 /**< DMA1 Stream 1. */
|
||||
#define DMA1_Stream2_IRQHandler Vector74 /**< DMA1 Stream 2. */
|
||||
#define DMA1_Stream3_IRQHandler Vector78 /**< DMA1 Stream 3. */
|
||||
#define DMA1_Stream4_IRQHandler Vector7C /**< DMA1 Stream 4. */
|
||||
#define DMA1_Stream5_IRQHandler Vector80 /**< DMA1 Stream 5. */
|
||||
#define DMA1_Stream6_IRQHandler Vector84 /**< DMA1 Stream 6. */
|
||||
#define ADC1_2_3_IRQHandler Vector88 /**< ADC1, ADC2 and ADC3. */
|
||||
#define CAN1_TX_IRQHandler Vector8C /**< CAN1 TX. */
|
||||
#define CAN1_RX0_IRQHandler Vector90 /**< CAN1 RX0. */
|
||||
#define CAN1_RX1_IRQHandler Vector94 /**< CAN1 RX1. */
|
||||
#define CAN1_SCE_IRQHandler Vector98 /**< CAN1 SCE. */
|
||||
#define EXTI9_5_IRQHandler Vector9C /**< EXTI Line 9..5. */
|
||||
#define TIM1_BRK_IRQHandler VectorA0 /**< TIM1 Break. */
|
||||
#define TIM1_UP_IRQHandler VectorA4 /**< TIM1 Update. */
|
||||
#define TIM1_TRG_COM_IRQHandler VectorA8 /**< TIM1 Trigger and
|
||||
Commutation. */
|
||||
#define TIM1_CC_IRQHandler VectorAC /**< TIM1 Capture Compare. */
|
||||
#define TIM2_IRQHandler VectorB0 /**< TIM2. */
|
||||
#define TIM3_IRQHandler VectorB4 /**< TIM3. */
|
||||
#define TIM4_IRQHandler VectorB8 /**< TIM4. */
|
||||
#define I2C1_EV_IRQHandler VectorBC /**< I2C1 Event. */
|
||||
#define I2C1_ER_IRQHandler VectorC0 /**< I2C1 Error. */
|
||||
#define I2C2_EV_IRQHandler VectorC4 /**< I2C2 Event. */
|
||||
#define I2C2_ER_IRQHandler VectorC8 /**< I2C1 Error. */
|
||||
#define SPI1_IRQHandler VectorCC /**< SPI1. */
|
||||
#define SPI2_IRQHandler VectorD0 /**< SPI2. */
|
||||
#define USART1_IRQHandler VectorD4 /**< USART1. */
|
||||
#define USART2_IRQHandler VectorD8 /**< USART2. */
|
||||
#define USART3_IRQHandler VectorDC /**< USART3. */
|
||||
#define EXTI15_10_IRQHandler VectorE0 /**< EXTI Line 15..10. */
|
||||
#define RTCAlarm_IRQHandler VectorE4 /**< RTC alarm through EXTI
|
||||
line. */
|
||||
#define OTG_FS_WKUP_IRQHandler VectorE8 /**< USB OTG FS Wakeup through
|
||||
EXTI line. */
|
||||
#define TIM8_BRK_IRQHandler VectorEC /**< TIM8 Break. */
|
||||
#define TIM8_UP_IRQHandler VectorF0 /**< TIM8 Update. */
|
||||
#define TIM8_TRG_COM_IRQHandler VectorF4 /**< TIM8 Trigger and
|
||||
Commutation. */
|
||||
#define TIM8_CC_IRQHandler VectorF8 /**< TIM8 Capture Compare. */
|
||||
#define DMA1_Stream7_IRQHandler VectorFC /**< DMA1 Stream 7. */
|
||||
#define FSMC_IRQHandler Vector100 /**< FSMC. */
|
||||
#define TIM5_IRQHandler Vector108 /**< TIM5. */
|
||||
#define SPI3_IRQHandler Vector10C /**< SPI3. */
|
||||
#define UART4_IRQHandler Vector110 /**< UART4. */
|
||||
#define UART5_IRQHandler Vector114 /**< UART5. */
|
||||
#define TIM6_IRQHandler Vector118 /**< TIM6. */
|
||||
#define TIM7_IRQHandler Vector11C /**< TIM7. */
|
||||
#define DMA2_Stream0_IRQHandler Vector120 /**< DMA2 Stream0. */
|
||||
#define DMA2_Stream1_IRQHandler Vector124 /**< DMA2 Stream1. */
|
||||
#define DMA2_Stream2_IRQHandler Vector128 /**< DMA2 Stream2. */
|
||||
#define DMA2_Stream3_IRQHandler Vector12C /**< DMA2 Stream3. */
|
||||
#define DMA2_Stream4_IRQHandler Vector130 /**< DMA2 Stream4. */
|
||||
#define ETH_IRQHandler Vector134 /**< Ethernet. */
|
||||
#define ETH_WKUP_IRQHandler Vector138 /**< Ethernet Wakeup through
|
||||
EXTI line. */
|
||||
#define CAN2_TX_IRQHandler Vector13C /**< CAN2 TX. */
|
||||
#define CAN2_RX0_IRQHandler Vector140 /**< CAN2 RX0. */
|
||||
#define CAN2_RX1_IRQHandler Vector144 /**< CAN2 RX1. */
|
||||
#define CAN2_SCE_IRQHandler Vector148 /**< CAN2 SCE. */
|
||||
#define OTG_FS_IRQHandler Vector14C /**< USB OTG FS. */
|
||||
#define DMA2_Stream5_IRQHandler Vector150 /**< DMA2 Stream5. */
|
||||
#define DMA2_Stream6_IRQHandler Vector154 /**< DMA2 Stream6. */
|
||||
#define DMA2_Stream7_IRQHandler Vector158 /**< DMA2 Stream7. */
|
||||
#define USART6_IRQHandler Vector15C /**< USART6. */
|
||||
#define I2C3_EV_IRQHandler Vector160 /**< I2C3 Event. */
|
||||
#define I2C3_ER_IRQHandler Vector164 /**< I2C3 Error. */
|
||||
#define OTG_HS_EP1_OUT_IRQHandler Vector168 /**< USB OTG HS End Point 1 Out.*/
|
||||
#define OTG_HS_EP1_IN_IRQHandler Vector16C /**< USB OTG HS End Point 1 In. */
|
||||
#define OTG_HS_WKUP_IRQHandler Vector168 /**< USB OTG HS Wakeup through
|
||||
EXTI line. */
|
||||
#define OTG_HS_IRQHandler Vector16C /**< USB OTG HS. */
|
||||
#define DCMI_IRQHandler Vector16C /**< DCMI. */
|
||||
#define CRYP_IRQHandler Vector16C /**< CRYP. */
|
||||
#define HASH_RNG_IRQHandler Vector16C /**< Hash and Rng. */
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver pre-compile time settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Disables the PWR/RCC initialization in the HAL.
|
||||
*/
|
||||
#if !defined(STM32_NO_INIT) || defined(__DOXYGEN__)
|
||||
#define STM32_NO_INIT FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables or disables the HSI clock source.
|
||||
*/
|
||||
#if !defined(STM32_HSI_ENABLED) || defined(__DOXYGEN__)
|
||||
#define STM32_HSI_ENABLED TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables or disables the LSI clock source.
|
||||
*/
|
||||
#if !defined(STM32_LSI_ENABLED) || defined(__DOXYGEN__)
|
||||
#define STM32_LSI_ENABLED FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables or disables the HSE clock source.
|
||||
*/
|
||||
#if !defined(STM32_HSE_ENABLED) || defined(__DOXYGEN__)
|
||||
#define STM32_HSE_ENABLED TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Enables or disables the LSE clock source.
|
||||
*/
|
||||
#if !defined(STM32_LSE_ENABLED) || defined(__DOXYGEN__)
|
||||
#define STM32_LSE_ENABLED FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief ADC clock setting.
|
||||
*/
|
||||
#if !defined(STM32_ADC_CLOCK_ENABLED) || defined(__DOXYGEN__)
|
||||
#define STM32_ADC_CLOCK_ENABLED TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief USB clock setting.
|
||||
*/
|
||||
#if !defined(STM32_USB_CLOCK_ENABLED) || defined(__DOXYGEN__)
|
||||
#define STM32_USB_CLOCK_ENABLED TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Main clock source selection.
|
||||
* @note If the selected clock source is not the PLL then the PLL is not
|
||||
* initialized and started.
|
||||
* @note The default value is calculated for a 32MHz system clock from
|
||||
* the internal 16MHz HSI clock.
|
||||
*/
|
||||
#if !defined(STM32_SW) || defined(__DOXYGEN__)
|
||||
#define STM32_SW STM32_SW_PLL
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Clock source for the PLL.
|
||||
* @note This setting has only effect if the PLL is selected as the
|
||||
* system clock source.
|
||||
* @note The default value is calculated for a 120MHz system clock from
|
||||
* the external 25MHz HSE clock.
|
||||
*/
|
||||
#if !defined(STM32_PLLSRC) || defined(__DOXYGEN__)
|
||||
#define STM32_PLLSRC STM32_PLLSRC_HSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief PLLM divider value.
|
||||
* @note The allowed values are 2..63.
|
||||
* @note The default value is calculated for a 120MHz system clock from
|
||||
* an external 25MHz HSE clock.
|
||||
*/
|
||||
#if !defined(STM32_PLLM_VALUE) || defined(__DOXYGEN__)
|
||||
#define STM32_PLLM_VALUE 25
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief PLLN multiplier value.
|
||||
* @note The allowed values are 192..432.
|
||||
* @note The default value is calculated for a 120MHz system clock from
|
||||
* an external 25MHz HSE clock.
|
||||
*/
|
||||
#if !defined(STM32_PLLN_VALUE) || defined(__DOXYGEN__)
|
||||
#define STM32_PLLN_VALUE 240
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief PLLP multiplier value.
|
||||
* @note The allowed values are DIV2, DIV4, DIV6, DIV8.
|
||||
* @note The default value is calculated for a 120MHz system clock from
|
||||
* an external 25MHz HSE clock.
|
||||
*/
|
||||
#if !defined(STM32_PLLP_VALUE) || defined(__DOXYGEN__)
|
||||
#define STM32_PLLP_VALUE 2
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief PLLQ multiplier value.
|
||||
* @note The allowed values are 4..15.
|
||||
* @note The default value is calculated for a 120MHz system clock from
|
||||
* an external 25MHz HSE clock.
|
||||
*/
|
||||
#if !defined(STM32_PLLQ_VALUE) || defined(__DOXYGEN__)
|
||||
#define STM32_PLLQ_VALUE 5
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief AHB prescaler value.
|
||||
* @note The default value is calculated for a 120MHz system clock from
|
||||
* an external 25MHz HSE clock.
|
||||
*/
|
||||
#if !defined(STM32_HPRE) || defined(__DOXYGEN__)
|
||||
#define STM32_HPRE STM32_HPRE_DIV1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief APB1 prescaler value.
|
||||
*/
|
||||
#if !defined(STM32_PPRE1) || defined(__DOXYGEN__)
|
||||
#define STM32_PPRE1 STM32_PPRE1_DIV4
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief APB2 prescaler value.
|
||||
*/
|
||||
#if !defined(STM32_PPRE2) || defined(__DOXYGEN__)
|
||||
#define STM32_PPRE2 STM32_PPRE2_DIV2
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief RTC prescaler value.
|
||||
*/
|
||||
#if !defined(STM32_RTCPRE_VALUE) || defined(__DOXYGEN__)
|
||||
#define STM32_RTCPRE_VALUE 25
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief MC01 clock source value.
|
||||
* @note The default value outputs HSI clock on MC01 pin.
|
||||
*/
|
||||
#if !defined(STM32_MCO1SEL) || defined(__DOXYGEN__)
|
||||
#define STM32_MCO1SEL STM32_MCO1SEL_HSI
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief MC01 prescaler value.
|
||||
* @note The default value outputs HSI clock on MC01 pin.
|
||||
*/
|
||||
#if !defined(STM32_MCO1PRE) || defined(__DOXYGEN__)
|
||||
#define STM32_MCO1PRE STM32_MCO1PRE_DIV1
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief MC02 clock source value.
|
||||
* @note The default value outputs SYSCLK / 5 on MC02 pin.
|
||||
*/
|
||||
#if !defined(STM32_MCO2SEL) || defined(__DOXYGEN__)
|
||||
#define STM32_MCO2SEL STM32_MCO2SEL_SYSCLK
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief MC02 prescaler value.
|
||||
* @note The default value outputs SYSCLK / 5 on MC02 pin.
|
||||
*/
|
||||
#if !defined(STM32_MCO2PRE) || defined(__DOXYGEN__)
|
||||
#define STM32_MCO2PRE STM32_MCO2PRE_DIV5
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief PLLI2SN multiplier value.
|
||||
* @note The allowed values are 192..432.
|
||||
* @note The default value is calculated for a 48000 I2S clock with
|
||||
* I2SDIV = 12 and I2SODD = 1.
|
||||
*/
|
||||
#if !defined(STM32_PLLI2SN_VALUE) || defined(__DOXYGEN__)
|
||||
#define STM32_PLLI2SN_VALUE 384
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief PLLI2SR multiplier value.
|
||||
* @note The allowed values are 2..7.
|
||||
* @note The default value is calculated for a 48000 I2S clock with
|
||||
* I2SDIV = 12 and I2SODD = 1.
|
||||
*/
|
||||
#if !defined(STM32_PLLI2SP_VALUE) || defined(__DOXYGEN__)
|
||||
#define STM32_PLI2SLP_VALUE 5
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Derived constants and error checks. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief Maximum HSECLK.
|
||||
*/
|
||||
#define STM32_HSECLK_MAX 32000000
|
||||
|
||||
/**
|
||||
* @brief Maximum SYSCLK.
|
||||
*/
|
||||
#define STM32_SYSCLK_MAX 120000000
|
||||
|
||||
/**
|
||||
* @brief Maximum frequency thresholds and wait states for flash access.
|
||||
* @note The values are valid for 2.7V to 3.6V supply range.
|
||||
*/
|
||||
#define STM32_0WS_THRESHOLD 30000000
|
||||
#define STM32_1WS_THRESHOLD 60000000
|
||||
#define STM32_2WS_THRESHOLD 90000000
|
||||
#define STM32_3WS_THRESHOLD 0
|
||||
#define STM32_4WS_THRESHOLD 0
|
||||
#define STM32_5WS_THRESHOLD 0
|
||||
#define STM32_6WS_THRESHOLD 0
|
||||
#define STM32_7WS_THRESHOLD 0
|
||||
|
||||
/* HSI related checks.*/
|
||||
#if STM32_HSI_ENABLED
|
||||
#else /* !STM32_HSI_ENABLED */
|
||||
#if STM32_ADC_CLOCK_ENABLED || \
|
||||
(STM32_SW == STM32_SW_HSI) || \
|
||||
((STM32_SW == STM32_SW_PLL) && \
|
||||
(STM32_PLLSRC == STM32_PLLSRC_HSI)) || \
|
||||
(STM32_MCO1SEL == STM32_MCO1SEL_HSI) || \
|
||||
((STM32_MCO1SEL == STM32_MCO1SEL_PLL) && \
|
||||
(STM32_PLLSRC == STM32_PLLSRC_HSI))
|
||||
#error "required HSI clock is not enabled"
|
||||
#endif
|
||||
#endif /* !STM32_HSI_ENABLED */
|
||||
|
||||
/* HSE related checks.*/
|
||||
#if STM32_HSE_ENABLED
|
||||
#if STM32_HSECLK == 0
|
||||
#error "impossible to activate HSE"
|
||||
#endif
|
||||
#if (STM32_HSECLK < 1000000) || (STM32_HSECLK > STM32_HSECLK_MAX)
|
||||
#error "STM32_HSECLK outside acceptable range (1MHz...STM32_HSECLK_MAX)"
|
||||
#endif
|
||||
#else /* !STM32_HSE_ENABLED */
|
||||
#if (STM32_SW == STM32_SW_HSE) || \
|
||||
((STM32_SW == STM32_SW_PLL) && \
|
||||
(STM32_PLLSRC == STM32_PLLSRC_HSE)) || \
|
||||
(STM32_MCO1SEL == STM32_MCO1SEL_HSE) || \
|
||||
((STM32_MCO1SEL == STM32_MCO1SEL_PLL) && \
|
||||
(STM32_PLLSRC == STM32_PLLSRC_HSE)) || \
|
||||
(STM32_MCO2SEL == STM32_MCO2SEL_HSE) || \
|
||||
((STM32_MCO2SEL == STM32_MCO2SEL_PLL) && \
|
||||
(STM32_PLLSRC == STM32_PLLSRC_HSE)) || \
|
||||
(STM_RTC_SOURCE == STM32_RTCSEL_HSEDIV)
|
||||
#error "required HSE clock is not enabled"
|
||||
#endif
|
||||
#endif /* !STM32_HSE_ENABLED */
|
||||
|
||||
/* LSI related checks.*/
|
||||
#if STM32_LSI_ENABLED
|
||||
#else /* !STM32_LSI_ENABLED */
|
||||
#if STM_RTCCLK == STM32_LSICLK
|
||||
#error "required LSI clock is not enabled"
|
||||
#endif
|
||||
#endif /* !STM32_LSI_ENABLED */
|
||||
|
||||
/* LSE related checks.*/
|
||||
#if STM32_LSE_ENABLED
|
||||
#if (STM32_LSECLK == 0)
|
||||
#error "impossible to activate LSE"
|
||||
#endif
|
||||
#if (STM32_LSECLK < 1000) || (STM32_LSECLK > 1000000)
|
||||
#error "STM32_LSECLK outside acceptable range (1...1000KHz)"
|
||||
#endif
|
||||
#else /* !#if STM32_LSE_ENABLED */
|
||||
#if STM_RTCCLK == STM32_LSECLK
|
||||
#error "required LSE clock is not enabled"
|
||||
#endif
|
||||
#endif /* !#if STM32_LSE_ENABLED */
|
||||
|
||||
/* PLL related checks.*/
|
||||
#if STM32_USB_CLOCK_ENABLED || \
|
||||
(STM32_SW == STM32_SW_PLL) || \
|
||||
(STM32_MCO1SEL == STM32_MCO1SEL_PLL) || \
|
||||
(STM32_MCO2SEL == STM32_MCO2SEL_PLL) || \
|
||||
defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief PLL activation flag.
|
||||
*/
|
||||
#define STM32_ACTIVATE_PLL TRUE
|
||||
#else
|
||||
#define STM32_ACTIVATE_PLL FALSE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief STM32_PLLM field.
|
||||
*/
|
||||
#if ((STM32_PLLM_VALUE >= 2) && (STM32_PLLM_VALUE <= 63)) || \
|
||||
defined(__DOXYGEN__)
|
||||
#define STM32_PLLM STM32_PLLM_VALUE
|
||||
#else
|
||||
#error "invalid STM32_PLLM_VALUE value specified"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief STM32_PLLN field.
|
||||
*/
|
||||
#if ((STM32_PLLN_VALUE >= 192) && (STM32_PLLN_VALUE <= 432)) || \
|
||||
defined(__DOXYGEN__)
|
||||
#define STM32_PLLN (STM32_PLLN_VALUE << 6)
|
||||
#else
|
||||
#error "invalid STM32_PLLN_VALUE value specified"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief STM32_PLLP field.
|
||||
*/
|
||||
#if (STM32_PLLP_VALUE == 2) || defined(__DOXYGEN__)
|
||||
#define STM32_PLLP (0 << 16)
|
||||
#elif STM32_PLLP_VALUE == 4
|
||||
#define STM32_PLLP (1 << 16)
|
||||
#elif STM32_PLLP_VALUE == 6
|
||||
#define STM32_PLLP (2 << 16)
|
||||
#elif STM32_PLLP_VALUE == 8
|
||||
#define STM32_PLLP (3 << 16)
|
||||
#else
|
||||
#error "invalid STM32_PLLP_VALUE value specified"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief STM32_PLLQ field.
|
||||
*/
|
||||
#if ((STM32_PLLQ_VALUE >= 4) && (STM32_PLLQ_VALUE <= 15)) || \
|
||||
defined(__DOXYGEN__)
|
||||
#define STM32_PLLQ (STM32_PLLQ_VALUE << 24)
|
||||
#else
|
||||
#error "invalid STM32_PLLQ_VALUE value specified"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief PLL input clock frequency.
|
||||
*/
|
||||
#if (STM32_PLLSRC == STM32_PLLSRC_HSE) || defined(__DOXYGEN__)
|
||||
#define STM32_PLLCLKIN STM32_HSECLK
|
||||
#elif STM32_PLLSRC == STM32_PLLSRC_HSI
|
||||
#define STM32_PLLCLKIN STM32_HSICLK
|
||||
#else
|
||||
#error "invalid STM32_PLLSRC value specified"
|
||||
#endif
|
||||
|
||||
/* PLL input frequency range check.*/
|
||||
#if (STM32_PLLCLKIN < 4000000) || (STM32_PLLCLKIN > 26000000)
|
||||
#error "STM32_PLLCLKIN outside acceptable range (4...26MHz)"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief PLL VCO frequency.
|
||||
*/
|
||||
#define STM32_PLLVCO ((STM32_PLLCLKIN / STM32_PLLM_VALUE) * \
|
||||
STM32_PLLN_VALUE)
|
||||
|
||||
/* PLL output frequency range check.*/
|
||||
#if (STM32_PLLVCO < 192000000) || (STM32_PLLVCO > 432000000)
|
||||
#error STM32_PLLVCO
|
||||
#error "STM32_PLLVCO outside acceptable range (192...432MHz)"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief PLL output clock frequency.
|
||||
*/
|
||||
#define STM32_PLLCLKOUT (STM32_PLLVCO / STM32_PLLP_VALUE)
|
||||
|
||||
/* PLL output frequency range check.*/
|
||||
#if (STM32_PLLCLKOUT < 24000000) || (STM32_PLLCLKOUT > 120000000)
|
||||
#error "STM32_PLLCLKOUT outside acceptable range (24...120MHz)"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief System clock source.
|
||||
*/
|
||||
#if STM32_NO_INIT || defined(__DOXYGEN__)
|
||||
#define STM32_SYSCLK 96000000
|
||||
#elif (STM32_SW == STM32_SW_HSI)
|
||||
#define STM32_SYSCLK STM32_HSICLK
|
||||
#elif (STM32_SW == STM32_SW_HSE)
|
||||
#define STM32_SYSCLK STM32_HSECLK
|
||||
#elif (STM32_SW == STM32_SW_PLL)
|
||||
#define STM32_SYSCLK STM32_PLLCLKOUT
|
||||
#else
|
||||
#error "invalid STM32_SW value specified"
|
||||
#endif
|
||||
|
||||
/* Check on the system clock.*/
|
||||
#if STM32_SYSCLK > STM32_SYSCLK_MAX
|
||||
#error "STM32_SYSCLK above maximum rated frequency (STM32_SYSCLK_MAX)"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief AHB frequency.
|
||||
*/
|
||||
#if (STM32_HPRE == STM32_HPRE_DIV1) || defined(__DOXYGEN__)
|
||||
#define STM32_HCLK (STM32_SYSCLK / 1)
|
||||
#elif STM32_HPRE == STM32_HPRE_DIV2
|
||||
#define STM32_HCLK (STM32_SYSCLK / 2)
|
||||
#elif STM32_HPRE == STM32_HPRE_DIV4
|
||||
#define STM32_HCLK (STM32_SYSCLK / 4)
|
||||
#elif STM32_HPRE == STM32_HPRE_DIV8
|
||||
#define STM32_HCLK (STM32_SYSCLK / 8)
|
||||
#elif STM32_HPRE == STM32_HPRE_DIV16
|
||||
#define STM32_HCLK (STM32_SYSCLK / 16)
|
||||
#elif STM32_HPRE == STM32_HPRE_DIV64
|
||||
#define STM32_HCLK (STM32_SYSCLK / 64)
|
||||
#elif STM32_HPRE == STM32_HPRE_DIV128
|
||||
#define STM32_HCLK (STM32_SYSCLK / 128)
|
||||
#elif STM32_HPRE == STM32_HPRE_DIV256
|
||||
#define STM32_HCLK (STM32_SYSCLK / 256)
|
||||
#elif STM32_HPRE == STM32_HPRE_DIV512
|
||||
#define STM32_HCLK (STM32_SYSCLK / 512)
|
||||
#else
|
||||
#error "invalid STM32_HPRE value specified"
|
||||
#endif
|
||||
|
||||
/* AHB frequency check.*/
|
||||
#if STM32_HCLK > STM32_SYSCLK_MAX
|
||||
#error "STM32_HCLK exceeding maximum frequency (STM32_SYSCLK_MAX)"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief APB1 frequency.
|
||||
*/
|
||||
#if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__)
|
||||
#define STM32_PCLK1 (STM32_HCLK / 1)
|
||||
#elif STM32_PPRE1 == STM32_PPRE1_DIV2
|
||||
#define STM32_PCLK1 (STM32_HCLK / 2)
|
||||
#elif STM32_PPRE1 == STM32_PPRE1_DIV4
|
||||
#define STM32_PCLK1 (STM32_HCLK / 4)
|
||||
#elif STM32_PPRE1 == STM32_PPRE1_DIV8
|
||||
#define STM32_PCLK1 (STM32_HCLK / 8)
|
||||
#elif STM32_PPRE1 == STM32_PPRE1_DIV16
|
||||
#define STM32_PCLK1 (STM32_HCLK / 16)
|
||||
#else
|
||||
#error "invalid STM32_PPRE1 value specified"
|
||||
#endif
|
||||
|
||||
/* APB1 frequency check.*/
|
||||
#if STM32_PCLK2 > STM32_SYSCLK_MAX
|
||||
#error "STM32_PCLK1 exceeding maximum frequency (STM32_SYSCLK_MAX)"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief APB2 frequency.
|
||||
*/
|
||||
#if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__)
|
||||
#define STM32_PCLK2 (STM32_HCLK / 1)
|
||||
#elif STM32_PPRE2 == STM32_PPRE2_DIV2
|
||||
#define STM32_PCLK2 (STM32_HCLK / 2)
|
||||
#elif STM32_PPRE2 == STM32_PPRE2_DIV4
|
||||
#define STM32_PCLK2 (STM32_HCLK / 4)
|
||||
#elif STM32_PPRE2 == STM32_PPRE2_DIV8
|
||||
#define STM32_PCLK2 (STM32_HCLK / 8)
|
||||
#elif STM32_PPRE2 == STM32_PPRE2_DIV16
|
||||
#define STM32_PCLK2 (STM32_HCLK / 16)
|
||||
#else
|
||||
#error "invalid STM32_PPRE2 value specified"
|
||||
#endif
|
||||
|
||||
/* APB2 frequency check.*/
|
||||
#if STM32_PCLK2 > STM32_SYSCLK_MAX
|
||||
#error "STM32_PCLK2 exceeding maximum frequency (STM32_SYSCLK_MAX)"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief RTC frequency.
|
||||
*/
|
||||
#if ((STM32_RTCPRE_VALUE >= 2) && (STM32_RTCPRE_VALUE <= 31)) || \
|
||||
defined(__DOXYGEN__)
|
||||
#define STM32_RTCPRE (STM32_RTCPRE_VALUE << 16)
|
||||
#else
|
||||
#error "invalid STM32_RTCPRE value specified"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief MCO1 divider clock.
|
||||
*/
|
||||
#if (STM32_MCO1SEL == STM32_MCO1SEL_HSI) || defined(__DOXYGEN__)
|
||||
#define STM_MCO1DIVCLK STM32_HSICLK
|
||||
#elif STM32_MCO1SEL == STM32_MCO1SEL_LSE
|
||||
#define STM_MCO1DIVCLK STM32_LSECLK
|
||||
#elif STM32_MCO1SEL == STM32_MCO1SEL_HSE
|
||||
#define STM_MCO1DIVCLK STM32_HSECLK
|
||||
#elif STM32_MCO1SEL == STM32_MCO1SEL_PLL
|
||||
#define STM_MCO1DIVCLK STM32_PLLCLKOUT
|
||||
#else
|
||||
#error "invalid STM32_MCO1SEL value specified"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief MCO1 output pin clock.
|
||||
*/
|
||||
#if (STM32_MCO1PRE == STM32_MCO1PRE_DIV1) || defined(__DOXYGEN__)
|
||||
#define STM_MCO1CLK STM_MCO1DIVCLK
|
||||
#elif STM32_MCO1PRE == STM32_MCO1PRE_DIV2
|
||||
#define STM_MCO1CLK (STM_MCO1DIVCLK / 2)
|
||||
#elif STM32_MCO1PRE == STM32_MCO1PRE_DIV3
|
||||
#define STM_MCO1CLK (STM_MCO1DIVCLK / 3)
|
||||
#elif STM32_MCO1PRE == STM32_MCO1PRE_DIV4
|
||||
#define STM_MCO1CLK (STM_MCO1DIVCLK / 4)
|
||||
#elif STM32_MCO1PRE == STM32_MCO1PRE_DIV5
|
||||
#define STM_MCO1CLK (STM_MCO1DIVCLK / 5)
|
||||
#else
|
||||
#error "invalid STM32_MCO1PRE value specified"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief MCO2 divider clock.
|
||||
*/
|
||||
#if (STM32_MCO2SEL == STM32_MCO2SEL_HSE) || defined(__DOXYGEN__)
|
||||
#define STM_MCO2DIVCLK STM32_HSECLK
|
||||
#elif STM32_MCO2SEL == STM32_MCO2SEL_PLL
|
||||
#define STM_MCO2DIVCLK STM32_PLLCLKOUT
|
||||
#elif STM32_MCO2SEL == STM32_MCO2SEL_SYSCLK
|
||||
#define STM_MCO2DIVCLK STM32_SYSCLK
|
||||
#elif STM32_MCO2SEL == STM32_MCO2SEL_PLLI2S
|
||||
#define STM_MCO2DIVCLK STM32_PLLI2S
|
||||
|
||||
#else
|
||||
#error "invalid STM32_MCO2SEL value specified"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief MCO2 output pin clock.
|
||||
*/
|
||||
#if (STM32_MCO2PRE == STM32_MCO2PRE_DIV1) || defined(__DOXYGEN__)
|
||||
#define STM_MCO2CLK STM_MCO2DIVCLK
|
||||
#elif STM32_MCO2PRE == STM32_MCO2PRE_DIV2
|
||||
#define STM_MCO2CLK (STM_MCO2DIVCLK / 2)
|
||||
#elif STM32_MCO2PRE == STM32_MCO2PRE_DIV3
|
||||
#define STM_MCO2CLK (STM_MCO2DIVCLK / 3)
|
||||
#elif STM32_MCO2PRE == STM32_MCO2PRE_DIV4
|
||||
#define STM_MCO2CLK (STM_MCO2DIVCLK / 4)
|
||||
#elif STM32_MCO2PRE == STM32_MCO2PRE_DIV5
|
||||
#define STM_MCO2CLK (STM_MCO2DIVCLK / 5)
|
||||
#else
|
||||
#error "invalid STM32_MCO2PRE value specified"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief HSE divider toward RTC clock.
|
||||
*/
|
||||
#if ((STM32_RTCPRE_VALUE >= 2) && (STM32_RTCPRE_VALUE <= 31)) || \
|
||||
defined(__DOXYGEN__)
|
||||
#define STM32_HSEDIVCLK (HSECLK / STM32_RTCPRE_VALUE)
|
||||
#else
|
||||
#error "invalid STM32_RTCPRE value specified"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief RTC clock.
|
||||
*/
|
||||
#if (STM32_RTCSEL == STM32_RTCSEL_NOCLOCK) || defined(__DOXYGEN__)
|
||||
#define STM_RTCCLK 0
|
||||
#elif STM32_RTCSEL == STM32_RTCSEL_LSE
|
||||
#define STM_RTCCLK STM32_LSECLK
|
||||
#elif STM32_RTCSEL == STM32_RTCSEL_LSI
|
||||
#define STM_RTCCLK STM32_LSICLK
|
||||
#elif STM32_RTCSEL == STM32_RTCSEL_HSEDIV
|
||||
#define STM_RTCCLK STM32_HSEDIVCLK
|
||||
#else
|
||||
#error "invalid STM32_RTCSEL value specified"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief ADC frequency.
|
||||
*/
|
||||
#if (STM32_ADCPRE == STM32_ADCPRE_DIV2) || defined(__DOXYGEN__)
|
||||
#define STM32_ADCCLK (STM32_PCLK2 / 2)
|
||||
#elif STM32_ADCPRE == STM32_ADCPRE_DIV4
|
||||
#define STM32_ADCCLK (STM32_PCLK2 / 4)
|
||||
#elif STM32_ADCPRE == STM32_ADCPRE_DIV6
|
||||
#define STM32_ADCCLK (STM32_PCLK2 / 6)
|
||||
#elif STM32_ADCPRE == STM32_ADCPRE_DIV8
|
||||
#define STM32_ADCCLK (STM32_PCLK2 / 8)
|
||||
#else
|
||||
#error "invalid STM32_ADCPRE value specified"
|
||||
#endif
|
||||
|
||||
/* ADC frequency check.*/
|
||||
#if STM32_ADCCLK > 30000000
|
||||
#error "STM32_ADCCLK exceeding maximum frequency (30MHz)"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief OTG frequency.
|
||||
*/
|
||||
#if (STM32_OTGFSPRE == STM32_OTGFSPRE_DIV3) || defined(__DOXYGEN__)
|
||||
#define STM32_OTGFSCLK (STM32_PLLVCO / 3)
|
||||
#elif (STM32_OTGFSPRE == STM32_OTGFSPRE_DIV2)
|
||||
#define STM32_OTGFSCLK (STM32_PLLVCO / 2)
|
||||
#else
|
||||
#error "invalid STM32_OTGFSPRE value specified"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Timers 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14 clock.
|
||||
*/
|
||||
#if (STM32_PPRE1 == STM32_PPRE1_DIV1) || defined(__DOXYGEN__)
|
||||
#define STM32_TIMCLK1 (STM32_PCLK1 * 1)
|
||||
#else
|
||||
#define STM32_TIMCLK1 (STM32_PCLK1 * 2)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Timers 1, 8 clock.
|
||||
*/
|
||||
#if (STM32_PPRE2 == STM32_PPRE2_DIV1) || defined(__DOXYGEN__)
|
||||
#define STM32_TIMCLK2 (STM32_PCLK2 * 1)
|
||||
#else
|
||||
#define STM32_TIMCLK2 (STM32_PCLK2 * 2)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Flash settings.
|
||||
*/
|
||||
#if (STM32_HCLK <= STM32_0WS_THRESHOLD) || defined(__DOXYGEN__)
|
||||
#define STM32_FLASHBITS 0x00000000
|
||||
#elif STM32_HCLK <= STM32_1WS_THRESHOLD
|
||||
#define STM32_FLASHBITS 0x00000001
|
||||
#elif STM32_HCLK <= STM32_2WS_THRESHOLD
|
||||
#define STM32_FLASHBITS 0x00000002
|
||||
#elif STM32_HCLK <= STM32_3WS_THRESHOLD
|
||||
#define STM32_FLASHBITS 0x00000003
|
||||
#elif STM32_HCLK <= STM32_4WS_THRESHOLD
|
||||
#define STM32_FLASHBITS 0x00000004
|
||||
#elif STM32_HCLK <= STM32_5WS_THRESHOLD
|
||||
#define STM32_FLASHBITS 0x00000005
|
||||
#elif STM32_HCLK <= STM32_6WS_THRESHOLD
|
||||
#define STM32_FLASHBITS 0x00000006
|
||||
#else
|
||||
#define STM32_FLASHBITS 0x00000007
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver data structures and types. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver macros. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* External declarations. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/* STM32 DMA support code.*/
|
||||
//#include "stm32_dma.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void hal_lld_init(void);
|
||||
void stm32_clock_init(void);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _HAL_LLD_H_ */
|
||||
|
||||
/** @} */
|
|
@ -0,0 +1,13 @@
|
|||
# List of all the STM32L1xx platform files.
|
||||
PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/STM32F2xx/hal_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/gpt_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/icu_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/pwm_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/serial_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/GPIOv2/pal_lld.c
|
||||
|
||||
# Required include directories
|
||||
PLATFORMINC = ${CHIBIOS}/os/hal/platforms/STM32F2xx \
|
||||
${CHIBIOS}/os/hal/platforms/STM32 \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/GPIOv2 \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/DMAv2
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -367,7 +367,7 @@
|
|||
/**
|
||||
* @brief Maximum HSECLK at current voltage setting.
|
||||
*/
|
||||
#define STM32_HSECLK_MAX 32000000
|
||||
#define STM32_HSECLK_MAX 32000000#if
|
||||
|
||||
/**
|
||||
* @brief Maximum SYSCLK at current voltage setting.
|
||||
|
@ -430,7 +430,7 @@
|
|||
#if (STM32_HSECLK < 1000000) || (STM32_HSECLK > STM32_HSECLK_MAX)
|
||||
#error "STM32_HSECLK outside acceptable range (1MHz...STM32_HSECLK_MAX)"
|
||||
#endif
|
||||
#else /* !#if STM32_HSE_ENABLED */
|
||||
#else /* !STM32_HSE_ENABLED */
|
||||
#if (STM32_SW == STM32_SW_HSE) || \
|
||||
((STM32_SW == STM32_SW_PLL) && \
|
||||
(STM32_PLLSRC == STM32_PLLSRC_HSE)) || \
|
||||
|
@ -440,7 +440,7 @@
|
|||
(STM_RTC_SOURCE == STM32_RTCSEL_HSEDIV)
|
||||
#error "required HSE clock is not enabled"
|
||||
#endif
|
||||
#endif /* !#if STM32_HSE_ENABLED */
|
||||
#endif /* !STM32_HSE_ENABLED */
|
||||
|
||||
/* LSI related checks.*/
|
||||
#if STM32_LSI_ENABLED
|
||||
|
|
|
@ -1,193 +0,0 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file STM32/pal_lld.c
|
||||
* @brief STM32 GPIO low level driver code.
|
||||
*
|
||||
* @addtogroup PAL
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include "ch.h"
|
||||
#include "hal.h"
|
||||
|
||||
#if HAL_USE_PAL || defined(__DOXYGEN__)
|
||||
|
||||
#if STM32_HAS_GPIOG
|
||||
#define APB2_EN_MASK (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | \
|
||||
RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | \
|
||||
RCC_APB2ENR_IOPEEN | RCC_APB2ENR_IOPFEN | \
|
||||
RCC_APB2ENR_IOPGEN | RCC_APB2ENR_AFIOEN)
|
||||
#elif STM32_HAS_GPIOE
|
||||
#define APB2_EN_MASK (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | \
|
||||
RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | \
|
||||
RCC_APB2ENR_IOPEEN | RCC_APB2ENR_AFIOEN)
|
||||
#else
|
||||
#define APB2_EN_MASK (RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | \
|
||||
RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPDEN | \
|
||||
RCC_APB2ENR_AFIOEN)
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported variables. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local variables. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
static void initgpio(GPIO_TypeDef *gpiop, const stm32_gpio_setup_t *config) {
|
||||
|
||||
gpiop->MODER = config->moder;
|
||||
gpiop->OTYPER = config->otyper;
|
||||
gpiop->OSPEEDR = config->ospeedr;
|
||||
gpiop->PUPDR = config->pupdr;
|
||||
gpiop->ODR = config->odr;
|
||||
gpiop->AFRL = 0;
|
||||
gpiop->AFRH = 0;
|
||||
}
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver interrupt handlers. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief STM32 I/O ports configuration.
|
||||
* @details Ports A-D(E, F, G) clocks enabled, AFIO clock enabled.
|
||||
*
|
||||
* @param[in] config the STM32 ports configuration
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
void _pal_lld_init(const PALConfig *config) {
|
||||
|
||||
/*
|
||||
* Enables the GPIO related clocks.
|
||||
*/
|
||||
RCC->AHBENR |= RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOBEN |
|
||||
RCC_AHBENR_GPIOCEN | RCC_AHBENR_GPIODEN |
|
||||
RCC_AHBENR_GPIOEEN | RCC_AHBENR_GPIOHEN;
|
||||
RCC->AHBLPENR |= RCC_AHBLPENR_GPIOALPEN | RCC_AHBLPENR_GPIOBLPEN |
|
||||
RCC_AHBLPENR_GPIOCLPEN | RCC_AHBLPENR_GPIODLPEN |
|
||||
RCC_AHBLPENR_GPIOELPEN | RCC_AHBLPENR_GPIOHLPEN;
|
||||
|
||||
/*
|
||||
* Initial GPIO setup.
|
||||
*/
|
||||
initgpio(GPIOA, &config->PAData);
|
||||
initgpio(GPIOB, &config->PBData);
|
||||
initgpio(GPIOC, &config->PCData);
|
||||
initgpio(GPIOD, &config->PDData);
|
||||
#if STM32_HAS_GPIOE
|
||||
initgpio(GPIOE, &config->PEData);
|
||||
#endif
|
||||
#if STM32_HAS_GPIOF
|
||||
initgpio(GPIOF, &config->PFData);
|
||||
#endif
|
||||
#if STM32_HAS_GPIOG
|
||||
initgpio(GPIOG, &config->PGData);
|
||||
#endif
|
||||
#if STM32_HAS_GPIOH
|
||||
initgpio(GPIOH, &config->PHData);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Pads mode setup.
|
||||
* @details This function programs a pads group belonging to the same port
|
||||
* with the specified mode.
|
||||
* @note This function is not meant to be invoked directly by the
|
||||
* application code.
|
||||
* @note @p PAL_MODE_UNCONNECTED is implemented as push pull output at 2MHz.
|
||||
* @note Writing on pads programmed as pull-up or pull-down has the side
|
||||
* effect to modify the resistor setting because the output latched
|
||||
* data is used for the resistor selection.
|
||||
*
|
||||
* @param[in] port the port identifier
|
||||
* @param[in] mask the group mask
|
||||
* @param[in] mode the mode
|
||||
*
|
||||
* @notapi
|
||||
*/
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode) {
|
||||
#if 0
|
||||
static const uint8_t cfgtab[] = {
|
||||
4, /* PAL_MODE_RESET, implemented as input.*/
|
||||
2, /* PAL_MODE_UNCONNECTED, implemented as push pull output 2MHz.*/
|
||||
4, /* PAL_MODE_INPUT */
|
||||
8, /* PAL_MODE_INPUT_PULLUP */
|
||||
8, /* PAL_MODE_INPUT_PULLDOWN */
|
||||
0, /* PAL_MODE_INPUT_ANALOG */
|
||||
3, /* PAL_MODE_OUTPUT_PUSHPULL, 50MHz.*/
|
||||
7, /* PAL_MODE_OUTPUT_OPENDRAIN, 50MHz.*/
|
||||
8, /* Reserved.*/
|
||||
8, /* Reserved.*/
|
||||
8, /* Reserved.*/
|
||||
8, /* Reserved.*/
|
||||
8, /* Reserved.*/
|
||||
8, /* Reserved.*/
|
||||
8, /* Reserved.*/
|
||||
8, /* Reserved.*/
|
||||
0xB, /* PAL_MODE_STM32_ALTERNATE_PUSHPULL, 50MHz.*/
|
||||
0xF, /* PAL_MODE_STM32_ALTERNATE_OPENDRAIN, 50MHz.*/
|
||||
};
|
||||
uint32_t mh, ml, crh, crl, cfg;
|
||||
unsigned i;
|
||||
|
||||
if (mode == PAL_MODE_INPUT_PULLUP)
|
||||
port->BSRR = mask;
|
||||
else if (mode == PAL_MODE_INPUT_PULLDOWN)
|
||||
port->BRR = mask;
|
||||
cfg = cfgtab[mode];
|
||||
mh = ml = crh = crl = 0;
|
||||
for (i = 0; i < 8; i++) {
|
||||
ml <<= 4;
|
||||
mh <<= 4;
|
||||
crl <<= 4;
|
||||
crh <<= 4;
|
||||
if ((mask & 0x0080) == 0)
|
||||
ml |= 0xf;
|
||||
else
|
||||
crl |= cfg;
|
||||
if ((mask & 0x8000) == 0)
|
||||
mh |= 0xf;
|
||||
else
|
||||
crh |= cfg;
|
||||
mask <<= 1;
|
||||
}
|
||||
port->CRH = (port->CRH & mh) | crh;
|
||||
port->CRL = (port->CRL & ml) | crl;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* HAL_USE_PAL */
|
||||
|
||||
/** @} */
|
|
@ -1,6 +1,18 @@
|
|||
# List of all the STM32 platform files.
|
||||
# List of all the STM32L1xx platform files.
|
||||
PLATFORMSRC = ${CHIBIOS}/os/hal/platforms/STM32L1xx/hal_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32L1xx/stm32_dma.c
|
||||
${CHIBIOS}/os/hal/platforms/STM32/gpt_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/icu_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/pwm_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/serial_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/GPIOv2/pal_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/DMAv1/spi_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/DMAv1/uart_lld.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/DMAv1/stm32_dma.c \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/USBv1/usb_lld.c
|
||||
|
||||
# Required include directories
|
||||
PLATFORMINC = ${CHIBIOS}/os/hal/platforms/STM32L1xx
|
||||
PLATFORMINC = ${CHIBIOS}/os/hal/platforms/STM32L1xx \
|
||||
${CHIBIOS}/os/hal/platforms/STM32 \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/GPIOv2 \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/DMAv1 \
|
||||
${CHIBIOS}/os/hal/platforms/STM32/USBv1
|
||||
|
|
|
@ -1,468 +0,0 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file stm32_dma.c
|
||||
* @brief STM32 DMA helper driver code.
|
||||
*
|
||||
* @addtogroup STM32_DMA
|
||||
* @details DMA sharing helper driver. In the STM32 the DMA channels are a
|
||||
* shared resource, this driver allows to allocate and free DMA
|
||||
* channels at runtime in order to allow all the other device
|
||||
* drivers to coordinate the access to the resource.
|
||||
* @note The DMA ISR handlers are all declared into this module because
|
||||
* sharing, the various device drivers can associate a callback to
|
||||
* IRSs when allocating channels.
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include "ch.h"
|
||||
#include "hal.h"
|
||||
|
||||
#if defined(STM32_DMA_REQUIRED) || defined(__DOXYGEN__)
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported variables. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local variables and types. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief DMA ISR redirector type.
|
||||
*/
|
||||
typedef struct {
|
||||
stm32_dmaisr_t dmaisrfunc;
|
||||
void *dmaisrparam;
|
||||
} dma_isr_redir_t;
|
||||
|
||||
static uint32_t dmamsk1;
|
||||
static dma_isr_redir_t dma1[7];
|
||||
|
||||
#if STM32_HAS_DMA2
|
||||
static uint32_t dmamsk2;
|
||||
static dma_isr_redir_t dma2[5];
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver local functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver interrupt handlers. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief DMA1 channel 1 shared interrupt handler.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(DMA1_Ch1_IRQHandler) {
|
||||
uint32_t isr;
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
isr = STM32_DMA1->ISR >> (STM32_DMA_CHANNEL_1 * 4);
|
||||
dmaClearChannel(STM32_DMA1, STM32_DMA_CHANNEL_1);
|
||||
if (dma1[0].dmaisrfunc)
|
||||
dma1[0].dmaisrfunc(dma1[0].dmaisrparam, isr);
|
||||
|
||||
CH_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA1 channel 2 shared interrupt handler.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(DMA1_Ch2_IRQHandler) {
|
||||
uint32_t isr;
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
isr = STM32_DMA1->ISR >> (STM32_DMA_CHANNEL_2 * 4);
|
||||
dmaClearChannel(STM32_DMA1, STM32_DMA_CHANNEL_2);
|
||||
if (dma1[1].dmaisrfunc)
|
||||
dma1[1].dmaisrfunc(dma1[1].dmaisrparam, isr);
|
||||
|
||||
CH_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA1 channel 3 shared interrupt handler.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(DMA1_Ch3_IRQHandler) {
|
||||
uint32_t isr;
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
isr = STM32_DMA1->ISR >> (STM32_DMA_CHANNEL_3 * 4);
|
||||
dmaClearChannel(STM32_DMA1, STM32_DMA_CHANNEL_3);
|
||||
if (dma1[2].dmaisrfunc)
|
||||
dma1[2].dmaisrfunc(dma1[2].dmaisrparam, isr);
|
||||
|
||||
CH_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA1 channel 4 shared interrupt handler.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(DMA1_Ch4_IRQHandler) {
|
||||
uint32_t isr;
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
isr = STM32_DMA1->ISR >> (STM32_DMA_CHANNEL_4 * 4);
|
||||
dmaClearChannel(STM32_DMA1, STM32_DMA_CHANNEL_4);
|
||||
if (dma1[3].dmaisrfunc)
|
||||
dma1[3].dmaisrfunc(dma1[3].dmaisrparam, isr);
|
||||
|
||||
CH_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA1 channel 5 shared interrupt handler.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(DMA1_Ch5_IRQHandler) {
|
||||
uint32_t isr;
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
isr = STM32_DMA1->ISR >> (STM32_DMA_CHANNEL_5 * 4);
|
||||
dmaClearChannel(STM32_DMA1, STM32_DMA_CHANNEL_5);
|
||||
if (dma1[4].dmaisrfunc)
|
||||
dma1[4].dmaisrfunc(dma1[4].dmaisrparam, isr);
|
||||
|
||||
CH_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA1 channel 6 shared interrupt handler.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(DMA1_Ch6_IRQHandler) {
|
||||
uint32_t isr;
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
isr = STM32_DMA1->ISR >> (STM32_DMA_CHANNEL_6 * 4);
|
||||
dmaClearChannel(STM32_DMA1, STM32_DMA_CHANNEL_6);
|
||||
if (dma1[5].dmaisrfunc)
|
||||
dma1[5].dmaisrfunc(dma1[5].dmaisrparam, isr);
|
||||
|
||||
CH_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA1 channel 7 shared interrupt handler.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(DMA1_Ch7_IRQHandler) {
|
||||
uint32_t isr;
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
isr = STM32_DMA1->ISR >> (STM32_DMA_CHANNEL_7 * 4);
|
||||
dmaClearChannel(STM32_DMA1, STM32_DMA_CHANNEL_7);
|
||||
if (dma1[6].dmaisrfunc)
|
||||
dma1[6].dmaisrfunc(dma1[6].dmaisrparam, isr);
|
||||
|
||||
CH_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
#if STM32_HAS_DMA2 || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief DMA2 channel 1 shared interrupt handler.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(DMA2_Ch1_IRQHandler) {
|
||||
uint32_t isr;
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
isr = STM32_DMA2->ISR >> (STM32_DMA_CHANNEL_1 * 4);
|
||||
dmaClearChannel(STM32_DMA2, STM32_DMA_CHANNEL_1);
|
||||
if (dma2[0].dmaisrfunc)
|
||||
dma2[0].dmaisrfunc(dma2[0].dmaisrparam, isr);
|
||||
|
||||
CH_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA2 channel 2 shared interrupt handler.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(DMA2_Ch2_IRQHandler) {
|
||||
uint32_t isr;
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
isr = STM32_DMA2->ISR >> (STM32_DMA_CHANNEL_2 * 4);
|
||||
dmaClearChannel(STM32_DMA2, STM32_DMA_CHANNEL_2);
|
||||
if (dma2[1].dmaisrfunc)
|
||||
dma2[1].dmaisrfunc(dma2[1].dmaisrparam, isr);
|
||||
|
||||
CH_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA2 channel 3 shared interrupt handler.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(DMA2_Ch3_IRQHandler) {
|
||||
uint32_t isr;
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
isr = STM32_DMA2->ISR >> (STM32_DMA_CHANNEL_3 * 4);
|
||||
dmaClearChannel(STM32_DMA2, STM32_DMA_CHANNEL_3);
|
||||
if (dma2[2].dmaisrfunc)
|
||||
dma2[2].dmaisrfunc(dma2[2].dmaisrparam, isr);
|
||||
|
||||
CH_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
#if defined(STM32F10X_CL) || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief DMA2 channel 4 shared interrupt handler.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(DMA2_Ch4_IRQHandler) {
|
||||
uint32_t isr;
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
isr = STM32_DMA2->ISR >> (STM32_DMA_CHANNEL_4 * 4);
|
||||
dmaClearChannel(STM32_DMA2, STM32_DMA_CHANNEL_4);
|
||||
if (dma2[3].dmaisrfunc)
|
||||
dma2[3].dmaisrfunc(dma2[3].dmaisrparam, isr);
|
||||
|
||||
CH_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA2 channel 5 shared interrupt handler.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(DMA2_Ch5_IRQHandler) {
|
||||
uint32_t isr;
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
isr = STM32_DMA2->ISR >> (STM32_DMA_CHANNEL_5 * 4);
|
||||
dmaClearChannel(STM32_DMA2, STM32_DMA_CHANNEL_5);
|
||||
if (dma2[4].dmaisrfunc)
|
||||
dma2[4].dmaisrfunc(dma2[4].dmaisrparam, isr);
|
||||
|
||||
CH_IRQ_EPILOGUE();
|
||||
}
|
||||
|
||||
#else /* !STM32F10X_CL */
|
||||
/**
|
||||
* @brief DMA2 channels 4 and 5 shared interrupt handler.
|
||||
* @note This IRQ is shared between DMA2 channels 4 and 5 so it is a
|
||||
* bit less efficient because an extra check.
|
||||
*
|
||||
* @isr
|
||||
*/
|
||||
CH_IRQ_HANDLER(DMA2_Ch4_5_IRQHandler) {
|
||||
uint32_t isr;
|
||||
|
||||
CH_IRQ_PROLOGUE();
|
||||
|
||||
/* Check on channel 4.*/
|
||||
isr = STM32_DMA2->ISR >> (STM32_DMA_CHANNEL_5 * 4);
|
||||
if (isr & DMA_ISR_GIF1) {
|
||||
dmaClearChannel(STM32_DMA2, STM32_DMA_CHANNEL_5);
|
||||
if (dma2[3].dmaisrfunc)
|
||||
dma2[3].dmaisrfunc(dma2[3].dmaisrparam, isr);
|
||||
}
|
||||
|
||||
/* Check on channel 5.*/
|
||||
isr = STM32_DMA2->ISR >> (STM32_DMA_CHANNEL_4 * 4);
|
||||
if (isr & DMA_ISR_GIF1) {
|
||||
dmaClearChannel(STM32_DMA2, STM32_DMA_CHANNEL_5);
|
||||
if (dma2[4].dmaisrfunc)
|
||||
dma2[4].dmaisrfunc(dma2[4].dmaisrparam, isr);
|
||||
}
|
||||
|
||||
CH_IRQ_EPILOGUE();
|
||||
}
|
||||
#endif /* !STM32F10X_CL */
|
||||
#endif /* STM32_HAS_DMA2 */
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver exported functions. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief STM32 DMA helper initialization.
|
||||
*
|
||||
* @init
|
||||
*/
|
||||
void dmaInit(void) {
|
||||
int i;
|
||||
|
||||
dmamsk1 = 0;
|
||||
for (i = STM32_DMA_CHANNEL_7; i >= STM32_DMA_CHANNEL_1; i--) {
|
||||
dmaDisableChannel(STM32_DMA1, i);
|
||||
dma1[i].dmaisrfunc = NULL;
|
||||
}
|
||||
STM32_DMA1->IFCR = 0xFFFFFFFF;
|
||||
#if STM32_HAS_DMA2
|
||||
dmamsk2 = 0;
|
||||
for (i = STM32_DMA_CHANNEL_5; i >= STM32_DMA_CHANNEL_1; i--) {
|
||||
dmaDisableChannel(STM32_DMA2, i);
|
||||
dma2[i].dmaisrfunc = NULL;
|
||||
}
|
||||
STM32_DMA1->IFCR = 0xFFFFFFFF;
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Allocates a DMA channel.
|
||||
* @details The channel is allocated and, if required, the DMA clock enabled.
|
||||
* Trying to allocate a channel already allocated is an illegal
|
||||
* operation and is trapped if assertions are enabled.
|
||||
* @pre The channel must not be already in use.
|
||||
* @post The channel is allocated and the default ISR handler redirected
|
||||
* to the specified function.
|
||||
* @post The channel must be freed using @p dmaRelease() before it can
|
||||
* be reused with another peripheral.
|
||||
* @note This function can be invoked in both ISR or thread context.
|
||||
*
|
||||
* @param[in] dma DMA controller id
|
||||
* @param[in] channel requested channel id
|
||||
* @param[in] func handling function pointer, can be @p NULL
|
||||
* @param[in] param a parameter to be passed to the handling function
|
||||
* @return The operation status.
|
||||
* @retval FALSE operation successfully allocated.
|
||||
* @retval TRUE the channel was already in use.
|
||||
*
|
||||
* @special
|
||||
*/
|
||||
void dmaAllocate(uint32_t dma, uint32_t channel,
|
||||
stm32_dmaisr_t func, void *param) {
|
||||
|
||||
chDbgCheck(func != NULL, "dmaAllocate");
|
||||
|
||||
#if STM32_HAS_DMA2
|
||||
switch (dma) {
|
||||
case STM32_DMA1_ID:
|
||||
#else
|
||||
(void)dma;
|
||||
#endif
|
||||
/* Check if the channel is already taken.*/
|
||||
chDbgAssert((dmamsk1 & (1 << channel)) == 0,
|
||||
"dmaAllocate(), #1", "already allocated");
|
||||
|
||||
/* If the DMA unit was idle then the clock is enabled.*/
|
||||
if (dmamsk1 == 0) {
|
||||
RCC->AHBENR |= RCC_AHBENR_DMA1EN;
|
||||
DMA1->IFCR = 0x0FFFFFFF;
|
||||
}
|
||||
|
||||
dmamsk1 |= 1 << channel;
|
||||
dma1[channel].dmaisrfunc = func;
|
||||
dma1[channel].dmaisrparam = param;
|
||||
#if STM32_HAS_DMA2
|
||||
break;
|
||||
case STM32_DMA2_ID:
|
||||
/* Check if the channel is already taken.*/
|
||||
chDbgAssert((dmamsk2 & (1 << channel)) == 0,
|
||||
"dmaAllocate(), #2", "already allocated");
|
||||
|
||||
/* If the DMA unit was idle then the clock is enabled.*/
|
||||
if (dmamsk2 == 0) {
|
||||
RCC->AHBENR |= RCC_AHBENR_DMA2EN;
|
||||
DMA2->IFCR = 0x0FFFFFFF;
|
||||
}
|
||||
|
||||
dmamsk2 |= 1 << channel;
|
||||
dma2[channel].dmaisrfunc = func;
|
||||
dma2[channel].dmaisrparam = param;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Releases a DMA channel.
|
||||
* @details The channel is freed and, if required, the DMA clock disabled.
|
||||
* Trying to release a unallocated channel is an illegal operation
|
||||
* and is trapped if assertions are enabled.
|
||||
* @pre The channel must have been allocated using @p dmaRequest().
|
||||
* @post The channel is again available.
|
||||
* @note This function can be invoked in both ISR or thread context.
|
||||
*
|
||||
* @param[in] dma DMA controller id
|
||||
* @param[in] channel requested channel id
|
||||
*
|
||||
* @special
|
||||
*/
|
||||
void dmaRelease(uint32_t dma, uint32_t channel) {
|
||||
|
||||
#if STM32_HAS_DMA2
|
||||
switch (dma) {
|
||||
case STM32_DMA1_ID:
|
||||
#else
|
||||
(void)dma;
|
||||
#endif
|
||||
/* Check if the channel is not taken.*/
|
||||
chDbgAssert((dmamsk1 & (1 << channel)) != 0,
|
||||
"dmaRelease(), #1", "not allocated");
|
||||
|
||||
dma1[channel].dmaisrfunc = NULL;
|
||||
dmamsk1 &= ~(1 << channel);
|
||||
if (dmamsk1 == 0)
|
||||
RCC->AHBENR &= ~RCC_AHBENR_DMA1EN;
|
||||
#if STM32_HAS_DMA2
|
||||
break;
|
||||
case STM32_DMA2_ID:
|
||||
/* Check if the channel is not taken.*/
|
||||
chDbgAssert((dmamsk2 & (1 << channel)) != 0,
|
||||
"dmaRelease(), #2", "not allocated");
|
||||
|
||||
dma2[channel].dmaisrfunc = NULL;
|
||||
dmamsk2 &= ~(1 << channel);
|
||||
if (dmamsk2 == 0)
|
||||
RCC->AHBENR &= ~RCC_AHBENR_DMA2EN;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* STM32_DMA_REQUIRED */
|
||||
|
||||
/** @} */
|
|
@ -1,280 +0,0 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file stm32_dma.h
|
||||
* @brief STM32 DMA helper driver header.
|
||||
* @note This file requires definitions from the ST STM32 header file
|
||||
* stm3232f10x.h.
|
||||
*
|
||||
* @addtogroup STM32_DMA
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef _STM32_DMA_H_
|
||||
#define _STM32_DMA_H_
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver constants. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/** @brief DMA1 identifier.*/
|
||||
#define STM32_DMA1_ID 0
|
||||
|
||||
/** @brief DMA2 identifier.*/
|
||||
#if STM32_HAS_DMA2 || defined(__DOXYGEN__)
|
||||
#define STM32_DMA2_ID 1
|
||||
#endif
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver pre-compile time settings. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Derived constants and error checks. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver data structures and types. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/**
|
||||
* @brief STM32 DMA channel memory structure type.
|
||||
*/
|
||||
typedef struct {
|
||||
volatile uint32_t CCR;
|
||||
volatile uint32_t CNDTR;
|
||||
volatile uint32_t CPAR;
|
||||
volatile uint32_t CMAR;
|
||||
volatile uint32_t dummy;
|
||||
} stm32_dma_channel_t;
|
||||
|
||||
/**
|
||||
* @brief STM32 DMA subsystem memory structure type.
|
||||
* @note This structure has been redefined here because it is convenient to
|
||||
* have the channels organized as an array, the ST header does not
|
||||
* do that.
|
||||
*/
|
||||
typedef struct {
|
||||
volatile uint32_t ISR;
|
||||
volatile uint32_t IFCR;
|
||||
stm32_dma_channel_t channels[7];
|
||||
} stm32_dma_t;
|
||||
|
||||
/**
|
||||
* @brief STM32 DMA ISR function type.
|
||||
*
|
||||
* @param[in] p parameter for the registered function
|
||||
* @param[in] flags pre-shifted content of the ISR register
|
||||
*/
|
||||
typedef void (*stm32_dmaisr_t)(void *p, uint32_t flags);
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Driver macros. */
|
||||
/*===========================================================================*/
|
||||
|
||||
/** DMA1 registers block numeric address.*/
|
||||
#define STM32_DMA1_BASE (AHBPERIPH_BASE + 0x0000)
|
||||
/** Pointer to the DMA1 registers block.*/
|
||||
#define STM32_DMA1 ((stm32_dma_t *)STM32_DMA1_BASE)
|
||||
/** Pointer to the DMA1 channel 1 registers block.*/
|
||||
#define STM32_DMA1_CH1 (&STM32_DMA1->channels[0])
|
||||
/** Pointer to the DMA1 channel 2 registers block.*/
|
||||
#define STM32_DMA1_CH2 (&STM32_DMA1->channels[1])
|
||||
/** Pointer to the DMA1 channel 3 registers block.*/
|
||||
#define STM32_DMA1_CH3 (&STM32_DMA1->channels[2])
|
||||
/** Pointer to the DMA1 channel 4 registers block.*/
|
||||
#define STM32_DMA1_CH4 (&STM32_DMA1->channels[3])
|
||||
/** Pointer to the DMA1 channel 5 registers block.*/
|
||||
#define STM32_DMA1_CH5 (&STM32_DMA1->channels[4])
|
||||
/** Pointer to the DMA1 channel 6 registers block.*/
|
||||
#define STM32_DMA1_CH6 (&STM32_DMA1->channels[5])
|
||||
/** Pointer to the DMA1 channel 7 registers block.*/
|
||||
#define STM32_DMA1_CH7 (&STM32_DMA1->channels[6])
|
||||
|
||||
#if STM32_HAS_DMA2 || defined(__DOXYGEN__)
|
||||
/** DMA2 registers block numeric address.*/
|
||||
#define STM32_DMA2_BASE (AHBPERIPH_BASE + 0x0400)
|
||||
/** Pointer to the DMA2 registers block.*/
|
||||
#define STM32_DMA2 ((stm32_dma_t *)STM32_DMA2_BASE)
|
||||
/** Pointer to the DMA2 channel 1 registers block.*/
|
||||
#define STM32_DMA2_CH1 (&STM32_DMA2->channels[0])
|
||||
/** Pointer to the DMA2 channel 2 registers block.*/
|
||||
#define STM32_DMA2_CH2 (&STM32_DMA2->channels[1])
|
||||
/** Pointer to the DMA2 channel 3 registers block.*/
|
||||
#define STM32_DMA2_CH3 (&STM32_DMA2->channels[2])
|
||||
/** Pointer to the DMA2 channel 4 registers block.*/
|
||||
#define STM32_DMA2_CH4 (&STM32_DMA2->channels[3])
|
||||
/** Pointer to the DMA2 channel 5 registers block.*/
|
||||
#define STM32_DMA2_CH5 (&STM32_DMA2->channels[4])
|
||||
#endif
|
||||
|
||||
#define STM32_DMA_CHANNEL_1 0 /**< @brief DMA channel 1. */
|
||||
#define STM32_DMA_CHANNEL_2 1 /**< @brief DMA channel 2. */
|
||||
#define STM32_DMA_CHANNEL_3 2 /**< @brief DMA channel 3. */
|
||||
#define STM32_DMA_CHANNEL_4 3 /**< @brief DMA channel 4. */
|
||||
#define STM32_DMA_CHANNEL_5 4 /**< @brief DMA channel 5. */
|
||||
#define STM32_DMA_CHANNEL_6 5 /**< @brief DMA channel 6. */
|
||||
#define STM32_DMA_CHANNEL_7 6 /**< @brief DMA channel 7. */
|
||||
|
||||
/**
|
||||
* @brief Associates a peripheral data register to a DMA channel.
|
||||
* @note This function can be invoked in both ISR or thread context.
|
||||
*
|
||||
* @param[in] dmachp dmachp to a stm32_dma_channel_t structure
|
||||
* @param[in] cpar value to be written in the CPAR register
|
||||
*
|
||||
* @special
|
||||
*/
|
||||
#define dmaChannelSetPeripheral(dmachp, cpar) { \
|
||||
(dmachp)->CPAR = (uint32_t)(cpar); \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA channel setup by channel pointer.
|
||||
* @note This macro does not change the CPAR register because that register
|
||||
* value does not change frequently, it usually points to a peripheral
|
||||
* data register.
|
||||
* @note This function can be invoked in both ISR or thread context.
|
||||
*
|
||||
* @param[in] dmachp dmachp to a stm32_dma_channel_t structure
|
||||
* @param[in] cndtr value to be written in the CNDTR register
|
||||
* @param[in] cmar value to be written in the CMAR register
|
||||
* @param[in] ccr value to be written in the CCR register
|
||||
*
|
||||
* @special
|
||||
*/
|
||||
#define dmaChannelSetup(dmachp, cndtr, cmar, ccr) { \
|
||||
(dmachp)->CNDTR = (uint32_t)(cndtr); \
|
||||
(dmachp)->CMAR = (uint32_t)(cmar); \
|
||||
(dmachp)->CCR = (uint32_t)(ccr); \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA channel enable by channel pointer.
|
||||
* @note This function can be invoked in both ISR or thread context.
|
||||
*
|
||||
* @param[in] dmachp dmachp to a stm32_dma_channel_t structure
|
||||
*
|
||||
* @special
|
||||
*/
|
||||
#define dmaChannelEnable(dmachp) { \
|
||||
(dmachp)->CCR |= DMA_CCR1_EN; \
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief DMA channel disable by channel pointer.
|
||||
* @note This function can be invoked in both ISR or thread context.
|
||||
*
|
||||
* @param[in] dmachp dmachp to a stm32_dma_channel_t structure
|
||||
*
|
||||
* @special
|
||||
*/
|
||||
#define dmaChannelDisable(dmachp) { \
|
||||
(dmachp)->CCR = 0; \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA channel setup by channel ID.
|
||||
* @note This macro does not change the CPAR register because that register
|
||||
* value does not change frequently, it usually points to a peripheral
|
||||
* data register.
|
||||
* @note Channels are numbered from 0 to 6, use the appropriate macro
|
||||
* as parameter.
|
||||
* @note This function can be invoked in both ISR or thread context.
|
||||
*
|
||||
* @param[in] dmap pointer to a stm32_dma_t structure
|
||||
* @param[in] ch channel number
|
||||
* @param[in] cndtr value to be written in the CNDTR register
|
||||
* @param[in] cmar value to be written in the CMAR register
|
||||
* @param[in] ccr value to be written in the CCR register
|
||||
*
|
||||
* @special
|
||||
*/
|
||||
#define dmaSetupChannel(dmap, ch, cndtr, cmar, ccr) { \
|
||||
dmaChannelSetup(&(dmap)->channels[ch], (cndtr), (cmar), (ccr)); \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA channel enable by channel ID.
|
||||
* @note Channels are numbered from 0 to 6, use the appropriate macro
|
||||
* as parameter.
|
||||
* @note This function can be invoked in both ISR or thread context.
|
||||
*
|
||||
* @param[in] dmap pointer to a stm32_dma_t structure
|
||||
* @param[in] ch channel number
|
||||
*
|
||||
* @special
|
||||
*/
|
||||
#define dmaEnableChannel(dmap, ch) { \
|
||||
dmaChannelEnable(&(dmap)->channels[ch]); \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA channel disable by channel ID.
|
||||
* @note Channels are numbered from 0 to 6, use the appropriate macro
|
||||
* as parameter.
|
||||
* @note This function can be invoked in both ISR or thread context.
|
||||
*
|
||||
* @param[in] dmap pointer to a stm32_dma_t structure
|
||||
* @param[in] ch channel number
|
||||
*
|
||||
* @special
|
||||
*/
|
||||
#define dmaDisableChannel(dmap, ch) { \
|
||||
dmaChannelDisable(&(dmap)->channels[ch]); \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DMA channel interrupt sources clear.
|
||||
* @details Sets the appropriate CGIF bit into the IFCR register in order to
|
||||
* withdraw all the pending interrupt bits from the ISR register.
|
||||
* @note Channels are numbered from 0 to 6, use the appropriate macro
|
||||
* as parameter.
|
||||
* @note This function can be invoked in both ISR or thread context.
|
||||
*
|
||||
* @param[in] dmap pointer to a stm32_dma_t structure
|
||||
* @param[in] ch channel number
|
||||
*
|
||||
* @special
|
||||
*/
|
||||
#define dmaClearChannel(dmap, ch){ \
|
||||
(dmap)->IFCR = 1 << ((ch) * 4); \
|
||||
}
|
||||
|
||||
/*===========================================================================*/
|
||||
/* External declarations. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void dmaInit(void);
|
||||
void dmaAllocate(uint32_t dma, uint32_t channel,
|
||||
stm32_dmaisr_t func, void *param);
|
||||
void dmaRelease(uint32_t dma, uint32_t channel);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _STM32_DMA_H_ */
|
||||
|
||||
/** @} */
|
|
@ -67,7 +67,7 @@
|
|||
*/
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode) {
|
||||
iomode_t mode) {
|
||||
|
||||
switch (mode) {
|
||||
case PAL_MODE_RESET:
|
||||
|
|
|
@ -244,7 +244,7 @@ extern "C" {
|
|||
#endif
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode);
|
||||
iomode_t mode);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -67,7 +67,7 @@
|
|||
*/
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode) {
|
||||
iomode_t mode) {
|
||||
|
||||
switch (mode) {
|
||||
case PAL_MODE_RESET:
|
||||
|
|
|
@ -229,7 +229,7 @@ extern "C" {
|
|||
#endif
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode);
|
||||
iomode_t mode);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -79,7 +79,7 @@ sim_vio_port_t vio_port_2;
|
|||
*/
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode) {
|
||||
iomode_t mode) {
|
||||
|
||||
switch (mode) {
|
||||
case PAL_MODE_RESET:
|
||||
|
|
|
@ -196,7 +196,7 @@ extern "C" {
|
|||
#endif
|
||||
void _pal_lld_setgroupmode(ioportid_t port,
|
||||
ioportmask_t mask,
|
||||
uint_fast8_t mode);
|
||||
iomode_t mode);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -90,13 +90,15 @@ typedef struct {
|
|||
*
|
||||
* @api
|
||||
*/
|
||||
#if !defined(chDbgCheck)
|
||||
#define chDbgCheck(c, func) { \
|
||||
if (!(c)) \
|
||||
chDbgPanic(__QUOTE_THIS(func)"(), line "__QUOTE_THIS(__LINE__)); \
|
||||
chDbgPanic(__QUOTE_THIS(func)"()"); \
|
||||
}
|
||||
#endif /* !defined(chDbgCheck) */
|
||||
#else /* !CH_DBG_ENABLE_CHECKS */
|
||||
#define chDbgCheck(c, func) { \
|
||||
(void)(c), (void)__QUOTE_THIS(func)"(), line "__QUOTE_THIS(__LINE__); \
|
||||
(void)(c), (void)__QUOTE_THIS(func)"()"; \
|
||||
}
|
||||
#endif /* !CH_DBG_ENABLE_CHECKS */
|
||||
|
||||
|
@ -118,10 +120,12 @@ typedef struct {
|
|||
*
|
||||
* @api
|
||||
*/
|
||||
#if !defined(chDbgAssert)
|
||||
#define chDbgAssert(c, m, r) { \
|
||||
if (!(c)) \
|
||||
chDbgPanic(m); \
|
||||
}
|
||||
#endif /* !defined(chDbgAssert) */
|
||||
#else /* !CH_DBG_ENABLE_ASSERTS */
|
||||
#define chDbgAssert(c, m, r) {(void)(c);}
|
||||
#endif /* !CH_DBG_ENABLE_ASSERTS */
|
||||
|
|
|
@ -76,12 +76,12 @@ typedef struct {
|
|||
initialized to zero. */
|
||||
struct context r_ctx; /**< @brief Not used, present because
|
||||
offsets. */
|
||||
#if CH_USE_REGISTRY
|
||||
#if CH_USE_REGISTRY || defined(__DOXYGEN__)
|
||||
Thread *r_newer; /**< @brief Newer registry element. */
|
||||
Thread *r_older; /**< @brief Older registry element. */
|
||||
#endif
|
||||
/* End of the fields shared with the Thread structure.*/
|
||||
#if CH_TIME_QUANTUM > 0
|
||||
#if (CH_TIME_QUANTUM > 0) || defined(__DOXYGEN__)
|
||||
cnt_t r_preempt; /**< @brief Round robin counter. */
|
||||
#endif
|
||||
Thread *r_current; /**< @brief The currently running
|
||||
|
|
|
@ -44,16 +44,22 @@ struct Thread {
|
|||
/* End of the fields shared with the ThreadsQueue structure. */
|
||||
tprio_t p_prio; /**< @brief Thread priority. */
|
||||
struct context p_ctx; /**< @brief Processor context. */
|
||||
#if CH_USE_REGISTRY
|
||||
#if CH_USE_REGISTRY || defined(__DOXYGEN__)
|
||||
Thread *p_newer; /**< @brief Newer registry element. */
|
||||
Thread *p_older; /**< @brief Older registry element. */
|
||||
#endif
|
||||
/* End of the fields shared with the ReadyList structure. */
|
||||
#if CH_USE_REGISTRY
|
||||
#if CH_USE_REGISTRY || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Thread name or @p NULL.
|
||||
*/
|
||||
const char *p_name;
|
||||
#endif
|
||||
#if CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Thread stack boundary.
|
||||
*/
|
||||
stkalign_t *p_stklimit;
|
||||
#endif
|
||||
/**
|
||||
* @brief Current thread state.
|
||||
|
@ -63,19 +69,19 @@ struct Thread {
|
|||
* @brief Various thread flags.
|
||||
*/
|
||||
tmode_t p_flags;
|
||||
#if CH_USE_DYNAMIC
|
||||
#if CH_USE_DYNAMIC || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief References to this thread.
|
||||
*/
|
||||
trefs_t p_refs;
|
||||
#endif
|
||||
#if CH_USE_NESTED_LOCKS
|
||||
#if CH_USE_NESTED_LOCKS || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Number of nested locks.
|
||||
*/
|
||||
cnt_t p_locks;
|
||||
#endif
|
||||
#if CH_DBG_THREADS_PROFILING
|
||||
#if CH_DBG_THREADS_PROFILING || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Thread consumed time in ticks.
|
||||
* @note This field can overflow.
|
||||
|
@ -109,22 +115,22 @@ struct Thread {
|
|||
* states.
|
||||
*/
|
||||
void *wtobjp;
|
||||
#if CH_USE_EVENTS
|
||||
#if CH_USE_EVENTS || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Enabled events mask.
|
||||
* @note This field is only valied while the thread is in the
|
||||
* @note This field is only valid while the thread is in the
|
||||
* @p THD_STATE_WTOREVT or @p THD_STATE_WTANDEVT states.
|
||||
*/
|
||||
eventmask_t ewmask;
|
||||
#endif
|
||||
} p_u;
|
||||
#if CH_USE_WAITEXIT
|
||||
#if CH_USE_WAITEXIT || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Termination waiting list.
|
||||
*/
|
||||
ThreadsList p_waiting;
|
||||
#endif
|
||||
#if CH_USE_MESSAGES
|
||||
#if CH_USE_MESSAGES || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Messages queue.
|
||||
*/
|
||||
|
@ -134,13 +140,13 @@ struct Thread {
|
|||
*/
|
||||
msg_t p_msg;
|
||||
#endif
|
||||
#if CH_USE_EVENTS
|
||||
#if CH_USE_EVENTS || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Pending events mask.
|
||||
*/
|
||||
eventmask_t p_epending;
|
||||
#endif
|
||||
#if CH_USE_MUTEXES
|
||||
#if CH_USE_MUTEXES || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief List of the mutexes owned by this thread.
|
||||
* @note The list is terminated by a @p NULL in this field.
|
||||
|
@ -151,7 +157,7 @@ struct Thread {
|
|||
*/
|
||||
tprio_t p_realprio;
|
||||
#endif
|
||||
#if CH_USE_DYNAMIC && CH_USE_MEMPOOLS
|
||||
#if (CH_USE_DYNAMIC && CH_USE_MEMPOOLS) || defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Memory Pool where the thread workspace is returned.
|
||||
*/
|
||||
|
|
|
@ -77,6 +77,9 @@ void _idle_thread(void *p) {
|
|||
*/
|
||||
void chSysInit(void) {
|
||||
static Thread mainthread;
|
||||
#if CH_DBG_ENABLE_STACK_CHECK
|
||||
extern stkalign_t __main_thread_stack_base__;
|
||||
#endif
|
||||
|
||||
port_init();
|
||||
_scheduler_init();
|
||||
|
@ -94,6 +97,9 @@ void chSysInit(void) {
|
|||
/* Now this instructions flow becomes the main thread.*/
|
||||
setcurrp(_thread_init(&mainthread, NORMALPRIO));
|
||||
currp->p_state = THD_STATE_CURRENT;
|
||||
#if CH_DBG_ENABLE_STACK_CHECK
|
||||
currp->p_stklimit = &__main_thread_stack_base__;
|
||||
#endif
|
||||
chSysEnable();
|
||||
|
||||
chRegSetThreadName("main");
|
||||
|
|
|
@ -99,6 +99,9 @@ Thread *_thread_init(Thread *tp, tprio_t prio) {
|
|||
#if CH_USE_MESSAGES
|
||||
queue_init(&tp->p_msgqueue);
|
||||
#endif
|
||||
#if CH_DBG_ENABLE_STACK_CHECK
|
||||
tp->p_stklimit = (stkalign_t *)(tp + 1);
|
||||
#endif
|
||||
#if defined(THREAD_EXT_INIT_HOOK)
|
||||
THREAD_EXT_INIT_HOOK(tp);
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* AT91SAM7S256 memory setup.
|
||||
*/
|
||||
__und_stack_size__ = 0x0004;
|
||||
__abt_stack_size__ = 0x0004;
|
||||
__fiq_stack_size__ = 0x0010;
|
||||
__irq_stack_size__ = 0x0080;
|
||||
__svc_stack_size__ = 0x0004;
|
||||
__sys_stack_size__ = 0x0400;
|
||||
__stacks_total_size__ = __und_stack_size__ + __abt_stack_size__ + __fiq_stack_size__ + __irq_stack_size__ + __svc_stack_size__ + __sys_stack_size__;
|
||||
|
||||
MEMORY
|
||||
{
|
||||
flash : org = 0x100000, len = 256k
|
||||
ram : org = 0x200020, len = 64k - 0x20
|
||||
}
|
||||
|
||||
__ram_start__ = ORIGIN(ram);
|
||||
__ram_size__ = LENGTH(ram);
|
||||
__ram_end__ = __ram_start__ + __ram_size__;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
|
||||
.text : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
_text = .;
|
||||
KEEP(*(vectors))
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
*(.glue_7t)
|
||||
*(.glue_7)
|
||||
*(.gcc*)
|
||||
*(.ctors)
|
||||
*(.dtors)
|
||||
} > flash
|
||||
|
||||
.ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)}
|
||||
|
||||
__exidx_start = .;
|
||||
.ARM.exidx : {*(.ARM.exidx* .gnu.linkonce.armexidx.*)} > flash
|
||||
__exidx_end = .;
|
||||
|
||||
.eh_frame_hdr : {*(.eh_frame_hdr)}
|
||||
|
||||
.eh_frame : ONLY_IF_RO {*(.eh_frame)}
|
||||
|
||||
. = ALIGN(4);
|
||||
_etext = .;
|
||||
_textdata = _etext;
|
||||
|
||||
.data :
|
||||
{
|
||||
_data = .;
|
||||
*(.data)
|
||||
. = ALIGN(4);
|
||||
*(.data.*)
|
||||
. = ALIGN(4);
|
||||
*(.ramtext)
|
||||
. = ALIGN(4);
|
||||
_edata = .;
|
||||
} > ram AT > flash
|
||||
|
||||
.bss :
|
||||
{
|
||||
_bss_start = .;
|
||||
*(.bss)
|
||||
. = ALIGN(4);
|
||||
*(.bss.*)
|
||||
. = ALIGN(4);
|
||||
*(COMMON)
|
||||
. = ALIGN(4);
|
||||
_bss_end = .;
|
||||
} > ram
|
||||
}
|
||||
|
||||
PROVIDE(end = .);
|
||||
_end = .;
|
||||
|
||||
__heap_base__ = _end;
|
||||
__heap_end__ = __ram_end__ - __stacks_total_size__;
|
||||
__main_thread_stack_base__ = __ram_end__ - __stacks_total_size__;
|
|
@ -0,0 +1,105 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* AT91SAM7X256 memory setup.
|
||||
*/
|
||||
__und_stack_size__ = 0x0004;
|
||||
__abt_stack_size__ = 0x0004;
|
||||
__fiq_stack_size__ = 0x0010;
|
||||
__irq_stack_size__ = 0x0080;
|
||||
__svc_stack_size__ = 0x0004;
|
||||
__sys_stack_size__ = 0x0400;
|
||||
__stacks_total_size__ = __und_stack_size__ + __abt_stack_size__ + __fiq_stack_size__ + __irq_stack_size__ + __svc_stack_size__ + __sys_stack_size__;
|
||||
|
||||
MEMORY
|
||||
{
|
||||
flash : org = 0x100000, len = 256k
|
||||
ram : org = 0x200020, len = 64k - 0x20
|
||||
}
|
||||
|
||||
__ram_start__ = ORIGIN(ram);
|
||||
__ram_size__ = LENGTH(ram);
|
||||
__ram_end__ = __ram_start__ + __ram_size__;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
|
||||
.text : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
_text = .;
|
||||
KEEP(*(vectors))
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
*(.glue_7t)
|
||||
*(.glue_7)
|
||||
*(.gcc*)
|
||||
*(.ctors)
|
||||
*(.dtors)
|
||||
} > flash
|
||||
|
||||
.ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)}
|
||||
|
||||
__exidx_start = .;
|
||||
.ARM.exidx : {*(.ARM.exidx* .gnu.linkonce.armexidx.*)} > flash
|
||||
__exidx_end = .;
|
||||
|
||||
.eh_frame_hdr : {*(.eh_frame_hdr)}
|
||||
|
||||
.eh_frame : ONLY_IF_RO {*(.eh_frame)}
|
||||
|
||||
. = ALIGN(4);
|
||||
_etext = .;
|
||||
_textdata = _etext;
|
||||
|
||||
.data :
|
||||
{
|
||||
_data = .;
|
||||
*(.data)
|
||||
. = ALIGN(4);
|
||||
*(.data.*)
|
||||
. = ALIGN(4);
|
||||
*(.ramtext)
|
||||
. = ALIGN(4);
|
||||
_edata = .;
|
||||
} > ram AT > flash
|
||||
|
||||
.bss :
|
||||
{
|
||||
_bss_start = .;
|
||||
*(.bss)
|
||||
. = ALIGN(4);
|
||||
*(.bss.*)
|
||||
. = ALIGN(4);
|
||||
*(COMMON)
|
||||
. = ALIGN(4);
|
||||
_bss_end = .;
|
||||
} > ram
|
||||
}
|
||||
|
||||
PROVIDE(end = .);
|
||||
_end = .;
|
||||
|
||||
__heap_base__ = _end;
|
||||
__heap_end__ = __ram_end__ - __stacks_total_size__;
|
||||
__main_thread_stack_base__ = __ram_end__ - __stacks_total_size__;
|
|
@ -0,0 +1,13 @@
|
|||
# List of the ChibiOS/RT ARM7 AT91SAM7 port files.
|
||||
PORTSRC = ${CHIBIOS}/os/ports/GCC/ARM/chcore.c
|
||||
|
||||
PORTASM = ${CHIBIOS}/os/ports/GCC/ARM/crt0.s \
|
||||
${CHIBIOS}/os/ports/GCC/ARM/chcoreasm.s \
|
||||
${CHIBIOS}/os/ports/GCC/ARM/AT91SAM7/vectors.s
|
||||
|
||||
|
||||
PORTINC = ${CHIBIOS}/os/ports/GCC/ARM \
|
||||
${CHIBIOS}/os/ports/GCC/ARM/AT91SAM7
|
||||
|
||||
PORTLD = ${CHIBIOS}/os/ports/GCC/ARM/AT91SAM7/ld
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* LPC2148 memory setup.
|
||||
*/
|
||||
__und_stack_size__ = 0x0004;
|
||||
__abt_stack_size__ = 0x0004;
|
||||
__fiq_stack_size__ = 0x0010;
|
||||
__irq_stack_size__ = 0x0080;
|
||||
__svc_stack_size__ = 0x0004;
|
||||
__sys_stack_size__ = 0x0400;
|
||||
__stacks_total_size__ = __und_stack_size__ + __abt_stack_size__ + __fiq_stack_size__ + __irq_stack_size__ + __svc_stack_size__ + __sys_stack_size__;
|
||||
|
||||
MEMORY
|
||||
{
|
||||
flash : org = 0x00000000, len = 512k - 12k
|
||||
ram : org = 0x40000200, len = 32k - 0x200 - 288
|
||||
}
|
||||
|
||||
__ram_start__ = ORIGIN(ram);
|
||||
__ram_size__ = LENGTH(ram);
|
||||
__ram_end__ = __ram_start__ + __ram_size__;
|
||||
__dma_start__ = 0x7FD00000;
|
||||
__dma_size__ = 8k;
|
||||
__dma_end__ = 0x7FD00000 + __dma_size__;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
|
||||
.text : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
_text = .;
|
||||
KEEP(*(vectors))
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
*(.glue_7t)
|
||||
*(.glue_7)
|
||||
*(.gcc*)
|
||||
*(.ctors)
|
||||
*(.dtors)
|
||||
} > flash
|
||||
|
||||
.ARM.extab : {*(.ARM.extab* .gnu.linkonce.armextab.*)}
|
||||
|
||||
__exidx_start = .;
|
||||
.ARM.exidx : {*(.ARM.exidx* .gnu.linkonce.armexidx.*)} > flash
|
||||
__exidx_end = .;
|
||||
|
||||
.eh_frame_hdr : {*(.eh_frame_hdr)}
|
||||
|
||||
.eh_frame : ONLY_IF_RO {*(.eh_frame)}
|
||||
|
||||
. = ALIGN(4);
|
||||
_etext = .;
|
||||
_textdata = _etext;
|
||||
|
||||
.data :
|
||||
{
|
||||
_data = .;
|
||||
*(.data)
|
||||
. = ALIGN(4);
|
||||
*(.data.*)
|
||||
. = ALIGN(4);
|
||||
*(.ramtext)
|
||||
. = ALIGN(4);
|
||||
_edata = .;
|
||||
} > ram AT > flash
|
||||
|
||||
.bss :
|
||||
{
|
||||
_bss_start = .;
|
||||
*(.bss)
|
||||
. = ALIGN(4);
|
||||
*(.bss.*)
|
||||
. = ALIGN(4);
|
||||
*(COMMON)
|
||||
. = ALIGN(4);
|
||||
_bss_end = .;
|
||||
} > ram
|
||||
}
|
||||
|
||||
PROVIDE(end = .);
|
||||
_end = .;
|
||||
|
||||
__heap_base__ = _end;
|
||||
__heap_end__ = __ram_end__ - __stacks_total_size__;
|
||||
__main_thread_stack_base__ = __ram_end__ - __stacks_total_size__;
|
|
@ -0,0 +1,13 @@
|
|||
# List of the ChibiOS/RT ARM7 LPC214x port files.
|
||||
PORTSRC = ${CHIBIOS}/os/ports/GCC/ARM/chcore.c
|
||||
|
||||
PORTASM = ${CHIBIOS}/os/ports/GCC/ARM/crt0.s \
|
||||
${CHIBIOS}/os/ports/GCC/ARM/chcoreasm.s \
|
||||
${CHIBIOS}/os/ports/GCC/ARM/LPC214x/vectors.s
|
||||
|
||||
|
||||
PORTINC = ${CHIBIOS}/os/ports/GCC/ARM \
|
||||
${CHIBIOS}/os/ports/GCC/ARM/LPC214x
|
||||
|
||||
PORTLD = ${CHIBIOS}/os/ports/GCC/ARM/LPC214x/ld
|
||||
|
|
@ -438,14 +438,10 @@ struct context {
|
|||
#ifdef THUMB
|
||||
#if CH_DBG_ENABLE_STACK_CHECK
|
||||
#define port_switch(ntp, otp) { \
|
||||
register Thread *_ntp asm ("r0") = (ntp); \
|
||||
register Thread *_otp asm ("r1") = (otp); \
|
||||
register char *sp asm ("sp"); \
|
||||
if (sp - sizeof(struct intctx) - sizeof(Thread) < (char *)_otp) \
|
||||
asm volatile ("mov r0, #0 \n\t" \
|
||||
"ldr r1, =chDbgPanic \n\t" \
|
||||
"bx r1"); \
|
||||
_port_switch_thumb(_ntp, _otp); \
|
||||
register struct intctx *r13 asm ("r13"); \
|
||||
if ((stkalign_t *)(r13 - 1) < otp->p_stklimit) \
|
||||
chDbgPanic("stack overflow"); \
|
||||
_port_switch_thumb(ntp, otp); \
|
||||
}
|
||||
#else /* !CH_DBG_ENABLE_STACK_CHECK */
|
||||
#define port_switch(ntp, otp) _port_switch_thumb(ntp, otp)
|
||||
|
@ -453,13 +449,10 @@ struct context {
|
|||
#else /* !THUMB */
|
||||
#if CH_DBG_ENABLE_STACK_CHECK
|
||||
#define port_switch(ntp, otp) { \
|
||||
register Thread *_ntp asm ("r0") = (ntp); \
|
||||
register Thread *_otp asm ("r1") = (otp); \
|
||||
register char *sp asm ("sp"); \
|
||||
if (sp - sizeof(struct intctx) - sizeof(Thread) < (char *)_otp) \
|
||||
asm volatile ("mov r0, #0 \n\t" \
|
||||
"b chDbgPanic"); \
|
||||
_port_switch_arm(_ntp, _otp); \
|
||||
register struct intctx *r13 asm ("r13"); \
|
||||
if ((stkalign_t *)(r13 - 1) < otp->p_stklimit) \
|
||||
chDbgPanic("stack overflow"); \
|
||||
_port_switch_arm(ntp, otp); \
|
||||
}
|
||||
#else /* !CH_DBG_ENABLE_STACK_CHECK */
|
||||
#define port_switch(ntp, otp) _port_switch_arm(ntp, otp)
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
# List of the ChibiOS/RT ARM7/9 port files.
|
||||
PORTSRC = ${CHIBIOS}/os/ports/GCC/ARM/chcore.c
|
||||
|
||||
PORTASM = ${CHIBIOS}/os/ports/GCC/ARM/crt0.s \
|
||||
${CHIBIOS}/os/ports/GCC/ARM/chcoreasm.s
|
||||
|
||||
PORTINC = ${CHIBIOS}/os/ports/GCC/ARM
|
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* LPC1114 memory setup.
|
||||
*/
|
||||
__main_stack_size__ = 0x0100;
|
||||
__process_stack_size__ = 0x0100;
|
||||
|
||||
MEMORY
|
||||
{
|
||||
flash : org = 0x00000000, len = 32k
|
||||
ram : org = 0x10000000, len = 8k
|
||||
}
|
||||
|
||||
__ram_start__ = ORIGIN(ram);
|
||||
__ram_size__ = LENGTH(ram);
|
||||
__ram_end__ = __ram_start__ + __ram_size__;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
_text = .;
|
||||
|
||||
startup : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
KEEP(*(vectors))
|
||||
} > flash
|
||||
|
||||
constructors : ALIGN(4) SUBALIGN(4)
|
||||
{
|
||||
PROVIDE(__init_array_start = .);
|
||||
KEEP(*(SORT(.init_array.*)))
|
||||
KEEP(*(.init_array))
|
||||
PROVIDE(__init_array_end = .);
|
||||
} > flash
|
||||
|
||||
destructors : ALIGN(4) SUBALIGN(4)
|
||||
{
|
||||
PROVIDE(__fini_array_start = .);
|
||||
KEEP(*(.fini_array))
|
||||
KEEP(*(SORT(.fini_array.*)))
|
||||
PROVIDE(__fini_array_end = .);
|
||||
} > flash
|
||||
|
||||
.text : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
*(.text.startup.*)
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
*(.glue_7t)
|
||||
*(.glue_7)
|
||||
*(.gcc*)
|
||||
} > flash
|
||||
|
||||
.ARM.extab :
|
||||
{
|
||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||
} > flash
|
||||
|
||||
.ARM.exidx : {
|
||||
PROVIDE(__exidx_start = .);
|
||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||
PROVIDE(__exidx_end = .);
|
||||
} > flash
|
||||
|
||||
.eh_frame_hdr :
|
||||
{
|
||||
*(.eh_frame_hdr)
|
||||
} > flash
|
||||
|
||||
.eh_frame : ONLY_IF_RO
|
||||
{
|
||||
*(.eh_frame)
|
||||
} > flash
|
||||
|
||||
. = ALIGN(4);
|
||||
_etext = .;
|
||||
_textdata = _etext;
|
||||
|
||||
.stacks :
|
||||
{
|
||||
. = ALIGN(8);
|
||||
__main_stack_base__ = .;
|
||||
. += __main_stack_size__;
|
||||
. = ALIGN(8);
|
||||
__main_stack_end__ = .;
|
||||
__process_stack_base__ = .;
|
||||
__main_thread_stack_base__ = .;
|
||||
. += __process_stack_size__;
|
||||
. = ALIGN(8);
|
||||
__process_stack_end__ = .;
|
||||
__main_thread_stack_end__ = .;
|
||||
} > ram
|
||||
|
||||
.data :
|
||||
{
|
||||
PROVIDE(_data = .);
|
||||
*(.data)
|
||||
. = ALIGN(4);
|
||||
*(.data.*)
|
||||
. = ALIGN(4);
|
||||
*(.ramtext)
|
||||
. = ALIGN(4);
|
||||
PROVIDE(_edata = .);
|
||||
} > ram AT > flash
|
||||
|
||||
.bss :
|
||||
{
|
||||
PROVIDE(_bss_start = .);
|
||||
*(.bss)
|
||||
. = ALIGN(4);
|
||||
*(.bss.*)
|
||||
. = ALIGN(4);
|
||||
*(COMMON)
|
||||
. = ALIGN(4);
|
||||
PROVIDE(_bss_end = .);
|
||||
} > ram
|
||||
}
|
||||
|
||||
PROVIDE(end = .);
|
||||
_end = .;
|
||||
|
||||
__heap_base__ = _end;
|
||||
__heap_end__ = __ram_end__;
|
|
@ -7,5 +7,8 @@ PORTSRC = $(CHIBIOS)/os/ports/GCC/ARMCMx/crt0.c \
|
|||
|
||||
PORTASM =
|
||||
|
||||
PORTINC = ${CHIBIOS}/os/ports/GCC/ARMCMx \
|
||||
PORTINC = ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx/LPC11xx
|
||||
|
||||
PORTLD = ${CHIBIOS}/os/ports/GCC/ARMCMx/LPC11xx/ld
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#include "ch.h"
|
||||
|
||||
#if !defined(__DOXYGEN__)
|
||||
extern void __ram_end__(void);
|
||||
extern void __main_stack_end__(void);
|
||||
extern void ResetHandler(void);
|
||||
extern void NMIVector(void);
|
||||
extern void HardFaultVector(void);
|
||||
|
@ -88,7 +88,7 @@ extern void VectorBC(void);
|
|||
__attribute__ ((section("vectors")))
|
||||
#endif
|
||||
void (*_vectors[])(void) = {
|
||||
__ram_end__, ResetHandler, NMIVector, HardFaultVector,
|
||||
__main_stack_end__, ResetHandler, NMIVector, HardFaultVector,
|
||||
MemManageVector, BusFaultVector, UsageFaultVector, Vector1C,
|
||||
Vector20, Vector24, Vector28, SVCallVector,
|
||||
DebugMonitorVector, Vector34, PendSVVector, SysTickVector,
|
||||
|
|
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* LPC1343 memory setup.
|
||||
*/
|
||||
__main_stack_size__ = 0x0100;
|
||||
__process_stack_size__ = 0x0100;
|
||||
|
||||
MEMORY
|
||||
{
|
||||
flash : org = 0x00000000, len = 32k
|
||||
ram : org = 0x10000000, len = 8k
|
||||
}
|
||||
|
||||
__ram_start__ = ORIGIN(ram);
|
||||
__ram_size__ = LENGTH(ram);
|
||||
__ram_end__ = __ram_start__ + __ram_size__;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
_text = .;
|
||||
|
||||
startup : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
KEEP(*(vectors))
|
||||
} > flash
|
||||
|
||||
constructors : ALIGN(4) SUBALIGN(4)
|
||||
{
|
||||
PROVIDE(__init_array_start = .);
|
||||
KEEP(*(SORT(.init_array.*)))
|
||||
KEEP(*(.init_array))
|
||||
PROVIDE(__init_array_end = .);
|
||||
} > flash
|
||||
|
||||
destructors : ALIGN(4) SUBALIGN(4)
|
||||
{
|
||||
PROVIDE(__fini_array_start = .);
|
||||
KEEP(*(.fini_array))
|
||||
KEEP(*(SORT(.fini_array.*)))
|
||||
PROVIDE(__fini_array_end = .);
|
||||
} > flash
|
||||
|
||||
.text : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
*(.text.startup.*)
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
*(.glue_7t)
|
||||
*(.glue_7)
|
||||
*(.gcc*)
|
||||
} > flash
|
||||
|
||||
.ARM.extab :
|
||||
{
|
||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||
} > flash
|
||||
|
||||
.ARM.exidx : {
|
||||
PROVIDE(__exidx_start = .);
|
||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||
PROVIDE(__exidx_end = .);
|
||||
} > flash
|
||||
|
||||
.eh_frame_hdr :
|
||||
{
|
||||
*(.eh_frame_hdr)
|
||||
} > flash
|
||||
|
||||
.eh_frame : ONLY_IF_RO
|
||||
{
|
||||
*(.eh_frame)
|
||||
} > flash
|
||||
|
||||
. = ALIGN(4);
|
||||
_etext = .;
|
||||
_textdata = _etext;
|
||||
|
||||
.stacks :
|
||||
{
|
||||
. = ALIGN(8);
|
||||
__main_stack_base__ = .;
|
||||
. += __main_stack_size__;
|
||||
. = ALIGN(8);
|
||||
__main_stack_end__ = .;
|
||||
__process_stack_base__ = .;
|
||||
__main_thread_stack_base__ = .;
|
||||
. += __process_stack_size__;
|
||||
. = ALIGN(8);
|
||||
__process_stack_end__ = .;
|
||||
__main_thread_stack_end__ = .;
|
||||
} > ram
|
||||
|
||||
.data :
|
||||
{
|
||||
PROVIDE(_data = .);
|
||||
*(.data)
|
||||
. = ALIGN(4);
|
||||
*(.data.*)
|
||||
. = ALIGN(4);
|
||||
*(.ramtext)
|
||||
. = ALIGN(4);
|
||||
PROVIDE(_edata = .);
|
||||
} > ram AT > flash
|
||||
|
||||
.bss :
|
||||
{
|
||||
PROVIDE(_bss_start = .);
|
||||
*(.bss)
|
||||
. = ALIGN(4);
|
||||
*(.bss.*)
|
||||
. = ALIGN(4);
|
||||
*(COMMON)
|
||||
. = ALIGN(4);
|
||||
PROVIDE(_bss_end = .);
|
||||
} > ram
|
||||
}
|
||||
|
||||
PROVIDE(end = .);
|
||||
_end = .;
|
||||
|
||||
__heap_base__ = _end;
|
||||
__heap_end__ = __ram_end__;
|
|
@ -7,5 +7,8 @@ PORTSRC = $(CHIBIOS)/os/ports/GCC/ARMCMx/crt0.c \
|
|||
|
||||
PORTASM =
|
||||
|
||||
PORTINC = ${CHIBIOS}/os/ports/GCC/ARMCMx \
|
||||
PORTINC = ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx/LPC13xx
|
||||
|
||||
PORTLD = ${CHIBIOS}/os/ports/GCC/ARMCMx/LPC13xx/ld
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#include "ch.h"
|
||||
|
||||
#if !defined(__DOXYGEN__)
|
||||
extern void __ram_end__(void);
|
||||
extern void __main_stack_end__(void);
|
||||
extern void ResetHandler(void);
|
||||
extern void NMIVector(void);
|
||||
extern void HardFaultVector(void);
|
||||
|
@ -112,7 +112,7 @@ extern void Vector11C(void);
|
|||
__attribute__ ((section("vectors")))
|
||||
#endif
|
||||
void (*_vectors[])(void) = {
|
||||
__ram_end__, ResetHandler, NMIVector, HardFaultVector,
|
||||
__main_stack_end__, ResetHandler, NMIVector, HardFaultVector,
|
||||
MemManageVector, BusFaultVector, UsageFaultVector, Vector1C,
|
||||
Vector20, Vector24, Vector28, SVCallVector,
|
||||
DebugMonitorVector, Vector34, PendSVVector, SysTickVector,
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
# List of the ChibiOS/RT Cortex-M3 STM32 port files.
|
||||
PORTSRC = $(CHIBIOS)/os/ports/GCC/ARMCMx/crt0.c \
|
||||
$(CHIBIOS)/os/ports/GCC/ARMCMx/STM32/vectors.c \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx/chcore.c \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx/chcore_v7m.c \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx/nvic.c
|
||||
|
||||
PORTASM =
|
||||
|
||||
PORTINC = ${CHIBIOS}/os/ports/GCC/ARMCMx \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx/STM32
|
|
@ -19,13 +19,13 @@
|
|||
*/
|
||||
|
||||
/**
|
||||
* @file GCC/ARMCMx/STM32/cmparams.h
|
||||
* @brief ARM Cortex-M3 parameters for the STM32.
|
||||
* @file GCC/ARMCMx/STM32F1xx/cmparams.h
|
||||
* @brief ARM Cortex-M3 parameters for the STM32F1xx.
|
||||
*
|
||||
* @defgroup ARMCMx_STM32 STM32 Specific Parameters
|
||||
* @defgroup ARMCMx_STM32F1xx STM32F1xx Specific Parameters
|
||||
* @ingroup ARMCMx_SPECIFIC
|
||||
* @details This file contains the Cortex-M3 specific parameters for the
|
||||
* STM32 platform.
|
||||
* STM32F1xx platform.
|
||||
* @{
|
||||
*/
|
||||
|
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* ST32F100xB memory setup.
|
||||
*/
|
||||
__main_stack_size__ = 0x0400;
|
||||
__process_stack_size__ = 0x0400;
|
||||
|
||||
MEMORY
|
||||
{
|
||||
flash : org = 0x08000000, len = 128k
|
||||
ram : org = 0x20000000, len = 8k
|
||||
}
|
||||
|
||||
__ram_start__ = ORIGIN(ram);
|
||||
__ram_size__ = LENGTH(ram);
|
||||
__ram_end__ = __ram_start__ + __ram_size__;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
_text = .;
|
||||
|
||||
startup : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
KEEP(*(vectors))
|
||||
} > flash
|
||||
|
||||
constructors : ALIGN(4) SUBALIGN(4)
|
||||
{
|
||||
PROVIDE(__init_array_start = .);
|
||||
KEEP(*(SORT(.init_array.*)))
|
||||
KEEP(*(.init_array))
|
||||
PROVIDE(__init_array_end = .);
|
||||
} > flash
|
||||
|
||||
destructors : ALIGN(4) SUBALIGN(4)
|
||||
{
|
||||
PROVIDE(__fini_array_start = .);
|
||||
KEEP(*(.fini_array))
|
||||
KEEP(*(SORT(.fini_array.*)))
|
||||
PROVIDE(__fini_array_end = .);
|
||||
} > flash
|
||||
|
||||
.text : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
*(.text.startup.*)
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
*(.glue_7t)
|
||||
*(.glue_7)
|
||||
*(.gcc*)
|
||||
} > flash
|
||||
|
||||
.ARM.extab :
|
||||
{
|
||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||
} > flash
|
||||
|
||||
.ARM.exidx : {
|
||||
PROVIDE(__exidx_start = .);
|
||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||
PROVIDE(__exidx_end = .);
|
||||
} > flash
|
||||
|
||||
.eh_frame_hdr :
|
||||
{
|
||||
*(.eh_frame_hdr)
|
||||
} > flash
|
||||
|
||||
.eh_frame : ONLY_IF_RO
|
||||
{
|
||||
*(.eh_frame)
|
||||
} > flash
|
||||
|
||||
. = ALIGN(4);
|
||||
_etext = .;
|
||||
_textdata = _etext;
|
||||
|
||||
.stacks :
|
||||
{
|
||||
. = ALIGN(8);
|
||||
__main_stack_base__ = .;
|
||||
. += __main_stack_size__;
|
||||
. = ALIGN(8);
|
||||
__main_stack_end__ = .;
|
||||
__process_stack_base__ = .;
|
||||
__main_thread_stack_base__ = .;
|
||||
. += __process_stack_size__;
|
||||
. = ALIGN(8);
|
||||
__process_stack_end__ = .;
|
||||
__main_thread_stack_end__ = .;
|
||||
} > ram
|
||||
|
||||
.data :
|
||||
{
|
||||
PROVIDE(_data = .);
|
||||
*(.data)
|
||||
. = ALIGN(4);
|
||||
*(.data.*)
|
||||
. = ALIGN(4);
|
||||
*(.ramtext)
|
||||
. = ALIGN(4);
|
||||
PROVIDE(_edata = .);
|
||||
} > ram AT > flash
|
||||
|
||||
.bss :
|
||||
{
|
||||
PROVIDE(_bss_start = .);
|
||||
*(.bss)
|
||||
. = ALIGN(4);
|
||||
*(.bss.*)
|
||||
. = ALIGN(4);
|
||||
*(COMMON)
|
||||
. = ALIGN(4);
|
||||
PROVIDE(_bss_end = .);
|
||||
} > ram
|
||||
}
|
||||
|
||||
PROVIDE(end = .);
|
||||
_end = .;
|
||||
|
||||
__heap_base__ = _end;
|
||||
__heap_end__ = __ram_end__;
|
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* ST32F103xB memory setup.
|
||||
*/
|
||||
__main_stack_size__ = 0x0400;
|
||||
__process_stack_size__ = 0x0400;
|
||||
|
||||
MEMORY
|
||||
{
|
||||
flash : org = 0x08000000, len = 128k
|
||||
ram : org = 0x20000000, len = 20k
|
||||
}
|
||||
|
||||
__ram_start__ = ORIGIN(ram);
|
||||
__ram_size__ = LENGTH(ram);
|
||||
__ram_end__ = __ram_start__ + __ram_size__;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
_text = .;
|
||||
|
||||
startup : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
KEEP(*(vectors))
|
||||
} > flash
|
||||
|
||||
constructors : ALIGN(4) SUBALIGN(4)
|
||||
{
|
||||
PROVIDE(__init_array_start = .);
|
||||
KEEP(*(SORT(.init_array.*)))
|
||||
KEEP(*(.init_array))
|
||||
PROVIDE(__init_array_end = .);
|
||||
} > flash
|
||||
|
||||
destructors : ALIGN(4) SUBALIGN(4)
|
||||
{
|
||||
PROVIDE(__fini_array_start = .);
|
||||
KEEP(*(.fini_array))
|
||||
KEEP(*(SORT(.fini_array.*)))
|
||||
PROVIDE(__fini_array_end = .);
|
||||
} > flash
|
||||
|
||||
.text : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
*(.text.startup.*)
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
*(.glue_7t)
|
||||
*(.glue_7)
|
||||
*(.gcc*)
|
||||
} > flash
|
||||
|
||||
.ARM.extab :
|
||||
{
|
||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||
} > flash
|
||||
|
||||
.ARM.exidx : {
|
||||
PROVIDE(__exidx_start = .);
|
||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||
PROVIDE(__exidx_end = .);
|
||||
} > flash
|
||||
|
||||
.eh_frame_hdr :
|
||||
{
|
||||
*(.eh_frame_hdr)
|
||||
} > flash
|
||||
|
||||
.eh_frame : ONLY_IF_RO
|
||||
{
|
||||
*(.eh_frame)
|
||||
} > flash
|
||||
|
||||
. = ALIGN(4);
|
||||
_etext = .;
|
||||
_textdata = _etext;
|
||||
|
||||
.stacks :
|
||||
{
|
||||
. = ALIGN(8);
|
||||
__main_stack_base__ = .;
|
||||
. += __main_stack_size__;
|
||||
. = ALIGN(8);
|
||||
__main_stack_end__ = .;
|
||||
__process_stack_base__ = .;
|
||||
__main_thread_stack_base__ = .;
|
||||
. += __process_stack_size__;
|
||||
. = ALIGN(8);
|
||||
__process_stack_end__ = .;
|
||||
__main_thread_stack_end__ = .;
|
||||
} > ram
|
||||
|
||||
.data :
|
||||
{
|
||||
PROVIDE(_data = .);
|
||||
*(.data)
|
||||
. = ALIGN(4);
|
||||
*(.data.*)
|
||||
. = ALIGN(4);
|
||||
*(.ramtext)
|
||||
. = ALIGN(4);
|
||||
PROVIDE(_edata = .);
|
||||
} > ram AT > flash
|
||||
|
||||
.bss :
|
||||
{
|
||||
PROVIDE(_bss_start = .);
|
||||
*(.bss)
|
||||
. = ALIGN(4);
|
||||
*(.bss.*)
|
||||
. = ALIGN(4);
|
||||
*(COMMON)
|
||||
. = ALIGN(4);
|
||||
PROVIDE(_bss_end = .);
|
||||
} > ram
|
||||
}
|
||||
|
||||
PROVIDE(end = .);
|
||||
_end = .;
|
||||
|
||||
__heap_base__ = _end;
|
||||
__heap_end__ = __ram_end__;
|
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* ST32F103xE memory setup.
|
||||
*/
|
||||
__main_stack_size__ = 0x0400;
|
||||
__process_stack_size__ = 0x0400;
|
||||
|
||||
MEMORY
|
||||
{
|
||||
flash : org = 0x08000000, len = 1m
|
||||
ram : org = 0x20000000, len = 96k
|
||||
}
|
||||
|
||||
__ram_start__ = ORIGIN(ram);
|
||||
__ram_size__ = LENGTH(ram);
|
||||
__ram_end__ = __ram_start__ + __ram_size__;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
_text = .;
|
||||
|
||||
startup : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
KEEP(*(vectors))
|
||||
} > flash
|
||||
|
||||
constructors : ALIGN(4) SUBALIGN(4)
|
||||
{
|
||||
PROVIDE(__init_array_start = .);
|
||||
KEEP(*(SORT(.init_array.*)))
|
||||
KEEP(*(.init_array))
|
||||
PROVIDE(__init_array_end = .);
|
||||
} > flash
|
||||
|
||||
destructors : ALIGN(4) SUBALIGN(4)
|
||||
{
|
||||
PROVIDE(__fini_array_start = .);
|
||||
KEEP(*(.fini_array))
|
||||
KEEP(*(SORT(.fini_array.*)))
|
||||
PROVIDE(__fini_array_end = .);
|
||||
} > flash
|
||||
|
||||
.text : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
*(.text.startup.*)
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
*(.glue_7t)
|
||||
*(.glue_7)
|
||||
*(.gcc*)
|
||||
} > flash
|
||||
|
||||
.ARM.extab :
|
||||
{
|
||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||
} > flash
|
||||
|
||||
.ARM.exidx : {
|
||||
PROVIDE(__exidx_start = .);
|
||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||
PROVIDE(__exidx_end = .);
|
||||
} > flash
|
||||
|
||||
.eh_frame_hdr :
|
||||
{
|
||||
*(.eh_frame_hdr)
|
||||
} > flash
|
||||
|
||||
.eh_frame : ONLY_IF_RO
|
||||
{
|
||||
*(.eh_frame)
|
||||
} > flash
|
||||
|
||||
. = ALIGN(4);
|
||||
_etext = .;
|
||||
_textdata = _etext;
|
||||
|
||||
.stacks :
|
||||
{
|
||||
. = ALIGN(8);
|
||||
__main_stack_base__ = .;
|
||||
. += __main_stack_size__;
|
||||
. = ALIGN(8);
|
||||
__main_stack_end__ = .;
|
||||
__process_stack_base__ = .;
|
||||
__main_thread_stack_base__ = .;
|
||||
. += __process_stack_size__;
|
||||
. = ALIGN(8);
|
||||
__process_stack_end__ = .;
|
||||
__main_thread_stack_end__ = .;
|
||||
} > ram
|
||||
|
||||
.data :
|
||||
{
|
||||
PROVIDE(_data = .);
|
||||
*(.data)
|
||||
. = ALIGN(4);
|
||||
*(.data.*)
|
||||
. = ALIGN(4);
|
||||
*(.ramtext)
|
||||
. = ALIGN(4);
|
||||
PROVIDE(_edata = .);
|
||||
} > ram AT > flash
|
||||
|
||||
.bss :
|
||||
{
|
||||
PROVIDE(_bss_start = .);
|
||||
*(.bss)
|
||||
. = ALIGN(4);
|
||||
*(.bss.*)
|
||||
. = ALIGN(4);
|
||||
*(COMMON)
|
||||
. = ALIGN(4);
|
||||
PROVIDE(_bss_end = .);
|
||||
} > ram
|
||||
}
|
||||
|
||||
PROVIDE(end = .);
|
||||
_end = .;
|
||||
|
||||
__heap_base__ = _end;
|
||||
__heap_end__ = __ram_end__;
|
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* ST32F107xC memory setup.
|
||||
*/
|
||||
__main_stack_size__ = 0x0400;
|
||||
__process_stack_size__ = 0x0400;
|
||||
|
||||
MEMORY
|
||||
{
|
||||
flash : org = 0x08000000, len = 256k
|
||||
ram : org = 0x20000000, len = 64k
|
||||
}
|
||||
|
||||
__ram_start__ = ORIGIN(ram);
|
||||
__ram_size__ = LENGTH(ram);
|
||||
__ram_end__ = __ram_start__ + __ram_size__;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
_text = .;
|
||||
|
||||
startup : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
KEEP(*(vectors))
|
||||
} > flash
|
||||
|
||||
constructors : ALIGN(4) SUBALIGN(4)
|
||||
{
|
||||
PROVIDE(__init_array_start = .);
|
||||
KEEP(*(SORT(.init_array.*)))
|
||||
KEEP(*(.init_array))
|
||||
PROVIDE(__init_array_end = .);
|
||||
} > flash
|
||||
|
||||
destructors : ALIGN(4) SUBALIGN(4)
|
||||
{
|
||||
PROVIDE(__fini_array_start = .);
|
||||
KEEP(*(.fini_array))
|
||||
KEEP(*(SORT(.fini_array.*)))
|
||||
PROVIDE(__fini_array_end = .);
|
||||
} > flash
|
||||
|
||||
.text : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
*(.text.startup.*)
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
*(.glue_7t)
|
||||
*(.glue_7)
|
||||
*(.gcc*)
|
||||
} > flash
|
||||
|
||||
.ARM.extab :
|
||||
{
|
||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||
} > flash
|
||||
|
||||
.ARM.exidx : {
|
||||
PROVIDE(__exidx_start = .);
|
||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||
PROVIDE(__exidx_end = .);
|
||||
} > flash
|
||||
|
||||
.eh_frame_hdr :
|
||||
{
|
||||
*(.eh_frame_hdr)
|
||||
} > flash
|
||||
|
||||
.eh_frame : ONLY_IF_RO
|
||||
{
|
||||
*(.eh_frame)
|
||||
} > flash
|
||||
|
||||
. = ALIGN(4);
|
||||
_etext = .;
|
||||
_textdata = _etext;
|
||||
|
||||
.stacks :
|
||||
{
|
||||
. = ALIGN(8);
|
||||
__main_stack_base__ = .;
|
||||
. += __main_stack_size__;
|
||||
. = ALIGN(8);
|
||||
__main_stack_end__ = .;
|
||||
__process_stack_base__ = .;
|
||||
__main_thread_stack_base__ = .;
|
||||
. += __process_stack_size__;
|
||||
. = ALIGN(8);
|
||||
__process_stack_end__ = .;
|
||||
__main_thread_stack_end__ = .;
|
||||
} > ram
|
||||
|
||||
.data :
|
||||
{
|
||||
PROVIDE(_data = .);
|
||||
*(.data)
|
||||
. = ALIGN(4);
|
||||
*(.data.*)
|
||||
. = ALIGN(4);
|
||||
*(.ramtext)
|
||||
. = ALIGN(4);
|
||||
PROVIDE(_edata = .);
|
||||
} > ram AT > flash
|
||||
|
||||
.bss :
|
||||
{
|
||||
PROVIDE(_bss_start = .);
|
||||
*(.bss)
|
||||
. = ALIGN(4);
|
||||
*(.bss.*)
|
||||
. = ALIGN(4);
|
||||
*(COMMON)
|
||||
. = ALIGN(4);
|
||||
PROVIDE(_bss_end = .);
|
||||
} > ram
|
||||
}
|
||||
|
||||
PROVIDE(end = .);
|
||||
_end = .;
|
||||
|
||||
__heap_base__ = _end;
|
||||
__heap_end__ = __ram_end__;
|
|
@ -0,0 +1,14 @@
|
|||
# List of the ChibiOS/RT Cortex-M3 STM32 port files.
|
||||
PORTSRC = $(CHIBIOS)/os/ports/GCC/ARMCMx/crt0.c \
|
||||
$(CHIBIOS)/os/ports/GCC/ARMCMx/STM32F1xx/vectors.c \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx/chcore.c \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx/chcore_v7m.c \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx/nvic.c
|
||||
|
||||
PORTASM =
|
||||
|
||||
PORTINC = ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx/STM32F1xx
|
||||
|
||||
PORTLD = ${CHIBIOS}/os/ports/GCC/ARMCMx/STM32F1xx/ld
|
|
@ -19,12 +19,12 @@
|
|||
*/
|
||||
|
||||
/**
|
||||
* @file GCC/ARMCMx/STM32/vectors.c
|
||||
* @brief Interrupt vectors for the STM32 family.
|
||||
* @file GCC/ARMCMx/STM32F1xx/vectors.c
|
||||
* @brief Interrupt vectors for the STM32F1xx family.
|
||||
*
|
||||
* @defgroup ARMCMx_STM32_VECTORS STM32 Interrupt Vectors
|
||||
* @defgroup ARMCMx_STM32F1xx_VECTORS STM32F1xx Interrupt Vectors
|
||||
* @ingroup ARMCMx_SPECIFIC
|
||||
* @details Interrupt vectors for the STM32 family.
|
||||
* @details Interrupt vectors for the STM32F1xx family.
|
||||
* @{
|
||||
*/
|
||||
|
||||
|
@ -38,7 +38,7 @@
|
|||
#endif
|
||||
|
||||
#if !defined(__DOXYGEN__)
|
||||
extern void __ram_end__(void);
|
||||
extern void __main_stack_end__(void);
|
||||
extern void ResetHandler(void);
|
||||
extern void NMIVector(void);
|
||||
extern void HardFaultVector(void);
|
||||
|
@ -138,7 +138,7 @@ extern void Vector14C(void);
|
|||
__attribute__ ((section("vectors")))
|
||||
#endif
|
||||
void (*_vectors[])(void) = {
|
||||
__ram_end__, ResetHandler, NMIVector, HardFaultVector,
|
||||
__main_stack_end__, ResetHandler, NMIVector, HardFaultVector,
|
||||
MemManageVector, BusFaultVector, UsageFaultVector, Vector1C,
|
||||
Vector20, Vector24, Vector28, SVCallVector,
|
||||
DebugMonitorVector, Vector34, PendSVVector, SysTickVector,
|
|
@ -0,0 +1,144 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* ST32L1152xB memory setup.
|
||||
*/
|
||||
__main_stack_size__ = 0x0400;
|
||||
__process_stack_size__ = 0x0400;
|
||||
|
||||
MEMORY
|
||||
{
|
||||
flash : org = 0x08000000, len = 128k
|
||||
ram : org = 0x20000000, len = 16k
|
||||
}
|
||||
|
||||
__ram_start__ = ORIGIN(ram);
|
||||
__ram_size__ = LENGTH(ram);
|
||||
__ram_end__ = __ram_start__ + __ram_size__;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
_text = .;
|
||||
|
||||
startup : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
KEEP(*(vectors))
|
||||
} > flash
|
||||
|
||||
constructors : ALIGN(4) SUBALIGN(4)
|
||||
{
|
||||
PROVIDE(__init_array_start = .);
|
||||
KEEP(*(SORT(.init_array.*)))
|
||||
KEEP(*(.init_array))
|
||||
PROVIDE(__init_array_end = .);
|
||||
} > flash
|
||||
|
||||
destructors : ALIGN(4) SUBALIGN(4)
|
||||
{
|
||||
PROVIDE(__fini_array_start = .);
|
||||
KEEP(*(.fini_array))
|
||||
KEEP(*(SORT(.fini_array.*)))
|
||||
PROVIDE(__fini_array_end = .);
|
||||
} > flash
|
||||
|
||||
.text : ALIGN(16) SUBALIGN(16)
|
||||
{
|
||||
*(.text.startup.*)
|
||||
*(.text)
|
||||
*(.text.*)
|
||||
*(.rodata)
|
||||
*(.rodata.*)
|
||||
*(.glue_7t)
|
||||
*(.glue_7)
|
||||
*(.gcc*)
|
||||
} > flash
|
||||
|
||||
.ARM.extab :
|
||||
{
|
||||
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||
} > flash
|
||||
|
||||
.ARM.exidx : {
|
||||
PROVIDE(__exidx_start = .);
|
||||
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
|
||||
PROVIDE(__exidx_end = .);
|
||||
} > flash
|
||||
|
||||
.eh_frame_hdr :
|
||||
{
|
||||
*(.eh_frame_hdr)
|
||||
} > flash
|
||||
|
||||
.eh_frame : ONLY_IF_RO
|
||||
{
|
||||
*(.eh_frame)
|
||||
} > flash
|
||||
|
||||
. = ALIGN(4);
|
||||
_etext = .;
|
||||
_textdata = _etext;
|
||||
|
||||
.stacks :
|
||||
{
|
||||
. = ALIGN(8);
|
||||
__main_stack_base__ = .;
|
||||
. += __main_stack_size__;
|
||||
. = ALIGN(8);
|
||||
__main_stack_end__ = .;
|
||||
__process_stack_base__ = .;
|
||||
__main_thread_stack_base__ = .;
|
||||
. += __process_stack_size__;
|
||||
. = ALIGN(8);
|
||||
__process_stack_end__ = .;
|
||||
__main_thread_stack_end__ = .;
|
||||
} > ram
|
||||
|
||||
.data :
|
||||
{
|
||||
PROVIDE(_data = .);
|
||||
*(.data)
|
||||
. = ALIGN(4);
|
||||
*(.data.*)
|
||||
. = ALIGN(4);
|
||||
*(.ramtext)
|
||||
. = ALIGN(4);
|
||||
PROVIDE(_edata = .);
|
||||
} > ram AT > flash
|
||||
|
||||
.bss :
|
||||
{
|
||||
PROVIDE(_bss_start = .);
|
||||
*(.bss)
|
||||
. = ALIGN(4);
|
||||
*(.bss.*)
|
||||
. = ALIGN(4);
|
||||
*(COMMON)
|
||||
. = ALIGN(4);
|
||||
PROVIDE(_bss_end = .);
|
||||
} > ram
|
||||
}
|
||||
|
||||
PROVIDE(end = .);
|
||||
_end = .;
|
||||
|
||||
__heap_base__ = _end;
|
||||
__heap_end__ = __ram_end__;
|
|
@ -7,5 +7,8 @@ PORTSRC = $(CHIBIOS)/os/ports/GCC/ARMCMx/crt0.c \
|
|||
|
||||
PORTASM =
|
||||
|
||||
PORTINC = ${CHIBIOS}/os/ports/GCC/ARMCMx \
|
||||
PORTINC = ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx \
|
||||
${CHIBIOS}/os/ports/GCC/ARMCMx/STM32L1xx
|
||||
|
||||
PORTLD = ${CHIBIOS}/os/ports/GCC/ARMCMx/STM32L1xx/ld
|
||||
|
|
|
@ -238,12 +238,12 @@ struct intctx {
|
|||
* @param[in] ntp the thread to be switched in
|
||||
* @param[in] otp the thread to be switched out
|
||||
*/
|
||||
#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__)
|
||||
#if !CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__)
|
||||
#define port_switch(ntp, otp) _port_switch(ntp, otp)
|
||||
#else
|
||||
#define port_switch(ntp, otp) { \
|
||||
register struct intctx *r13 asm ("r13"); \
|
||||
if ((void *)(r13 - 1) < (void *)(otp + 1)) \
|
||||
if ((stkalign_t *)(r13 - 1) < otp->p_stklimit) \
|
||||
chDbgPanic("stack overflow"); \
|
||||
_port_switch(ntp, otp); \
|
||||
}
|
||||
|
|
|
@ -166,15 +166,7 @@ void _port_switch_from_isr(void) {
|
|||
#if !defined(__DOXYGEN__)
|
||||
__attribute__((naked))
|
||||
#endif
|
||||
void port_switch(Thread *ntp, Thread *otp) {
|
||||
|
||||
#if CH_DBG_ENABLE_STACK_CHECK
|
||||
/* Stack overflow check, if enabled.*/
|
||||
register struct intctx *r13 asm ("r13");
|
||||
if ((void *)(r13 - 1) < (void *)(otp + 1))
|
||||
asm volatile ("movs r0, #0 \n\t"
|
||||
"b chDbgPanic");
|
||||
#endif /* CH_DBG_ENABLE_STACK_CHECK */
|
||||
void _port_switch(Thread *ntp, Thread *otp) {
|
||||
|
||||
PUSH_CONTEXT();
|
||||
|
||||
|
|
|
@ -314,11 +314,32 @@ struct intctx {
|
|||
#define port_wait_for_interrupt()
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Performs a context switch between two threads.
|
||||
* @details This is the most critical code in any port, this function
|
||||
* is responsible for the context switch between 2 threads.
|
||||
* @note The implementation of this code affects <b>directly</b> the context
|
||||
* switch performance so optimize here as much as you can.
|
||||
*
|
||||
* @param[in] ntp the thread to be switched in
|
||||
* @param[in] otp the thread to be switched out
|
||||
*/
|
||||
#if !CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__)
|
||||
#define port_switch(ntp, otp) _port_switch(ntp, otp)
|
||||
#else
|
||||
#define port_switch(ntp, otp) { \
|
||||
register struct intctx *r13 asm ("r13"); \
|
||||
if ((stkalign_t *)(r13 - 1) < otp->p_stklimit) \
|
||||
chDbgPanic("stack overflow"); \
|
||||
_port_switch(ntp, otp); \
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void port_halt(void);
|
||||
void port_switch(Thread *ntp, Thread *otp);
|
||||
void _port_switch(Thread *ntp, Thread *otp);
|
||||
void _port_irq_epilogue(void);
|
||||
void _port_switch_from_isr(void);
|
||||
void _port_thread_start(void);
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
* @{
|
||||
*/
|
||||
|
||||
#include "chtypes.h"
|
||||
#include <stdint.h>
|
||||
|
||||
#define FALSE 0
|
||||
#define TRUE (!FALSE)
|
||||
|
@ -42,6 +42,20 @@ typedef funcp_t * funcpp_t;
|
|||
#define CRT0_CONTROL_INIT 0x00000002
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Stack segments initialization switch.
|
||||
*/
|
||||
#if !defined(CRT0_STACKS_FILL_PATTERN) || defined(__DOXYGEN__)
|
||||
#define CRT0_STACKS_FILL_PATTERN 0x55555555
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Stack segments initialization switch.
|
||||
*/
|
||||
#if !defined(CRT0_INIT_STACKS) || defined(__DOXYGEN__)
|
||||
#define CRT0_INIT_STACKS TRUE
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief DATA segment initialization switch.
|
||||
*/
|
||||
|
@ -73,28 +87,32 @@ typedef funcp_t * funcpp_t;
|
|||
#define SYMVAL(sym) (uint32_t)(((uint8_t *)&(sym)) - ((uint8_t *)0))
|
||||
|
||||
/**
|
||||
* @brief Ram end.
|
||||
* @brief Main stack lower boundary.
|
||||
* @details This symbol must be exported by the linker script and represents
|
||||
* the location after the last RAM location.
|
||||
* the main stack lower boundary.
|
||||
*/
|
||||
extern uint8_t __ram_end__;
|
||||
extern uint32_t __main_stack_base__;
|
||||
|
||||
/**
|
||||
* @brief Main stack size.
|
||||
* @brief Main stack initial position.
|
||||
* @details This symbol must be exported by the linker script and represents
|
||||
* the main stack size.
|
||||
* @note The main stack is the stack where interrupts and exceptions are
|
||||
* processed.
|
||||
* the main stack initial position.
|
||||
*/
|
||||
extern uint8_t __main_stack_size__;
|
||||
extern uint32_t __main_stack_end__;
|
||||
|
||||
/**
|
||||
* @brief Process stack size.
|
||||
* @brief Process stack lower boundary.
|
||||
* @details This symbol must be exported by the linker script and represents
|
||||
* the process stack size.
|
||||
* @note The process stack is the stack used by the @p main() function.
|
||||
* the process stack lower boundary.
|
||||
*/
|
||||
extern uint8_t __process_stack_size__;
|
||||
extern uint32_t __process_stack_base__;
|
||||
|
||||
/**
|
||||
* @brief Process stack initial position.
|
||||
* @details This symbol must be exported by the linker script and represents
|
||||
* the process stack initial position.
|
||||
*/
|
||||
extern uint32_t __process_stack_end__;
|
||||
|
||||
/**
|
||||
* @brief ROM image of the data segment start.
|
||||
|
@ -193,6 +211,19 @@ void _default_exit(void) {
|
|||
;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Memory fill.
|
||||
*
|
||||
* @param[in] start fill area start
|
||||
* @param[in] end fill area end
|
||||
* @param[in] filler filler pattern
|
||||
*/
|
||||
static void fill32(uint32_t *start, uint32_t *end, uint32_t filler) {
|
||||
|
||||
while (start < end)
|
||||
*start++ = filler;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Reset vector.
|
||||
*/
|
||||
|
@ -206,7 +237,7 @@ void ResetHandler(void) {
|
|||
main stack is assumed to be allocated starting from @p __ram_end__
|
||||
extending downward.*/
|
||||
asm volatile ("cpsid i");
|
||||
psp = SYMVAL(__ram_end__) - SYMVAL(__main_stack_size__);
|
||||
psp = SYMVAL(__process_stack_end__);
|
||||
asm volatile ("msr PSP, %0" : : "r" (psp));
|
||||
|
||||
ctl = CRT0_CONTROL_INIT;
|
||||
|
@ -216,6 +247,16 @@ void ResetHandler(void) {
|
|||
/* Early initialization hook invocation.*/
|
||||
__early_init();
|
||||
|
||||
#if CRT0_INIT_STACKS
|
||||
/* Main and Process stacks initialization.*/
|
||||
fill32(&__main_stack_base__,
|
||||
&__main_stack_end__,
|
||||
CRT0_STACKS_FILL_PATTERN);
|
||||
fill32(&__process_stack_base__,
|
||||
&__process_stack_end__,
|
||||
CRT0_STACKS_FILL_PATTERN);
|
||||
#endif
|
||||
|
||||
#if CRT0_INIT_DATA
|
||||
/* DATA segment initialization.*/
|
||||
{
|
||||
|
@ -230,13 +271,7 @@ void ResetHandler(void) {
|
|||
|
||||
#if CRT0_INIT_BSS
|
||||
/* BSS segment initialization.*/
|
||||
{
|
||||
uint32_t *bp;
|
||||
|
||||
bp = &_bss_start;
|
||||
while (bp < &_bss_end)
|
||||
*bp++ = 0;
|
||||
}
|
||||
fill32(&_bss_start, &_bss_end, 0);
|
||||
#endif
|
||||
|
||||
/* Late initialization hook invocation.*/
|
||||
|
|
|
@ -1,133 +0,0 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file GCC/ARMCMx/crt0_v6m.s
|
||||
* @brief Generic ARMv6-M (Cortex-M0/M1) startup file for ChibiOS/RT.
|
||||
*
|
||||
* @addtogroup ARMCMx_CORE
|
||||
* @{
|
||||
*/
|
||||
|
||||
#if !defined(__DOXYGEN__)
|
||||
|
||||
.set CONTROL_MODE_PRIVILEGED, 0
|
||||
.set CONTROL_MODE_UNPRIVILEGED, 1
|
||||
.set CONTROL_USE_MSP, 0
|
||||
.set CONTROL_USE_PSP, 2
|
||||
|
||||
.text
|
||||
.balign 2
|
||||
.syntax unified
|
||||
.thumb
|
||||
|
||||
/*
|
||||
* Reset handler.
|
||||
*/
|
||||
.thumb_func
|
||||
.global ResetHandler
|
||||
.weak ResetHandler
|
||||
ResetHandler:
|
||||
/*
|
||||
* Interrupts are globally masked initially.
|
||||
*/
|
||||
cpsid i
|
||||
/*
|
||||
* Stack pointers initialization.
|
||||
*/
|
||||
ldr r0, =__ram_end__
|
||||
ldr r1, =__main_stack_size__
|
||||
subs r0, r0, r1
|
||||
/*
|
||||
* Note that r0 is the main stack low boundary address and process
|
||||
* stack initial top address.
|
||||
*/
|
||||
msr PSP, r0
|
||||
/*
|
||||
* Early initialization phase, it is empty by default.
|
||||
*/
|
||||
bl __early_init
|
||||
/*
|
||||
* Data initialization.
|
||||
* NOTE: It assumes that the DATA size is a multiple of 4.
|
||||
*/
|
||||
ldr r1, =_textdata
|
||||
ldr r2, =_data
|
||||
ldr r3, =_edata
|
||||
dloop:
|
||||
cmp r2, r3
|
||||
bge enddloop
|
||||
ldr r0, [r1]
|
||||
str r0, [r2]
|
||||
adds r1, r1, #4
|
||||
adds r2, r2, #4
|
||||
b dloop
|
||||
enddloop:
|
||||
/*
|
||||
* BSS initialization.
|
||||
* NOTE: It assumes that the BSS size is a multiple of 4.
|
||||
*/
|
||||
movs r0, #0
|
||||
ldr r1, =_bss_start
|
||||
ldr r2, =_bss_end
|
||||
bloop:
|
||||
cmp r1, r2
|
||||
bge endbloop
|
||||
str r0, [r1]
|
||||
adds r1, r1, #4
|
||||
b bloop
|
||||
endbloop:
|
||||
/*
|
||||
* Switches to the Process Stack and uses a barrier just to be safe.
|
||||
*/
|
||||
movs r0, #CONTROL_MODE_PRIVILEGED | CONTROL_USE_PSP
|
||||
msr CONTROL, r0
|
||||
isb
|
||||
/*
|
||||
* Main program invocation.
|
||||
*/
|
||||
bl main
|
||||
b _main_exit_handler
|
||||
|
||||
/*
|
||||
* Default main exit code, just a loop.
|
||||
* It is a weak symbol, the application code can redefine the behavior.
|
||||
*/
|
||||
.thumb_func
|
||||
.global _main_exit_handler
|
||||
.weak _main_exit_handler
|
||||
_main_exit_handler:
|
||||
.loop: b .loop
|
||||
|
||||
/*
|
||||
* Default early initialization code. It is declared weak in order to be
|
||||
* replaced by the real initialization code.
|
||||
* The arly initialization is performed just after stacks setup and before BSS
|
||||
* and DATA segments initialization.
|
||||
*/
|
||||
.thumb_func
|
||||
.global __early_init
|
||||
.weak __early_init
|
||||
__early_init:
|
||||
bx lr
|
||||
|
||||
#endif
|
||||
|
||||
/** @} */
|
|
@ -1,128 +0,0 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file GCC/ARMCMx/crt0_v7m.s
|
||||
* @brief Generic ARMv7-M (Cortex-M3/M4) startup file for ChibiOS/RT.
|
||||
*
|
||||
* @addtogroup ARMCMx_CORE
|
||||
* @{
|
||||
*/
|
||||
|
||||
#if !defined(__DOXYGEN__)
|
||||
|
||||
.set CONTROL_MODE_PRIVILEGED, 0
|
||||
.set CONTROL_MODE_UNPRIVILEGED, 1
|
||||
.set CONTROL_USE_MSP, 0
|
||||
.set CONTROL_USE_PSP, 2
|
||||
|
||||
.text
|
||||
.balign 2
|
||||
.syntax unified
|
||||
.thumb
|
||||
|
||||
/*
|
||||
* Reset handler.
|
||||
*/
|
||||
.thumb_func
|
||||
.global ResetHandler
|
||||
.weak ResetHandler
|
||||
ResetHandler:
|
||||
/*
|
||||
* Interrupts are globally masked initially.
|
||||
*/
|
||||
cpsid i
|
||||
/*
|
||||
* Stack pointers initialization.
|
||||
*/
|
||||
ldr r0, =__ram_end__
|
||||
ldr r1, =__main_stack_size__
|
||||
subs r0, r0, r1
|
||||
/*
|
||||
* Note that r0 is the main stack low boundary address and process
|
||||
* stack initial top address.
|
||||
*/
|
||||
msr PSP, r0
|
||||
/*
|
||||
* Early initialization phase, it is empty by default.
|
||||
*/
|
||||
bl __early_init
|
||||
/*
|
||||
* Data initialization.
|
||||
* NOTE: It assumes that the DATA size is a multiple of 4.
|
||||
*/
|
||||
ldr r1, =_textdata
|
||||
ldr r2, =_data
|
||||
ldr r3, =_edata
|
||||
dloop:
|
||||
cmp r2, r3
|
||||
ittt lo
|
||||
ldrlo r0, [r1], #4
|
||||
strlo r0, [r2], #4
|
||||
blo dloop
|
||||
/*
|
||||
* BSS initialization.
|
||||
* NOTE: It assumes that the BSS size is a multiple of 4.
|
||||
*/
|
||||
movs r0, #0
|
||||
ldr r1, =_bss_start
|
||||
ldr r2, =_bss_end
|
||||
bloop:
|
||||
cmp r1, r2
|
||||
itt lo
|
||||
strlo r0, [r1], #4
|
||||
blo bloop
|
||||
/*
|
||||
* Switches to the Process Stack and uses a barrier just to be safe.
|
||||
*/
|
||||
movs r0, #CONTROL_MODE_PRIVILEGED | CONTROL_USE_PSP
|
||||
msr CONTROL, r0
|
||||
isb
|
||||
/*
|
||||
* Main program invocation.
|
||||
*/
|
||||
bl main
|
||||
b _main_exit_handler
|
||||
|
||||
/*
|
||||
* Default main exit code, just a loop.
|
||||
* It is a weak symbol, the application code can redefine the behavior.
|
||||
*/
|
||||
.thumb_func
|
||||
.global _main_exit_handler
|
||||
.weak _main_exit_handler
|
||||
_main_exit_handler:
|
||||
.loop: b .loop
|
||||
|
||||
/*
|
||||
* Default early initialization code. It is declared weak in order to be
|
||||
* replaced by the real initialization code.
|
||||
* The arly initialization is performed just after stacks setup and before BSS
|
||||
* and DATA segments initialization.
|
||||
*/
|
||||
.thumb_func
|
||||
.global __early_init
|
||||
.weak __early_init
|
||||
__early_init:
|
||||
bx lr
|
||||
|
||||
#endif
|
||||
|
||||
/** @} */
|
|
@ -1,126 +0,0 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file ARMCMx/chcore_v7m.c
|
||||
* @brief ARMv7-M architecture port code.
|
||||
*
|
||||
* @addtogroup ARMCMx_V7M_CORE
|
||||
* @{
|
||||
*/
|
||||
|
||||
#include "ch.h"
|
||||
|
||||
#if !CH_OPTIMIZE_SPEED
|
||||
void _port_lock(void) {
|
||||
register uint32_t tmp asm ("r3") = CORTEX_BASEPRI_KERNEL;
|
||||
asm volatile ("msr BASEPRI, %0" : : "r" (tmp));
|
||||
}
|
||||
|
||||
void _port_unlock(void) {
|
||||
register uint32_t tmp asm ("r3") = CORTEX_BASEPRI_DISABLED;
|
||||
asm volatile ("msr BASEPRI, %0" : : "r" (tmp));
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief System Timer vector.
|
||||
* @details This interrupt is used as system tick.
|
||||
* @note The timer must be initialized in the startup code.
|
||||
*/
|
||||
void SysTickVector(void) {
|
||||
|
||||
chSysLockFromIsr();
|
||||
chSysTimerHandlerI();
|
||||
if (chSchIsRescRequiredExI())
|
||||
SCB_ICSR = ICSR_PENDSVSET;
|
||||
chSysUnlockFromIsr();
|
||||
}
|
||||
|
||||
#define PUSH_CONTEXT(sp, prio) { \
|
||||
asm volatile ("mrs %0, PSP \n\t" \
|
||||
"stmdb %0!, {r3-r11,lr}" : \
|
||||
"=r" (sp) : "r" (sp), "r" (prio)); \
|
||||
}
|
||||
|
||||
#define POP_CONTEXT(sp) { \
|
||||
asm volatile ("ldmia %0!, {r3-r11, lr} \n\t" \
|
||||
"msr PSP, %0 \n\t" \
|
||||
"msr BASEPRI, r3 \n\t" \
|
||||
"bx lr" : "=r" (sp) : "r" (sp)); \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief SVC vector.
|
||||
* @details The SVC vector is used for commanded context switch. Structures
|
||||
* @p intctx are saved and restored from the process stacks of the
|
||||
* switched threads.
|
||||
*
|
||||
* @param[in] ntp the thread to be switched it
|
||||
* @param[in] otp the thread to be switched out
|
||||
*/
|
||||
#if !defined(__DOXYGEN__)
|
||||
__attribute__((naked))
|
||||
#endif
|
||||
void SVCallVector(Thread *ntp, Thread *otp) {
|
||||
register struct intctx *sp_thd asm("r2");
|
||||
register uint32_t prio asm ("r3");
|
||||
|
||||
asm volatile ("mrs r3, BASEPRI" : "=r" (prio) : );
|
||||
PUSH_CONTEXT(sp_thd, prio)
|
||||
|
||||
otp->p_ctx.r13 = sp_thd;
|
||||
sp_thd = ntp->p_ctx.r13;
|
||||
|
||||
POP_CONTEXT(sp_thd)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Preemption code.
|
||||
*/
|
||||
#if !defined(__DOXYGEN__)
|
||||
__attribute__((naked))
|
||||
#endif
|
||||
void PendSVVector(void) {
|
||||
register struct intctx *sp_thd asm("r2");
|
||||
register uint32_t prio asm ("r3");
|
||||
Thread *otp, *ntp;
|
||||
|
||||
chSysLockFromIsr();
|
||||
|
||||
prio = CORTEX_BASEPRI_DISABLED;
|
||||
PUSH_CONTEXT(sp_thd, prio)
|
||||
|
||||
(otp = currp)->p_ctx.r13 = sp_thd;
|
||||
ntp = fifo_remove(&rlist.r_queue);
|
||||
setcurrp(ntp);
|
||||
ntp->p_state = THD_STATE_CURRENT;
|
||||
chSchReadyI(otp);
|
||||
#if CH_TIME_QUANTUM > 0
|
||||
/* Set the round-robin time quantum.*/
|
||||
rlist.r_preempt = CH_TIME_QUANTUM;
|
||||
#endif
|
||||
chDbgTrace(otp);
|
||||
sp_thd = ntp->p_ctx.r13;
|
||||
|
||||
POP_CONTEXT(sp_thd)
|
||||
}
|
||||
|
||||
/** @} */
|
|
@ -1,299 +0,0 @@
|
|||
/*
|
||||
ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010,
|
||||
2011 Giovanni Di Sirio.
|
||||
|
||||
This file is part of ChibiOS/RT.
|
||||
|
||||
ChibiOS/RT is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
ChibiOS/RT is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file ARMCMx/chcore_v7m.h
|
||||
* @brief ARMv7-M architecture port macros and structures.
|
||||
*
|
||||
* @addtogroup ARMCMx_V7M_CORE
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef _CHCORE_V7M_H_
|
||||
#define _CHCORE_V7M_H_
|
||||
|
||||
/*===========================================================================*/
|
||||
/* Port implementation part. */
|
||||
/*===========================================================================*/
|
||||
|
||||
#if !defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief Interrupt saved context.
|
||||
* @details This structure represents the stack frame saved during a
|
||||
* preemption-capable interrupt handler.
|
||||
* @note This structure is empty in this port.
|
||||
*/
|
||||
struct extctx {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if !defined(__DOXYGEN__)
|
||||
/**
|
||||
* @brief System saved context.
|
||||
* @details This structure represents the inner stack frame during a context
|
||||
* switching.
|
||||
*/
|
||||
struct intctx {
|
||||
regarm_t basepri;
|
||||
regarm_t r4;
|
||||
regarm_t r5;
|
||||
regarm_t r6;
|
||||
#ifndef CH_CURRP_REGISTER_CACHE
|
||||
regarm_t r7;
|
||||
#endif
|
||||
regarm_t r8;
|
||||
regarm_t r9;
|
||||
regarm_t r10;
|
||||
regarm_t r11;
|
||||
regarm_t lr_exc;
|
||||
/* Start of the hardware saved frame.*/
|
||||
regarm_t r0;
|
||||
regarm_t r1;
|
||||
regarm_t r2;
|
||||
regarm_t r3;
|
||||
regarm_t r12;
|
||||
regarm_t lr_thd;
|
||||
regarm_t pc;
|
||||
regarm_t xpsr;
|
||||
};
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Platform dependent part of the @p chThdInit() API.
|
||||
* @details This code usually setup the context switching frame represented
|
||||
* by an @p intctx structure.
|
||||
*/
|
||||
#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \
|
||||
tp->p_ctx.r13 = (struct intctx *)((uint8_t *)workspace + \
|
||||
wsize - \
|
||||
sizeof(struct intctx)); \
|
||||
tp->p_ctx.r13->basepri = CORTEX_BASEPRI_DISABLED; \
|
||||
tp->p_ctx.r13->lr_exc = (regarm_t)0xFFFFFFFD; \
|
||||
tp->p_ctx.r13->r0 = arg; \
|
||||
tp->p_ctx.r13->lr_thd = chThdExit; \
|
||||
tp->p_ctx.r13->pc = pf; \
|
||||
tp->p_ctx.r13->xpsr = (regarm_t)0x01000000; \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Stack size for the system idle thread.
|
||||
* @details This size depends on the idle thread implementation, usually
|
||||
* the idle thread should take no more space than those reserved
|
||||
* by @p PORT_INT_REQUIRED_STACK.
|
||||
* @note In this port it is set to 4 because the idle thread does have
|
||||
* a stack frame when compiling without optimizations.
|
||||
*/
|
||||
#ifndef PORT_IDLE_THREAD_STACK_SIZE
|
||||
#define PORT_IDLE_THREAD_STACK_SIZE 4
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Per-thread stack overhead for interrupts servicing.
|
||||
* @details This constant is used in the calculation of the correct working
|
||||
* area size.
|
||||
* This value can be zero on those architecture where there is a
|
||||
* separate interrupt stack and the stack space between @p intctx and
|
||||
* @p extctx is known to be zero.
|
||||
* @note This port requires no extra stack space for interrupt handling.
|
||||
*/
|
||||
#ifndef PORT_INT_REQUIRED_STACK
|
||||
#define PORT_INT_REQUIRED_STACK 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief IRQ prologue code.
|
||||
* @details This macro must be inserted at the start of all IRQ handlers
|
||||
* enabled to invoke system APIs.
|
||||
*/
|
||||
#define PORT_IRQ_PROLOGUE()
|
||||
|
||||
/**
|
||||
* @brief IRQ epilogue code.
|
||||
* @details This macro must be inserted at the end of all IRQ handlers
|
||||
* enabled to invoke system APIs.
|
||||
*/
|
||||
#define PORT_IRQ_EPILOGUE() { \
|
||||
chSysLockFromIsr(); \
|
||||
if (chSchIsRescRequiredI()) \
|
||||
SCB_ICSR = ICSR_PENDSVSET; \
|
||||
chSysUnlockFromIsr(); \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief IRQ handler function declaration.
|
||||
* @note @p id can be a function name or a vector number depending on the
|
||||
* port implementation.
|
||||
*/
|
||||
#define PORT_IRQ_HANDLER(id) void id(void)
|
||||
|
||||
/**
|
||||
* @brief Port-related initialization code.
|
||||
*/
|
||||
#define port_init() { \
|
||||
SCB_AIRCR = AIRCR_VECTKEY | AIRCR_PRIGROUP(0); \
|
||||
NVICSetSystemHandlerPriority(HANDLER_SVCALL, \
|
||||
CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_SVCALL)); \
|
||||
NVICSetSystemHandlerPriority(HANDLER_PENDSV, \
|
||||
CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_PENDSV)); \
|
||||
NVICSetSystemHandlerPriority(HANDLER_SYSTICK, \
|
||||
CORTEX_PRIORITY_MASK(CORTEX_PRIORITY_SYSTICK)); \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Kernel-lock action.
|
||||
* @details Usually this function just disables interrupts but may perform
|
||||
* more actions.
|
||||
* @note In this port this it raises the base priority to kernel level.
|
||||
*/
|
||||
#if CH_OPTIMIZE_SPEED
|
||||
#define port_lock() { \
|
||||
register uint32_t tmp asm ("r3") = CORTEX_BASEPRI_KERNEL; \
|
||||
asm volatile ("msr BASEPRI, %0" : : "r" (tmp) : "memory"); \
|
||||
}
|
||||
#else
|
||||
#define port_lock() { \
|
||||
asm volatile ("bl _port_lock" : : : "r3", "lr", "memory"); \
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Kernel-unlock action.
|
||||
* @details Usually this function just disables interrupts but may perform
|
||||
* more actions.
|
||||
* @note In this port this it lowers the base priority to kernel level.
|
||||
*/
|
||||
#if CH_OPTIMIZE_SPEED
|
||||
#define port_unlock() { \
|
||||
register uint32_t tmp asm ("r3") = CORTEX_BASEPRI_DISABLED; \
|
||||
asm volatile ("msr BASEPRI, %0" : : "r" (tmp) : "memory"); \
|
||||
}
|
||||
#else
|
||||
#define port_unlock() { \
|
||||
asm volatile ("bl _port_unlock" : : : "r3", "lr", "memory"); \
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Kernel-lock action from an interrupt handler.
|
||||
* @details This function is invoked before invoking I-class APIs from
|
||||
* interrupt handlers. The implementation is architecture dependent,
|
||||
* in its simplest form it is void.
|
||||
* @note Same as @p port_lock() in this port.
|
||||
*/
|
||||
#define port_lock_from_isr() port_lock()
|
||||
|
||||
/**
|
||||
* @brief Kernel-unlock action from an interrupt handler.
|
||||
* @details This function is invoked after invoking I-class APIs from interrupt
|
||||
* handlers. The implementation is architecture dependent, in its
|
||||
* simplest form it is void.
|
||||
* @note Same as @p port_unlock() in this port.
|
||||
*/
|
||||
#define port_unlock_from_isr() port_unlock()
|
||||
|
||||
/**
|
||||
* @brief Disables all the interrupt sources.
|
||||
* @note Of course non maskable interrupt sources are not included.
|
||||
* @note In this port it disables all the interrupt sources by raising
|
||||
* the priority mask to level 0.
|
||||
*/
|
||||
#define port_disable() asm volatile ("cpsid i" : : : "memory")
|
||||
|
||||
/**
|
||||
* @brief Disables the interrupt sources below kernel-level priority.
|
||||
* @note Interrupt sources above kernel level remains enabled.
|
||||
* @note In this port it raises/lowers the base priority to kernel level.
|
||||
*/
|
||||
#define port_suspend() { \
|
||||
register uint32_t tmp asm ("r3") = CORTEX_BASEPRI_KERNEL; \
|
||||
asm volatile ("msr BASEPRI, %0 \n\t" \
|
||||
"cpsie i" : : "r" (tmp) : "memory"); \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Enables all the interrupt sources.
|
||||
* @note In this port it lowers the base priority to user level.
|
||||
*/
|
||||
#define port_enable() { \
|
||||
register uint32_t tmp asm ("r3") = CORTEX_BASEPRI_DISABLED; \
|
||||
asm volatile ("msr BASEPRI, %0 \n\t" \
|
||||
"cpsie i" : : "r" (tmp) : "memory"); \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Enters an architecture-dependent IRQ-waiting mode.
|
||||
* @details The function is meant to return when an interrupt becomes pending.
|
||||
* The simplest implementation is an empty function or macro but this
|
||||
* would not take advantage of architecture-specific power saving
|
||||
* modes.
|
||||
* @note Implemented as an inlined @p WFI instruction.
|
||||
*/
|
||||
#if CORTEX_ENABLE_WFI_IDLE || defined(__DOXYGEN__)
|
||||
#define port_wait_for_interrupt() { \
|
||||
asm volatile ("wfi" : : : "memory"); \
|
||||
}
|
||||
#else
|
||||
#define port_wait_for_interrupt()
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Performs a context switch between two threads.
|
||||
* @details This is the most critical code in any port, this function
|
||||
* is responsible for the context switch between 2 threads.
|
||||
* @note The implementation of this code affects <b>directly</b> the context
|
||||
* switch performance so optimize here as much as you can.
|
||||
* @note Implemented as inlined code for performance reasons.
|
||||
*
|
||||
* @param[in] ntp the thread to be switched in
|
||||
* @param[in] otp the thread to be switched out
|
||||
*/
|
||||
#if !CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__)
|
||||
#define port_switch(ntp, otp) { \
|
||||
register Thread *_ntp asm ("r0") = (ntp); \
|
||||
register Thread *_otp asm ("r1") = (otp); \
|
||||
asm volatile ("svc #0" : : "r" (_otp), "r" (_ntp) : "memory"); \
|
||||
}
|
||||
#else /* CH_DBG_ENABLE_STACK_CHECK */
|
||||
#define port_switch(ntp, otp) { \
|
||||
register Thread *_ntp asm ("r0") = (ntp); \
|
||||
register Thread *_otp asm ("r1") = (otp); \
|
||||
register struct intctx *r13 asm ("r13"); \
|
||||
if ((void *)(r13 - 1) < (void *)(_otp + 1)) \
|
||||
asm volatile ("movs r0, #0 \n\t" \
|
||||
"b chDbgPanic"); \
|
||||
asm volatile ("svc #0" : : "r" (_otp), "r" (_ntp) : "memory"); \
|
||||
}
|
||||
#endif /* CH_DBG_ENABLE_STACK_CHECK */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void port_halt(void);
|
||||
#if !CH_OPTIMIZE_SPEED
|
||||
void _port_lock(void);
|
||||
void _port_unlock(void);
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _CHCORE_V7M_H_ */
|
||||
|
||||
/** @} */
|
|
@ -236,7 +236,7 @@ struct intctx {
|
|||
* @param[in] ntp the thread to be switched in
|
||||
* @param[in] otp the thread to be switched out
|
||||
*/
|
||||
#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__)
|
||||
#if !CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__)
|
||||
#define port_switch(ntp, otp) _port_switch(ntp, otp)
|
||||
#else
|
||||
#define port_switch(ntp, otp) { \
|
||||
|
|
|
@ -302,7 +302,7 @@ struct intctx {
|
|||
* @param[in] ntp the thread to be switched in
|
||||
* @param[in] otp the thread to be switched out
|
||||
*/
|
||||
#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__)
|
||||
#if !CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__)
|
||||
#define port_switch(ntp, otp) _port_switch(ntp, otp)
|
||||
#else
|
||||
#define port_switch(ntp, otp) { \
|
||||
|
|
|
@ -236,7 +236,7 @@ struct intctx {
|
|||
* @param[in] ntp the thread to be switched in
|
||||
* @param[in] otp the thread to be switched out
|
||||
*/
|
||||
#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__)
|
||||
#if !CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__)
|
||||
#define port_switch(ntp, otp) _port_switch(ntp, otp)
|
||||
#else
|
||||
#define port_switch(ntp, otp) { \
|
||||
|
|
|
@ -234,6 +234,7 @@ struct intctx {
|
|||
/**
|
||||
* @brief Kernel-lock action from an interrupt handler.
|
||||
* @details This function is invoked before invoking I-class APIs from
|
||||
|
||||
* interrupt handlers. The implementation is architecture dependent,
|
||||
* in its simplest form it is void.
|
||||
* @note Same as @p port_lock() in this port.
|
||||
|
@ -309,7 +310,7 @@ struct intctx {
|
|||
* @param[in] ntp the thread to be switched in
|
||||
* @param[in] otp the thread to be switched out
|
||||
*/
|
||||
#if !defined(CH_DBG_ENABLE_STACK_CHECK) || defined(__DOXYGEN__)
|
||||
#if !CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__)
|
||||
#define port_switch(ntp, otp) _port_switch(ntp, otp)
|
||||
#else
|
||||
#define port_switch(ntp, otp) { \
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
/* ----------------------------------------------------------------------
|
||||
* Copyright (C) 2010 ARM Limited. All rights reserved.
|
||||
*
|
||||
* $Date: 11. November 2010
|
||||
* $Revision: V1.0.2
|
||||
*
|
||||
* Project: CMSIS DSP Library
|
||||
* Title: arm_common_tables.h
|
||||
*
|
||||
* Description: This file has extern declaration for common tables like Bitreverse, reciprocal etc which are used across different functions
|
||||
*
|
||||
* Target Processor: Cortex-M4/Cortex-M3
|
||||
*
|
||||
* Version 1.0.2 2010/11/11
|
||||
* Documentation updated.
|
||||
*
|
||||
* Version 1.0.1 2010/10/05
|
||||
* Production release and review comments incorporated.
|
||||
*
|
||||
* Version 1.0.0 2010/09/20
|
||||
* Production release and review comments incorporated.
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#ifndef _ARM_COMMON_TABLES_H
|
||||
#define _ARM_COMMON_TABLES_H
|
||||
|
||||
#include "arm_math.h"
|
||||
|
||||
extern uint16_t armBitRevTable[256];
|
||||
extern q15_t armRecipTableQ15[64];
|
||||
extern q31_t armRecipTableQ31[64];
|
||||
extern const q31_t realCoefAQ31[1024];
|
||||
extern const q31_t realCoefBQ31[1024];
|
||||
|
||||
#endif /* ARM_COMMON_TABLES_H */
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue