diff --git a/ArduinoZeroTemplate.cproj b/ArduinoZeroTemplate.cproj index 4e36db09836e555ecce2cbf6fcb7c0ca8f003d1a..1e0c0d59cbeaed8c2a513afe0f374aee3812040e 100644 --- a/ArduinoZeroTemplate.cproj +++ b/ArduinoZeroTemplate.cproj @@ -412,7 +412,7 @@ <Value>../src/ASF/sam0/drivers/rtc/rtc_sam_d_r_h</Value> </ListValues> </armgcc.compiler.directories.IncludePaths> - <armgcc.compiler.optimization.level>Optimize (-O1)</armgcc.compiler.optimization.level> + <armgcc.compiler.optimization.level>Optimize debugging experience (-Og)</armgcc.compiler.optimization.level> <armgcc.compiler.optimization.OtherFlags>-fdata-sections</armgcc.compiler.optimization.OtherFlags> <armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection>True</armgcc.compiler.optimization.PrepareFunctionsForGarbageCollection> <armgcc.compiler.optimization.DebugLevel>Maximum (-g3)</armgcc.compiler.optimization.DebugLevel> @@ -431,6 +431,7 @@ </ListValues> </armgcc.linker.libraries.LibrarySearchPaths> <armgcc.linker.optimization.GarbageCollectUnusedSections>True</armgcc.linker.optimization.GarbageCollectUnusedSections> + <armgcc.linker.memorysettings.ExternalRAM /> <armgcc.linker.miscellaneous.LinkerFlags>-Wl,--entry=Reset_Handler -Wl,--cref -mthumb -T../src/ASF/sam0/utils/linker_scripts/samd21/gcc/samd21g18a_flash.ld</armgcc.linker.miscellaneous.LinkerFlags> <armgcc.assembler.general.IncludePaths> <ListValues> @@ -1124,6 +1125,9 @@ <Compile Include="src\config\asf.h"> <SubType>compile</SubType> </Compile> + <Compile Include="src\macros.h"> + <SubType>compile</SubType> + </Compile> <Compile Include="src\main.c"> <SubType>compile</SubType> </Compile> diff --git a/src/ArduinoZeroTemplate.c b/src/ArduinoZeroTemplate.c index 0b0dfc692c1409335ff0a5241bf346055386b0a2..8ea2afecaa3345e49e8093d25e16340aa0dcff59 100644 --- a/src/ArduinoZeroTemplate.c +++ b/src/ArduinoZeroTemplate.c @@ -7,6 +7,7 @@ #include <asf.h> #include "ArduinoZeroTemplate.h" +#include "macros.h" // Globala variabler diff --git a/src/ArduinoZeroTemplate.h b/src/ArduinoZeroTemplate.h index 3e14f99aaa6d5ddb3db61a4679775d515bb765a7..1bc1e9b56df74d03295525a7a858e8d767c4c234 100644 --- a/src/ArduinoZeroTemplate.h +++ b/src/ArduinoZeroTemplate.h @@ -98,41 +98,6 @@ Available for user (J4-14) PB11 - TCC0-W5 */ -// Macros for writing to I/O: - // There are many ways to write to PORT registers. - // Method 1. Simples PORT method. Example for setting PA20 on PORTA. Note PORT_PA20 and not PIN_PA20 - // PORTA.OUTSET.reg = PORT_PA20 - // Method 2. Quicker method of PORT. Not sure if it is much faster than method 1 but it is more "compatible" with method nr 3. - // port_nr is in this case 0 for PORTA, 1 for PORTB and so on. - // PORT->Group[port_nr].OUTSET.reg = PORT_PA20 - // Method nr 3. Much quicker method that uses the direct access IOBUS. (If any optimization is enabled, otherwise difference is smaller). - // PORT_IOBUS->Group[port_nr].OUTSET.reg = PORT_PA20 - // Drawback is that for using IOBUS the constant sampling of used pins (in groups of 8) must be enabled. - // This consumes some power. - // Recommendation: Use method nr 2 and 3. Nr 2 if need to use minimum of power and 3 if need for maximal speed. - // Note: Data sheet says that only Data Output Value, Data Input Value and Pin Direction registers can be accessed through IOBUS operation. - // But practically test has shown that all PORT register can be accessed. For example PINCFG. - // Read more here about writing to ports: - // https://electronics.stackexchange.com/questions/139117/atmels-arm-programming-without-asf - // https://community.atmel.com/forum/getting-started-arm-3 - // https://www.avrfreaks.net/forum/considerations-using-iobus-port-access - - #define PORT_SET_PIN(port_nr,port_pin) PORT_IOBUS->Group[port_nr].OUTSET.reg = port_pin // Set to 1; Time with 40MHz is 190nsec - #define PORT_CLR_PIN(port_nr,port_pin) PORT_IOBUS->Group[port_nr].OUTCLR.reg = port_pin // Set to 0 - #define PORT_TOGGLE_PIN(port_nr,port_pin) PORT_IOBUS->Group[port_nr].OUTTGL.reg = port_pin // Toggle pin - #define PORT_OUTPUT_PIN(port_nr,port_pin) PORT_IOBUS->Group[port_nr].DIRSET.reg = port_pin // Set pin to output - #define PORT_INPUT_PIN(port_nr,port_pin) PORT_IOBUS->Group[port_nr].DIRCLR.reg = port_pin // port.DIRCLR.reg = pin // Set pin to input - #define PORT_INPUT_PIN_EN(port_nr,port_pin) PORT->Group[port_nr].PINCFG[port_pin].bit.INEN = 1 // Enable input buffer (needed to be able to read a pin) - #define PORT_READ_PIN(port_nr,port_pin) PORT_IOBUS->Group[port_nr].IN[port_pin] // Read a pin - #define PORT_READ(port_nr) PORT->Group[port_nr].IN.reg // Read a port - #define PORT_SET_CTRLSAMPLING(port_nr,port_pin) PORT->Group[port_nr].CTRL.reg |= port_pin; // Enable continuous sampling of a pin group (always in groups of 8) - #define PORT_CLR_CTRLSAMPLING(port_nr,port_pin) PORT->Group[port_nr].CTRL.reg &= ~port_pin; // Remove continuous sampling of a pin group - #define PORT_PULL_PIN_EN(port_nr,port_pin) PORT->Group[port_nr].PINCFG[port_pin].PULLEN=1 // Enable pull on a pin (Typ 40 kohm). Data value defines pull-up (1) or pull-down (0). Not on PA24 and PA25 - #define PORT_PULL_PIN_DIS(port_nr,port_pin) PORT->Group[port_nr].PINCFG[port_pin].PULLEN=0 // Disable pull on a pin - #define PORT_PULL_PIN_DRIVE_STRONG(port_nr,port_pin) PORT->Group[port_nr].PINCFG[port_pin].DRVSTR=1 // Enable strong drive strength on a pin. (~3mA, twice for VCC=3.6V). Not on PA24 and PA25 - #define PORT_PULL_PIN_DRIVE_WEAK(port_nr,port_pin) PORT->Group[port_nr].PINCFG[port_pin].DRVSTR=1 // Disable strong drive strength on a pin. (~1mA, twice for VCC=3.6V) - - // Tip: Example of other register or variable fiddling: SYSCTRL->VREG.bit.RUNSTDBY = 1 // Definitions diff --git a/src/config/ArduinoZeroTemplateClocks.h b/src/config/ArduinoZeroTemplateClocks.h index 4fcd785ca86882221163ef32b05427495a36c437..3f51799372d5f602df13bdb93bf760def16db85a 100644 --- a/src/config/ArduinoZeroTemplateClocks.h +++ b/src/config/ArduinoZeroTemplateClocks.h @@ -5,6 +5,7 @@ * Author: ilosz01 */ +// ArduinoZeroTemplate: configured for maximum speed using DFLL (48 MHz) // System clock bus configuration # define CONF_CLOCK_CPU_CLOCK_FAILURE_DETECT false