From b7d241746c658d6ef41c798282031ba0cd9da4bb Mon Sep 17 00:00:00 2001 From: Arti Zirk Date: Sat, 26 Jun 2021 11:34:10 +0300 Subject: [PATCH] Add dcc debug write and fix mcu part number --- .clang-format | 66 +++++++++++++++++++ .editorconfig | 8 +++ .gitignore | 3 + Makefile | 11 +++- libdcc/README | 18 ++++++ libdcc/dcc_stdio.c | 155 +++++++++++++++++++++++++++++++++++++++++++++ libdcc/dcc_stdio.h | 35 ++++++++++ libdcc/example.c | 56 ++++++++++++++++ libopencm3 | 2 +- main.c | 13 +++- openocd.cfg | 8 ++- rules.mk | 3 +- 12 files changed, 367 insertions(+), 11 deletions(-) create mode 100644 .clang-format create mode 100644 .editorconfig create mode 100644 libdcc/README create mode 100644 libdcc/dcc_stdio.c create mode 100644 libdcc/dcc_stdio.h create mode 100644 libdcc/example.c diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..43addd9 --- /dev/null +++ b/.clang-format @@ -0,0 +1,66 @@ +# Generated from CLion C/C++ Code Style settings +BasedOnStyle: LLVM +AccessModifierOffset: -2 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: None +AlignOperands: Align +AllowAllArgumentsOnNextLine: false +AllowAllConstructorInitializersOnNextLine: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: Always +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Always +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: true +AlwaysBreakAfterReturnType: None +AlwaysBreakTemplateDeclarations: Yes +BreakBeforeBraces: Custom +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterFunction: false + AfterNamespace: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + IndentBraces: false + SplitEmptyFunction: false + SplitEmptyRecord: true +BreakBeforeBinaryOperators: None +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeColon +BreakInheritanceList: BeforeColon +ColumnLimit: 0 +CompactNamespaces: false +ContinuationIndentWidth: 8 +IndentCaseLabels: true +IndentPPDirectives: None +IndentWidth: 2 +KeepEmptyLinesAtTheStartOfBlocks: true +MaxEmptyLinesToKeep: 2 +NamespaceIndentation: All +ObjCSpaceAfterProperty: false +ObjCSpaceBeforeProtocolList: true +PointerAlignment: Right +ReflowComments: false +SpaceAfterCStyleCast: true +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeCpp11BracedList: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeParens: ControlStatements +SpaceBeforeRangeBasedForLoopColon: true +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 0 +SpacesInAngles: false +SpacesInCStyleCastParentheses: false +SpacesInContainerLiterals: false +SpacesInParentheses: false +SpacesInSquareBrackets: false +TabWidth: 4 +UseTab: ForContinuationAndIndentation diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..280cd99 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +# top-most EditorConfig file +root = true + +[*] +end_of_line = lf +insert_final_newline = true +indent_style = tab +indent_size = 4 diff --git a/.gitignore b/.gitignore index 9ba28bd..bf4fc60 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ bin/ *.elf *.bin +*.map +*.lss +*.list generated.*.ld .idea diff --git a/Makefile b/Makefile index f81b150..d066728 100644 --- a/Makefile +++ b/Makefile @@ -5,12 +5,17 @@ BUILD_DIR = bin #SHARED_DIR = ../my-common-code CFILES = main.c -#CFILES += api.c #AFILES += api-asm.S # TODO - you will need to edit these two lines! -DEVICE=stm32f103rcbt6 -OOCD_FILE = board/stm32f4discovery.cfg +DEVICE=STM32F103C8T6 +OOCD_FILE=openocd.cfg + +# Send debug messages via OpenOCD DCC support +CFILES += dcc_stdio.c +VPATH += libdcc +INCLUDES += $(patsubst %,-I%, . libdcc) + # You shouldn't have to edit anything below here. #VPATH += $(SHARED_DIR) diff --git a/libdcc/README b/libdcc/README new file mode 100644 index 0000000..1135b24 --- /dev/null +++ b/libdcc/README @@ -0,0 +1,18 @@ +This code is an example of using the openocd debug message system. + +Before the message output is seen in the debug window, the functionality +will need enabling: + +From the gdb prompt: +monitor target_request debugmsgs enable +monitor trace point 1 + +From the Telnet prompt: +target_request debugmsgs enable +trace point 1 + +To see how many times the trace point was hit: +(monitor) trace point 1 + +Spen +spen@spen-soft.co.uk diff --git a/libdcc/dcc_stdio.c b/libdcc/dcc_stdio.c new file mode 100644 index 0000000..7da78c6 --- /dev/null +++ b/libdcc/dcc_stdio.c @@ -0,0 +1,155 @@ +/*************************************************************************** + * Copyright (C) 2008 by Dominic Rath * + * Dominic.Rath@gmx.de * + * Copyright (C) 2008 by Spencer Oliver * + * spen@spen-soft.co.uk * + * Copyright (C) 2008 by Frederik Kriewtz * + * frederik@kriewitz.eu * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#include "dcc_stdio.h" + +#define TARGET_REQ_TRACEMSG 0x00 +#define TARGET_REQ_DEBUGMSG_ASCII 0x01 +#define TARGET_REQ_DEBUGMSG_HEXMSG(size) (0x01 | ((size & 0xff) << 8)) +#define TARGET_REQ_DEBUGCHAR 0x02 + +#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_6SM__) + +/* we use the System Control Block DCRDR reg to simulate a arm7_9 dcc channel + * DCRDR[7:0] is used by target for status + * DCRDR[15:8] is used by target for write buffer + * DCRDR[23:16] is used for by host for status + * DCRDR[31:24] is used for by host for write buffer */ + +#define NVIC_DBG_DATA_R (*((volatile unsigned short *)0xE000EDF8)) + +#define BUSY 1 + +void dbg_write(unsigned long dcc_data) +{ + int len = 4; + + while (len--) + { + /* wait for data ready */ + while (NVIC_DBG_DATA_R & BUSY); + + /* write our data and set write flag - tell host there is data*/ + NVIC_DBG_DATA_R = (unsigned short)(((dcc_data & 0xff) << 8) | BUSY); + dcc_data >>= 8; + } +} + +#elif defined(__ARM_ARCH_4T__) || defined(__ARM_ARCH_5TE__) || defined(__ARM_ARCH_5T__) + +void dbg_write(unsigned long dcc_data) +{ + unsigned long dcc_status; + + do { + asm volatile("mrc p14, 0, %0, c0, c0" : "=r" (dcc_status)); + } while (dcc_status & 0x2); + + asm volatile("mcr p14, 0, %0, c1, c0" : : "r" (dcc_data)); +} + +#else + #error unsupported target +#endif + +void dbg_trace_point(unsigned long number) +{ + dbg_write(TARGET_REQ_TRACEMSG | (number << 8)); +} + +void dbg_write_u32(const unsigned long *val, long len) +{ + dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(4) | ((len & 0xffff) << 16)); + + while (len > 0) + { + dbg_write(*val); + + val++; + len--; + } +} + +void dbg_write_u16(const unsigned short *val, long len) +{ + unsigned long dcc_data; + + dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(2) | ((len & 0xffff) << 16)); + + while (len > 0) + { + dcc_data = val[0] + | ((len > 1) ? val[1] << 16: 0x0000); + + dbg_write(dcc_data); + + val += 2; + len -= 2; + } +} + +void dbg_write_u8(const unsigned char *val, long len) +{ + unsigned long dcc_data; + + dbg_write(TARGET_REQ_DEBUGMSG_HEXMSG(1) | ((len & 0xffff) << 16)); + + while (len > 0) + { + dcc_data = val[0] + | ((len > 1) ? val[1] << 8 : 0x00) + | ((len > 2) ? val[2] << 16 : 0x00) + | ((len > 3) ? val[3] << 24 : 0x00); + + dbg_write(dcc_data); + + val += 4; + len -= 4; + } +} + +void dbg_write_str(const char *msg) +{ + long len; + unsigned long dcc_data; + + for (len = 0; msg[len] && (len < 65536); len++); + + dbg_write(TARGET_REQ_DEBUGMSG_ASCII | ((len & 0xffff) << 16)); + + while (len > 0) + { + dcc_data = msg[0] + | ((len > 1) ? msg[1] << 8 : 0x00) + | ((len > 2) ? msg[2] << 16 : 0x00) + | ((len > 3) ? msg[3] << 24 : 0x00); + dbg_write(dcc_data); + + msg += 4; + len -= 4; + } +} + +void dbg_write_char(char msg) +{ + dbg_write(TARGET_REQ_DEBUGCHAR | ((msg & 0xff) << 16)); +} diff --git a/libdcc/dcc_stdio.h b/libdcc/dcc_stdio.h new file mode 100644 index 0000000..7e36348 --- /dev/null +++ b/libdcc/dcc_stdio.h @@ -0,0 +1,35 @@ +/*************************************************************************** + * Copyright (C) 2008 by Dominic Rath * + * Dominic.Rath@gmx.de * + * Copyright (C) 2008 by Spencer Oliver * + * spen@spen-soft.co.uk * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#ifndef DCC_STDIO_H +#define DCC_STDIO_H + +void dbg_write(unsigned long dcc_data); + +void dbg_trace_point(unsigned long number); + +void dbg_write_u32(const unsigned long *val, long len); +void dbg_write_u16(const unsigned short *val, long len); +void dbg_write_u8(const unsigned char *val, long len); + +void dbg_write_str(const char *msg); +void dbg_write_char(char msg); + +#endif /* DCC_STDIO_H */ diff --git a/libdcc/example.c b/libdcc/example.c new file mode 100644 index 0000000..99b7bf6 --- /dev/null +++ b/libdcc/example.c @@ -0,0 +1,56 @@ +/*************************************************************************** + * Copyright (C) 2008 by Spencer Oliver * + * spen@spen-soft.co.uk * + * Copyright (C) 2008 by Frederik Kriewtz * + * frederik@kriewitz.eu * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#include "dcc_stdio.h" + +/* enable openocd debugmsg at the gdb prompt: + * monitor target_request debugmsgs enable + * + * create a trace point: + * monitor trace point 1 + * + * to show how often the trace point was hit: + * monitor trace point +*/ + +int main(void) +{ + dbg_write_str("hello world"); + + dbg_write_char('t'); + dbg_write_char('e'); + dbg_write_char('s'); + dbg_write_char('t'); + dbg_write_char('\n'); + + unsigned long test_u32 = 0x01234567; + dbg_write_u32(&test_u32, 1); + + static const unsigned short test_u16[] = {0x0123, 0x4567, 0x89AB, 0xCDEF, 0x0123, 0x4567, 0x89AB, 0xCDEF}; + dbg_write_u16(test_u16, 8); + + static const unsigned char test_u8[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0XDD, 0xEE, 0xFF}; + dbg_write_u8(test_u8, 16); + + while(1) + { + dbg_trace_point(0); + } +} diff --git a/libopencm3 b/libopencm3 index 4492841..3b89fc5 160000 --- a/libopencm3 +++ b/libopencm3 @@ -1 +1 @@ -Subproject commit 44928416eacb4c8d7774b1385c7f38fb226d080b +Subproject commit 3b89fc5999874c49f6f5be65bbd5e75f7d77469c diff --git a/main.c b/main.c index 76c001a..91c4d6e 100644 --- a/main.c +++ b/main.c @@ -22,6 +22,8 @@ #include #include +#include + static void delay(int count) { for (int i=0; i < count; i++) { @@ -138,18 +140,25 @@ static void dht_start_signal(void) volatile int bla=0; +void hard_fault_handler(void) { + __asm("bkpt 1"); +} + int main(void) { rcc_clock_setup_pll(&rcc_hse_configs[RCC_CLOCK_HSE8_72MHZ]); gpio_setup(); - tim_setup(); + //tim_setup(); + + dbg_write_str("hello\n"); /* Blink the LED (PA5) on the board. */ while (1) { /* Using API function gpio_toggle(): */ gpio_toggle(GPIOB, GPIO1); /* LED on/off */ delay(4000000); - dht_start_signal(); + //dht_start_signal(); + dbg_write_str("hello2\n"); } return 0; diff --git a/openocd.cfg b/openocd.cfg index f45185d..b53f28c 100644 --- a/openocd.cfg +++ b/openocd.cfg @@ -1,7 +1,6 @@ -# This is an ST NUCLEO F103RB board with a single STM32F103RBT6 chip. -# http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF259875 +# FT2232H Board V3 connected to Maple Mini -interface ftdi +adapter driver ftdi transport select swd ftdi_vid_pid 0x0403 0x6010 @@ -22,3 +21,6 @@ ftdi_layout_signal nSRST -ndata 0x0020 -noe 0x0040 source [find target/stm32f1x.cfg] reset_config srst_only + +#poll on +#target_request debugmsgs enable diff --git a/rules.mk b/rules.mk index e417d2f..7a26311 100644 --- a/rules.mk +++ b/rules.mk @@ -86,7 +86,7 @@ TGT_LDFLAGS += $(ARCH_FLAGS) TGT_LDFLAGS += -specs=nano.specs TGT_LDFLAGS += -Wl,--gc-sections # OPTIONAL -#TGT_LDFLAGS += -Wl,-Map=$(PROJECT).map +TGT_LDFLAGS += -Wl,-Map=$(PROJECT).map ifeq ($(V),99) TGT_LDFLAGS += -Wl,--print-gc-sections endif @@ -174,4 +174,3 @@ clean: .PHONY: all clean flash -include $(OBJS:.o=.d) -