Made register access bit nicer (not first clearing bit and then setting
it again if thats not required), and additionally when clock idle level
is changed, it writes out a dummy byte. Problem is only after a write
the idle level is changed, resulting in a clock glitch at the start
After version 7.5.0 the compiler used in LPCXpresso changed and as a
result some of the included libraries were changed. This caused a
build error when trying to compile exported mbed projects.
The error was with NewlibNano libraries (*_s.a) and as NewlibNano is
not used by mbed, this patch references the non-NewlibNano libraries
instead.
This change in the linker script has been verified on LPCXpresso versions
from 6.1.2 up to the current 7.9.0.
The S110 linker script is still using start address 0x16000, which was
required by version 7.1 of the s110 SoftDevice. Update it to the current
address, required by S110 v8.0.0.
LPC810 has only 4KB of flash, thus avoiding dead code is really nice.
Here the NVIC interrupt setup was pulled from the us_ticker code even
if no code is using timer events.
This also adds ARM_GCC support for TARGET_LPC81X.
LPC81X and LPC82X support Cortex M0+ VTOR register, so it is not
necessary to put non-init text at 0x200.
* Grouped SAMR21G18A specific files to its particular folder.
* Added files for all variants of SAMR21 and SAMD21.
* Removed Quick Start files from ASF.
* Added Target Dependency in port.c for PORT MASK.
* Grouped PWM pin implementation to SAMR21G18A folder.
* added more pins for external interrupt as per pio_samr21g18a.h
* updated serial_api.c for sanity checks, removed unused variables and other corrections.
Moved "stm32l1xx_hal_conf.h" to target folder. This file is part of
STM32CubeL1, and this is the way it is done for the 95 examples supplied
with STM32CubeL1. This file should be part of project(target) folder,
not API. On mbed, this has been done for TARGET_STM32F4 and
TARGET_STM32F7 targets (in ../targets/cmsis/TARGET_STM folder). All
targets in these two folders already have the "stm32l1xx_hal_conf.h"
file in the target folder.
Root cause: you cannot use a C-enum name in a #if compare, becaudse the preprocessor will replace all enum names with 0 (so all checks on HFXO/LFXO checked out regardless of the define).
Since some Nordic platforms don't use an external clock source, they
need to be built with the TARGET_NRF_LFCLK_RC flag. If they don't,
SystemInit will wait indefinitely for an external clock to start.
This patch adds a 1s timeout to the external oscillator initialisation,
and falls back to using the internal RC one if no LFCLKSTARTED event was
received in this interval.
For most applications, this won't matter. When building for the wrong
Nordic target, pin numbers will be mixed up as well and the application
will break later on.
But on targets that can only be updated using FOTA and don't have an
interface chip, this patch avoid ending up with a bricked device after a
slight mistake. Indeed, BLE DFU service is portable across all boards
and will run even with a mixed-up target setup, allowing the user to
re-install the right application.
An example scenario is transferring an application on a standalone
NRF51 chip, after spending some time prototyping on an mKIT, which tends
to happen a bit too often...
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
This patch clears the EVENT_COMPARE register even when we're not
expecting to get a COMPARE interrupt.
Here is a scenario where we get an unwelcome interrupt, and where it
currently results in a deadlock:
* A Ticker T1 runs at 500ms
* Its handler registers a Timeout T2 at 20µs. Since LF clock runs at
32.768kHz, this will be rounded up to a multiple of 30.5µs (actually
61µs, to ensure we're in the next tick window)
T1 T2 T1' T2'
-------|---|---------------------------------|---|--------->
: : :
<---> n * 30.5µs :
<--------------- 500ms --------------->
* When the ticker API handles T1, it calls us_ticker_set_interrupt a
first time for T1', and then for registering T2.
* Since T2 period is less than one RTC tick (30.5µs), there is a high
chance it will go past *while* we're still in this first handler.
* So ticker_irq_handler also handles T2 as well, and removes it from the
queue.
* us_ticker_set_interrupt is called for T1' before returning from
ticker_irq_handler
The problem resides in the fact that us_ticker_set_interrupt takes more
than 2 RTC ticks to execute: while inside the handler, T2 interrupt will
fire.
* Because of this pending interrupt, RTC1_IRQHandler will be called
right away, but since we removed T2 from the queue, the handler is
waiting for T1' instead, and will not clear EVENT_COMPARE until we
reach the T1' tick, in about 500ms.
* This results in a lock and main isn't executed anymore.
With this patch, we avoid being stuck in RTC1_IRQHandler while waiting
for T1'.
Note: even when T2 isn't handled in the same loop as T1, we may get a
spurious interrupt, because us_ticker_set_interrupt will be called twice
for T2... and will register T2+m the second time, while T2 interrupt is
fired in the background.
That case isn't as harmful, since RTC1_IRQHandler will be waiting for
T2+m, which is only one or two ticks further, and then it won't be
called again before T1'.
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
** Overview
This commit provides USB device-mode drivers for Silicon Labs chips.
The code is based on the SiLabs USB driver that is part of the
Simplicity dev environment.
Because Mbed USBDevice class wants to control the USB transactions
itself, large parts of the higher level code originally present in the
driver have been stripped out. An attempt has been made to keep Mbed
code separate enough that patches can be applied with minor effort, if
needed.
** Use of dynamic memory
Due to requirements imposed by the USB hardware, the driver needs read
and write buffers for every enabled endpoint. Since information on
what EPs will be used is only available during runtime, dynamic memory
allocation is used to minimize memory usage.
If needed, dynamic memory use can be disabled via a flag in
usbconfig.h. In this case, please read the documentation to see what
limitations this imposes. Static memory usage can also be reduced by
limiting the maximum number of active endpoints - see configuration in
usbconfig.h and USBEndpoints_EFM32.h.
** Power management
Driver supports the new SiLabs functionality in Mbed sleep(). Normal
sleep (EM1) is always available, and deep sleep (EM2) is available
when USB is either disconnected or suspended. How and when different
sleep modes are made possible can be configured in usbconfig.h
** Supported hardware
Current release officially supports, and has only been tested on Giant
Gecko. Upcoming releases will add support for other SiLabs platforms
on Mbed.
Line 244 changed PclkFreq*2 to PcklFreq
Line 246 changed PclkFreq to PclkFreq*2
This is proposed as the current pwmout_api.c gives the wrong period/frequency when using e.g."mypwm.period_ms(1);"
For PWM1 1ms gave 500Hz and PWM2,3 and 4 gave 2KHz
Applied to source as above and re-compiled this gave 1KHz outputs for all PWM's selected
Tried on NUCLEO STM32F401RE will effect other NUCLEO-STM32F4 as above
HAL Clocks are as follows for the F401RE Board: PCLK1=42000000 PCLK2=84000000 HCLK=84000000
Kind Regards
Martin
In a previous commit, the content of twi_master.h did not allow the invocation
of the c functions specified by the file from a cpp context. This commit wraps
the contents of the header file with the appropriate ifdefs.
Rather than indefinitely adding platforms to a #define list that use
the internal RC oscillator instead of an external crystal, let platforms
define this and the 'core code' can be platform agnostic.
Note, that this also allows people to use this symbol in libraries.
There's one notable example in the BLE_API that can now be refactored to
the same method, hopefully saving someone some unpleasant debugging
when their platform doesn't work because of a missing platform dependent
define in the high level API.
Signed-off-by: Jonathan Austin <jonathan.austin@arm.com>
This commit adds the ability for a compile flag to be set from targets.py
which changes the soft device to s110.
The compile flag is: MCU_NRF51_16K_S110. In order to avoid duplication
of the startup file, for the 16K parts we introduce an S110 or S130
scatter file. This means all 16K platforms must define
MCU_NRF51_16K
and ONE of
MCU_NRF51_16K_S110 or MCU_NRF51_16K_S130
Based on an earlier commit by Mihail but modified to avoid copy/paste
of the startup code for S110/S130
Signed-off-by: Jonathan Austin <jonathan.austin@arm.com>
This adds the BBC micro:bit platform, based on NRF51822
Initially, add the platform to use whatever version of softdevice is the
default for the NRF51822-based platforms.
Originally written by James, modified for new target inheritance by
Jonathan Austin:
Signed-off-by: Jonathan Austin <jonathan.austin@arm.com>
This commit is based on Nordic's fix for an abnormality in some releases
of the nrf51822 silicon.
Without this fix, the I2C bus locks up and doesn't reset properly. The
fix resets the TWI master on powerup.
For more information see
https://www.nordicsemi.com/eng/nordic/download_resource/24634/6/47696154
Nordic Product Anomaly ID 56.
Unlike other Nordic platforms, the wallbot doesn't use numbered I2C
ports. This makes it difficult to refer to a platforms's I2C pins from
common code.
This fix leaves the original wallbot definitions, but adds the more
'standard' ones too.
Signed-off-by: Jonathan Austin <jonathan.austin@arm.com>
This is a small optimisation for ARM compiler toolchains: constant
arrays should be declared const explicitly, to let the compiler put them
into .rodata instead of .data. GCC automatically detects that the array
is read-only, and already puts it into flash.
This way, we free 136 bytes of RAM, which is nothing to sneeze at, given
that applications only get about 2048 bytes by default, on 16k targets.
Please note that you will need to disable data compression in armlink to
see the real difference, with the "--datacompressor off" switch, for
example.