diff --git a/cores/arduino/HOWTO - compiling a project.txt b/cores/arduino/HOWTO_compiling_a_project_with_GCC.txt similarity index 58% rename from cores/arduino/HOWTO - compiling a project.txt rename to cores/arduino/HOWTO_compiling_a_project_with_GCC.txt index 7c3b4d5d420b70b4491c0f21a636bad41f5c5b5b..e99d2cdfb605783448a2c6353f6deec9605c55ab 100644 --- a/cores/arduino/HOWTO - compiling a project.txt +++ b/cores/arduino/HOWTO_compiling_a_project_with_GCC.txt @@ -8,6 +8,9 @@ GNU Make from http://gnuwin32.sourceforge.net/packages/make.htm Binaries http://gnuwin32.sourceforge.net/downlinks/make-bin-zip.php Dependencies http://gnuwin32.sourceforge.net/downlinks/make-dep-zip.php +GNU rm from http://gnuwin32.sourceforge.net/packages/coreutils.htm + Binaries http://gnuwin32.sourceforge.net/downlinks/coreutils-bin-zip.php + *MacOS* *Linux* @@ -21,29 +24,7 @@ ARM_GCC_TOOLCHAIN=C:\GNU Tools ARM Embedded_4.8 2013q4\bin Add to PATH the path were Make has been installed -3- Compile libarduino (Arduino API) - -Go to hardware/arduino/samd/cores/arduino/build_gcc - -run the command: 'make' - -This will compile the libarduino library and deliver to main Arduino folder the files: - -hardware/arduino/samd/cores/arduino/libarduino_arduino_zero_gcc_dbg.a -hardware/arduino/samd/cores/arduino/libarduino_arduino_zero_gcc_dbg.a.txt (result of nm) - -4- Compile libvariant (variant specific library, use Arduino API and libsam) - -Go to hardware/sam/variants/arduino_zero/build_gcc - -run the command: 'make' - -This will compile the libvariant library and deliver to main Arduino folder the files: - -hardware/arduino/samd/cores/arduino/libvariant_arduino_zero_gcc_dbg.a -hardware/arduino/samd/cores/arduino/libvariant_arduino_zero_gcc_dbg.a.txt (result of nm) - -5- Compile test application +3- Compile test application Go to hardware/arduino/samd/cores/arduino/validation/build_gcc diff --git a/cores/arduino/delay.c b/cores/arduino/delay.c index 5640e71f1ce4dc0acbe5beb151cf1da036267c04..834278413afa6a04696a2196a2992a372d79550a 100644 --- a/cores/arduino/delay.c +++ b/cores/arduino/delay.c @@ -5,12 +5,13 @@ extern "C" { #endif +/** Tick Counter united by ms */ +static volatile uint32_t _ulTickCount=0 ; + uint32_t millis( void ) { -/* TODO // todo: ensure no interrupts - return GetTickCount() ; -*/ return 0ul ; + return _ulTickCount ; } // Interrupt-compatible version of micros @@ -19,56 +20,48 @@ uint32_t millis( void ) // values to calculate micros. If there is a pending SysTick, add one to the millis counter in the calculation. uint32_t micros( void ) { -/* TODO - uint32_t ticks, ticks2; - uint32_t pend, pend2; - uint32_t count, count2; + uint32_t ticks, ticks2; + uint32_t pend, pend2; + uint32_t count, count2; - ticks2 = SysTick->VAL; - pend2 = !!((SCB->ICSR & SCB_ICSR_PENDSTSET_Msk)||((SCB->SHCSR & SCB_SHCSR_SYSTICKACT_Msk))) ; - count2 = GetTickCount(); + ticks2 = SysTick->VAL; + pend2 = !!(SCB->ICSR & SCB_ICSR_PENDSTSET_Msk) ; + count2 = _ulTickCount ; - do { - ticks=ticks2; - pend=pend2; - count=count2; - ticks2 = SysTick->VAL; - pend2 = !!((SCB->ICSR & SCB_ICSR_PENDSTSET_Msk)||((SCB->SHCSR & SCB_SHCSR_SYSTICKACT_Msk))) ; - count2 = GetTickCount(); - } while ((pend != pend2) || (count != count2) || (ticks < ticks2)); + do + { + ticks=ticks2; + pend=pend2; + count=count2; + ticks2 = SysTick->VAL; + pend2 = !!(SCB->ICSR & SCB_ICSR_PENDSTSET_Msk) ; + count2 = _ulTickCount ; + } while ((pend != pend2) || (count != count2) || (ticks < ticks2)); - return ((count+pend) * 1000) + (((SysTick->LOAD - ticks)*(1048576/(F_CPU/1000000)))>>20) ; - // this is an optimization to turn a runtime division into two compile-time divisions and - // a runtime multiplication and shift, saving a few cycles -*/ return 0ul ; + return ((count+pend) * 1000) + (((SysTick->LOAD - ticks)*(1048576/(VARIANT_MCK/1000000)))>>20) ; + // this is an optimization to turn a runtime division into two compile-time divisions and + // a runtime multiplication and shift, saving a few cycles } -// original function: -// uint32_t micros( void ) -// { -// uint32_t ticks ; -// uint32_t count ; -// -// SysTick->CTRL; -// do { -// ticks = SysTick->VAL; -// count = GetTickCount(); -// } while (SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk); -// -// return count * 1000 + (SysTick->LOAD + 1 - ticks) / (SystemCoreClock/1000000) ; -// } +void delay( uint32_t ms ) +{ + if ( ms == 0 ) + { + return ; + } + + uint32_t start = _ulTickCount ; + do + { + yield() ; + } while ( _ulTickCount - start < ms ) ; +} -void delay( uint32_t ms ) +void SysTick_Handler( void ) { -/* TODO - if (ms == 0) - return; - uint32_t start = GetTickCount(); - do { - yield(); - } while (GetTickCount() - start < ms); -*/ + // Increment tick count each ms + _ulTickCount++ ; } #ifdef __cplusplus diff --git a/cores/arduino/delay.h b/cores/arduino/delay.h index 2ea5d0c1d53a78084323784a6fb348d77b8de212..f9b08efeff3b608ef09265eb2f261cc46ff72919 100644 --- a/cores/arduino/delay.h +++ b/cores/arduino/delay.h @@ -64,16 +64,31 @@ static inline void delayMicroseconds(uint32_t) __attribute__((always_inline, unu static inline void delayMicroseconds(uint32_t usec){ if (usec == 0) return; uint32_t n = usec * (VARIANT_MCK / 3000000); -/* - asm volatile( + + __asm__ volatile( "L_%=_delayMicroseconds:" "\n\t" "subs %0, #1" "\n\t" "bne L_%=_delayMicroseconds" "\n" : "+r" (n) : ); -*/ } +/* +__attribute__((naked)) static void delay_loop(unsigned n) +{ + __asm volatile ("1: subs r0, r0, #1"); + __asm volatile (" bne 1b"); + __asm volatile (" bx lr"); +} + +void delay_microseconds(unsigned n) +{ + // Bogus assumption: + // Assume 8 cycles/iteration and running at 80MHz + delay_loop(n * 10); +} +*/ + #ifdef __cplusplus } #endif diff --git a/cores/arduino/main.cpp b/cores/arduino/main.cpp index 0efdb70d4a095a2ec66d62fa04e595cab5036e07..ae1eee2643c5d219a433311875349d3f1133c7b2 100644 --- a/cores/arduino/main.cpp +++ b/cores/arduino/main.cpp @@ -20,17 +20,6 @@ #define ARDUINO_MAIN #include "Arduino.h" -/* - * Cortex-M3 Systick IT handler - */ -/* -extern void SysTick_Handler( void ) -{ - // Increment tick count each ms - TimeTick_Increment() ; -} -*/ - /* * \brief Main entry point of Arduino application */ diff --git a/cores/arduino/startup.c b/cores/arduino/startup.c index 811e975a839b2de9afe6700cef8e698e1d0f5a08..d640f3ffcefa41bb4ec14b4c1098013408f71588 100644 --- a/cores/arduino/startup.c +++ b/cores/arduino/startup.c @@ -169,7 +169,8 @@ const DeviceVectors exception_table= * 3) Put Generic Clock Generator 1 as source for Generic Clock Multiplexer 0 (DFLL48M reference) * 4) Enable DFLL48M clock * 5) Switch Generic Clock Generator 0 to DFLL48M. CPU will run at 48MHz. - * 6) Put OSC8M as source for Generic Clock Generator 3 + * 6) Modify PRESCaler value of OSCM to have 8MHz + * 7) Put OSC8M as source for Generic Clock Generator 3 */ // Constants for Clock generators #define GENERIC_CLOCK_GENERATOR_MAIN (0u) @@ -221,8 +222,10 @@ void SystemInit( void ) } /* Write Generic Clock Generator 1 configuration */ + *((uint8_t *) &GCLK->GENCTRL) = GENERIC_CLOCK_GENERATOR_XOSC32K ; GCLK->GENCTRL.reg = GCLK_GENCTRL_ID( GENERIC_CLOCK_GENERATOR_XOSC32K ) | // Generic Clock Generator 1 GCLK_GENCTRL_SRC_XOSC32K | // Selected source is External 32KHz Oscillator + GCLK_GENCTRL_OE | GCLK_GENCTRL_GENEN ; while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY ) @@ -248,37 +251,60 @@ void SystemInit( void ) /* DFLL Configuration in Closed Loop mode, cf product datasheet chapter 15.6.7.1 - Closed-Loop Operation */ - /* Enable the generic clock */ - GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID( SYSCTRL_GCLK_ID_DFLL48 ) | - GCLK_CLKCTRL_CLKEN ; + /* Remove the OnDemand mode, Bug http://avr32.icgroup.norway.atmel.com/bugzilla/show_bug.cgi?id=9905 */ + SYSCTRL->DFLLCTRL.bit.ONDEMAND = 0 ; - while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY ) + while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 ) { /* Wait for synchronization */ } - /* DFLL Enable (Closed Loop) */ - SYSCTRL->DFLLCTRL.bit.ONDEMAND = 0 ; /* Remove the OnDemand mode, */ +#if 0 + SYSCTRL->DFLLMUL.reg = SYSCTRL_DFLLMUL_CSTEP( 31 ) | // Coarse step is 31, half of the max value + SYSCTRL_DFLLMUL_FSTEP( 511 ) | // Fine step is 511, half of the max value + SYSCTRL_DFLLMUL_MUL( (VARIANT_MCK/VARIANT_MAINOSC) ) ; // External 32KHz is the reference +#else + SYSCTRL->DFLLMUL.reg = SYSCTRL_DFLLMUL_CSTEP( 10 ) | // Coarse step is 31, half of the max value + SYSCTRL_DFLLMUL_FSTEP( 10 ) | // Fine step is 511, half of the max value + SYSCTRL_DFLLMUL_MUL( (VARIANT_MCK/VARIANT_MAINOSC) ) ; // External 32KHz is the reference +#endif while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 ) { /* Wait for synchronization */ } - SYSCTRL->DFLLMUL.reg = SYSCTRL_DFLLMUL_CSTEP( 31 ) | // Coarse step is 31, half of the max value - SYSCTRL_DFLLMUL_FSTEP( 511 ) | // Fine step is 511, half of the max value - SYSCTRL_DFLLMUL_MUL( (VARIANT_MCK/VARIANT_MAINOSC) ) ; // External 32KHz is the reference - /* Write full configuration to DFLL control register */ - SYSCTRL->DFLLCTRL.reg = SYSCTRL_DFLLCTRL_MODE | /* Enable the closed loop mode */ +#if 0 + SYSCTRL->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_MODE | /* Enable the closed loop mode */ SYSCTRL_DFLLCTRL_QLDIS | /* Disable Quick lock */ - SYSCTRL_DFLLCTRL_ENABLE ; + SYSCTRL_DFLLCTRL_CCDIS ; /* Disable Chill Cycle */ +#else + SYSCTRL->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_MODE | /* Enable the closed loop mode */ + SYSCTRL_DFLLCTRL_QLDIS ; /* Disable Quick lock */ +#endif while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 ) { /* Wait for synchronization */ } + /* Enable the DFLL */ + SYSCTRL->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_ENABLE ; + + while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY) == 0 ) + { + /* Wait for synchronization */ + } + +#if 0 + while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLLCKC) == 0 || + (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLLCKF) == 0 ) + { + /* Wait for locks flags */ + } +#endif + /* * 5) Switch Generic Clock Generator 0 to DFLL48M. CPU will run at 48MHz. */ @@ -292,6 +318,8 @@ void SystemInit( void ) /* Write Generic Clock Generator 0 configuration */ GCLK->GENCTRL.reg = GCLK_GENCTRL_ID( GENERIC_CLOCK_GENERATOR_MAIN ) | // Generic Clock Generator 0 GCLK_GENCTRL_SRC_DFLL48M | // Selected source is DFLL 48MHz + GCLK_GENCTRL_OE | + GCLK_GENCTRL_IDC | // Set 50/50 duty cycle GCLK_GENCTRL_GENEN ; while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY ) @@ -299,16 +327,29 @@ void SystemInit( void ) /* Wait for synchronization */ } -#if 0 +#if 1 /* - * 6) Put OSC8M as source for Generic Clock Generator 3 + * 6) Modify PRESCaler value of OSC8M to have 8MHz */ - GCLK->GENDIV.reg = GCLK_GENDIV_ID( GENERIC_CLOCK_GENERATOR_OSC8M ) ; // Generic Clock Generator 3 + SYSCTRL->OSC8M.bit.PRESC = SYSCTRL_OSC8M_PRESC_0_Val ; + SYSCTRL->OSC8M.bit.ONDEMAND = 0 ; - while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY ) +/* + while ( (SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_OSC8MRDY) == 0 ) { - /* Wait for synchronization */ + /* Wait for synchronization } +*/ + + /* + * 7) Put OSC8M as source for Generic Clock Generator 3 + */ + GCLK->GENDIV.reg = GCLK_GENDIV_ID( GENERIC_CLOCK_GENERATOR_OSC8M ) ; // Generic Clock Generator 3 + + //while ( GCLK->STATUS.reg & GCLK_STATUS_SYNCBUSY ) + //{ + ///* Wait for synchronization */ + //} /* Write Generic Clock Generator 3 configuration */ GCLK->GENCTRL.reg = GCLK_GENCTRL_ID( GENERIC_CLOCK_GENERATOR_OSC8M ) | // Generic Clock Generator 3 @@ -325,10 +366,10 @@ void SystemInit( void ) * Now that all system clocks are configured, we can set CPU and APBx BUS clocks. * There values are normally the one present after Reset. */ - //PM->CPUSEL.reg = PM_CPUSEL_CPUDIV_DIV1 ; - //PM->APBASEL.reg = PM_APBASEL_APBADIV_DIV1_Val ; - //PM->APBBSEL.reg = PM_APBBSEL_APBBDIV_DIV1_Val ; - //PM->APBCSEL.reg = PM_APBCSEL_APBCDIV_DIV1_Val ; + PM->CPUSEL.reg = PM_CPUSEL_CPUDIV_DIV1 ; + PM->APBASEL.reg = PM_APBASEL_APBADIV_DIV1_Val ; + PM->APBBSEL.reg = PM_APBBSEL_APBBDIV_DIV1_Val ; + PM->APBCSEL.reg = PM_APBCSEL_APBCDIV_DIV1_Val ; SystemCoreClock=VARIANT_MCK ; } @@ -385,3 +426,39 @@ void Dummy_Handler( void ) { } } + +#if 0 +GCLK->GENDIV.reg = GCLK_GENDIV_ID(O) | GCLK_GENDIV_DIV(O); // No div since RC8M is at 1MHz by default +while (GCLK->STATUS.bit.SYNCBUSY); +GCLK->GENCTRL.reg = ( GCLK_GENCTRL_ID(O) | GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_OSC8M_Val) | GCLK_GENCTRL_GENEN | GCLK_GENCTRL_IDC | GCLK_GENCTRL_OE ) & (~GCLK_GENCTRL_OOV); +while (GCLK->STATUS.bit.SYNCBUSY); + +//-------------------------- EXAMPLE ------------------------------------------- + +#define DFLLREF32K_GENERATOR_GCLK_ID 2 +void init_dfll_on_xosc32k(void) +{ + // Setup generator on XOSC32K + gclk_gen_setup(DFLLREF32K_GENERATOR_GCLK_ID,GCLK_SOURCE_XOSC32K,1); + gclk_gen_output_conf(DFLLREF32K_GENERATOR_GCLK_ID,false,0); + gclk_setup(SYSCTRL_GCLK_ID_DFLL48,DFLLREF32K_GENERATOR_GCLK_ID,0); + + //Use DFLL @ 48MHz + SYSCTRL->DFLLCTRL.bit.ONDEMAND = 0; // Bug http://avr32.icgroup.norway.atmel.com/bugzilla/show_bug.cgi?id=9905 + while((SYSCTRL->PCLKSR.reg&SYSCTRL_PCLKSR_DFLLRDY)==0); + + SYSCTRL->DFLLMUL.reg = SYSCTRL_DFLLMUL_MUL(1465)|SYSCTRL_DFLLMUL_FSTEP(10)|SYSCTRL_DFLLMUL_CSTEP(10); + while((SYSCTRL->PCLKSR.reg&SYSCTRL_PCLKSR_DFLLRDY)==0); + + SYSCTRL->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_CCDIS|SYSCTRL_DFLLCTRL_QLDIS|SYSCTRL_DFLLCTRL_MODE; + while((SYSCTRL->PCLKSR.reg&SYSCTRL_PCLKSR_DFLLRDY)==0); + + //SYSCTRL->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_ENABLE | SYSCTRL_DFLLCTRL_RUNSTDBY; + SYSCTRL->DFLLCTRL.reg |= SYSCTRL_DFLLCTRL_ENABLE; + while((SYSCTRL->PCLKSR.reg&SYSCTRL_PCLKSR_DFLLRDY)==0); + + // Wait for locks flags . + while((SYSCTRL->PCLKSR.reg&SYSCTRL_PCLKSR_DFLLLCKC)==0 || (SYSCTRL->PCLKSR.reg&SYSCTRL_PCLKSR_DFLLLCKF)==0); + +} +#endif diff --git a/cores/arduino/validation/build_as6/test.atsuo b/cores/arduino/validation/build_as6/test.atsuo index 1da3b883ce1b841e1ca709dafb7e91a14a9bc371..26b524b33b54fad372b5784431c9893881c36c82 100644 Binary files a/cores/arduino/validation/build_as6/test.atsuo and b/cores/arduino/validation/build_as6/test.atsuo differ diff --git a/cores/arduino/validation/build_as6/test.cppproj b/cores/arduino/validation/build_as6/test.cppproj index 4adca3086f3c5f7f42f0f9337bb3c161f6d61fd8..fdb1f72b4e591e41124afbebf41c504449099484 100644 --- a/cores/arduino/validation/build_as6/test.cppproj +++ b/cores/arduino/validation/build_as6/test.cppproj @@ -131,89 +131,89 @@ <PropertyGroup Condition=" '$(Configuration)' == 'Debug' "> <ToolchainSettings> <ArmGccCpp> - <armgcc.common.outputfiles.hex>True</armgcc.common.outputfiles.hex> - <armgcc.common.outputfiles.lss>True</armgcc.common.outputfiles.lss> - <armgcc.common.outputfiles.eep>True</armgcc.common.outputfiles.eep> - <armgcc.common.outputfiles.bin>True</armgcc.common.outputfiles.bin> - <armgcc.common.outputfiles.srec>True</armgcc.common.outputfiles.srec> - <armgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</armgcc.compiler.general.ChangeDefaultCharTypeUnsigned> - <armgcc.compiler.symbols.DefSymbols> - <ListValues> - <Value>DEBUG</Value> - </ListValues> - </armgcc.compiler.symbols.DefSymbols> - <armgcc.compiler.directories.DefaultIncludePath>False</armgcc.compiler.directories.DefaultIncludePath> - <armgcc.compiler.directories.IncludePaths> - <ListValues> - <Value>../../../../../../../tools/CMSIS/Device/ATMEL</Value> - <Value>../../../../../../../tools/CMSIS/CMSIS/Include</Value> - <Value>../../..</Value> - <Value>../../../USB</Value> - <Value>../../../../../variants/arduino_zero</Value> - <Value>../../../../../libraries/SPI</Value> - <Value>../../../../../libraries/Wire</Value> - </ListValues> - </armgcc.compiler.directories.IncludePaths> - <armgcc.compiler.optimization.level>Optimize (-O1)</armgcc.compiler.optimization.level> - <armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>True</armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection> - <armgcc.compiler.optimization.PrepareDataForGarbageCollection>True</armgcc.compiler.optimization.PrepareDataForGarbageCollection> - <armgcc.compiler.optimization.DebugLevel>Maximum (-g3)</armgcc.compiler.optimization.DebugLevel> - <armgcc.compiler.warnings.AllWarnings>True</armgcc.compiler.warnings.AllWarnings> - <armgcc.compiler.miscellaneous.OtherFlags>-std=c99</armgcc.compiler.miscellaneous.OtherFlags> - <armgcccpp.compiler.general.ChangeDefaultCharTypeUnsigned>True</armgcccpp.compiler.general.ChangeDefaultCharTypeUnsigned> - <armgcccpp.compiler.symbols.DefSymbols> - <ListValues> - <Value>DEBUG</Value> - <Value>USB_VID=0x2341</Value> - <Value>USB_PID=0x004d</Value> - </ListValues> - </armgcccpp.compiler.symbols.DefSymbols> - <armgcccpp.compiler.directories.DefaultIncludePath>False</armgcccpp.compiler.directories.DefaultIncludePath> - <armgcccpp.compiler.directories.IncludePaths> - <ListValues> - <Value>../../../../../../../tools/CMSIS/Device/ATMEL</Value> - <Value>../../../../../../../tools/CMSIS/CMSIS/Include</Value> - <Value>../../..</Value> - <Value>../../../USB</Value> - <Value>../../../../../variants/arduino_zero</Value> - <Value>../../../../../libraries/SPI</Value> - <Value>../../../../../libraries/Wire</Value> - </ListValues> - </armgcccpp.compiler.directories.IncludePaths> - <armgcccpp.compiler.optimization.level>Optimize (-O1)</armgcccpp.compiler.optimization.level> - <armgcccpp.compiler.optimization.PrepareFunctionsForGarbageCollection>True</armgcccpp.compiler.optimization.PrepareFunctionsForGarbageCollection> - <armgcccpp.compiler.optimization.PrepareDataForGarbageCollection>True</armgcccpp.compiler.optimization.PrepareDataForGarbageCollection> - <armgcccpp.compiler.optimization.DebugLevel>Maximum (-g3)</armgcccpp.compiler.optimization.DebugLevel> - <armgcccpp.compiler.warnings.AllWarnings>True</armgcccpp.compiler.warnings.AllWarnings> - <armgcccpp.compiler.miscellaneous.OtherFlags>-std=c++98</armgcccpp.compiler.miscellaneous.OtherFlags> - <armgcccpp.linker.general.UseNewlibNano>True</armgcccpp.linker.general.UseNewlibNano> - <armgcccpp.linker.libraries.Libraries> - <ListValues> - <Value>libm</Value> - </ListValues> - </armgcccpp.linker.libraries.Libraries> - <armgcccpp.linker.libraries.LibrarySearchPaths> - <ListValues> - <Value>../../../../../variants/arduino_zero/linker_scripts/gcc</Value> - </ListValues> - </armgcccpp.linker.libraries.LibrarySearchPaths> - <armgcccpp.linker.optimization.GarbageCollectUnusedSections>True</armgcccpp.linker.optimization.GarbageCollectUnusedSections> - <armgcccpp.linker.memorysettings.ExternalRAM /> - <armgcccpp.linker.miscellaneous.LinkerFlags>-Tflash.ld</armgcccpp.linker.miscellaneous.LinkerFlags> - <armgcccpp.assembler.general.IncludePaths> - <ListValues> - <Value>../../..</Value> - </ListValues> - </armgcccpp.assembler.general.IncludePaths> - <armgcccpp.assembler.debugging.DebugLevel>Default (-g)</armgcccpp.assembler.debugging.DebugLevel> - <armgcccpp.preprocessingassembler.general.DefaultIncludePath>False</armgcccpp.preprocessingassembler.general.DefaultIncludePath> - <armgcccpp.preprocessingassembler.general.IncludePaths> - <ListValues> - <Value>../../..</Value> - </ListValues> - </armgcccpp.preprocessingassembler.general.IncludePaths> - <armgcccpp.preprocessingassembler.debugging.DebugLevel>Default (-Wa,-g)</armgcccpp.preprocessingassembler.debugging.DebugLevel> -</ArmGccCpp> + <armgcc.common.outputfiles.hex>True</armgcc.common.outputfiles.hex> + <armgcc.common.outputfiles.lss>True</armgcc.common.outputfiles.lss> + <armgcc.common.outputfiles.eep>True</armgcc.common.outputfiles.eep> + <armgcc.common.outputfiles.bin>True</armgcc.common.outputfiles.bin> + <armgcc.common.outputfiles.srec>True</armgcc.common.outputfiles.srec> + <armgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</armgcc.compiler.general.ChangeDefaultCharTypeUnsigned> + <armgcc.compiler.symbols.DefSymbols> + <ListValues> + <Value>DEBUG</Value> + </ListValues> + </armgcc.compiler.symbols.DefSymbols> + <armgcc.compiler.directories.DefaultIncludePath>False</armgcc.compiler.directories.DefaultIncludePath> + <armgcc.compiler.directories.IncludePaths> + <ListValues> + <Value>../../../../../../../tools/CMSIS/Device/ATMEL</Value> + <Value>../../../../../../../tools/CMSIS/CMSIS/Include</Value> + <Value>../../..</Value> + <Value>../../../USB</Value> + <Value>../../../../../variants/arduino_zero</Value> + <Value>../../../../../libraries/SPI</Value> + <Value>../../../../../libraries/Wire</Value> + </ListValues> + </armgcc.compiler.directories.IncludePaths> + <armgcc.compiler.optimization.level>Optimize (-O1)</armgcc.compiler.optimization.level> + <armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>True</armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection> + <armgcc.compiler.optimization.PrepareDataForGarbageCollection>True</armgcc.compiler.optimization.PrepareDataForGarbageCollection> + <armgcc.compiler.optimization.DebugLevel>Maximum (-g3)</armgcc.compiler.optimization.DebugLevel> + <armgcc.compiler.warnings.AllWarnings>True</armgcc.compiler.warnings.AllWarnings> + <armgcc.compiler.miscellaneous.OtherFlags>-std=c99</armgcc.compiler.miscellaneous.OtherFlags> + <armgcccpp.compiler.general.ChangeDefaultCharTypeUnsigned>True</armgcccpp.compiler.general.ChangeDefaultCharTypeUnsigned> + <armgcccpp.compiler.symbols.DefSymbols> + <ListValues> + <Value>DEBUG</Value> + <Value>USB_VID=0x2341</Value> + <Value>USB_PID=0x004d</Value> + </ListValues> + </armgcccpp.compiler.symbols.DefSymbols> + <armgcccpp.compiler.directories.DefaultIncludePath>False</armgcccpp.compiler.directories.DefaultIncludePath> + <armgcccpp.compiler.directories.IncludePaths> + <ListValues> + <Value>../../../../../../../tools/CMSIS/Device/ATMEL</Value> + <Value>../../../../../../../tools/CMSIS/CMSIS/Include</Value> + <Value>../../..</Value> + <Value>../../../USB</Value> + <Value>../../../../../variants/arduino_zero</Value> + <Value>../../../../../libraries/SPI</Value> + <Value>../../../../../libraries/Wire</Value> + </ListValues> + </armgcccpp.compiler.directories.IncludePaths> + <armgcccpp.compiler.optimization.level>Optimize (-O1)</armgcccpp.compiler.optimization.level> + <armgcccpp.compiler.optimization.PrepareFunctionsForGarbageCollection>True</armgcccpp.compiler.optimization.PrepareFunctionsForGarbageCollection> + <armgcccpp.compiler.optimization.PrepareDataForGarbageCollection>True</armgcccpp.compiler.optimization.PrepareDataForGarbageCollection> + <armgcccpp.compiler.optimization.DebugLevel>Maximum (-g3)</armgcccpp.compiler.optimization.DebugLevel> + <armgcccpp.compiler.warnings.AllWarnings>True</armgcccpp.compiler.warnings.AllWarnings> + <armgcccpp.compiler.miscellaneous.OtherFlags>-std=c++98</armgcccpp.compiler.miscellaneous.OtherFlags> + <armgcccpp.linker.general.UseNewlibNano>True</armgcccpp.linker.general.UseNewlibNano> + <armgcccpp.linker.libraries.Libraries> + <ListValues> + <Value>libm</Value> + </ListValues> + </armgcccpp.linker.libraries.Libraries> + <armgcccpp.linker.libraries.LibrarySearchPaths> + <ListValues> + <Value>../../../../../variants/arduino_zero/linker_scripts/gcc</Value> + </ListValues> + </armgcccpp.linker.libraries.LibrarySearchPaths> + <armgcccpp.linker.optimization.GarbageCollectUnusedSections>True</armgcccpp.linker.optimization.GarbageCollectUnusedSections> + <armgcccpp.linker.memorysettings.ExternalRAM /> + <armgcccpp.linker.miscellaneous.LinkerFlags>-Tflash.ld</armgcccpp.linker.miscellaneous.LinkerFlags> + <armgcccpp.assembler.general.IncludePaths> + <ListValues> + <Value>../../..</Value> + </ListValues> + </armgcccpp.assembler.general.IncludePaths> + <armgcccpp.assembler.debugging.DebugLevel>Default (-g)</armgcccpp.assembler.debugging.DebugLevel> + <armgcccpp.preprocessingassembler.general.DefaultIncludePath>False</armgcccpp.preprocessingassembler.general.DefaultIncludePath> + <armgcccpp.preprocessingassembler.general.IncludePaths> + <ListValues> + <Value>../../..</Value> + </ListValues> + </armgcccpp.preprocessingassembler.general.IncludePaths> + <armgcccpp.preprocessingassembler.debugging.DebugLevel>Default (-Wa,-g)</armgcccpp.preprocessingassembler.debugging.DebugLevel> + </ArmGccCpp> </ToolchainSettings> </PropertyGroup> <ItemGroup> @@ -223,18 +223,18 @@ <Folder Include="variant" /> </ItemGroup> <ItemGroup> - <Compile Include="..\..\..\..\libraries\SPI\SPI.cpp"> + <None Include="..\..\..\..\libraries\SPI\SPI.cpp"> <SubType>compile</SubType> <Link>SPI\SPI.cpp</Link> - </Compile> + </None> <Compile Include="..\..\..\..\libraries\SPI\SPI.h"> <SubType>compile</SubType> <Link>SPI\SPI.h</Link> </Compile> - <Compile Include="..\..\..\..\libraries\Wire\Wire.cpp"> + <None Include="..\..\..\..\libraries\Wire\Wire.cpp"> <SubType>compile</SubType> <Link>Wire\Wire.cpp</Link> - </Compile> + </None> <Compile Include="..\..\..\..\libraries\Wire\Wire.h"> <SubType>compile</SubType> <Link>Wire\Wire.h</Link> diff --git a/cores/arduino/validation/test.cpp b/cores/arduino/validation/test.cpp index 68968f1e9623a3a1e8edc6d63728300568931c68..3c7e0b2e6a4eff37beef1ac11bd8ab7f08cd3b8c 100644 --- a/cores/arduino/validation/test.cpp +++ b/cores/arduino/validation/test.cpp @@ -22,13 +22,26 @@ void setup( void ) { // Initialize the digital pin as an output. // Pin PIN_LED has a LED connected on most Arduino boards: - pinMode( PIN_LED, OUTPUT ) ; - digitalWrite( PIN_LED, LOW ) ; + //pinMode( PIN_LED, OUTPUT ) ; + //digitalWrite( PIN_LED, LOW ) ; // Initialize the PIN_LED2 digital pin as an output. pinMode( PIN_LED2, OUTPUT ) ; digitalWrite( PIN_LED2, HIGH ) ; + // Initialize the PIN_LED2 digital pin as an output. + pinMode( PIN_LED3, OUTPUT ) ; + digitalWrite( PIN_LED3, LOW ) ; + +//********************************************** +// Clock output on pin 4 for measure + + pinPeripheral( 4, PIO_AC_CLK ) ; // Clock Gen 0 + pinPeripheral( 5, PIO_AC_CLK ) ; // Clock Gen 1 + pinPeripheral( 13, PIO_AC_CLK ) ; // Clock Gen 3 + +//********************************************** + /* Serial1.begin( 115200 ) ; */ @@ -36,14 +49,16 @@ void setup( void ) static void led_step1( void ) { - digitalWrite( PIN_LED, LOW ) ; // set the LED on +// digitalWrite( PIN_LED, LOW ) ; // set the LED on digitalWrite( PIN_LED2, LOW ) ; // set the red LED off + digitalWrite( PIN_LED3, HIGH ) ; // set the red LED off } static void led_step2( void ) { - digitalWrite( PIN_LED, HIGH ) ; // set the LED off +// digitalWrite( PIN_LED, HIGH ) ; // set the LED off digitalWrite( PIN_LED2, HIGH ) ; // set the red LED on + digitalWrite( PIN_LED3, LOW ) ; // set the red LED on } void loop( void ) diff --git a/cores/arduino/wiring.c b/cores/arduino/wiring.c index b13bf15b12f5f2503e21a5d9786468528f692e29..693f1924c695cde5c8c61402810403269f2d23ab 100644 --- a/cores/arduino/wiring.c +++ b/cores/arduino/wiring.c @@ -45,17 +45,29 @@ void init( void ) uint32_t ul ; // Set Systick to 1ms interval, common to all Cortex-M variants - // if ( SysTick_Config( SystemCoreClock / 1000 ) ) - // { - // // Capture error - // while ( 1 ) ; - // } + if ( SysTick_Config( SystemCoreClock / 1000 ) ) + { + // Capture error + while ( 1 ) ; + } - // Setup PORT for Digital I/O - PM->APBBMASK.reg |= PM_APBBMASK_PORT ; + // Clock PORT for Digital I/O +// PM->APBBMASK.reg |= PM_APBBMASK_PORT ; +// +// // Clock EIC for I/O interrupts +// PM->APBAMASK.reg |= PM_APBAMASK_EIC ; + + // Clock SERCOM for Serial + PM->APBCMASK.reg |= PM_APBCMASK_SERCOM0 | PM_APBCMASK_SERCOM1 | PM_APBCMASK_SERCOM2 | PM_APBCMASK_SERCOM3 | PM_APBCMASK_SERCOM4 | PM_APBCMASK_SERCOM5 ; + + // Clock TC/TCC for Pulse and Analog + PM->APBCMASK.reg |= PM_APBCMASK_TCC0 | PM_APBCMASK_TCC1 | PM_APBCMASK_TCC2 | PM_APBCMASK_TC3 | PM_APBCMASK_TC4 | PM_APBCMASK_TC5 | PM_APBCMASK_TC6 | PM_APBCMASK_TC7 ; + + // Clock ADC/DAC for Analog + PM->APBCMASK.reg |= PM_APBCMASK_ADC | PM_APBCMASK_DAC ; // Setup all pins (digital and analog) in INPUT mode (default is nothing) - for ( ul = 0 ; ul < NUM_DIGITAL_PINS ; ul++ ) +// for ( ul = 0 ; ul < NUM_DIGITAL_PINS ; ul++ ) { // pinMode( ul, INPUT ) ; } diff --git a/cores/arduino/wiring_digital.c b/cores/arduino/wiring_digital.c index 5716bceb93520a8fb3311af6eb457cd827826015..5733a633e89fb150a3cd2580550d715bf9ae3589 100644 --- a/cores/arduino/wiring_digital.c +++ b/cores/arduino/wiring_digital.c @@ -27,153 +27,175 @@ int pinPeripheral( uint32_t ulPin, EPioType ulPeripheral ) { - if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN ) - { - return -1 ; - } - - switch ( ulPeripheral ) - { - case PIO_DIGITAL: - case PIO_INPUT: - case PIO_INPUT_PULLUP: - case PIO_OUTPUT: - // Disable peripheral muxing, done in pinMode + if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN ) + { + return -1 ; + } + + switch ( ulPeripheral ) + { + case PIO_DIGITAL: + case PIO_INPUT: + case PIO_INPUT_PULLUP: + case PIO_OUTPUT: + // Disable peripheral muxing, done in pinMode // PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].bit.PMUXEN = 0 ; // Configure pin mode, if requested - if ( ulPeripheral == PIO_INPUT ) - { - pinMode( ulPin, INPUT ) ; - } - else - { - if ( ulPeripheral == PIO_INPUT_PULLUP ) - { - pinMode( ulPin, INPUT_PULLUP ) ; - } - else - { - if ( ulPeripheral == PIO_OUTPUT ) - { - pinMode( ulPin, OUTPUT ) ; - } - else - { - // PIO_DIGITAL, do we have to do something as all cases are covered? - } - } - } - break ; - - case PIO_ANALOG: - case PIO_SERCOM: - case PIO_SERCOM_ALT: - case PIO_TIMER: - case PIO_TIMER_ALT: - case PIO_EXTINT: - case PIO_COM: - case PIO_AC_CLK: + if ( ulPeripheral == PIO_INPUT ) + { + pinMode( ulPin, INPUT ) ; + } + else + { + if ( ulPeripheral == PIO_INPUT_PULLUP ) + { + pinMode( ulPin, INPUT_PULLUP ) ; + } + else + { + if ( ulPeripheral == PIO_OUTPUT ) + { + pinMode( ulPin, OUTPUT ) ; + } + else + { + // PIO_DIGITAL, do we have to do something as all cases are covered? + } + } + } + break ; + + case PIO_ANALOG: + case PIO_SERCOM: + case PIO_SERCOM_ALT: + case PIO_TIMER: + case PIO_TIMER_ALT: + case PIO_EXTINT: + case PIO_COM: + case PIO_AC_CLK: +#if 0 // Is the pio pin in the lower 16 ones? - // The WRCONFIG register allows update of only 16 pin max out of 32 - if ( g_APinDescription[ulPin].ulPin < 16 ) - { - PORT->Group[g_APinDescription[ulPin].ulPort].WRCONFIG.reg = PORT_WRCONFIG_WRPMUX | PORT_WRCONFIG_PMUXEN | PORT_WRCONFIG_PMUX( g_APinDescription[ulPin].ulPinType ) | - PORT_WRCONFIG_WRPINCFG | - PORT_WRCONFIG_PINMASK( g_APinDescription[ulPin].ulPin ) ; - } - else - { - PORT->Group[g_APinDescription[ulPin].ulPort].WRCONFIG.reg = PORT_WRCONFIG_HWSEL | - PORT_WRCONFIG_WRPMUX | PORT_WRCONFIG_PMUXEN | PORT_WRCONFIG_PMUX( g_APinDescription[ulPin].ulPinType ) | - PORT_WRCONFIG_WRPINCFG | - PORT_WRCONFIG_PINMASK( g_APinDescription[ulPin].ulPin - 16 ) ; - } - break ; - - case PIO_NOT_A_PIN: - return -1l ; - break ; - } - - return 0l ; + // The WRCONFIG register allows update of only 16 pin max out of 32 + if ( g_APinDescription[ulPin].ulPin < 16 ) + { + PORT->Group[g_APinDescription[ulPin].ulPort].WRCONFIG.reg = PORT_WRCONFIG_WRPMUX | PORT_WRCONFIG_PMUXEN | PORT_WRCONFIG_PMUX( ulPeripheral ) | + PORT_WRCONFIG_WRPINCFG | + PORT_WRCONFIG_PINMASK( g_APinDescription[ulPin].ulPin ) ; + } + else + { + PORT->Group[g_APinDescription[ulPin].ulPort].WRCONFIG.reg = PORT_WRCONFIG_HWSEL | + PORT_WRCONFIG_WRPMUX | PORT_WRCONFIG_PMUXEN | PORT_WRCONFIG_PMUX( ulPeripheral ) | + PORT_WRCONFIG_WRPINCFG | + PORT_WRCONFIG_PINMASK( g_APinDescription[ulPin].ulPin - 16 ) ; + } +#else + if ( g_APinDescription[ulPin].ulPin & 1 ) // is pin odd? + { + uint32_t temp ; + + // Get whole current setup for both odd and even pins and remove odd one + temp = (PORT->Group[g_APinDescription[ulPin].ulPort].PMUX[g_APinDescription[ulPin].ulPin >> 1].reg) & PORT_PMUX_PMUXE( 0xF ) ; + // Set new muxing + PORT->Group[g_APinDescription[ulPin].ulPort].PMUX[g_APinDescription[ulPin].ulPin >> 1].reg = temp|PORT_PMUX_PMUXO( ulPeripheral ) ; + // Enable port mux + PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg |= PORT_PINCFG_PMUXEN ; + } + else // even pin + { + uint32_t temp ; + + temp = (PORT->Group[g_APinDescription[ulPin].ulPort].PMUX[g_APinDescription[ulPin].ulPin >> 1].reg) & PORT_PMUX_PMUXO( 0xF ) ; + PORT->Group[g_APinDescription[ulPin].ulPort].PMUX[g_APinDescription[ulPin].ulPin >> 1].reg = temp|PORT_PMUX_PMUXE( ulPeripheral ) ; + PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg |= PORT_PINCFG_PMUXEN ; // Enable port mux + } +#endif + break ; + + case PIO_NOT_A_PIN: + return -1l ; + break ; + } + + return 0l ; } void pinMode( uint32_t ulPin, uint32_t ulMode ) { - if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN ) - { - return ; - } - - switch ( ulMode ) - { - case INPUT: - // Set pin to input mode - PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg=(uint8_t)(PORT_PINCFG_INEN) ; - PORT->Group[g_APinDescription[ulPin].ulPort].DIRCLR.reg = (uint32_t)(1<<g_APinDescription[ulPin].ulPin) ; - break ; - - case INPUT_PULLUP: - // Set pin to input mode with pull-up resistor enabled - PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg=(uint8_t)(PORT_PINCFG_INEN|PORT_PINCFG_PULLEN) ; - PORT->Group[g_APinDescription[ulPin].ulPort].DIRCLR.reg = (uint32_t)(1<<g_APinDescription[ulPin].ulPin) ; - break ; - - case OUTPUT: - // Set pin to output mode - PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg&=~(uint8_t)(PORT_PINCFG_INEN) ; - PORT->Group[g_APinDescription[ulPin].ulPort].DIRSET.reg = (uint32_t)(1<<g_APinDescription[ulPin].ulPin) ; - break ; - - default: - // do nothing - break ; - } + if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN ) + { + return ; + } + + switch ( ulMode ) + { + case INPUT: + // Set pin to input mode + PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg=(uint8_t)(PORT_PINCFG_INEN) ; + PORT->Group[g_APinDescription[ulPin].ulPort].DIRCLR.reg = (uint32_t)(1<<g_APinDescription[ulPin].ulPin) ; + break ; + + case INPUT_PULLUP: + // Set pin to input mode with pull-up resistor enabled + PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg=(uint8_t)(PORT_PINCFG_INEN|PORT_PINCFG_PULLEN) ; + PORT->Group[g_APinDescription[ulPin].ulPort].DIRCLR.reg = (uint32_t)(1<<g_APinDescription[ulPin].ulPin) ; + break ; + + case OUTPUT: + // Set pin to output mode + PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg&=~(uint8_t)(PORT_PINCFG_INEN) ; + PORT->Group[g_APinDescription[ulPin].ulPort].DIRSET.reg = (uint32_t)(1<<g_APinDescription[ulPin].ulPin) ; + break ; + + default: + // do nothing + break ; + } } void digitalWrite( uint32_t ulPin, uint32_t ulVal ) { /* Handle the case the pin isn't usable as PIO */ - if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN ) + if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN ) { return ; } - // Enable pull-up resistor - PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg=(uint8_t)(PORT_PINCFG_PULLEN) ; + // Enable pull-up resistor + PORT->Group[g_APinDescription[ulPin].ulPort].PINCFG[g_APinDescription[ulPin].ulPin].reg=(uint8_t)(PORT_PINCFG_PULLEN) ; switch ( ulVal ) - { - case LOW: - PORT->Group[g_APinDescription[ulPin].ulPort].OUTCLR.reg = (1ul << g_APinDescription[ulPin].ulPin) ; - break ; + { + case LOW: + PORT->Group[g_APinDescription[ulPin].ulPort].OUTCLR.reg = (1ul << g_APinDescription[ulPin].ulPin) ; + break ; - case HIGH: - PORT->Group[g_APinDescription[ulPin].ulPort].OUTSET.reg = (1ul << g_APinDescription[ulPin].ulPin) ; - break ; + case HIGH: + PORT->Group[g_APinDescription[ulPin].ulPort].OUTSET.reg = (1ul << g_APinDescription[ulPin].ulPin) ; + break ; - default: - break ; - } + default: + break ; + } - return ; + return ; } int digitalRead( uint32_t ulPin ) { /* Handle the case the pin isn't usable as PIO */ - if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN ) - { - return LOW ; - } + if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN ) + { + return LOW ; + } - if ( (PORT->Group[g_APinDescription[ulPin].ulPort].IN.reg & (1ul << g_APinDescription[ulPin].ulPin)) != 0 ) - { - return HIGH ; - } + if ( (PORT->Group[g_APinDescription[ulPin].ulPort].IN.reg & (1ul << g_APinDescription[ulPin].ulPin)) != 0 ) + { + return HIGH ; + } - return LOW ; + return LOW ; } #ifdef __cplusplus diff --git a/variants/arduino_zero/debug_scripts/variant.gdb b/variants/arduino_zero/debug_scripts/variant.gdb new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/variants/arduino_zero/variant.cpp b/variants/arduino_zero/variant.cpp index d21675a95b9a453df53b5a4ef94deeb1b93277b3..de13f0b54edce2e69cb5b4747665cdb8ed423af1 100644 --- a/variants/arduino_zero/variant.cpp +++ b/variants/arduino_zero/variant.cpp @@ -22,27 +22,27 @@ * +------------+------------------+--------+-----------------+------------------------------ * | | Digital Low | | | * +------------+------------------+--------+-----------------+------------------------------ - * | 0 | 0 -> RX | PA10 | | EIC/EXTINT[10] ADC/AIN[18] *SERCOM0/PAD[2] TCC1/WO[0] TCC0/WO[2] - * | 1 | 1 <- TX | PA11 | | EIC/EXTINT[11] ADC/AIN[19] *SERCOM0/PAD[3] SERCOM2/PAD[3] TCC1/WO[1] TCC0/WO[3] - * | 2 | ~2 | PA08 | | EIC/NMI ADC/AIN[16] SERCOM0/PAD[0] SERCOM2/PAD[0] *TCC0/WO[0] TCC1/WO[2] - * | 3 | ~3 | PA09 | | EIC/EXTINT[9] ADC/AIN[17] SERCOM0/PAD[1] SERCOM2/PAD[1] *TCC0/WO[1] TCC1/WO[3] + * | 0 | 0 -> RX | PA10 | | EIC/EXTINT[10] ADC/AIN[18] PTC/X[2] *SERCOM0/PAD[2] TCC1/WO[0] TCC0/WO[2] + * | 1 | 1 <- TX | PA11 | | EIC/EXTINT[11] ADC/AIN[19] PTC/X[3] *SERCOM0/PAD[3] SERCOM2/PAD[3] TCC1/WO[1] TCC0/WO[3] + * | 2 | ~2 | PA08 | | EIC/NMI ADC/AIN[16] PTC/X[0] SERCOM0/PAD[0] SERCOM2/PAD[0] *TCC0/WO[0] TCC1/WO[2] + * | 3 | ~3 | PA09 | | EIC/EXTINT[9] ADC/AIN[17] PTC/X[1] SERCOM0/PAD[1] SERCOM2/PAD[1] *TCC0/WO[1] TCC1/WO[3] * | 4 | ~4 | PA14 | | EIC/EXTINT[14] SERCOM2/PAD[2] SERCOM4/PAD[2] TC3/WO[0] *TCC0/WO[4] * | 5 | ~5 | PA15 | | EIC/EXTINT[15] SERCOM2/PAD[3] SERCOM4/PAD[3] TC3/WO[1] *TCC0/WO[5] - * | 6 | ~6 | PA20 | | EIC/EXTINT[4] SERCOM5/PAD[2] SERCOM3/PAD[2] TC7/WO[0] *TCC0/WO[6] - * | 7 | ~7 | PA21 | | EIC/EXTINT[5] SERCOM5/PAD[3] SERCOM3/PAD[3] TC7/WO[1] *TCC0/WO[7] + * | 6 | ~6 | PA20 | | EIC/EXTINT[4] PTC/X[8] SERCOM5/PAD[2] SERCOM3/PAD[2] TC7/WO[0] *TCC0/WO[6] + * | 7 | ~7 | PA21 | | EIC/EXTINT[5] PTC/X[9] SERCOM5/PAD[3] SERCOM3/PAD[3] TC7/WO[1] *TCC0/WO[7] * +------------+------------------+--------+-----------------+------------------------------ * | | Digital High | | | * +------------+------------------+--------+-----------------+------------------------------ - * | 8 | ~8 | PA06 | | EIC/EXTINT[6] ADC/AIN[6] AC/AIN[2] SERCOM0/PAD[2] *TCC1/WO[0] - * | 9 | ~9 | PA07 | | EIC/EXTINT[7] ADC/AIN[7] AC/AIN[3] SERCOM0/PAD[3] *TCC1/WO[1] - * | 10 | ~10 | PA18 | | EIC/EXTINT[2] SERCOM1/PAD[2] SERCOM3/PAD[2] *TC3/WO[0] TCC0/WO[2] - * | 11 | ~11 | PA16 | | EIC/EXTINT[0] SERCOM1/PAD[0] SERCOM3/PAD[0] *TCC2/WO[0] TCC0/WO[6] - * | 12 | ~12 | PA19 | | EIC/EXTINT[3] SERCOM1/PAD[3] SERCOM3/PAD[3] *TC3/WO[1] TCC0/WO[3] - * | 13 | ~13 | PA17 | LED | EIC/EXTINT[1] SERCOM1/PAD[1] SERCOM3/PAD[1] *TCC2/WO[1] TCC0/WO[7] + * | 8 | ~8 | PA06 | | EIC/EXTINT[6] PTC/Y[4] ADC/AIN[6] AC/AIN[2] SERCOM0/PAD[2] *TCC1/WO[0] + * | 9 | ~9 | PA07 | | EIC/EXTINT[7] PTC/Y[5] DC/AIN[7] AC/AIN[3] SERCOM0/PAD[3] *TCC1/WO[1] + * | 10 | ~10 | PA18 | | EIC/EXTINT[2] PTC/X[6] SERCOM1/PAD[2] SERCOM3/PAD[2] *TC3/WO[0] TCC0/WO[2] + * | 11 | ~11 | PA16 | | EIC/EXTINT[0] PTC/X[4] SERCOM1/PAD[0] SERCOM3/PAD[0] *TCC2/WO[0] TCC0/WO[6] + * | 12 | ~12 | PA19 | | EIC/EXTINT[3] PTC/X[7] SERCOM1/PAD[3] SERCOM3/PAD[3] *TC3/WO[1] TCC0/WO[3] + * | 13 | ~13 | PA17 | LED | EIC/EXTINT[1] PTC/X[5] SERCOM1/PAD[1] SERCOM3/PAD[1] *TCC2/WO[1] TCC0/WO[7] * | 14 | GND | | | - * | 15 | AREF | PA03 | | *DAC/VREFP - * | 16 | SDA | PA22 | | EIC/EXTINT[6] *SERCOM3/PAD[0] SERCOM5/PAD[0] TC4/WO[0] TCC0/WO[4] - * | 17 | SCL | PA23 | | EIC/EXTINT[7] *SERCOM3/PAD[1] SERCOM5/PAD[1] TC4/WO[1] TCC0/WO[5] + * | 15 | AREF | PA03 | | *DAC/VREFP PTC/Y[1] + * | 16 | SDA | PA22 | | EIC/EXTINT[6] PTC/X[10] *SERCOM3/PAD[0] SERCOM5/PAD[0] TC4/WO[0] TCC0/WO[4] + * | 17 | SCL | PA23 | | EIC/EXTINT[7] PTC/X[11] *SERCOM3/PAD[1] SERCOM5/PAD[1] TC4/WO[1] TCC0/WO[5] * +------------+------------------+--------+-----------------+------------------------------ * | |SPI (Legacy ICSP) | | | * +------------+------------------+--------+-----------------+------------------------------ @@ -55,12 +55,12 @@ * +------------+------------------+--------+-----------------+------------------------------ * | | Analog Connector | | | * +------------+------------------+--------+-----------------+------------------------------ - * | 24 | A0 | PA02 | | EIC/EXTINT[2] *DAC/VOUT - * | 25 | A1 | PB08 | | EIC/EXTINT[8] *ADC/AIN[2] SERCOM4/PAD[0] TC4/WO[0] - * | 26 | A2 | PB09 | | EIC/EXTINT[9] *ADC/AIN[3] SERCOM4/PAD[1] TC4/WO[1] - * | 27 | A3 | PA04 | | EIC/EXTINT[4] *ADC/AIN[4] AC/AIN[0] SERCOM0/PAD[0] TCC0/WO[0] - * | 28 | A4 | PA05 | | EIC/EXTINT[5] *ADC/AIN[5] AC/AIN[1] SERCOM0/PAD[1] TCC0/WO[1] - * | 29 | A5 | PB02 | | EIC/EXTINT[2] *ADC/AIN[10] SERCOM5/PAD[0] TC6/WO[0] + * | 24 | A0 | PA02 | | EIC/EXTINT[2] PTC/Y[0] *DAC/VOUT + * | 25 | A1 | PB08 | | EIC/EXTINT[8] *ADC/AIN[2] PTC/Y[14] SERCOM4/PAD[0] TC4/WO[0] + * | 26 | A2 | PB09 | | EIC/EXTINT[9] *ADC/AIN[3] PTC/Y[15] SERCOM4/PAD[1] TC4/WO[1] + * | 27 | A3 | PA04 | | EIC/EXTINT[4] *ADC/AIN[4] AC/AIN[0] PTC/Y[2] SERCOM0/PAD[0] TCC0/WO[0] + * | 28 | A4 | PA05 | | EIC/EXTINT[5] *ADC/AIN[5] AC/AIN[1] PTC/Y[5] SERCOM0/PAD[1] TCC0/WO[1] + * | 29 | A5 | PB02 | | EIC/EXTINT[2] *ADC/AIN[10] PTC/Y[8] SERCOM5/PAD[0] TC6/WO[0] * +------------+------------------+--------+-----------------+------------------------------ * | | LEDs | | | * +------------+------------------+--------+-----------------+------------------------------