New HAL and SimpleMAC for STM32W108.

This commit is contained in:
Salvatore Pitrulli 2011-03-21 13:11:52 +01:00
parent c9af578eab
commit eb588f1aec
89 changed files with 1503 additions and 1883 deletions

View file

@ -45,9 +45,9 @@ ifdef IAR
TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library.a
else
ifdef PRINTF_FLOAT
TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library.a $(CONTIKI_CPU)/hal/micro/cortexm3/e_stdio_thumb2.a
TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library-gnu.a $(CONTIKI_CPU)/hal/micro/cortexm3/e_stdio_thumb2.a
else
TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library.a $(CONTIKI_CPU)/hal/micro/cortexm3/e_stdio_intonly_thumb2.a
TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library-gnu.a $(CONTIKI_CPU)/lib/e_stdio_intonly_thumb2.a
endif
endif
# `$(CC) -print-file-name=thumb2/libc.a` `$(CC) -print-file-name=thumb2/libgcc.a`
@ -74,7 +74,7 @@ AROPTS = --create
ASFLAGS = -s+ -w+ --cpu Cortex-M3 -L$(OBJECTDIR)
LDFLAGS += --redirect _Printf=_PrintfSmall --redirect _Scanf=_ScanfSmall --map=contiki-$(TARGET).map
ifndef COFFEE
LDFLAGS+= --config $(CONTIKI_CPU)/hal/micro/cortexm3/stm32w108/iar-cfg.icf
LDFLAGS+= --config $(CONTIKI_CPU)/iar-cfg.icf
endif
OBJOPTS = --bin
@ -101,7 +101,7 @@ ASFLAGS = -mthumb -mcpu=cortex-m3 -fsigned-char -c -g -Wall -Os -ffunction-secti
-mlittle-endian -fshort-enums -x assembler-with-cpp -Wa,-EL
LDFLAGS += -mcpu=cortex-m3 \
-mthumb \
-Wl,-T -Xlinker $(CONTIKI_CPU)/hal/micro/cortexm3/stm32w108/gnu.ld \
-Wl,-T -Xlinker $(CONTIKI_CPU)/gnu.ld \
-Wl,-static \
-u Default_Handler \
-nostartfiles \
@ -118,8 +118,6 @@ OBJOPTS = -O binary
endif
ifndef IAR
ifdef COFFEE_ADDRESS
COFFEE = 1
endif
@ -147,15 +145,18 @@ ifeq ($(COFFEE),1)
else
# Coffee starts at the end of the flash, before NVM section.
COFFEE_ADDRESS = 0x801F400
COFFEE_ADDRESS = 0x801F800
endif
ifndef IAR
LDFLAGS+= -Wl,--section-start=.coffee=$(COFFEE_ADDRESS)
else #IAR
ifeq ($(COFFEE),1)
LDFLAGS+= --config $(CONTIKI_CPU)/hal/micro/cortexm3/stm32w108/iar-cfg-coffee.icf
LDFLAGS+= --config $(CONTIKI_CPU)/iar-cfg-coffee.icf
endif
endif

View file

@ -67,7 +67,7 @@
/* If using IAR, COFFEE_ADDRESS reflects the static value in the linker script
iar-cfg-coffee.icf, so it can't be passed as a parameter for Make.*/
#ifdef __ICCARM__
#define COFFEE_ADDRESS 0x8010000
#define COFFEE_ADDRESS 0x8010c00
#endif
#if (COFFEE_ADDRESS & 0x3FF) !=0
#error "COFFEE_ADDRESS not aligned to a 1024-bytes page boundary."
@ -96,9 +96,10 @@
#define COFFEE_LOG_SIZE 128 // COFFEE_MICRO_LOGS is 0.
#if COFFEE_PAGES <= 0x100
#define coffee_page_t uint8_t
#elif COFFEE_PAGES <= 0x10000
#if COFFEE_PAGES <= 127
#define coffee_page_t int8_t
#elif COFFEE_PAGES <= 0x7FFF
#define coffee_page_t int16_t
#endif

View file

@ -1,5 +1,5 @@
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* File Name : stm32f10x_conf.h
* File Name : stm32w_conf.h
* Author : MCD Application Team
* Version : V2.0.3
* Date : 09/22/2008
@ -18,7 +18,7 @@
#define __STM32F10x_CONF_H
/* Includes ------------------------------------------------------------------*/
#include "stm32w_type.h"
#include "stm32w108_type.h"
/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/

View file

@ -1,5 +1,5 @@
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* File Name : stm32f10x_systick.c
* File Name : stm32w108_systick.c
* Author : MCD Application Team
* Version : V2.0.3
* Date : 09/22/2008

View file

@ -18,7 +18,7 @@
#ifndef __STM32W_SYSTICK_H
#define __STM32W_SYSTICK_H
#include "stm32w_type.h"
#include "stm32w108_type.h"
#include "stm32w_conf.h"
#ifndef EXT

View file

@ -1,80 +0,0 @@
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* File Name : stm32f10x_type.h
* Author : MCD Application Team
* Version : V2.0.3
* Date : 09/22/2008
* Description : This file contains all the common data types used for the
* STM32F10x firmware library.
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F10x_TYPE_H
#define __STM32F10x_TYPE_H
/* Includes ------------------------------------------------------------------*/
/* Exported types ------------------------------------------------------------*/
typedef signed long s32;
typedef signed short s16;
typedef signed char s8;
typedef signed long const sc32; /* Read Only */
typedef signed short const sc16; /* Read Only */
typedef signed char const sc8; /* Read Only */
typedef volatile signed long vs32;
typedef volatile signed short vs16;
typedef volatile signed char vs8;
typedef volatile signed long const vsc32; /* Read Only */
typedef volatile signed short const vsc16; /* Read Only */
typedef volatile signed char const vsc8; /* Read Only */
typedef unsigned long u32;
typedef unsigned short u16;
typedef unsigned char u8;
typedef unsigned long const uc32; /* Read Only */
typedef unsigned short const uc16; /* Read Only */
typedef unsigned char const uc8; /* Read Only */
typedef volatile unsigned long vu32;
typedef volatile unsigned short vu16;
typedef volatile unsigned char vu8;
typedef volatile unsigned long const vuc32; /* Read Only */
typedef volatile unsigned short const vuc16; /* Read Only */
typedef volatile unsigned char const vuc8; /* Read Only */
//typedef enum {FALSE = 0, TRUE = !FALSE} bool;
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
#define U8_MAX ((u8)255)
#define S8_MAX ((s8)127)
#define S8_MIN ((s8)-128)
#define U16_MAX ((u16)65535u)
#define S16_MAX ((s16)32767)
#define S16_MIN ((s16)-32768)
#define U32_MAX ((u32)4294967295uL)
#define S32_MAX ((s32)2147483647)
#define S32_MIN ((s32)-2147483648)
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
#endif /* __STM32F10x_TYPE_H */
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/

View file

@ -0,0 +1,53 @@
/*
* Copyright (c) 2007, Swedish Institute of Computer Science.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the Institute nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* This file is part of the Contiki operating system.
*
* $Id: uart1.h,v 1.1 2010/10/25 09:03:39 salvopitru Exp $
*/
/**
* \file
* A brief description of what this file is.
* \author
* Adam Dunkels <adam@sics.se>
*/
#ifndef __UART1_H__
#define __UART1_H__
//#include "msp430.h"
//
//#define UART1_BAUD2UBR(baud) ((MSP430_CPU_SPEED)/(baud))
void uart1_set_input(int (*input)(unsigned char c));
void uart1_writeb(unsigned char c);
void uart1_init(unsigned long ubr);
//uint8_t uart1_active(void);
#endif /* __UART1_H__ */

236
cpu/stm32w108/gnu.ld Normal file
View file

@ -0,0 +1,236 @@
/*SEARCH_DIR("C:\Program Files\Raisonance\Ride\Lib\ARM")
EXTERN( __io_putchar )
EXTERN( _write )
GROUP(
"std_sbrk_thumb.lib"
"smallprintf_thumb.a"
"libc.a"
"libm.a"
)
*/
/* default stack sizes.
These are used by the startup in order to allocate stacks for the different modes.
*/
__Stack_Size = 0x500 ;
PROVIDE ( _Stack_Size = __Stack_Size ) ;
__Stack_Init = 0x20000000;
_estack = __Stack_Init + __Stack_Size;
/*"PROVIDE" allows to easily override these values from an object file or the commmand line.*/
PROVIDE ( _Stack_Init = __Stack_Init ) ;
/*
this sends all unreferenced IRQHandlers to a Default_Handler or a reset.
*/
PROVIDE(Default_Handler = 0 );
PROVIDE(NMI_Handler = Default_Handler );
PROVIDE(HardFault_Handler = Default_Handler );
PROVIDE(MemManage_Handler = Default_Handler );
PROVIDE(BusFault_Handler = Default_Handler );
PROVIDE(UsageFault_Handler = Default_Handler );
PROVIDE(SVC_Handler = Default_Handler );
PROVIDE(DebugMonitor_Handler = Default_Handler );
PROVIDE(PendSV_Handler = Default_Handler );
PROVIDE(SysTick_Handler = Default_Handler );
PROVIDE(halTimer1Isr = Default_Handler );
PROVIDE(halTimer2Isr = Default_Handler );
PROVIDE(halManagementIsr = Default_Handler );
PROVIDE(halBaseBandIsr = Default_Handler );
PROVIDE(halSleepTimerIsr = Default_Handler );
PROVIDE(halSc1Isr = Default_Handler );
PROVIDE(halSc2Isr = Default_Handler );
PROVIDE(halSecurityIsr = Default_Handler );
PROVIDE(halStackMacTimerIsr = Default_Handler );
PROVIDE(stmRadioTransmitIsr = Default_Handler );
PROVIDE(stmRadioReceiveIsr = Default_Handler );
PROVIDE(halAdcIsr = Default_Handler );
PROVIDE(halIrqAIsr = Default_Handler );
PROVIDE(halIrqBIsr = Default_Handler );
PROVIDE(halIrqCIsr = Default_Handler );
PROVIDE(halIrqDIsr = Default_Handler );
PROVIDE(halDebugIsr = Default_Handler );
/******************************************************************************/
/* Peripheral memory map */
/******************************************************************************/
/*this allows to compile the ST lib in "non-debug" mode*/
_BOOTLOADER_SIZE = 0x3000 ;
_ROM_base = DEFINED(ST_BTL) ? (0x08000000 + _BOOTLOADER_SIZE) : 0x08000000 ;
/* include the memory spaces definitions sub-script */
MEMORY
{
RAM_region (xrw) : ORIGIN = 0x20000000, LENGTH = 8K
ROM_region (rx) : ORIGIN = 0x08000000, LENGTH = 128K-2K
NVM_region (rx) : ORIGIN = 0x0801F800, LENGTH = 2K
FIB_region (ra) : ORIGIN = 0x08040000, LENGTH = 2K
}
/* Sections management for FLASH mode */
/* Sections Definitions */
SECTIONS
{
/* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */
.isr_vector (DEFINED(ST_BTL) ? (0x08000000 + _BOOTLOADER_SIZE) : 0x08000000) :
{
. = ALIGN(4);
__ApplicationFlashStart = . ;
/* . = . + _ROM_base ;*/
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >ROM_region
/* for some STRx devices, the beginning of the startup code is stored in the .flashtext section, which goes to FLASH */
.flashtext :
{
. = ALIGN(4);
*(.flashtext) /* Startup code */
. = ALIGN(4);
} >ROM_region
/* the program code is stored in the .text section, which goes to Flash */
.text :
{
. = ALIGN(4);
*(.text) /* remaining code */
*(.text.*) /* remaining code */
*(.rodata) /* read-only data (constants) */
*(.rodata*)
*(.glue_7)
*(.glue_7t)
. = (DEFINED(ELF_LOADER) ? ALIGN(1024) : .);
*(.elf_text)
. = (DEFINED(ELF_LOADER) ? ALIGN(1024) : .);
. = ALIGN(4);
_etext = .;
/* This is used by the startup in order to initialize the .data section */
_sidata = _etext;
} >ROM_region
/* Section start can be overridden via command line. */
.coffee 0x08010c0 :
{
_coffee_start = ABSOLUTE(.);
. = ALIGN(1024);
*(.coffeefiles)
. = ORIGIN(NVM_region) - _coffee_start;
} > ROM_region = 0x00
NVM (NOLOAD):
{
. = ALIGN(1024);
KEEP(*(NVM))
. = ALIGN(4);
} > NVM_region
FAT (NOLOAD) :
{
. = ALIGN(4);
KEEP(*(FAT))
. = ALIGN(4);
} > FIB_region
/* after that it's only debugging information. */
/* This is the initialized data section
The program executes knowing that the data is in the RAM
but the loader puts the initial values in the FLASH (inidata).
It is one task of the startup to copy the initial values from FLASH to RAM. */
.data _estack : AT ( _sidata )
{
. = ALIGN(4);
/* This is used by the startup in order to initialize the .data section */
_sdata = . ;
*(.data)
*(.data.*)
. = ALIGN(4);
/* This is used by the startup in order to initialize the .data secion */
_edata = . ;
ASSERT(_sidata + SIZEOF(.data) < LOADADDR(.coffee), ".data section overflow in ROM");
} >RAM_region
/* This is the uninitialized data section */
.bss :
{
. = ALIGN(4);
/* This is used by the startup in order to initialize the .bss secion */
_sbss = .;
*(.bss)
*(.bss.*)
*(COMMON)
. = ALIGN(4);
/* This is used by the startup in order to initialize the .bss secion */
_ebss = . ;
} >RAM_region
PROVIDE ( end = _ebss );
PROVIDE ( _end = _ebss );
__exidx_start = .;
__exidx_end = .;
/* remove the debugging information from the standard libraries */
/DISCARD/ :
{
libc.a ( * )
libm.a ( * )
libgcc.a ( * )
}
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1 */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2 */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2 */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
}
__ApplicationFlashEnd = _sidata + (_edata - _sdata);

File diff suppressed because it is too large Load diff

View file

@ -1,18 +0,0 @@
<hr size="1">
<table border="0" cellspacing="0" cellpadding="0" width=100%>
<tr>
<td><address><small>
$projectname. <br>
$projectnumber.
</small></address>
</td>
<td align="right">
<address><small>
Copyright &copy; 2009 by STMicrolectronics. All rights reserved.<br>
Generated $datetime with <a href="http://www.doxygen.org/index.html">Doxygen</a> $doxygenversion.
</small></address>
</td>
</tr>
</table>
</body>
</html>

View file

@ -1,16 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>$title</title>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</head><body>
<table border="0" cellspacing="0" cellpadding="0" width=100%>
<tr>
<td><img src="ST_Logo.gif"></td>
<td> <div class="qindex">
<a class="qindex" href="index.html">Home</a>&nbsp;
| &nbsp;<a class="qindex" href="modules.html">Modules</a>&nbsp;
| &nbsp;<a class="qindex" href="annotated.html">Data Structures</a>&nbsp;
| &nbsp;<a class="qindex" href="files.html">File List</a>&nbsp;
| &nbsp;<a class="qindex" href="globals.html">Index</a></div>
</td>
</table>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -1,5 +0,0 @@
all:
doxygen Doxygen_Release
cp ST_Logo.gif html
clean:
- rm -fr html

View file

@ -1,6 +1,6 @@
/**
* @file error-def.h
* @brief Return-code definitions for StZNet stack API functions.
* @brief Return-code definitions for API functions.
*
* See @ref status_codes for documentation.
* <!--(C) COPYRIGHT 2010 STMicroelectronics. All rights reserved. -->

View file

@ -31,13 +31,12 @@
// Keep micro first for specifics used by other headers
#include "micro/micro-common.h"
#include "micro/cortexm3/micro-common.h"
#include "micro/led.h"
#include "micro/button.h"
#include "micro/system-timer.h"
#include "micro/cortexm3/nvm.h"
#include "hal/micro/cortexm3/uart.h"
#include "hal/micro/adc.h"
#endif //__HAL_H__

View file

@ -15,8 +15,7 @@
*
* To use the ADC system, include this file and ensure that
* ::halInternalInitAdc() is called whenever the microcontroller is
* started. Call ::halInternalSleepAdc() to sleep the module and
* ::halInternalInitAdc() to wake up the module.
* started.
*
* A "user" is a separate thread of execution and usage. That is,
* internal St code is one user and clients are a different user.
@ -171,13 +170,6 @@ typedef int8u ADCChannelType;
*/
void halInternalInitAdc(void);
/** @brief Shuts down the voltage reference and ADC system to
* minimize power consumption in sleep.
*/
void halInternalSleepAdc(void);
/** @brief Starts an ADC conversion for the user specified by \c id.
*
* @appusage The application must set \c reference to the voltage

View file

@ -117,6 +117,7 @@ ADCUser startNextConversion()
ADC_CFG = adcConfig[i]; // set the configuration to desired
INT_ADCFLAG = 0xFFFF;
INT_CFGSET = INT_ADC;
break; //see DDTS MBTst38936
}
}
} else {

View file

@ -0,0 +1,453 @@
/** @file board.c
* @brief Board file x STM32W108 Kits boards
*
* This file implements a software layer to support all the ST kits boards
* and deal with the difference in leds, buttons and sensors connected to the board.
* This a bit too complex for customer boards adaptation and customer can simplify it
* to adapt it to their hardware environment as they normally don't need to have the software
* running on several boards.
* The boards supported are:
* - MB851 A
* - MB851 B
* - MB851 C
* - MB954 A
* - MB954 B
* - MB950 A
* - MB951 A
* <!--(C) COPYRIGHT 2010 STMicroelectronics. All rights reserved. -->
*/
#include PLATFORM_HEADER
#include BOARD_HEADER
#ifdef EMBERZNET_HAL
#include "stack/include/ember.h"
#include "stack/include/error.h"
#include "hal/hal.h"
#define PORTA (0 << 3)
#define PORTB (1 << 3)
#define PORTC (2 << 3)
#else
#include "error.h"
#include "hal/hal.h"
#include "hal/micro/cortexm3/mfg-token.h"
#endif
#include <string.h>
const LedResourceType LedsMB851A[] = {
{
"D1", /* Green LED */
PORTB,
6
},
{
"D3", /* Yellow LED */
PORTB,
5
}
};
const InfraRedLedResourceType infraRedLedMB851A = {
"D5", /* Infrared LED */
PORTB,
4
};
const LedResourceType LedsMB954A[] = {
{
"D1", /* Green LED */
PORTA,
5
},
{
"D3", /* Yellow LED */
PORTA,
0
}
};
const ButtonResourceType ButtonsMB851A[] = {
{
"S1",
PORTA,
7
}
};
const ButtonResourceType ButtonsMB954A[] = {
{
"S1",
PORTB,
3
}
};
const ButtonResourceType ButtonsMB950A[] = {
{
"S1",
PORTB,
3
},
{
"S2",
PORTA,
7
},
{
"S3",
PORTB,
7
},
{
"S4",
PORTB,
0
},
{
"S5",
PORTB,
6
}
};
const TempSensorResourceType tempSensorMB851A = {
"STLM20",
PORTB,
7,
FALSE
};
const TempSensorResourceType tempSensorMB954A = {
"STLM20",
PORTA,
4,
TRUE
};
const MemsResourceType memsSensor = {
"LIS302",
0
};
const BoardIOType ioMB851A = {
LedsMB851A,
ButtonsMB851A,
};
const BoardIOType ioMB954A = {
LedsMB954A,
ButtonsMB954A,
};
const BoardIOType ioMB950A = {
LedsMB954A,
ButtonsMB950A,
};
const BoardResourcesType MB851A = {
"MB851 A",
(BOARD_HAS_MEMS | BOARD_HAS_TEMP_SENSOR | BOARD_HAS_FTDI),
BUTTONS_MB851A,
LEDS_MB851A,
&ioMB851A,
&infraRedLedMB851A,
&memsSensor,
&tempSensorMB851A,
};
const BoardResourcesType MB851B = {
"MB851 B",
(BOARD_HAS_MEMS | BOARD_HAS_TEMP_SENSOR | BOARD_HAS_FTDI),
BUTTONS_MB851B,
LEDS_MB851B,
&ioMB851A,
&infraRedLedMB851A,
&memsSensor,
&tempSensorMB851A,
};
const BoardResourcesType MB851C = {
"MB851 C",
(BOARD_HAS_MEMS | BOARD_HAS_TEMP_SENSOR | BOARD_HAS_STM32F | BOARD_HAS_EEPROM),
BUTTONS_MB851C,
LEDS_MB851C,
&ioMB954A,
&infraRedLedMB851A,
&memsSensor,
&tempSensorMB954A,
};
const BoardResourcesType MB954A = {
"MB954 A",
(BOARD_HAS_MEMS | BOARD_HAS_TEMP_SENSOR | BOARD_HAS_FTDI | BOARD_HAS_PA),
BUTTONS_MB954A,
LEDS_MB954A,
&ioMB954A,
&infraRedLedMB851A,
&memsSensor,
&tempSensorMB954A,
};
const BoardResourcesType MB954B = {
"MB954 B",
(BOARD_HAS_MEMS | BOARD_HAS_TEMP_SENSOR | BOARD_HAS_STM32F | BOARD_HAS_EEPROM | BOARD_HAS_PA),
BUTTONS_MB954B,
LEDS_MB954B,
&ioMB954A,
&infraRedLedMB851A,
&memsSensor,
&tempSensorMB954A,
};
const BoardResourcesType MB950A = {
"MB950 A",
(BOARD_HAS_MEMS | BOARD_HAS_TEMP_SENSOR | BOARD_HAS_STM32F),
BUTTONS_MB950A,
LEDS_MB950A,
&ioMB950A,
&infraRedLedMB851A,
&memsSensor,
&tempSensorMB954A,
};
const BoardResourcesType MB951A = {
"MB951 A",
(BOARD_HAS_STM32F),
BUTTONS_MB951A,
LEDS_MB951A,
&ioMB954A,
NULL,
NULL,
NULL,
};
static const BoardResourcesType *boardList [] = {
&MB851A,
&MB851B,
&MB851C,
&MB954A,
&MB954B,
&MB950A,
&MB951A
};
BoardResourcesType const *boardDescription = NULL;
#define PORT_NAME(x) ((x == PORTA) ? "A": ((x == PORTB) ? "B" : ((x == PORTC) ? "C": "?")))
void halBoardInit(void)
{
char boardName[16];
int8s i;
boardDescription = NULL;
#ifdef EMBERZNET_HAL
halCommonGetToken(boardName, TOKEN_MFG_BOARD_NAME);
#else
halCommonGetMfgToken(boardName, TOKEN_MFG_BOARD_NAME);
#endif
i = 15;
while ((i >= 0) && (boardName[i] == 0xFF)) {
boardName[i] = 0;
i--;
}
for (i = 0; i < (sizeof(boardList)/4) ; i++)
if (strcmp(boardName, (boardList[i])->name) == 0) {
boardDescription = (BoardResourcesType *) boardList[i];
break;
}
if (boardDescription == NULL) {
/* Board type not identified default to MB851A also to support legacy boards */
boardDescription = (BoardResourcesType *) &MB851A;
}
return;
}
BoardResourcesType const *halBoardGetDescription(void)
{
return boardDescription;
}
void halBoardPowerDown(void)
{
/* Set everything to input value */
GPIO_PACFGL = (GPIOCFG_IN <<PA0_CFG_BIT)|
(GPIOCFG_IN <<PA1_CFG_BIT)|
(GPIOCFG_IN <<PA2_CFG_BIT)|
(GPIOCFG_IN <<PA3_CFG_BIT);
GPIO_PACFGH = (GPIOCFG_IN <<PA4_CFG_BIT)| /* PTI EN */
(GPIOCFG_IN <<PA5_CFG_BIT)| /* PTI_DATA */
(GPIOCFG_IN <<PA6_CFG_BIT)|
(GPIOCFG_IN <<PA7_CFG_BIT);
GPIO_PBCFGL = (GPIOCFG_IN <<PB0_CFG_BIT)|
(GPIOCFG_IN <<PB1_CFG_BIT)| /* Uart TX */
(GPIOCFG_IN <<PB2_CFG_BIT)| /* Uart RX */
(GPIOCFG_IN <<PB3_CFG_BIT);
GPIO_PBCFGH = (GPIOCFG_IN <<PB4_CFG_BIT)|
(GPIOCFG_IN <<PB5_CFG_BIT)|
(GPIOCFG_IN <<PB6_CFG_BIT)|
(GPIOCFG_IN <<PB7_CFG_BIT);
GPIO_PCCFGL = (GPIOCFG_IN <<PC0_CFG_BIT)|
(GPIOCFG_IN <<PC1_CFG_BIT)|
(GPIOCFG_IN <<PC2_CFG_BIT)|
(GPIOCFG_IN <<PC3_CFG_BIT);
GPIO_PCCFGH = (GPIOCFG_IN <<PC4_CFG_BIT)|
(GPIOCFG_IN <<PC5_CFG_BIT)|
#ifdef EMBERZNET_HAL
(CFG_C6 <<PC6_CFG_BIT)| /* OSC32K */
(CFG_C7 <<PC7_CFG_BIT); /* OSC32K */
#else
(GPIOCFG_IN <<PC6_CFG_BIT)| /* OSC32K */
(GPIOCFG_IN <<PC7_CFG_BIT); /* OSC32K */
#endif
#ifdef EMBERZNET_HAL
/* Configure GPIO for BUTTONSs */
{
ButtonResourceType *buttons = (ButtonResourceType *) boardDescription->io->buttons;
int8u i;
for (i = 0; i < boardDescription->buttons; i++) {
halGpioConfig(PORTx_PIN(buttons[i].gpioPort, buttons[i].gpioPin), GPIOCFG_IN_PUD);
halGpioSet(PORTx_PIN(buttons[i].gpioPort, buttons[i].gpioPin), GPIOOUT_PULLUP);
}
}
#endif
/* Configure GPIO for power amplifier */
if (boardDescription->flags & BOARD_HAS_PA) {
/* SiGe Standby */
halGpioConfig(PORTB_PIN(6), GPIOCFG_OUT);
halGpioSet(PORTB_PIN(6), 0);
}
}
void halBoardPowerUp(void)
{
/* Set everything to input value */
GPIO_PACFGL = (GPIOCFG_IN <<PA0_CFG_BIT)|
(GPIOCFG_IN <<PA1_CFG_BIT)|
(GPIOCFG_IN <<PA2_CFG_BIT)|
(GPIOCFG_IN <<PA3_CFG_BIT);
GPIO_PACFGH = (GPIOCFG_IN <<PA4_CFG_BIT)| /* PTI EN */
(GPIOCFG_IN <<PA5_CFG_BIT)| /* PTI_DATA */
(GPIOCFG_IN <<PA6_CFG_BIT)|
(GPIOCFG_IN <<PA7_CFG_BIT);
GPIO_PBCFGL = (GPIOCFG_IN <<PB0_CFG_BIT)|
(GPIOCFG_OUT_ALT <<PB1_CFG_BIT)| /* Uart TX */
(GPIOCFG_IN <<PB2_CFG_BIT)| /* Uart RX */
(GPIOCFG_IN <<PB3_CFG_BIT);
GPIO_PBCFGH = (GPIOCFG_IN <<PB4_CFG_BIT)|
(GPIOCFG_IN <<PB5_CFG_BIT)|
(GPIOCFG_IN <<PB6_CFG_BIT)|
(GPIOCFG_IN <<PB7_CFG_BIT);
GPIO_PCCFGL = (GPIOCFG_IN <<PC0_CFG_BIT)|
(GPIOCFG_IN <<PC1_CFG_BIT)|
(GPIOCFG_IN <<PC2_CFG_BIT)|
(GPIOCFG_IN <<PC3_CFG_BIT);
GPIO_PCCFGH = (GPIOCFG_IN <<PC4_CFG_BIT)|
(GPIOCFG_IN <<PC5_CFG_BIT)|
#ifdef EMBERZNET_HAL
(CFG_C6 <<PC6_CFG_BIT)| /* OSC32K */
(CFG_C7 <<PC7_CFG_BIT); /* OSC32K */
#else
(GPIOCFG_IN <<PC6_CFG_BIT)| /* OSC32K */
(GPIOCFG_IN <<PC7_CFG_BIT); /* OSC32K */
#endif
/* Configure GPIO for I2C access */
if ((boardDescription->flags & BOARD_HAS_MEMS) || (boardDescription->flags & BOARD_HAS_EEPROM)) {
halGpioConfig(PORTA_PIN(1), GPIOCFG_OUT_ALT_OD);
halGpioConfig(PORTA_PIN(2), GPIOCFG_OUT_ALT_OD);
}
/* Configure GPIO for ADC access (temp sensor) */
if (boardDescription->flags & BOARD_HAS_TEMP_SENSOR) {
halGpioConfig(PORTx_PIN(boardDescription->temperatureSensor->gpioPort,
boardDescription->temperatureSensor->gpioPin),
GPIOCFG_ANALOG);
}
/* Configure GPIO for LEDs */
{
LedResourceType *leds = (LedResourceType *) boardDescription->io->leds;
int8u i;
for (i = 0; i < boardDescription->leds; i++) {
/* LED default off */
halGpioConfig(PORTx_PIN(leds[i].gpioPort, leds[i].gpioPin), GPIOCFG_OUT);
halGpioSet(PORTx_PIN(leds[i].gpioPort, leds[i].gpioPin), 1);
}
}
/* Configure GPIO for BUTTONSs */
{
ButtonResourceType *buttons = (ButtonResourceType *) boardDescription->io->buttons;
int8u i;
for (i = 0; i < boardDescription->buttons; i++) {
halGpioConfig(PORTx_PIN(buttons[i].gpioPort, buttons[i].gpioPin), GPIOCFG_IN_PUD);
halGpioSet(PORTx_PIN(buttons[i].gpioPort, buttons[i].gpioPin), GPIOOUT_PULLUP);
}
}
/* Configure GPIO for power amplifier */
if (boardDescription->flags & BOARD_HAS_PA) {
/* SiGe Ant Sel (default ceramic antenna) */
halGpioConfig(PORTB_PIN(5), GPIOCFG_OUT);
halGpioSet(PORTB_PIN(5), 1);
/* SiGe Standby (default out of standby) */
halGpioConfig(PORTB_PIN(6), GPIOCFG_OUT);
halGpioSet(PORTB_PIN(6), 1);
/* SiGe LNA (default LNA off )*/
halGpioConfig(PORTB_PIN(7), GPIOCFG_OUT);
halGpioSet(PORTB_PIN(7), 0);
/* SiGe nTX Active */
halGpioConfig(PORTC_PIN(5), GPIOCFG_OUT_ALT);
}
}
#ifdef TEST_COMMANDS
#include <stdio.h>
void printLeds (LedResourceType *leds)
{
while (leds->name != NULL) {
printf ("Led %s (port:%s, bit:%d)\r\n", leds->name, PORT_NAME(leds->gpioPort), leds->gpioPin);
leds++;
}
}
void printButtons (ButtonResourceType *buttons)
{
while (buttons->name != NULL) {
printf ("Button %s (port:%s, bit:%d)\r\n", buttons->name, PORT_NAME(buttons->gpioPort), buttons->gpioPin);
buttons++;
}
}
void boardPrintStringDescription(void)
{
int8u i = 0;
while (boardList[i] != NULL) {
if ((boardDescription == boardList[i]) || (boardDescription == NULL)) {
BoardResourcesType *ptr = boardList[i];
printf ("*************************************\r\n");
printf ("Board name = %s\r\n", ptr->name);
printf ("*************************************\r\n");
printLeds(ptr->leds);
printButtons(ptr->buttons);
if (ptr->mems) {
printf ("MEMS = %s\r\n", ptr->mems->name);
}
if (ptr->temperatureSensor) {
printf ("Temp sensor = %s, port:%s, pin:%d, adcFix:%s\r\n",
ptr->temperatureSensor->name,
PORT_NAME(ptr->temperatureSensor->gpioPort),
ptr->temperatureSensor->gpioPin,
ptr->temperatureSensor->adcFix ? "Yes" : "No"
);
}
printf ("EEProm:%s\r\n", ptr->EEProm ? "Yes" : "No");
printf ("PC i/f:%s\r\n", ptr->FTDInotSTM32 ? "FTDI" : "STM32F");
printf ("Power Amplifier:%s\r\n", ptr->PowerAmplifier ? "Yes" : "No");
}
i++;
}
return NULL;
}
#endif

View file

@ -12,18 +12,25 @@
void halInitButton(void)
{
/* Set GPIO pin to PUD (input pull-up or pull-down) for button S1 */
halGpioConfig(BUTTON_S1,GPIOCFG_IN_PUD);
/* Set the button S1 gpio pin to pull-up */
BUTTON_S1_OUTPUT_GPIO |= GPIOOUT_PULLUP << BUTTON_S1_GPIO_PIN;
int8u i;
/* Configure GPIO for BUTTONSs */
ButtonResourceType *buttons = (ButtonResourceType *) boardDescription->io->buttons;
for (i = 0; i < boardDescription->buttons; i++) {
halGpioConfig(PORTx_PIN(buttons[i].gpioPort, buttons[i].gpioPin), GPIOCFG_IN_PUD);
halGpioSet(PORTx_PIN(buttons[i].gpioPort, buttons[i].gpioPin), GPIOOUT_PULLUP);
}
}/* end halInitButton() */
int8u halGetButtonStatus(HalBoardButton button)
{
if (button == BUTTON_S1)
return (BUTTON_S1_INPUT_GPIO & (1<<BUTTON_S1_GPIO_PIN)) ? BUTTON_RELEASED : BUTTON_PRESSED;
else
return BUTTON_UNKNOWN;
int8u port = (button >> 3) & 0xf;
int8u pin = button & 0x7;
if (button != DUMMY_BUTTON)
{
return (BUTTON_INPUT_GPIO(port) & (1 << pin)) ? BUTTON_RELEASED : BUTTON_PRESSED;
}
return BUTTON_UNKNOWN;
}/* end halGetButtonStatus()*/

View file

@ -22,13 +22,17 @@
#error Improper PLATFORM_HEADER
#endif
#define GCC_VERSION (__GNUC__ * 10000 \
+ __GNUC_MINOR__ * 100 \
+ __GNUC_PATCHLEVEL__)
#if GCC_VERSION < 40302
#error Only GNU C version later than 4.3.2 are supported
#endif
#if (__GNUC__ < 4)
#error Only GNU C versions later than 4.3.2 are supported
#elif (__GNUC__ == 4)
#if (__GNUC_MINOR__ < 3)
#error Only GNU C versions later than 4.3.2 are supported
#elif (__GNUC_MINOR__ == 3)
#if (__GNUC_PATCHLEVEL__ < 2)
#error Only GNU C versions later than 4.3.2 are supported
#endif
#endif
#endif // __GNUC__
#ifndef DOXYGEN_SHOULD_SKIP_THIS
@ -36,6 +40,7 @@
#include <stdarg.h>
#if defined (CORTEXM3_STM32W108)
#include "micro/cortexm3/stm32w108/regs.h"
#include "micro/cortexm3/stm32w108/stm32w108_type.h"
#else
#error Unknown CORTEXM3 micro
#endif
@ -169,6 +174,16 @@ typedef unsigned int PointerType;
#endif
#endif
/**
* @brief Set the application start and end address.
* This are useful to detect whether an image is for bootloader mode or not.
* This can be used also to clone image to another node via bootloader.
*/
#define APPLICATION_IMAGE_START ((u32) &__ApplicationFlashStart)
#define APPLICATION_IMAGE_END ((u32) &__ApplicationFlashEnd)
extern char __ApplicationFlashStart;
extern char __ApplicationFlashEnd;
/**
* @brief Macro to reset the watchdog timer. Note: be very very
* careful when using this as you can easily get into an infinite loop if you
@ -252,6 +267,9 @@ void halInternalResetWatchDog(void);
#define VAR_AT_SEGMENT(__variableDeclaration, __segmentName) \
__variableDeclaration __attribute__ ((section (__segmentName)))
#define ALIGN_VAR(__variableDeclaration, alignment) \
__variableDeclaration __attribute__ ((aligned(alignment)))
////////////////////////////////////////////////////////////////////////////////
//@} // end of Miscellaneous Macros
////////////////////////////////////////////////////////////////////////////////

View file

@ -33,6 +33,9 @@
#include <stdarg.h>
#if defined (CORTEXM3_STM32W108)
#include "micro/cortexm3/stm32w108/regs.h"
#include "micro/cortexm3/stm32w108/stm32w108_type.h"
#elif defined (CORTEXM3_STM32F103)
#include "stm32f10x.h"
#else
#error Unknown CORTEXM3 micro
#endif
@ -163,6 +166,15 @@ typedef unsigned int PointerType;
#endif
#endif
/**
* @brief Set the application start and end address.
* This are useful to detect whether an image is for bootloader mode or not.
* This can be used also to clone image to another node via bootloader.
*/
#define APPLICATION_IMAGE_START ((u32) __section_begin("FLASH_IMAGE"))
#define APPLICATION_IMAGE_END ((u32) __section_end ("FLASH_IMAGE"))
/**
* @brief Macro to reset the watchdog timer. Note: be very very
* careful when using this as you can easily get into an infinite loop if you
@ -247,6 +259,11 @@ void halInternalResetWatchDog(void);
#define VAR_AT_SEGMENT(__variableDeclaration, __segmentName) \
__variableDeclaration @ __segmentName
#define _QUOTEME(a) #a
#define QUOTEME(a) _QUOTEME(a)
#define ALIGN_VAR(__variableDeclaration, alignment) _Pragma(QUOTEME(data_alignment=alignment)) \
__variableDeclaration
////////////////////////////////////////////////////////////////////////////////
//@} // end of Miscellaneous Macros
////////////////////////////////////////////////////////////////////////////////
@ -290,6 +307,8 @@ void halInternalResetWatchDog(void);
#pragma segment=__TEXTRW__
#pragma segment=__FAT__
#pragma segment=__NVM__
// Special pragma to get the application image start and end address
#pragma segment="FLASH_IMAGE"
/**@} */
//A utility function for inserting barrier instructions. These

View file

@ -0,0 +1,34 @@
/** @file iap_bootloader.h
* @brief IAP bootloader specific definitions
* <!--(C) COPYRIGHT 2010 STMicroelectronics. All rights reserved. -->
*/
/**
* @brief Application start address
*/
#define IAP_BOOTLOADER_APPLICATION_ADDRESS 0x08003000
/**
* @brief Radio PAN ID for OTA bootloader
*/
#define IAP_BOOTLOADER_PAN_ID 0xb00b
/**
* @brief Signature used for switch to application
*/
#define IAP_BOOTLOADER_APP_SWITCH_SIGNATURE 0xb001204d
/**
* @brief Radio default channel for OTA bootloader
*/
#define IAP_BOOTLOADER_DEFAULT_CHANNEL 0x0F
/**
* @brief IAP bootloader uart mode
*/
#define IAP_BOOTLOADER_MODE_UART 0
/**
* @brief IAP bootloader OTA mode
*/
#define IAP_BOOTLOADER_MODE_OTA 1

View file

@ -10,12 +10,6 @@
#include "hal/micro/micro-common.h"
#include "hal/micro/cortexm3/micro-common.h"
#define GPIO_PxCLR_BASE (GPIO_PACLR_ADDR)
#define GPIO_PxSET_BASE (GPIO_PASET_ADDR)
#define GPIO_PxOUT_BASE (GPIO_PAOUT_ADDR)
// Each port is offset from the previous port by the same amount
#define GPIO_Px_OFFSET (GPIO_PBCFGL_ADDR-GPIO_PACFGL_ADDR)
void halInitLed(void)
{
/* Set GPIO pins for Led D1 and Led D3 */
@ -28,16 +22,12 @@ void halInitLed(void)
void halSetLed(HalBoardLed led)
{
if(led/8 < 3) {
*((volatile int32u *)(GPIO_PxCLR_BASE+(GPIO_Px_OFFSET*(led/8)))) = BIT(led&7);
}
halGpioSet(led, 0);
}
void halClearLed(HalBoardLed led)
{
if(led/8 < 3) {
*((volatile int32u *)(GPIO_PxSET_BASE+(GPIO_Px_OFFSET*(led/8)))) = BIT(led&7);
}
halGpioSet(led, 1);
}
void halToggleLed(HalBoardLed led)

View file

@ -10,6 +10,8 @@
#ifndef LOADER
#if defined (CORTEXM3_STM32W108)
#include "hal/micro/cortexm3/stm32w108/memmap.h"
#elif defined (CORTEXM3_STM32F103)
#include "hal/micro/cortexm3/stm32f103ret/memmap.h"
#else
#error no appropriate micro defined
#endif

View file

@ -250,7 +250,7 @@ void halInternalSetRegTrim(boolean boostMode)
// the accuracy of OSCHF (much lower than XTAL).
void halCommonDelayMicroseconds(int16u us)
{
int32u beginTime = MAC_TIMER;
int32u beginTime = ReadRegister(MAC_TIMER);
//If we're not using the XTAL, the MAC Timer is running off OSCHF,
//that means the clock is half speed, 6MHz. We need to halve our delay

View file

@ -9,6 +9,7 @@
#include PLATFORM_HEADER
#include BOARD_HEADER
#include "error.h"
#include "hal/micro/micro-common.h"
#include "hal/micro/cortexm3/micro-common.h"
@ -59,11 +60,16 @@ void halGpioConfig(int32u io, int32u config)
*configRegs[io/4] = portcfg | (config <<((io&3)*4));
}
void halGpioSet(int32u gpio, boolean value)
{
if(gpio/8 < 3) {
if (value) {
*((volatile int32u *)(GPIO_PxSET_BASE+(GPIO_Px_OFFSET*(gpio/8)))) = BIT(gpio&7);
} else {
*((volatile int32u *)(GPIO_PxCLR_BASE+(GPIO_Px_OFFSET*(gpio/8)))) = BIT(gpio&7);
}
}
}
int16u halInternalStartSystemTimer(void)
{

View file

@ -24,24 +24,35 @@
#endif //__STSTATUS_TYPE__
#endif // DOXYGEN_SHOULD_SKIP_THIS
#define PORTA (0 << 3)
#define PORTB (1 << 3)
#define PORTC (2 << 3)
/**
* @brief Some registers and variables require indentifying GPIO by
* a single number instead of the port and pin. This macro converts
* Port A pins into a single number.
*/
#define PORTA_PIN(y) ((0<<3)|y)
#define PORTA_PIN(y) (PORTA|y)
/**
* @brief Some registers and variables require indentifying GPIO by
* a single number instead of the port and pin. This macro converts
* Port B pins into a single number.
*/
#define PORTB_PIN(y) ((1<<3)|y)
#define PORTB_PIN(y) (PORTB|y)
/**
* @brief Some registers and variables require indentifying GPIO by
* a single number instead of the port and pin. This macro converts
* Port C pins into a single number.
*/
#define PORTC_PIN(y) ((2<<3)|y)
#define PORTC_PIN(y) (PORTC|y)
/**
* @brief Some registers and variables require indentifying GPIO by
* a single number instead of the port and pin. This macro converts
* Port C pins into a single number.
*/
#define PORTx_PIN(x, y) (x|y)
/**
* @brief Resets the watchdog timer. This function is pointed
@ -62,6 +73,16 @@ void halInternalResetWatchDog( void );
*/
void halGpioConfig(int32u io, int32u config);
/**
* @brief Set/Clear single GPIO bit
*
* @param io The io pin to use, can be specified with the convenience macros
* PORTA_PIN(), PORTB_PIN(), PORTC_PIN()
* @param value A flag indicating whether to set or clear the io.
*
*/
void halGpioSet(int32u io, boolean value);
/**
* @brief Calibrates the internal SlowRC to generate a 1024 Hz (1kHz) clock.

View file

@ -6,15 +6,19 @@
*/
#include PLATFORM_HEADER
#include BOARD_HEADER
#include "error.h"
#include "hal/micro/micro-common.h"
#include "hal/micro/cortexm3/micro-common.h"
#include "micro/system-timer.h"
#include "micro/adc.h"
#include "micro/cortexm3/memmap.h"
#include "micro/cortexm3/iap_bootloader.h"
#include <stdlib.h>
#include <string.h>
extern void halBoardInit(void);
void halInit(void)
{
@ -24,6 +28,7 @@ void halInit(void)
//be deleted.
GPIO_DBGCFG &= ~GPIO_EXTREGEN;
halInternalSetRegTrim(FALSE);
halBoardInit();
halPowerUp();
halInternalCalibrateFastRc();
@ -54,6 +59,7 @@ void halReboot(void)
void halPowerDown(void)
{
halBoardPowerDown();
}
void halPowerUp(void)
@ -61,6 +67,7 @@ void halPowerUp(void)
halInternalInitAdc();
halCommonCalibratePads();
halInternalSwitchToXtal();
halBoardPowerUp();
}
static int16u seed0 = 0xbeef;
@ -106,3 +113,43 @@ void halCommonMemSet(void *dest, int8u val, int16u bytes)
{
memset(dest, val, bytes);
}
#pragma pack(1)
typedef struct appSwitchStruct {
int32u signature;
int8u mode;
int8u channel;
union {
int16u panID;
int16u offset;
} param;
} appSwitchStructType;
#pragma pack()
static appSwitchStructType *appSwitch = (appSwitchStructType *) RAM_BOTTOM;
StStatus halBootloaderStart(int8u mode, int8u channel, int16u panID)
{
if (mode == IAP_BOOTLOADER_MODE_UART) {
int8u cut = *(volatile int8u *) 0x08040798;
if (!( (halFixedAddressTable.baseTable.type == FIXED_ADDRESS_TABLE_TYPE) &&
( ( (halFixedAddressTable.baseTable.version & FAT_MAJOR_VERSION_MASK)
== 0x0000 ) &&
(halFixedAddressTable.baseTable.version == 0x0003) //checking presence of valid version
) && (cut >= 2) && (cut <= 3)))
/* Cut not supported */
return ST_ERR_FATAL;
} else {
/* Check that OTA bootloader is at the base of the flash */
if (*((int32u *) (MFB_BOTTOM + 28)) == IAP_BOOTLOADER_APP_SWITCH_SIGNATURE) {
appSwitch->channel = ((channel >= 11) && (channel <= 26)) ? channel :IAP_BOOTLOADER_DEFAULT_CHANNEL;
appSwitch->param.panID = panID;
} else {
return ST_ERR_FATAL;
}
}
appSwitch->signature = IAP_BOOTLOADER_APP_SWITCH_SIGNATURE;
appSwitch->mode = mode;
halReboot();
return (mode <= IAP_BOOTLOADER_MODE_OTA) ? ST_ERR_FATAL: ST_BAD_ARGUMENT;
}

View file

@ -10,6 +10,30 @@
#include PLATFORM_HEADER
#include "error.h"
#ifdef NVM_RAM_EMULATION
static int16u calibrationData[32+2]={
0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
};
int8u halCommonReadFromNvm(void *data, int32u offset, int16u length)
{
halCommonMemCopy(data, ((int8u *) calibrationData) + offset, length);
return ST_SUCCESS;
}
int8u halCommonWriteToNvm(const void *data, int32u offset, int16u length)
{
halCommonMemCopy(((int8u *) calibrationData) + offset, data, length);
return ST_SUCCESS;
}
#else
//flash.h gives access to halInternalFlashErase and halInternalFlashWrite.
#include "hal/micro/cortexm3/flash.h"
//nvm.h includes memmap.h. These two headers define the key parameters:
@ -375,3 +399,4 @@ int8u halCommonWriteToNvm(const void *data, int32u offset, int16u length)
}
}
#endif // NVM_RAM_EMULATION

View file

@ -99,9 +99,9 @@ _disableBasePri:
_basePriIsDisabled:
MRS R0, BASEPRI // read current BASEPRI
CMP R0, #INTERRUPTS_DISABLED_PRIORITY
ITE le
LDRLE R0, =1
LDRGT R0, =0
ITE lt
LDRLT R0, =0
LDRGE R0, =1
BX LR
__CFI__(EndBlock cfiBlock3)

View file

@ -1,24 +1,221 @@
/** @file board.h
* @brief Header file x STM32W108 Kits boards
* @brief Header file x STM32W108 Kits boards abstraction.
* See @ref board for documentation.
*
*
* See hal/micro/cortexm3/stm32w108/board.h for source code.
*
* <!--(C) COPYRIGHT 2010 STMicroelectronics. All rights reserved. -->
*/
#ifndef _BOARD_H_
#define _BOARD_H_
#ifdef BOARD_MB851
/** @addtogroup board
* @brief ST board abstraction layer
*
* This header defines API and data structures to handle ST boards with thei associated resources
* on algorithm behavior.
* See hal/micro/cortexm3/stm32w108/board.h for source code.
*@{
*/
/**
* @brief Define the number of LEDs in the specific board revision
*/
#define LEDS_MB851A 2
/**
* @brief Define the number of LEDs in the specific board revision
*/
#define LEDS_MB851B 2
/**
* @brief Define the number of LEDs in the specific board revision
*/
#define LEDS_MB851C 2
/**
* @brief Define the number of LEDs in the specific board revision
*/
#define LEDS_MB954A 2
/**
* @brief Define the number of LEDs in the specific board revision
*/
#define LEDS_MB954B 2
/**
* @brief Define the number of LEDs in the specific board revision
*/
#define LEDS_MB950A 2
/**
* @brief Define the number of LEDs in the specific board revision
*/
#define LEDS_MB951A 2
/**
* @brief Define the number of user buttons in the specific board revision
*/
#define BUTTONS_MB851A 1
/**
* @brief Define the number of user buttons in the specific board revision
*/
#define BUTTONS_MB851B 1
/**
* @brief Define the number of user buttons in the specific board revision
*/
#define BUTTONS_MB851C 1
/**
* @brief Define the number of user buttons in the specific board revision
*/
#define BUTTONS_MB954A 1
/**
* @brief Define the number of user buttons in the specific board revision
*/
#define BUTTONS_MB954B 1
/**
* @brief Define the number of user buttons in the specific board revision
*/
#define BUTTONS_MB950A 5
/**
* @brief Define the number of user buttons in the specific board revision
*/
#define BUTTONS_MB951A 0
/**
* @brief Data structure for led description
*/
typedef struct LedResourceStruct {
/** Name of the LED as printed in the board */
char *name;
/** GPIO port associated with the LED */
int8u gpioPort;
/** GPIO pin associated with the LED */
int8u gpioPin;
} LedResourceType;
typedef LedResourceType InfraRedLedResourceType;
/**
* @brief Data structure for button description
*/
typedef struct ButtonResourceStruct {
/** Name of the button as printed in the board */
char *name;
/** GPIO port associated with the button */
int8u gpioPort;
/** GPIO pin associated with the button */
int8u gpioPin;
} ButtonResourceType;
/**
* @brief Data structure for MEMS description
*/
typedef struct MemsResourceStruct {
/** Name of the MEMS device */
char *name;
/** Serial communication port associated with the MEMS */
int8u scPort;
} MemsResourceType;
/**
* @brief Data structure for temperature sensor description
*/
typedef struct TempSensorResourceStruct {
/** Name of the temperature sensor device */
char *name;
/** GPIO port associated with the sensor */
int8u gpioPort;
/** GPIO pin associated with the sensor */
int8u gpioPin;
/** Flag to indicate whether the ADC range extension bug fix is implemented */
boolean adcFix;
} TempSensorResourceType;
/**
* @brief Data structure for board user I/O
*/
typedef struct BoardIOStruct {
/** Pointer to LED resources */
const LedResourceType *leds;
/** Pointer to button resources */
const ButtonResourceType *buttons;
} BoardIOType;
/**
* @brief Flag to indicate if MEMS is present
*/
#define BOARD_HAS_MEMS (1 << 0)
/**
* @brief Flag to indicate if temeprature sensor is present
*/
#define BOARD_HAS_TEMP_SENSOR (1 << 1)
/**
* @brief Flag to indicate if external power amplifier is present
*/
#define BOARD_HAS_PA (1 << 2)
/**
* @brief Flag to indicate if EEPROM is present
*/
#define BOARD_HAS_EEPROM (1 << 3)
/**
* @brief Flag to indicate if FTDI is used as PC interface
*/
#define BOARD_HAS_FTDI (1 << 4)
/**
* @brief Flag to indicate if STM32F is used as PC interface
*/
#define BOARD_HAS_STM32F (1 << 5)
/**
* @brief Data structure describing board features
*/
typedef struct BoardResourcesStruct {
const char *name;
const int32u flags;
/** Number of buttons */
int8u buttons;
/** Number of leds */
int8u leds;
/** Board I/O description */
const BoardIOType *io;
/** Board infrared led description */
const InfraRedLedResourceType* infraredLed;
/** Board infrared MEMS description */
const MemsResourceType *mems;
/** Board infrared temeprature sensor description */
const TempSensorResourceType *temperatureSensor;
} BoardResourcesType;
extern BoardResourcesType const *boardDescription;
// Generic definitions
#define GPIO_PxCLR_BASE (GPIO_PACLR_ADDR)
#define GPIO_PxSET_BASE (GPIO_PASET_ADDR)
#define GPIO_PxOUT_BASE (GPIO_PAOUT_ADDR)
#define GPIO_PxIN_BASE (GPIO_PAIN_ADDR)
// Each port is offset from the previous port by the same amount
#define GPIO_Px_OFFSET (GPIO_PBCFGL_ADDR-GPIO_PACFGL_ADDR)
/* leds definitions */
#define LED_D1 PORTB_PIN(6)
#define LED_D3 PORTB_PIN(5)
#define LED_D1 PORTx_PIN(boardDescription->io->leds[0].gpioPort, boardDescription->io->leds[0].gpioPin) //PORTB_PIN(6)
#define LED_D3 PORTx_PIN(boardDescription->io->leds[1].gpioPort, boardDescription->io->leds[1].gpioPin) // PORTB_PIN(5)
#define DUMMY_LED 0xff
/** Description buttons definition */
#define BUTTON_S1 PORTA_PIN(7)
#define BUTTON_S1_INPUT_GPIO GPIO_PAIN
#define BUTTON_S1_OUTPUT_GPIO GPIO_PAOUT
#define BUTTON_S1_GPIO_PIN PA7_BIT
#define BUTTON_S1_WAKE_SOURCE 0x00000080
#define BUTTON_Sn(n) (PORTx_PIN(boardDescription->io->buttons[n].gpioPort, boardDescription->io->buttons[n].gpioPin))
#define BUTTON_Sn_WAKE_SOURCE(n) (1 << ((boardDescription->io->buttons[n].gpioPin) + (8 * (boardDescription->io->buttons[n].gpioPort >> 3))))
#define BUTTON_INPUT_GPIO(port) *((volatile int32u *) (GPIO_PxIN_BASE + GPIO_Px_OFFSET * port))
#define DUMMY_BUTTON 0xff
#define BUTTON_S1 (boardDescription->buttons>0 ? BUTTON_Sn(0): DUMMY_BUTTON)
#define BUTTON_S2 (boardDescription->buttons>1 ? BUTTON_Sn(1): DUMMY_BUTTON)
#define BUTTON_S3 (boardDescription->buttons>2 ? BUTTON_Sn(2): DUMMY_BUTTON)
#define BUTTON_S4 (boardDescription->buttons>3 ? BUTTON_Sn(3): DUMMY_BUTTON)
#define BUTTON_S5 (boardDescription->buttons>4 ? BUTTON_Sn(4): DUMMY_BUTTON)
#define BUTTON_S1_WAKE_SOURCE (boardDescription->buttons>0 ? BUTTON_Sn_WAKE_SOURCE(0): 0)
#define BUTTON_S2_WAKE_SOURCE (boardDescription->buttons>1 ? BUTTON_Sn_WAKE_SOURCE(1): 0)
#define BUTTON_S3_WAKE_SOURCE (boardDescription->buttons>2 ? BUTTON_Sn_WAKE_SOURCE(2): 0)
#define BUTTON_S4_WAKE_SOURCE (boardDescription->buttons>3 ? BUTTON_Sn_WAKE_SOURCE(3): 0)
#define BUTTON_S5_WAKE_SOURCE (boardDescription->buttons>4 ? BUTTON_Sn_WAKE_SOURCE(4): 0)
/** Description uart definition */
#define UART_TX PORTB_PIN(1)
@ -26,8 +223,37 @@
#define UART_RX_WAKE_SOURCE 0x00000400
/** Description temperature sensor GPIO */
#define TEMPERATURE_SENSOR_GPIO PORTB_PIN(7)
#endif /* BOARD_MB851 */
#define TEMPERATURE_SENSOR_GPIO PORTx_PIN(boardDescription->temperatureSensor->gpioPort, boardDescription->temperatureSensor->gpioPin) // PORTB_PIN(7)
/** @brief Return pointer to board description structure
*
*
* @return Pointer to board description structure
*/
BoardResourcesType const *halBoardGetDescription(void);
/**
* @brief Initialize the board description data structure after
* autodetect of the boards based on the CIB Board name field
* content. In case of invalid CIB data it will default to MB851A.
* Customer normally needs to modify this file to adapt it to their specific board.
*/
void halBoardInit(void);
/**
* @brief Perform board specific action to power up the system.
* This code depends on the actual board features and configure
* the stm32w and on board devices for proper operation.
* Customer normally needs to modify this file to adapt it to their specific board.
*/
void halBoardPowerUp(void);
/**
* @brief Perform board specific action to power down the system, usually before going to deep sleep.
* This code depends on the actual board features and configure
* the stm32w and on board devices for minimal power consumption.
* Customer normally needs to modify this file to adapt it to their specific board.
*/
void halBoardPowerDown(void);
#endif /* _BOARD_H_ */
/** @} // END addtogroup
*/

View file

@ -20,8 +20,8 @@
#include <stdio.h>
#include <sys/stat.h>
#define RESERVED 0
//#define DUMMY_MALLOC
#define IAP_BOOTLOADER_APP_SWITCH_SIGNATURE 0xb001204d
#define IAP_BOOTLOADER_MODE_UART 0
/* Includes ----------------------------------------------------------------------*/
#include PLATFORM_HEADER
void NMI_Handler(void);
@ -72,7 +72,7 @@ VAR_AT_SEGMENT(const HalFixedAddressTableType halFixedAddressTable, __FAT__);
/* function prototypes ------------------------------------------------------*/
void Reset_Handler(void) __attribute__((__interrupt__));
extern int main(void);
extern void halInternalSwitchToXtal(void);
/******************************************************************************
*
@ -121,6 +121,20 @@ void (* const g_pfnVectors[])(void) =
halDebugIsr, // 32
};
static void setStackPointer(int32u address) __attribute__((noinline));
static void setStackPointer(int32u address)
{
// This code is needed to generate the instruction below
// that GNU ASM is refusing to add
// asm("MOVS SP, r0");
asm(".short 0x4685");
}
static const int16u blOffset[] = {
0x0715 - 0x03ad - 0x68,
0x0719 - 0x03ad - 0x6C
};
/*******************************************************************************
* Function Name : Reset_Handler
* Description : This is the code that gets called when the processor first starts execution
@ -244,6 +258,21 @@ void Reset_Handler(void)
while(1) { ; }
}
//USART bootloader software activation check
if ((*((int32u *)RAM_BOTTOM) == IAP_BOOTLOADER_APP_SWITCH_SIGNATURE) && (*((int8u *)(RAM_BOTTOM+4)) == IAP_BOOTLOADER_MODE_UART)){
int8u cut = *(volatile int8u *) 0x08040798;
int16u offset = 0;
typedef void (*EntryPoint)(void);
offset = (halFixedAddressTable.baseTable.version == 3) ? blOffset[cut - 2] : 0;
*((int32u *)RAM_BOTTOM) = 0;
if (offset) {
halInternalSwitchToXtal();
}
EntryPoint entryPoint = (EntryPoint)(*(int32u *)(FIB_BOTTOM+4) - offset);
setStackPointer(*(int32u *)FIB_BOTTOM);
entryPoint();
}
INTERRUPTS_OFF();
asm("CPSIE i");
@ -302,12 +331,10 @@ caddr_t _sbrk ( int incr )
return (caddr_t) prev_heap;
}
#else
# ifdef DUMMY_MALLOC
caddr_t _sbrk ( int incr )
{
return NULL;
}
# endif
#endif
int _lseek (int file,
int ptr,

View file

@ -13,71 +13,65 @@ GROUP(
These are used by the startup in order to allocate stacks for the different modes.
*/
__Stack_Size = 0x500 ;
__Stack_Size = 0x400 ;
PROVIDE ( _Stack_Size = __Stack_Size ) ;
__Stack_Init = _estack - __Stack_Size ;
__Stack_Init = 0x20000000;
_estack = __Stack_Init + __Stack_Size;
/*"PROVIDE" allows to easily override these values from an object file or the commmand line.*/
PROVIDE ( _Stack_Init = __Stack_Init ) ;
/*
There will be a link error if there is not this amount of RAM free at the end.
*/
_Minimum_Stack_Size = 0x500 ;
/*
this sends all unreferenced IRQHandlers to reset
*/
PROVIDE(Default_Handler = 0 );
PROVIDE(NMI_Handler = Default_Handler );
PROVIDE(HardFault_Handler = Default_Handler );
PROVIDE(MemManage_Handler = Default_Handler );
PROVIDE(BusFault_Handler = Default_Handler );
PROVIDE(UsageFault_Handler = Default_Handler );
PROVIDE(SVC_Handler = Default_Handler );
PROVIDE(DebugMonitor_Handler = Default_Handler );
PROVIDE(PendSV_Handler = Default_Handler );
PROVIDE(SysTick_Handler = Default_Handler );
PROVIDE(halTimer1Isr = Default_Handler );
PROVIDE(halTimer2Isr = Default_Handler );
PROVIDE(halManagementIsr = Default_Handler );
PROVIDE(halBaseBandIsr = Default_Handler );
PROVIDE(halSleepTimerIsr = Default_Handler );
PROVIDE(halSc1Isr = Default_Handler );
PROVIDE(halSc2Isr = Default_Handler );
PROVIDE(halSecurityIsr = Default_Handler );
PROVIDE(halStackMacTimerIsr = Default_Handler );
PROVIDE(stmRadioTransmitIsr = Default_Handler );
PROVIDE(stmRadioReceiveIsr = Default_Handler );
PROVIDE(halAdcIsr = Default_Handler );
PROVIDE(halIrqAIsr = Default_Handler );
PROVIDE(halIrqBIsr = Default_Handler );
PROVIDE(halIrqCIsr = Default_Handler );
PROVIDE(halIrqDIsr = Default_Handler );
PROVIDE(halDebugIsr = Default_Handler );
/*PROVIDE(stSerialPrintf = printf );*/
PROVIDE(NMI_Handler = 0 );
PROVIDE(HardFault_Handler = 0 );
PROVIDE(MemManage_Handler = 0 );
PROVIDE(BusFault_Handler = 0 );
PROVIDE(UsageFault_Handler = 0 );
PROVIDE(SVC_Handler = 0 );
PROVIDE(DebugMonitor_Handler = 0 );
PROVIDE(PendSV_Handler = 0 );
PROVIDE(SysTick_Handler = 0 );
PROVIDE(halTimer1Isr = 0 );
PROVIDE(halTimer2Isr = 0 );
PROVIDE(halManagementIsr = 0 );
PROVIDE(halBaseBandIsr = 0 );
PROVIDE(halSleepTimerIsr = 0 );
PROVIDE(halSc1Isr = 0 );
PROVIDE(halSc2Isr = 0 );
PROVIDE(halSecurityIsr = 0 );
PROVIDE(halStackMacTimerIsr = 0 );
PROVIDE(stmRadioTransmitIsr = 0 );
PROVIDE(stmRadioReceiveIsr = 0 );
PROVIDE(halAdcIsr = 0 );
PROVIDE(halIrqAIsr = 0 );
PROVIDE(halIrqBIsr = 0 );
PROVIDE(halIrqCIsr = 0 );
PROVIDE(halIrqDIsr = 0 );
PROVIDE(halDebugIsr = 0 );
/******************************************************************************/
/* Peripheral memory map */
/******************************************************************************/
/*this allows to compile the ST lib in "non-debug" mode*/
_BOOTLOADER_SIZE = 0x3000 ;
_ROM_base = DEFINED(ST_BTL) ? (0x08000000 + _BOOTLOADER_SIZE) : 0x08000000 ;
/* include the memory spaces definitions sub-script */
MEMORY
{
RAM_region (xrw) : ORIGIN = 0x20000000, LENGTH = 8K
ROM_region (rx) : ORIGIN = 0x08000000, LENGTH = 128K-3K
NVM_region (rx) : ORIGIN = 0x0801F400, LENGTH = 3K
ROM_region (rx) : ORIGIN = 0x08000000, LENGTH = 128K-2K
NVM_region (rx) : ORIGIN = 0x0801F800, LENGTH = 2K
FIB_region (ra) : ORIGIN = 0x08040000, LENGTH = 2K
}
/* higher address of the user mode stack */
_estack = 0x20002000;
/* Sections management for FLASH mode */
@ -87,9 +81,12 @@ SECTIONS
{
/* for Cortex devices, the beginning of the startup code is stored in the .isr_vector section, which goes to FLASH */
.isr_vector :
.isr_vector (DEFINED(ST_BTL) ? (0x08000000 + _BOOTLOADER_SIZE) : 0x08000000) :
{
. = ALIGN(4);
__ApplicationFlashStart = . ;
/* . = . + _ROM_base ;*/
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} >ROM_region
@ -113,24 +110,12 @@ SECTIONS
*(.rodata*)
*(.glue_7)
*(.glue_7t)
. = ALIGN(1024);
*(.elf_text)
. = ALIGN(1024);
/*. = ALIGN(4);*/
. = ALIGN(4);
_etext = .;
/* This is used by the startup in order to initialize the .data section */
/* This is used by the startup in order to initialize the .data secion */
_sidata = _etext;
} >ROM_region
.coffee 0x08010000 :
{
_coffee_start = ABSOLUTE(.);
. = ALIGN(1024);
*(.coffeefiles)
. = ORIGIN(NVM_region) - _coffee_start;
} > ROM_region = 0x00
NVM (NOLOAD):
{
. = ALIGN(1024);
@ -146,6 +131,12 @@ SECTIONS
. = ALIGN(4);
} > FIB_region
/*
.FAT (NOLOAD):
{
KEEP(*(.FAT))
} > FIB_region
*/
/* after that it's only debugging information. */
@ -153,10 +144,10 @@ SECTIONS
The program executes knowing that the data is in the RAM
but the loader puts the initial values in the FLASH (inidata).
It is one task of the startup to copy the initial values from FLASH to RAM. */
.data : AT ( _sidata )
.data _estack : AT ( _sidata )
{
. = ALIGN(4);
/* This is used by the startup in order to initialize the .data section */
/* This is used by the startup in order to initialize the .data secion */
_sdata = . ;
*(.data)
@ -165,10 +156,10 @@ SECTIONS
. = ALIGN(4);
/* This is used by the startup in order to initialize the .data secion */
_edata = . ;
ASSERT(_sidata + SIZEOF(.data) < LOADADDR(.coffee), ".data section overflow in ROM");
} >RAM_region
/* This is the uninitialized data section */
.bss :
{
@ -177,6 +168,7 @@ SECTIONS
_sbss = .;
*(.bss)
*(.bss.*)
*(COMMON)
. = ALIGN(4);
@ -187,21 +179,6 @@ SECTIONS
PROVIDE ( end = _ebss );
PROVIDE ( _end = _ebss );
/* This is the user stack section
This is just to check that there is enough RAM left for the User mode stack
It should generate an error if it's full.
*/
._usrstack :
{
. = ALIGN(4);
_susrstack = . ;
. = . + _Minimum_Stack_Size ;
. = ALIGN(4);
_eusrstack = . ;
} >RAM_region
__exidx_start = .;
__exidx_end = .;
@ -247,3 +224,5 @@ SECTIONS
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
}
__ApplicationFlashEnd = _sidata + (_edata - _sdata);

View file

@ -1,13 +1,21 @@
if( isdefinedsymbol(ST_BTL) ) {
define symbol __ICFEDIT_intvec_start__ = 0x08003000;
define symbol __ICFEDIT_region_ROM_start__ = 0x08003000;
} else {
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
}
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF;
define symbol __ICFEDIT_region_FIB_start__ = 0x08040000;
define symbol __ICFEDIT_region_FIB_end__ = 0x080407FF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x500;
define symbol __ICFEDIT_size_cstack__ = 0x400;
define memory mem with size = 4G;
@ -15,16 +23,17 @@ define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFED
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block FLASH_IMAGE with fixed order { readonly section .intvec, readonly } ;
initialize by copy { readwrite };
do not initialize { section .noinit,
section FAT,
section NVM };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at address mem:__ICFEDIT_region_FIB_start__ { section FAT };
place in ROM_region { readonly };
place in ROM_region { block FLASH_IMAGE };
place at end of ROM_region { section NVM };
place in RAM_region { readwrite,
block CSTACK };

View file

@ -31,10 +31,24 @@ extern "C" {
__root __no_init const HalFixedAddressTableType halFixedAddressTable @ __FAT__;
extern const HalVectorTableType __vector_table[];
extern void halInternalSwitchToXtal(void);
#define IAP_BOOTLOADER_APP_SWITCH_SIGNATURE 0xb001204d
#define IAP_BOOTLOADER_MODE_UART 0
__interwork int __low_level_init(void);
static void setStackPointer(int32u address)
{
asm("MOVS SP, r0");
}
static const int16u blOffset[] = {
0x0715 - 0x03ad - 0x68,
0x0719 - 0x03ad - 0x6C
};
__interwork int __low_level_init(void)
{
//Ensure there is enough margin on VREG_1V8 for stable RAM reads by
@ -154,6 +168,21 @@ __interwork int __low_level_init(void)
while(1) { ; }
}
//USART bootloader software activation check
if ((*((int32u *)RAM_BOTTOM) == IAP_BOOTLOADER_APP_SWITCH_SIGNATURE) && (*((int8u *)(RAM_BOTTOM+4)) == IAP_BOOTLOADER_MODE_UART)){
int8u cut = *(volatile int8u *) 0x08040798;
int16u offset = 0;
typedef void (*EntryPoint)(void);
offset = (halFixedAddressTable.baseTable.version == 3) ? blOffset[cut - 2] : 0;
*((int32u *)RAM_BOTTOM) = 0;
if (offset) {
halInternalSwitchToXtal();
}
EntryPoint entryPoint = (EntryPoint)(*(int32u *)(FIB_BOTTOM+4) - offset);
setStackPointer(*(int32u *)FIB_BOTTOM);
entryPoint();
}
INTERRUPTS_OFF();
asm("CPSIE i");

View file

@ -2,6 +2,9 @@
#define __REGS_H__ 1
#define ReadRegister(a) a
#define WriteRegister(a, b) a = b
/* FLASH_BASE block */
#define DATA_FLASH_BASE_BASE (0x00000000u)
#define DATA_FLASH_BASE_END (0x0001FFFFu)

View file

@ -29,18 +29,17 @@ void temperatureSensor_Init(void)
#endif /* ENABLE_ADC_EXTENDED_RANGE_BROKEN */
}/* end temperatureSensor_Init() */
int32u temperatureSensor_GetValue(int8u type)
int32u temperatureSensor_GetValue(void)
{
static int16u ADCvalue;
static int16s volts;
/*
NOTE:
The ADC extended range is inaccurate due to the high voltage mode bug of the general purpose ADC
(see STM32W108 errata). As consequence, it is not reccomended to use this ADC driver for getting
the temperature values.
*/
#ifdef ENABLE_ADC_EXTENDED_RANGE_BROKEN
/*
NOTE:
The ADC extended range is inaccurate due to the high voltage mode bug of the general purpose ADC
(see STM32W108 errata). As consequence, it is not reccomended to use this ADC driver for getting
the temperature values.
*/
halStartAdcConversion(ADC_USER_APP, ADC_REF_INT, ADC_SOURCE_ADC2_VREF2, ADC_CONVERSION_TIME_US_4096);
halReadAdcBlocking(ADC_USER_APP, &ADCvalue); // This blocks for a while, about 4ms.
@ -49,6 +48,5 @@ int32u temperatureSensor_GetValue(int8u type)
volts = halConvertValueToVolts(ADCvalue);
return ((18641 - (int32s)volts)*100)/1171;
#endif /* ENABLE_ADC_EXTENDED_RANGE_BROKEN */
}/* end temperatureSensor_GetValue() */

View file

@ -135,18 +135,6 @@
int8s halCommonMemCompare(const void *source0, const void *source1, int8u bytes);
/**
* @brief Works like C stdlib memcmp(), but takes a flash space source
* parameter.
*/
int8s halCommonMemPGMCompare(const void *source0, void PGM *source1, int8u bytes);
/**
* @brief Same as the C stdlib memcpy(), but handles copying from const
* program space.
*/
void halCommonMemPGMCopy(void* dest, void PGM *source, int8u bytes);
/**
* @brief Friendly convenience macro pointing to the full HAL function.
*/

View file

@ -49,16 +49,9 @@ void halSetLed(HalBoardLed led);
*/
void halClearLed(HalBoardLed led);
/** @brief Called by the stack to indicate activity over the radio (for
* both transmission and reception). It is called once with \c turnOn TRUE and
* shortly thereafter with \c turnOn FALSE.
*
* Typically does something interesting, such as change the state of
* an LED.
*
* @param turnOn See Usage.
*/
void halStackIndicateActivity(boolean turnOn);
#ifdef CORTEXM3_STM32F103
#include "micro/cortexm3/stm32f103ret/led-specific.h"
#endif
/** @} // END addtogroup
*/

View file

@ -15,6 +15,15 @@
#ifndef __MICRO_COMMON_H__
#define __MICRO_COMMON_H__
#ifndef DOXYGEN_SHOULD_SKIP_THIS
#ifndef __STSTATUS_TYPE__
#define __STSTATUS_TYPE__
//This is necessary here because halSleepForQsWithOptions returns an
//StStatus and not adding this typedef to this file breaks a
//whole lot of builds.
typedef int8u StStatus;
#endif //__STSTATUS_TYPE__
#endif // DOXYGEN_SHOULD_SKIP_THIS
/** @brief Initializes microcontroller-specific peripherals.
*/
@ -109,6 +118,28 @@ enum
*/
void halCommonDelayMicroseconds(int16u us);
/** @brief Request the appplication to enter in bootloader mode
*
* This function will check whwther the user flash contains the bootloader
* and if yes it will jump into it according to the user parameters.
*
*
* @param mode The bootloader mode, 0 UART mode, 1 RF mode. All other
* values are reserved
* @param channel The channel where the booloader will operate. 0 means
* default channel (only vaild for RF mode).
* @param panID The panID where the booloader will operate. 0xFFFF means
* default panID (only vaild for RF mode).
* @return An error code or it will never return.
*/
StStatus halBootloaderStart(int8u mode, int8u channel, int16u panId);
#ifdef CORTEXM3_STM32F103
#include "micro/cortexm3/stm32f103ret/micro-specific.h"
#endif
#ifdef CORTEXM3_STM32W108
#include "micro/cortexm3/micro-common.h"
#endif
#endif //__MICRO_COMMON_H__

View file

@ -48,9 +48,9 @@ int16u halInternalStartSystemTimer(void);
* @return The least significant 16 bits of the current system time, in system
* ticks.
*/
//#pragma pagezero_on // place this function in zero-page memory for xap
#pragma pagezero_on // place this function in zero-page memory for xap
int16u halCommonGetInt16uMillisecondTick(void);
//#pragma pagezero_off
#pragma pagezero_off
/**
* @brief Returns the current system time in system ticks, as a 32-bit

View file

@ -21,7 +21,7 @@ void temperatureSensor_Init(void);
/** @brief Get temperature sensor value
*/
int32u temperatureSensor_GetValue(int8u type);
int32u temperatureSensor_GetValue(void);
#endif /* _TEMP_SENSOR_H_ */

View file

@ -1,10 +1,17 @@
if( isdefinedsymbol(ST_BTL) ) {
define symbol __ICFEDIT_intvec_start__ = 0x08003000;
define symbol __ICFEDIT_region_ROM_start__ = 0x08003000;
} else {
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x0800FFFF;
define symbol __ICFEDIT_region_CFS_start__ = 0x08010000; /* Reserved for contiki flash file system. COFFEE_ADDRESS must be changed also in cfs-coffee-arch.h */
}
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF;
define symbol __ICFEDIT_region_CFS_start__ = 0x08010c00; /* Reserved for contiki flash file system. COFFEE_ADDRESS must be changed also in cfs-coffee-arch.h */
define symbol __ICFEDIT_region_CFS_end__ = 0x0801F3FF;
define symbol __ICFEDIT_region_NVM_start__ = 0x0801F400;
define symbol __ICFEDIT_region_NVM_start__ = 0x0801F800;
define symbol __ICFEDIT_region_NVM_end__ = 0x0801FFFF;
define symbol __ICFEDIT_region_FIB_start__ = 0x08040000;
define symbol __ICFEDIT_region_FIB_end__ = 0x080407FF;
@ -14,6 +21,7 @@ define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF;
define symbol __ICFEDIT_size_cstack__ = 0x500;
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region CFS_region = mem:[from __ICFEDIT_region_CFS_start__ to __ICFEDIT_region_CFS_end__];
@ -21,17 +29,17 @@ define region NVM_region = mem:[from __ICFEDIT_region_NVM_start__ to __ICFED
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block FLASH_IMAGE with fixed order { readonly section .intvec, readonly } ;
initialize by copy { readwrite };
do not initialize { section .noinit,
section FAT,
section NVM };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place at address mem:__ICFEDIT_region_FIB_start__ { section FAT };
place in ROM_region { readonly };
place in ROM_region { block FLASH_IMAGE };
place in CFS_region { section .coffeefiles };
place in NVM_region { section NVM };
place in RAM_region { readwrite,
block CSTACK };

39
cpu/stm32w108/iar-cfg.icf Normal file
View file

@ -0,0 +1,39 @@
if( isdefinedsymbol(ST_BTL) ) {
define symbol __ICFEDIT_intvec_start__ = 0x08003000;
define symbol __ICFEDIT_region_ROM_start__ = 0x08003000;
} else {
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
}
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_end__ = 0x0801FFFF;
define symbol __ICFEDIT_region_FIB_start__ = 0x08040000;
define symbol __ICFEDIT_region_FIB_end__ = 0x080407FF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x500;
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block FLASH_IMAGE with fixed order { readonly section .intvec, readonly } ;
initialize by copy { readwrite };
do not initialize { section .noinit,
section FAT,
section NVM };
place at address mem:__ICFEDIT_region_FIB_start__ { section FAT };
place in ROM_region { block FLASH_IMAGE };
place at end of ROM_region { section NVM };
place in RAM_region { readwrite,
block CSTACK };

View file

@ -5,7 +5,6 @@
* <!--(C) COPYRIGHT 2010 STMicroelectronics. All rights reserved. -->
*/
#include "stm32w108_type.h"
//---------------------------------------------------------------------------
// Definitions
@ -30,7 +29,7 @@
/**
* @brief Version patch number
*/
#define SIMPLEMAC_VERSION_PATCH 0
#define SIMPLEMAC_VERSION_PATCH 2
/**
* @brief Version qualifier

View file

@ -5,7 +5,7 @@ ARCH= irq.c sensors.c acc-sensor.c button-sensor.c temperature-sensor.c mems.c
CONTIKI_TARGET_DIRS = . dev
ifndef CONTIKI_TARGET_MAIN
CONTIKI_TARGET_MAIN = contiki-main.c #contiki-init-net.c
CONTIKI_TARGET_MAIN = contiki-main.c board-mb851.c
endif
ifdef UIP_CONF_IPV6

View file

@ -0,0 +1,47 @@
#include PLATFORM_HEADER
#include BOARD_HEADER
void halBoardInit(void)
{
return;
}
void halBoardPowerDown(void)
{
}
void halBoardPowerUp(void)
{
/* Set everything to input value */
GPIO_PACFGL = (GPIOCFG_IN <<PA0_CFG_BIT)|
(GPIOCFG_IN <<PA1_CFG_BIT)|
(GPIOCFG_IN <<PA2_CFG_BIT)|
(GPIOCFG_IN <<PA3_CFG_BIT);
GPIO_PACFGH = (GPIOCFG_IN <<PA4_CFG_BIT)| /* PTI EN */
(GPIOCFG_IN <<PA5_CFG_BIT)| /* PTI_DATA */
(GPIOCFG_IN <<PA6_CFG_BIT)|
(GPIOCFG_IN <<PA7_CFG_BIT);
GPIO_PBCFGL = (GPIOCFG_IN <<PB0_CFG_BIT)|
(GPIOCFG_OUT_ALT <<PB1_CFG_BIT)| /* Uart TX */
(GPIOCFG_IN <<PB2_CFG_BIT)| /* Uart RX */
(GPIOCFG_IN <<PB3_CFG_BIT);
GPIO_PBCFGH = (GPIOCFG_IN <<PB4_CFG_BIT)|
(GPIOCFG_IN <<PB5_CFG_BIT)|
(GPIOCFG_IN <<PB6_CFG_BIT)|
(GPIOCFG_IN <<PB7_CFG_BIT);
GPIO_PCCFGL = (GPIOCFG_IN <<PC0_CFG_BIT)|
(GPIOCFG_IN <<PC1_CFG_BIT)|
(GPIOCFG_IN <<PC2_CFG_BIT)|
(GPIOCFG_IN <<PC3_CFG_BIT);
GPIO_PCCFGH = (GPIOCFG_IN <<PC4_CFG_BIT)|
(GPIOCFG_IN <<PC5_CFG_BIT)|
#ifdef EMBERZNET_HAL
(CFG_C6 <<PC6_CFG_BIT)| /* OSC32K */
(CFG_C7 <<PC7_CFG_BIT); /* OSC32K */
#else
(GPIOCFG_IN <<PC6_CFG_BIT)| /* OSC32K */
(GPIOCFG_IN <<PC7_CFG_BIT); /* OSC32K */
#endif
}

View file

@ -48,6 +48,15 @@
#define DEBOUNCE 1
/**
* @brief Port and pin for BUTTON0.
*/
#undef BUTTON_S1
#define BUTTON_S1 PORTA_PIN(7)
#define BUTTON_S1_INPUT_GPIO BUTTON_INPUT_GPIO(PORTA)
#define BUTTON_S1_GPIO_PIN 7
#define BUTTON_S1_OUTPUT_GPIO GPIO_PAOUT
/**
* @brief Point the proper IRQ at the desired pin for BUTTON0.
*/
@ -88,6 +97,8 @@ init(void)
timer_set(&debouncetimer, 0);
#endif
/* Configure GPIO for BUTTONSs */
//Input, pulled up or down (selected by GPIO_PxOUT: 0 = pull-down, 1 = pull-up).
halGpioConfig(BUTTON_S1,GPIOCFG_IN_PUD);
BUTTON_S1_OUTPUT_GPIO |= GPIOOUT_PULLUP << BUTTON_S1_GPIO_PIN;
@ -95,6 +106,7 @@ init(void)
BUTTON_S1_SEL();
BUTTON_S1_INTCFG = 0x40; // Falling edge triggered.
}
/*---------------------------------------------------------------------------*/
static void

View file

@ -56,6 +56,9 @@
#include "dev/temperature-sensor.h"
#undef TEMPERATURE_SENSOR_GPIO
#define TEMPERATURE_SENSOR_GPIO PORTB_PIN(7)
/*---------------------------------------------------------------------------*/
static void