This one's a bit of a kludge but it does work. There's a bit of drift (or something) but I didn't have time to scope the output and fix it. Sorry.
This uses the GCC example for "delay" in the Atmel Software Framework:
http://www.atmel.com/tools/avrsoftwareframework.aspx?tab=overview
There are 3 files you need to edit:
common2/services/delay/example/
/**
* \file
*
* \mainpage
*
* \section title Delay service example
*
* \section file File(s)
* - \ref delay_example.c
*
* Copyright (c) 2011 - 2014 Atmel Corporation. All rights reserved.
*
* \asf_license_start
*
* \page License
*
* 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. The name of Atmel may not be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* 4. This software may only be redistributed and used in connection with an
* Atmel microcontroller product.
*
* THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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.
*
* \asf_license_stop
*
*/
#include <asf.h>
#define PWM_MODULE EXT1_PWM_MODULE
#define PWM_OUT_PIN EXT1_PWM_0_PIN //PB02
#define PWM_OUT_MUX EXT1_PWM_0_MUX
struct tc_module tc_instance;
void configure_tc(void)
{
struct tc_config config_tc;
tc_get_config_defaults(&config_tc);
config_tc.counter_size = TC_COUNTER_SIZE_16BIT;
config_tc.wave_generation = TC_WAVE_GENERATION_NORMAL_PWM;
//config_tc.counter_16_bit.compare_capture_channel[0] = (0xFFFF / 2);
config_tc.counter_32_bit.compare_capture_channel[0] = (8000);
config_tc.pwm_channel[0].enabled = true;
config_tc.pwm_channel[0].pin_out = PWM_OUT_PIN;
config_tc.pwm_channel[0].pin_mux = PWM_OUT_MUX;
tc_init(&tc_instance, PWM_MODULE, &config_tc);
tc_set_top_value(&tc_instance,160000);
tc_enable(&tc_instance);
}
void setDuty(uint32_t duty) {
tc_set_compare_value(&tc_instance, TC_COMPARE_CAPTURE_CHANNEL_0, duty);
//Do we need to reset the counter? What if we already passed top?
}
int main(void)
{
system_init();
delay_init();
configure_tc();
struct port_config pin;
port_get_config_defaults(&pin);
pin.direction = PORT_PIN_DIR_OUTPUT;
port_pin_set_config(LED0_PIN, &pin);
port_pin_set_output_level(LED0_PIN, LED0_INACTIVE);
while (true) {
delay_s(2);
setDuty(16000);
delay_s(2);
setDuty(12000);
delay_s(2);
setDuty(8000);
}
}
common2/services/delay/example/samd20_xplained_pro/gcc/asf.h
Just add this before the last #endif:
#include <tc.h>
common2/services/delay/example/samd20_xplained_pro/gcc/config.mk
To this file we're just adding the includes for tc.c and the tc path but I'll paste the entire file:
#
# Copyright (c) 2011 Atmel Corporation. All rights reserved.
#
# \asf_license_start
#
# \page License
#
# 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. The name of Atmel may not be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# 4. This software may only be redistributed and used in connection with an
# Atmel microcontroller product.
#
# THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
# EXPRESSLY AND SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL 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.
#
# \asf_license_stop
#
# Path to top level ASF directory relative to this project directory.
PRJ_PATH = ../../../../../..
# Target CPU architecture: cortex-m3, cortex-m4
ARCH = cortex-m0plus
# Target part: none, sam3n4 or sam4l4aa
PART = samd20j18
# Application target name. Given with suffix .a for library and .elf for a
# standalone application.
TARGET_FLASH = delay_example_flash.elf
TARGET_SRAM = delay_example_sram.elf
# List of C source files.
CSRCS = \
common/utils/interrupt/interrupt_sam_nvic.c \
common2/services/delay/example/delay_example.c \
common2/services/delay/sam0/systick_counter.c \
sam0/boards/samd20_xplained_pro/board_init.c \
sam0/drivers/port/port.c \
sam0/drivers/system/clock/clock_samd20/clock.c \
sam0/drivers/system/clock/clock_samd20/gclk.c \
sam0/drivers/system/interrupt/system_interrupt.c \
sam0/drivers/system/pinmux/pinmux.c \
sam0/drivers/system/system.c \
sam0/drivers/tc/tc.c \
sam0/utils/cmsis/samd20/source/gcc/startup_samd20.c \
sam0/utils/cmsis/samd20/source/system_samd20.c \
sam0/utils/syscalls/gcc/syscalls.c
# List of assembler source files.
ASSRCS =
# List of include paths.
INC_PATH = \
common/boards \
common/utils \
common2/services/delay \
common2/services/delay/example/samd20_xplained_pro \
common2/services/delay/sam0 \
sam0/boards \
sam0/boards/samd20_xplained_pro \
sam0/drivers/port \
sam0/drivers/system \
sam0/drivers/system/clock \
sam0/drivers/system/clock/clock_samd20 \
sam0/drivers/system/interrupt \
sam0/drivers/system/interrupt/system_interrupt_samd20 \
sam0/drivers/system/pinmux \
sam0/drivers/tc \
sam0/utils \
sam0/utils/cmsis/samd20/include \
sam0/utils/cmsis/samd20/source \
sam0/utils/header_files \
sam0/utils/preprocessor \
thirdparty/CMSIS/Include \
thirdparty/CMSIS/Lib/GCC \
common2/services/delay/example/samd20_xplained_pro/gcc
# Additional search paths for libraries.
LIB_PATH = \
thirdparty/CMSIS/Lib/GCC
# List of libraries to use during linking.
LIBS = \
arm_cortexM0l_math
# Path relative to top level directory pointing to a linker script.
LINKER_SCRIPT_FLASH = sam0/utils/linker_scripts/samd20/gcc/samd20j18_flash.ld
LINKER_SCRIPT_SRAM = sam0/utils/linker_scripts/samd20/gcc/samd20j18_sram.ld
# Path relative to top level directory pointing to a linker script.
DEBUG_SCRIPT_FLASH = sam0/boards/samd20_xplained_pro/debug_scripts/gcc/samd20_xplained_pro_flash.gdb
DEBUG_SCRIPT_SRAM = sam0/boards/samd20_xplained_pro/debug_scripts/gcc/samd20_xplained_pro_sram.gdb
# Project type parameter: all, sram or flash
PROJECT_TYPE = flash
# Additional options for debugging. By default the common Makefile.in will
# add -g3.
DBGFLAGS =
# Application optimization used during compilation and linking:
# -O0, -O1, -O2, -O3 or -Os
OPTIMIZATION = -O1
# Extra flags to use when archiving.
ARFLAGS =
# Extra flags to use when assembling.
ASFLAGS =
# Extra flags to use when compiling.
CFLAGS =
# Extra flags to use when preprocessing.
#
# Preprocessor symbol definitions
# To add a definition use the format "-D name[=definition]".
# To cancel a definition use the format "-U name".
#
# The most relevant symbols to define for the preprocessor are:
# BOARD Target board in use, see boards/board.h for a list.
# EXT_BOARD Optional extension board in use, see boards/board.h for a list.
CPPFLAGS = \
-D ARM_MATH_CM0=true \
-D BOARD=SAMD20_XPLAINED_PRO \
-D SYSTICK_MODE \
-D __SAMD20J18__
# Extra flags to use when linking
LDFLAGS = \
# Pre- and post-build commands
PREBUILD_CMD =
POSTBUILD_CMD =
type "make" in the GCC directory to build the .elf file. Flash it to the hardware using OpenOCD and arm-none-eabi-gdb as explained here.
Discussions
Become a Hackaday.io Member
Create an account to leave a comment. Already have an account? Log In.