Debugging tool for mbed enabled microcontrollers, especially for NUCLEO-F303RE and STM32F042F6P6.

Committer:
bieleluk
Date:
Mon May 13 08:39:42 2019 +0000
Revision:
12:a8ab6e018422
Parent:
10:4d5f38d996e2
Child:
15:83d4dced2a28

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bieleluk 0:e36b454cc2e6 1 #pragma once
bieleluk 0:e36b454cc2e6 2
bieleluk 12:a8ab6e018422 3 // include libraries
bieleluk 0:e36b454cc2e6 4 //------------------------------------------------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 5 #include "mbed.h"
bieleluk 3:3d7837ae4a37 6 #include <stdlib.h>
bieleluk 3:3d7837ae4a37 7
bieleluk 0:e36b454cc2e6 8
bieleluk 0:e36b454cc2e6 9 // macros
bieleluk 0:e36b454cc2e6 10 //------------------------------------------------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 11 #define name(var) #var
bieleluk 3:3d7837ae4a37 12 #define min(a, b) (((a) < (b)) ? (a) : (b))
bieleluk 3:3d7837ae4a37 13 #define max(a, b) (((a) > (b)) ? (a) : (b))
bieleluk 0:e36b454cc2e6 14
bieleluk 0:e36b454cc2e6 15 // assembly functions
bieleluk 0:e36b454cc2e6 16 //------------------------------------------------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 17 extern "C" int check_1_bit(uint32_t gpiox, uint32_t offset, uint32_t pin);
bieleluk 0:e36b454cc2e6 18 extern "C" int check_2_bit(uint32_t gpiox, uint32_t offset, uint32_t pin);
bieleluk 0:e36b454cc2e6 19 extern "C" int check_alternative_mode(uint32_t gpiox, uint32_t offset, uint32_t pin);
bieleluk 0:e36b454cc2e6 20 extern "C" int read_word(uint32_t address, uint32_t offset);
bieleluk 0:e36b454cc2e6 21
bieleluk 0:e36b454cc2e6 22 // structs
bieleluk 0:e36b454cc2e6 23 //------------------------------------------------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 24 typedef struct Pin {
bieleluk 0:e36b454cc2e6 25 char port;
bieleluk 0:e36b454cc2e6 26 int number;
bieleluk 0:e36b454cc2e6 27 } pin_t;
bieleluk 0:e36b454cc2e6 28
bieleluk 12:a8ab6e018422 29 //------------------------------------------------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 30 /** Debug_serial class.
bieleluk 0:e36b454cc2e6 31 * Class for stepping programme and printing actual position of the running programme with optional print of one variable (int, float, char or char*).
bieleluk 0:e36b454cc2e6 32 * Functions printf, putc and getc are also defined in the class.
bieleluk 0:e36b454cc2e6 33 *
bieleluk 0:e36b454cc2e6 34 * Example program:
bieleluk 0:e36b454cc2e6 35 * @code
bieleluk 0:e36b454cc2e6 36 * // ----------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 37 * // Author: Lukas Bielesch
bieleluk 0:e36b454cc2e6 38 * // Department of Measurement, Czech technical university in Prague, Czech Republic
bieleluk 12:a8ab6e018422 39 * // Date of publication: 13. May 2019
bieleluk 0:e36b454cc2e6 40 * // ----------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 41 * #include "Debug.h"
bieleluk 9:59344a584e18 42 * AnalogIn analog(PA_4);
bieleluk 0:e36b454cc2e6 43 * PwmOut pwm(PA_6);
bieleluk 9:59344a584e18 44 * DigitalOut out(PA_5);
bieleluk 12:a8ab6e018422 45 * Debug_serial pc(PA_2, PA_3, 115200);
bieleluk 0:e36b454cc2e6 46 *
bieleluk 0:e36b454cc2e6 47 * int main(){
bieleluk 0:e36b454cc2e6 48 * int var = 0;
bieleluk 0:e36b454cc2e6 49 * char character;
bieleluk 0:e36b454cc2e6 50 * out = 1;
bieleluk 0:e36b454cc2e6 51 * float pi = 3.14159265359;
bieleluk 0:e36b454cc2e6 52 * pc.breakpoint(__LINE__,name(pi),pi);
bieleluk 0:e36b454cc2e6 53 * char* arr = "this is string";
bieleluk 0:e36b454cc2e6 54 * pc.breakpoint(__LINE__,name(arr),arr);
bieleluk 0:e36b454cc2e6 55 * pwm = 0.5;
bieleluk 0:e36b454cc2e6 56 * pwm.period(1);
bieleluk 0:e36b454cc2e6 57 * while(1){
bieleluk 0:e36b454cc2e6 58 * pc.breakpoint(__LINE__,name(var),var);
bieleluk 0:e36b454cc2e6 59 * pc.printf("insert character\n\r");
bieleluk 2:478ba8b83e3f 60 * while (!pc.readable()){}
bieleluk 0:e36b454cc2e6 61 * character = pc.getc();
bieleluk 0:e36b454cc2e6 62 * pc.printf("you have inserted %c\n\r",character);
bieleluk 0:e36b454cc2e6 63 * var++;
bieleluk 1:dbb9fcc20d07 64 * pc.breakpoint(__LINE__, 0x48000000);
bieleluk 0:e36b454cc2e6 65 * wait(1);
bieleluk 0:e36b454cc2e6 66 * }
bieleluk 0:e36b454cc2e6 67 * }
bieleluk 0:e36b454cc2e6 68 * @endcode
bieleluk 0:e36b454cc2e6 69 */
bieleluk 0:e36b454cc2e6 70 class Debug_serial {
bieleluk 0:e36b454cc2e6 71 public:
bieleluk 0:e36b454cc2e6 72
bieleluk 12:a8ab6e018422 73 /** Create object of Debug_serial class
bieleluk 12:a8ab6e018422 74 * @param tx_pin TX pin of debug serial port
bieleluk 12:a8ab6e018422 75 * @param rx_pin RX pin of debug serial port
bieleluk 12:a8ab6e018422 76 * @param baudrate(optional) desired baudrate value of debug serial port, default baudrate is 115200 Bd/s
bieleluk 0:e36b454cc2e6 77 */
bieleluk 0:e36b454cc2e6 78 Debug_serial(PinName tx_pin, PinName rx_pin, int baudrate = 115200);
bieleluk 0:e36b454cc2e6 79
bieleluk 0:e36b454cc2e6 80 /** Perform one breakpoint without printing variable
bieleluk 12:a8ab6e018422 81 * @param line_number(optional) line number of breakpoint,macro __LINE__ is recommended
bieleluk 0:e36b454cc2e6 82 */
bieleluk 0:e36b454cc2e6 83 void breakpoint(int line_number = -1);
bieleluk 0:e36b454cc2e6 84
bieleluk 0:e36b454cc2e6 85 /** Perform one breakpoint and print variable of type int
bieleluk 12:a8ab6e018422 86 * @param line_number line number of breakpoint, macro __LINE__ is recommended
bieleluk 12:a8ab6e018422 87 * @param name name of printed variable(max length is 19) , macro name(variable) is recommended
bieleluk 12:a8ab6e018422 88 * @param variable variable of type int
bieleluk 0:e36b454cc2e6 89 */
bieleluk 0:e36b454cc2e6 90 void breakpoint(int line_number, char name[20], int variable);
bieleluk 0:e36b454cc2e6 91
bieleluk 0:e36b454cc2e6 92 /** Perform one breakpoint and print variable of type char
bieleluk 12:a8ab6e018422 93 * @param line_number line number of breakpoint, macro __LINE__ is recommended
bieleluk 12:a8ab6e018422 94 * @param name name of printed variable(max length is 19) , macro name(variable) is recommended
bieleluk 12:a8ab6e018422 95 * @param variable variable of type int
bieleluk 0:e36b454cc2e6 96 */
bieleluk 0:e36b454cc2e6 97 void breakpoint(int line_number, char name[20], char variable);
bieleluk 0:e36b454cc2e6 98
bieleluk 12:a8ab6e018422 99 /** Perform one breakpoint and print string variable
bieleluk 12:a8ab6e018422 100 * @param line_number line number of breakpoint, macro __LINE__ is recommended
bieleluk 12:a8ab6e018422 101 * @param name name of printed variable(max length is 19) , macro name(variable) is recommended
bieleluk 12:a8ab6e018422 102 * @param variable variable of type char*
bieleluk 0:e36b454cc2e6 103 */
bieleluk 0:e36b454cc2e6 104 void breakpoint(int line_number, char name[20], char * variable);
bieleluk 0:e36b454cc2e6 105
bieleluk 0:e36b454cc2e6 106 /** Perform one breakpoint and print variable of type float
bieleluk 12:a8ab6e018422 107 * @param line_number line number of breakpoint, macro __LINE__ is recommended
bieleluk 12:a8ab6e018422 108 * @param name name of printed variable(max length is 19) , macro name(variable) is recommended
bieleluk 12:a8ab6e018422 109 * @param variable variable of type float
bieleluk 0:e36b454cc2e6 110 */
bieleluk 0:e36b454cc2e6 111 void breakpoint(int line_number, char name[20], float variable);
bieleluk 0:e36b454cc2e6 112
bieleluk 1:dbb9fcc20d07 113 /** Perform one breakpoint and print one register value
bieleluk 12:a8ab6e018422 114 * @param line_number line number of breakpoint, macro __LINE__ is recommended
bieleluk 12:a8ab6e018422 115 * @param address address of register, must be divisible by 4
bieleluk 1:dbb9fcc20d07 116 */
bieleluk 6:1ee26b7b9c2f 117 void breakpoint(int line_number, uint32_t address);
bieleluk 1:dbb9fcc20d07 118
bieleluk 0:e36b454cc2e6 119 /** Print formatted string to debug serial port
bieleluk 0:e36b454cc2e6 120 * @returns total number of printed characters or negative value if an output error or an encoding error
bieleluk 0:e36b454cc2e6 121 */
bieleluk 0:e36b454cc2e6 122 int printf(const char* format, ...);
bieleluk 12:a8ab6e018422 123
bieleluk 12:a8ab6e018422 124 /** Read formatted string from debug serial port
bieleluk 12:a8ab6e018422 125 * @returns total number of successfully read arguments or negative value if en error occured
bieleluk 12:a8ab6e018422 126 */
bieleluk 12:a8ab6e018422 127 int scanf(const char* format, ...);
bieleluk 0:e36b454cc2e6 128
bieleluk 0:e36b454cc2e6 129 /** Print one character to debug serial port
bieleluk 0:e36b454cc2e6 130 * @param character
bieleluk 0:e36b454cc2e6 131 * @returns character written as an unsigned char cast to an int
bieleluk 0:e36b454cc2e6 132 */
bieleluk 0:e36b454cc2e6 133 int putc(int character);
bieleluk 0:e36b454cc2e6 134
bieleluk 0:e36b454cc2e6 135 /** Read one character from debug serial port
bieleluk 0:e36b454cc2e6 136 * @returns character written as an unsigned char cast to an int
bieleluk 0:e36b454cc2e6 137 */
bieleluk 0:e36b454cc2e6 138 int getc();
bieleluk 2:478ba8b83e3f 139
bieleluk 12:a8ab6e018422 140 /** Check whether there is some character available to read from debug serial port.
bieleluk 12:a8ab6e018422 141 * @returns true when there is something available to read
bieleluk 12:a8ab6e018422 142 */
bieleluk 2:478ba8b83e3f 143 bool readable();
bieleluk 12:a8ab6e018422 144
bieleluk 12:a8ab6e018422 145 /** Check whether it is possible to write a character to debug serial port.
bieleluk 12:a8ab6e018422 146 * @returns true when it is possible to write a character to debug serial port
bieleluk 12:a8ab6e018422 147 */
bieleluk 2:478ba8b83e3f 148 bool writable();
bieleluk 2:478ba8b83e3f 149
bieleluk 0:e36b454cc2e6 150 private:
bieleluk 0:e36b454cc2e6 151 int break_line[3]; //store number of lines of three previous breakpoints
bieleluk 0:e36b454cc2e6 152 char var[3][50]; //store variables of three previous breakpoints
bieleluk 0:e36b454cc2e6 153
bieleluk 0:e36b454cc2e6 154 protected:
bieleluk 0:e36b454cc2e6 155 // objects:
bieleluk 12:a8ab6e018422 156 Serial pc; //debug serial port
bieleluk 12:a8ab6e018422 157 // variables
bieleluk 0:e36b454cc2e6 158 int breakpoint_count; //stores number of the current breakpoint
bieleluk 0:e36b454cc2e6 159 // functions
bieleluk 0:e36b454cc2e6 160 // initialization function
bieleluk 0:e36b454cc2e6 161 void init();
bieleluk 0:e36b454cc2e6 162 // print 3 last breakpoints
bieleluk 0:e36b454cc2e6 163 void print_3_breaks(int line_number);
bieleluk 0:e36b454cc2e6 164 // print one breakpoint
bieleluk 0:e36b454cc2e6 165 void print_one_break(int n);
bieleluk 0:e36b454cc2e6 166 // clear screen from m line up to n line
bieleluk 0:e36b454cc2e6 167 void clear_from_n_up_to_m(int m, int n);
bieleluk 0:e36b454cc2e6 168 };
bieleluk 0:e36b454cc2e6 169
bieleluk 12:a8ab6e018422 170 //------------------------------------------------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 171
bieleluk 0:e36b454cc2e6 172 /** Debug_led class.
bieleluk 0:e36b454cc2e6 173 * Class for stepping the program with debug LED and button, that is connected to GND(default) or VCC.
bieleluk 0:e36b454cc2e6 174 *
bieleluk 0:e36b454cc2e6 175 * Example program:
bieleluk 0:e36b454cc2e6 176 * @code
bieleluk 0:e36b454cc2e6 177 * // ----------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 178 * // Author: Lukas Bielesch
bieleluk 0:e36b454cc2e6 179 * // Department of Measurement, Czech technical university in Prague, Czech Republic
bieleluk 12:a8ab6e018422 180 * // Date of publication: 13. May 2019
bieleluk 0:e36b454cc2e6 181 * // ----------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 182 * #include "Debug.h"
bieleluk 8:a5570452154e 183 * AnalogIn analog(PA_0);
bieleluk 0:e36b454cc2e6 184 * PwmOut pwm(PA_4);
bieleluk 8:a5570452154e 185 * DigitalOut out(PA_1);
bieleluk 0:e36b454cc2e6 186 * Debug_led deb(PA_5, PA_6, "BUTTON_VDD"); //debug led on PA5, debug button connected to VDD on PA6
bieleluk 0:e36b454cc2e6 187 * int main(){
bieleluk 0:e36b454cc2e6 188 *
bieleluk 0:e36b454cc2e6 189 * out = 1;
bieleluk 0:e36b454cc2e6 190 * deb.breakpoint(1);
bieleluk 0:e36b454cc2e6 191 * pwm = 0.5;
bieleluk 0:e36b454cc2e6 192 * pwm.period(1);
bieleluk 0:e36b454cc2e6 193 * deb.breakpoint(2);
bieleluk 0:e36b454cc2e6 194 *
bieleluk 0:e36b454cc2e6 195 * while(1){
bieleluk 0:e36b454cc2e6 196 * deb.breakpoint();
bieleluk 0:e36b454cc2e6 197 * pwm = pwm + 0.1;
bieleluk 0:e36b454cc2e6 198 * wait(2);
bieleluk 0:e36b454cc2e6 199 * }
bieleluk 0:e36b454cc2e6 200 * }
bieleluk 0:e36b454cc2e6 201 * @endcode
bieleluk 0:e36b454cc2e6 202 */
bieleluk 0:e36b454cc2e6 203 // class Debug_led
bieleluk 0:e36b454cc2e6 204 class Debug_led {
bieleluk 0:e36b454cc2e6 205 public:
bieleluk 0:e36b454cc2e6 206
bieleluk 0:e36b454cc2e6 207 /** Create object of class Debug_led
bieleluk 0:e36b454cc2e6 208 * @param led_pin pin of of debug led
bieleluk 0:e36b454cc2e6 209 * @param button_pin pin of of debug button
bieleluk 0:e36b454cc2e6 210 * @param mode mode of button connection("BUTTON_GND", "BUTTON_VCC", "BUTTON_VDD")
bieleluk 0:e36b454cc2e6 211 */
bieleluk 0:e36b454cc2e6 212 Debug_led(PinName led_pin, PinName button_pin, char mode[11] = "BUTTON_GND");
bieleluk 0:e36b454cc2e6 213
bieleluk 0:e36b454cc2e6 214 /** Perform one breakpoint
bieleluk 12:a8ab6e018422 215 * @param number(optional) number of flashes of periodic flashing of LED during the breakpoint, default is constant flashing
bieleluk 0:e36b454cc2e6 216 */
bieleluk 0:e36b454cc2e6 217 void breakpoint(int number = -1);
bieleluk 0:e36b454cc2e6 218
bieleluk 0:e36b454cc2e6 219 private:
bieleluk 0:e36b454cc2e6 220 // objects
bieleluk 0:e36b454cc2e6 221 DigitalOut led; //debug led
bieleluk 0:e36b454cc2e6 222 InterruptIn button; //debug button
bieleluk 0:e36b454cc2e6 223 // variables
bieleluk 0:e36b454cc2e6 224 int button_mode; //mode of button 1->pullupt, 0->pulldown
bieleluk 12:a8ab6e018422 225 volatile bool end_breakpoint; //true when button was pushed
bieleluk 12:a8ab6e018422 226 int number_of_breakpoints; //number of the current breakpoint
bieleluk 0:e36b454cc2e6 227
bieleluk 0:e36b454cc2e6 228 /** Initialization */
bieleluk 0:e36b454cc2e6 229 void init(char mode[11]);
bieleluk 0:e36b454cc2e6 230
bieleluk 12:a8ab6e018422 231 /** Blink the debug led n-times with blink period wait_time_ms */
bieleluk 0:e36b454cc2e6 232 void flash_n_times(int wait_time_ms, int n);
bieleluk 0:e36b454cc2e6 233
bieleluk 12:a8ab6e018422 234 /** IRQ function, end breakpoint after the button is pushed */
bieleluk 0:e36b454cc2e6 235 void end_break();
bieleluk 0:e36b454cc2e6 236 };
bieleluk 0:e36b454cc2e6 237
bieleluk 12:a8ab6e018422 238 //------------------------------------------------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 239 /** Debug_register class.
bieleluk 0:e36b454cc2e6 240 *
bieleluk 0:e36b454cc2e6 241 * Example program:
bieleluk 0:e36b454cc2e6 242 * @code
bieleluk 0:e36b454cc2e6 243 * // ----------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 244 * // Author: Lukas Bielesch
bieleluk 0:e36b454cc2e6 245 * // Department of Measurement, Czech technical university in Prague, Czech Republic
bieleluk 0:e36b454cc2e6 246 * // Date of publication: 15. Apr 2019
bieleluk 0:e36b454cc2e6 247 * // ----------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 248 * #include "Debug.h"
bieleluk 9:59344a584e18 249 * AnalogIn analog(PA_4);
bieleluk 0:e36b454cc2e6 250 * PwmOut pwm(PA_6);
bieleluk 9:59344a584e18 251 * DigitalOut out(PA_5);
bieleluk 0:e36b454cc2e6 252 * Debug_register pc(PA_2, PA_3, 115200);
bieleluk 0:e36b454cc2e6 253 *
bieleluk 0:e36b454cc2e6 254 * int main(){
bieleluk 0:e36b454cc2e6 255 * pc.breakpoint(__LINE__,0x48000000);
bieleluk 0:e36b454cc2e6 256 * DigitalOut out2 (PA_0);
bieleluk 10:4d5f38d996e2 257 * pc.breakpoint(__LINE__,0x48000001);
bieleluk 0:e36b454cc2e6 258 * AnalogIn analog2 (PA_1);
bieleluk 6:1ee26b7b9c2f 259 * pc.breakpoint(__LINE__,0x4800000C);
bieleluk 5:e2e16ef72833 260 * DigitalIn di1(PA_7, PullUp);
bieleluk 6:1ee26b7b9c2f 261 * pc.breakpoint(__LINE__,0x4800000C);
bieleluk 6:1ee26b7b9c2f 262 * pc.breakpoint(__LINE__,0x48000004);
bieleluk 0:e36b454cc2e6 263 * while(1){
bieleluk 0:e36b454cc2e6 264 * if(pc.readable()){
bieleluk 0:e36b454cc2e6 265 * pc.putc(pc.getc());
bieleluk 0:e36b454cc2e6 266 * }
bieleluk 0:e36b454cc2e6 267 * wait(0.1);
bieleluk 0:e36b454cc2e6 268 * }
bieleluk 0:e36b454cc2e6 269 * }
bieleluk 0:e36b454cc2e6 270 * @endcode
bieleluk 0:e36b454cc2e6 271 */
bieleluk 0:e36b454cc2e6 272 class Debug_register {
bieleluk 0:e36b454cc2e6 273 public:
bieleluk 0:e36b454cc2e6 274
bieleluk 12:a8ab6e018422 275 /** Create object of Debug_register class
bieleluk 12:a8ab6e018422 276 * @param tx_pin TX pin of debug serial port
bieleluk 12:a8ab6e018422 277 * @param rx_pin RX pin of debug serial port
bieleluk 12:a8ab6e018422 278 * @param baudrate(optional) desired baudrate value of debug serial port, default baudrate is 115200 Bd/s
bieleluk 0:e36b454cc2e6 279 */
bieleluk 0:e36b454cc2e6 280 Debug_register(PinName tx_pin, PinName rx_pin, int baudrate = 115200);
bieleluk 0:e36b454cc2e6 281
bieleluk 0:e36b454cc2e6 282 /** Perform one breakpoint and print one register
bieleluk 12:a8ab6e018422 283 * @param line_number line number of breakpoint, macro __LINE__ is recommended
bieleluk 12:a8ab6e018422 284 * @param address address of register, must be divisible by 4
bieleluk 0:e36b454cc2e6 285 */
bieleluk 12:a8ab6e018422 286 void breakpoint(int line_number, uint32_t address);
bieleluk 0:e36b454cc2e6 287
bieleluk 0:e36b454cc2e6 288 /** Print formatted string to debug serial port
bieleluk 0:e36b454cc2e6 289 * @returns total number of printed characters or negative value if an output error or an encoding error
bieleluk 0:e36b454cc2e6 290 */
bieleluk 0:e36b454cc2e6 291 int printf(const char* format, ...);
bieleluk 12:a8ab6e018422 292
bieleluk 12:a8ab6e018422 293 /** Read formatted string from debug serial port
bieleluk 12:a8ab6e018422 294 * @returns total number of successfully read arguments or negative value if en error occured
bieleluk 12:a8ab6e018422 295 */
bieleluk 12:a8ab6e018422 296 int scanf(const char* format, ...);
bieleluk 0:e36b454cc2e6 297
bieleluk 0:e36b454cc2e6 298 /** Print one character to debug serial port
bieleluk 0:e36b454cc2e6 299 * @param character
bieleluk 0:e36b454cc2e6 300 * @returns character written as an unsigned char cast to an int
bieleluk 0:e36b454cc2e6 301 */
bieleluk 0:e36b454cc2e6 302 int putc(int character);
bieleluk 0:e36b454cc2e6 303
bieleluk 0:e36b454cc2e6 304 /** Read one character from debug serial port
bieleluk 0:e36b454cc2e6 305 * @returns character written as an unsigned char cast to an int
bieleluk 0:e36b454cc2e6 306 */
bieleluk 0:e36b454cc2e6 307 int getc();
bieleluk 0:e36b454cc2e6 308
bieleluk 12:a8ab6e018422 309 /** Check whether there is some character available to read from debug serial port.
bieleluk 12:a8ab6e018422 310 * @returns true when there is something available to read
bieleluk 12:a8ab6e018422 311 */
bieleluk 0:e36b454cc2e6 312 bool readable();
bieleluk 12:a8ab6e018422 313
bieleluk 12:a8ab6e018422 314 /** Check whether it is possible to write a character to debug serial port.
bieleluk 12:a8ab6e018422 315 * @returns true when it is possible to write a character to debug serial port
bieleluk 12:a8ab6e018422 316 */
bieleluk 2:478ba8b83e3f 317 bool writable();
bieleluk 0:e36b454cc2e6 318
bieleluk 0:e36b454cc2e6 319 protected:
bieleluk 0:e36b454cc2e6 320 // objects:
bieleluk 0:e36b454cc2e6 321 Serial pc; //debug serial device
bieleluk 0:e36b454cc2e6 322 // variables:
bieleluk 12:a8ab6e018422 323 int breakpoint_count; //number of the current breakpoint
bieleluk 0:e36b454cc2e6 324 // functions
bieleluk 0:e36b454cc2e6 325 // initialization function
bieleluk 0:e36b454cc2e6 326 void init();
bieleluk 0:e36b454cc2e6 327 // clear screen from m line up to n line
bieleluk 0:e36b454cc2e6 328 void clear_from_n_up_to_m(int m, int n);
bieleluk 12:a8ab6e018422 329 //modify actual address or register value according to position in terminal
bieleluk 3:3d7837ae4a37 330 uint32_t modify_value(uint32_t value, int horizontal);
bieleluk 0:e36b454cc2e6 331 };
bieleluk 3:3d7837ae4a37 332
bieleluk 12:a8ab6e018422 333 //------------------------------------------------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 334 /** Debug_register_print class.
bieleluk 0:e36b454cc2e6 335 *
bieleluk 0:e36b454cc2e6 336 * Example program:
bieleluk 0:e36b454cc2e6 337 * @code
bieleluk 0:e36b454cc2e6 338 * // ----------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 339 * // Author: Lukas Bielesch
bieleluk 0:e36b454cc2e6 340 * // Department of Measurement, Czech technical university in Prague, Czech Republic
bieleluk 0:e36b454cc2e6 341 * // Date of publication: 15. Apr 2019
bieleluk 0:e36b454cc2e6 342 * // ----------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 343 * #include "Debug.h"
bieleluk 9:59344a584e18 344 * AnalogIn analog(PA_4);
bieleluk 0:e36b454cc2e6 345 * PwmOut pwm(PA_6);
bieleluk 9:59344a584e18 346 * DigitalOut out(PA_5);
bieleluk 0:e36b454cc2e6 347 * Debug_register_print pc(PA_2, PA_3, 115200);
bieleluk 0:e36b454cc2e6 348 *
bieleluk 0:e36b454cc2e6 349 * int main(){
bieleluk 0:e36b454cc2e6 350 * pc.format(2,2,1,3);//breakpoint count,line number, address, value
bieleluk 10:4d5f38d996e2 351 * pc.breakpoint(__LINE__,0x48000001, 2);
bieleluk 0:e36b454cc2e6 352 * DigitalOut out2 (PA_0);
bieleluk 6:1ee26b7b9c2f 353 * pc.breakpoint(__LINE__,0x48000014, -3);
bieleluk 0:e36b454cc2e6 354 * AnalogIn analog2 (PA_1);
bieleluk 6:1ee26b7b9c2f 355 * pc.breakpoint(__LINE__,0x48000008);
bieleluk 0:e36b454cc2e6 356 *
bieleluk 0:e36b454cc2e6 357 * while(1){
bieleluk 0:e36b454cc2e6 358 * wait(1);
bieleluk 0:e36b454cc2e6 359 * }
bieleluk 0:e36b454cc2e6 360 * }
bieleluk 0:e36b454cc2e6 361 * @endcode
bieleluk 0:e36b454cc2e6 362 */
bieleluk 0:e36b454cc2e6 363 class Debug_register_print {
bieleluk 0:e36b454cc2e6 364 public:
bieleluk 0:e36b454cc2e6 365
bieleluk 12:a8ab6e018422 366 /** Create object of Debug_register_print class
bieleluk 12:a8ab6e018422 367 * @param tx_pin TX pin of debug serial port
bieleluk 12:a8ab6e018422 368 * @param rx_pin RX pin of debug serial port
bieleluk 12:a8ab6e018422 369 * @param baudrate(optional) desired baudrate value of debug serial port, default baudrate is 115200 Bd/s
bieleluk 0:e36b454cc2e6 370 */
bieleluk 0:e36b454cc2e6 371 Debug_register_print(PinName tx_pin, PinName rx_pin, int baudrate = 115200);
bieleluk 0:e36b454cc2e6 372
bieleluk 12:a8ab6e018422 373 /** Set format of breakpoint message
bieleluk 12:a8ab6e018422 374 * @param break_number format of number of actual breakpoint: 0->not show, 1->show in hexadecimal, 2->show in decimal(default)
bieleluk 12:a8ab6e018422 375 * @param line format of line of actual breakpoint: 0->not show, 1->show in hexadecimal, 2->show in decimal(default)
bieleluk 12:a8ab6e018422 376 * @param address format of address of register: 0->not show, 1->show in hexadecimal(default), 2->show in decimal
bieleluk 12:a8ab6e018422 377 * @param value format of register value: 0->not show, 1->show in hexadecimal, 2->show in decimal, 3->show in binary(default)
bieleluk 12:a8ab6e018422 378 */
bieleluk 12:a8ab6e018422 379 void format(int break_number = 2, int line = 2, int address = 1, int value = 3);
bieleluk 0:e36b454cc2e6 380
bieleluk 12:a8ab6e018422 381 /** Perform one breakpoint and print one register value
bieleluk 12:a8ab6e018422 382 * @param line_number line number of breakpoint, macro __LINE__ is recommended
bieleluk 12:a8ab6e018422 383 * @param address address of register , must be divisible by 4
bieleluk 0:e36b454cc2e6 384 */
bieleluk 12:a8ab6e018422 385 void breakpoint(int line_number, uint32_t address, int number_of_words = 1);
bieleluk 0:e36b454cc2e6 386
bieleluk 0:e36b454cc2e6 387
bieleluk 0:e36b454cc2e6 388 protected:
bieleluk 0:e36b454cc2e6 389 // objects:
bieleluk 0:e36b454cc2e6 390 Serial pc; //debug serial device
bieleluk 0:e36b454cc2e6 391 // variables:
bieleluk 12:a8ab6e018422 392 int breakpoint_count; //number of the current breakpoint
bieleluk 12:a8ab6e018422 393 int count_format; // format of breakpoint count, 0->not show, 1->show in hexadecimal, 2->show in decimal
bieleluk 12:a8ab6e018422 394 int line_format; // format of lineof breakpoint, 0->not show, 1->show in hexadecimal, 2->show in decimal
bieleluk 12:a8ab6e018422 395 int address_format; // format of address of register, 0->not show, 1->show in hexadecimal, 2->show in decimal
bieleluk 12:a8ab6e018422 396 int register_format;// format of register value, 0->not show, 1->show in hexadecimal, 2->show in decimal, 3->show in binary
bieleluk 0:e36b454cc2e6 397 // functions
bieleluk 0:e36b454cc2e6 398 // initialization function
bieleluk 0:e36b454cc2e6 399 void init();
bieleluk 0:e36b454cc2e6 400
bieleluk 0:e36b454cc2e6 401 };