This page contains the source code for programming the Teensy3.5 in assembly. No frameworks like Adruino or external dependencies are required. It can be used by people who want to learn assembly and experiment with the teensy3.5 developement board.
Most of the work was done by sources found on the internet:
# Need to login https://www.nxp.com/part/MK64FX512VMD12#/ KQRUG, Kinetis K Quick Reference User Guide Kinetis K64F Sub-Family Data Sheet https://www.nxp.com/docs/en/data-sheet/K64P144M120SF5.pdf ARMv7-M Architecture Reference Manual https://developer.arm.com/documentation/ddi0403/ee/ # Note ## We used pdftotext (from the poppler-utils-21.12.0 package) to convert the pdf files to text for easy access from the commandline. pdftotext -layout K64P144M120SF5RM.pdf > K64P144M120SF5RM.txt
pkg_add teensyloader pkg_add arm-none-eabi-binutils-2.31.1 pkg_add arm-none-eabi-newlib-2.2.0.1p1 #pkg_add arm-none-eabi-gcc-linaro-7.4.2019.02p0 #pkg_add arm-none-eabi-gdb-7.12.1p0 pgk_add gmake wget https://aoeu-it.nl/howto/teensy3.5-bare-mimimum.tar.gz tar -xzf teensy3.5-bare-mimimum.tar.gz cd teensy3.5-bare-mimimum gmake clean gmake all # Connect the Teensy3.5 development board to the system. gmake program # Push the reset button to upload the binary (*.hex) ```
/* * File: crt0.s * Purpose: Lowest level routines for Kinetis. * * Notes: This code is modified from the original from the Kinetis K20 * package from Freescale (kinetis_50MHz_sc.zip). Vector table entries * are based on the K20P64M72F1 Reference Manual by Freescale; refer to * the NVIC section in Chapter 3. * */ .syntax unified .section ".interrupt_vector_table" .global __interrupt_vector_table __interrupt_vector_table: .long _estack .long _startup /* Reset Handler */ .long _halt .long _halt .long _halt .long _halt .long _halt .section ".flash_config" .global __flash_config __flash_config: .long 0xFFFFFFFF .long 0xFFFFFFFF .long 0xFFFFFFFF .long 0xFFFFFFFE .section ".startup","x",%progbits .thumb_func .global _startup _startup: mov r0,#0 mov r1,#0 mov r2,#0 mov r3,#0 mov r4,#0 mov r5,#0 mov r6,#0 mov r7,#0 mov r8,#0 mov r9,#0 mov r10,#0 mov r11,#0 mov r12,#0 // Disable watchdog interrupt cpsid i // WDOG_UNLOCK ldr r6, =0x4005200E ldr r0, =0xC520 strh r0, [r6] ldr r0, =0xD928 strh r0, [r6] // WDOG_STCTRLH ldr r6, =0x40052000 ldr r0, =0x01D2 strh r0, [r6] cpsie i // clocks ldr r6, =0x40048038 ldr r0, =0x043F82 str r0, [r6] // Turn on light. // PORTC_PCR5 ldr r6, =0x4004B014 ldr r0, =0x00000143 str r0, [r6] // GPIOC_PDDR ldr r6, =0x400ff094 ldr r0, =0x20 str r0, [r6] // GPIOC_PSOR ldr r6, =0x400FF084 ldr r0, =0x20 str r0, [r6] b . _halt: b .
/* Teensyduino Core Library * http://www.pjrc.com/teensy/ * Copyright (c) 2017 PJRC.COM, LLC. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * 1. The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * 2. If the Software is incorporated into a build system that allows * selection among a list of target devices, then similar target * devices manufactured by PJRC.COM must be included in the list of * target devices and selectable in the same manner. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ MEMORY { FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 512K RAM (rwx) : ORIGIN = 0x1FFF0000, LENGTH = 64K } ENTRY(_startup) SECTIONS { .text : { . = 0; KEEP(*(.interrupt_vector_table)) . = 0x400; KEEP(*(.flash_config*)) *(.startup*) *(.text*) } > FLASH = 0xFF .ARM.exidx : { __exidx_start = .; *(.ARM.exidx* .gnu.linkonce.armexidx.*) __exidx_end = .; } > FLASH _etext = .; _estack = ORIGIN(RAM) + LENGTH(RAM); _teensy_model_identifier = 0x1F; }
PROJECT=bare CPU = cortex-m4 OBJECTS = crt0.o TOOLPATH = /usr/local TEENSY3X_BASEPATH = ${HOME}/minimal-setup-teensy TARGETTYPE = arm-none-eabi TEENSY3X_INC = $(TEENSY3X_BASEPATH) GCC_INC = $(TOOLPATH)/$(TARGETTYPE) INCDIRS = -I$(GCC_INC) INCDIRS += -I$(TEENSY3X_INC) INCDIRS += -I. LSCRIPT = $(TEENSY3X_BASEPATH)/mk64fx512.ld LIBDIRS = -L"$(TOOLPATH)/$(TARGETTYPE)/lib" LIBS = ASFLAGS = -mcpu=$(CPU) -mthumb ASFLAGS += -alhs -g LDFLAGS = -Map=$(PROJECT).map -T$(LSCRIPT) #LDFLAGS = -nostdlib -nostartfiles -shared -Map=$(PROJECT).map -T$(LSCRIPT) #LDFLAGS = -nostdlib -nostartfiles -Map=$(PROJECT).map -T$(LSCRIPT) LDFLAGS += --cref LDFLAGS += $(LIBDIRS) LDFLAGS += $(LIBS) BINDIR = /usr/local/bin AS = $(BINDIR)/arm-none-eabi-as AR = $(BINDIR)/arm-none-eabi-ar LD = $(BINDIR)/arm-none-eabi-ld OBJCOPY = $(BINDIR)/arm-none-eabi-objcopy SIZE = $(BINDIR)/arm-none-eabi-size OBJDUMP = $(BINDIR)/arm-none-eabi-objdump REMOVE = rm -f ######################################################################### all:: $(PROJECT).hex $(PROJECT).bin stats dump #all:: $(PROJECT).hex $(PROJECT).bin $(PROJECT).hex: $(PROJECT).elf @echo "Objcopy (hex)" $(OBJCOPY) -R .stack -O ihex $(PROJECT).elf $(PROJECT).hex @echo "" $(PROJECT).bin: $(PROJECT).elf @echo "# Objcopy (bin)" $(OBJCOPY) -O binary -j .text -j .data $(PROJECT).elf $(PROJECT).bin @echo "" stats: $(PROJECT).elf $(SIZE) $(PROJECT).elf dump: $(PROJECT).elf $(OBJDUMP) -h $(PROJECT).elf # Linker invocation $(PROJECT).elf: $(OBJECTS) @echo Linking $< $(LD) $(OBJECTS) $(LDFLAGS) -o $(PROJECT).elf @echo "" .s.o : @echo "# Assembling $< -> $@:" $(AS) $(ASFLAGS) -o $@ $< > $(basename $@).lst @echo "" clean: $(REMOVE) *.o $(REMOVE) $(PROJECT).hex $(REMOVE) $(PROJECT).elf $(REMOVE) $(PROJECT).map $(REMOVE) $(PROJECT).bin $(REMOVE) *.lst program: teensyloader -w --mcu=TEENSY35 blinky.hex
The information provided herein is for general educational purpose only and does not constitute professional advice. While effort has been made to ensure the accuracy and reliability of the information, no guarantee is given regarding its completeness or applicability. The reader assumes full responsibility for any actions taken based on the information provided. The author shall not be held liable for any direct, indirect, consequential or incidental damages arising from the use or misuse of the information presented.