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

Committer:
bieleluk
Date:
Sun Mar 21 20:43:16 2021 +0000
Revision:
25:cda8a4f9874a
Parent:
15:83d4dced2a28
;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bieleluk 0:e36b454cc2e6 1 #include "Debug.h"
bieleluk 0:e36b454cc2e6 2
bieleluk 0:e36b454cc2e6 3 // create object of class Debug_register
bieleluk 0:e36b454cc2e6 4 //------------------------------------------------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 5 Debug_register_print::Debug_register_print(PinName tx_pin, PinName rx_pin, int baudrate) : pc(tx_pin,rx_pin, baudrate) {
bieleluk 0:e36b454cc2e6 6 init();
bieleluk 0:e36b454cc2e6 7 }
bieleluk 0:e36b454cc2e6 8
bieleluk 0:e36b454cc2e6 9 // init function
bieleluk 0:e36b454cc2e6 10 //------------------------------------------------------------------------------------------------------------------
bieleluk 0:e36b454cc2e6 11 void Debug_register_print::init() {
bieleluk 15:83d4dced2a28 12 pc.printf("\ec"); // erase the whole screen
bieleluk 15:83d4dced2a28 13 wait_ms(50); // wait until erasing is done
bieleluk 15:83d4dced2a28 14 breakpoint_count=0; // set breakpoint count to 0
bieleluk 15:83d4dced2a28 15 // format: 0->none, 1->hexa, 2->decimal, 3->binary(only for register value)
bieleluk 0:e36b454cc2e6 16 count_format = 2; //binary
bieleluk 0:e36b454cc2e6 17 line_format = 2; //binary
bieleluk 0:e36b454cc2e6 18 address_format = 1; //hexa
bieleluk 0:e36b454cc2e6 19 register_format = 1; //hexa
bieleluk 0:e36b454cc2e6 20
bieleluk 0:e36b454cc2e6 21 }
bieleluk 0:e36b454cc2e6 22
bieleluk 0:e36b454cc2e6 23
bieleluk 0:e36b454cc2e6 24 // perform one breakpoint and print one register
bieleluk 0:e36b454cc2e6 25 //------------------------------------------------------------------------------------------------------------------
bieleluk 6:1ee26b7b9c2f 26 void Debug_register_print::breakpoint(int line_number, uint32_t address, int number_of_words){
bieleluk 0:e36b454cc2e6 27
bieleluk 0:e36b454cc2e6 28 breakpoint_count++;
bieleluk 0:e36b454cc2e6 29
bieleluk 3:3d7837ae4a37 30 for (int i = 0; i < abs(number_of_words); i++){
bieleluk 3:3d7837ae4a37 31
bieleluk 15:83d4dced2a28 32 // print breakpoint count according to format
bieleluk 3:3d7837ae4a37 33 if( count_format == 1){
bieleluk 3:3d7837ae4a37 34 pc.printf("Break no. 0x%3x ",breakpoint_count);
bieleluk 3:3d7837ae4a37 35 }else if( count_format == 2){
bieleluk 3:3d7837ae4a37 36 pc.printf("Break no. %3d ",breakpoint_count);
bieleluk 3:3d7837ae4a37 37 }
bieleluk 15:83d4dced2a28 38 // print line number according to format
bieleluk 3:3d7837ae4a37 39 if( line_format == 1){
bieleluk 3:3d7837ae4a37 40 pc.printf("Line no. 0x%3x ",line_number);
bieleluk 3:3d7837ae4a37 41 }else if( line_format == 2){
bieleluk 3:3d7837ae4a37 42 pc.printf("Line no. %3d ",line_number);
bieleluk 3:3d7837ae4a37 43 }
bieleluk 15:83d4dced2a28 44
bieleluk 15:83d4dced2a28 45 // print address according to format
bieleluk 3:3d7837ae4a37 46 if( address_format == 1){
bieleluk 15:83d4dced2a28 47 pc.printf("Address 0x%8x ", address - address % 4);
bieleluk 3:3d7837ae4a37 48 }else if( address_format == 2){
bieleluk 15:83d4dced2a28 49 pc.printf("Address %10u ", address - address % 4);
bieleluk 3:3d7837ae4a37 50 }
bieleluk 3:3d7837ae4a37 51
bieleluk 15:83d4dced2a28 52 // get value of register from address
bieleluk 15:83d4dced2a28 53 uint32_t reg = *((volatile unsigned int *)(address - address % 4));
bieleluk 15:83d4dced2a28 54
bieleluk 15:83d4dced2a28 55 // print register value according to format
bieleluk 15:83d4dced2a28 56 if( register_format == 1){ // in hexa
bieleluk 3:3d7837ae4a37 57 pc.printf("Value 0x%8x ", reg);
bieleluk 15:83d4dced2a28 58 }else if( register_format == 2){ // in dedcimal
bieleluk 3:3d7837ae4a37 59 pc.printf("Value %10u ", reg);
bieleluk 15:83d4dced2a28 60 }else if( register_format == 3){ // binary
bieleluk 3:3d7837ae4a37 61 pc.printf("Value ");
bieleluk 15:83d4dced2a28 62 for (int i = 0; i < 32; i++){ // print reg value in binary
bieleluk 15:83d4dced2a28 63 if (i%4 == 0) pc.printf(" "); // print space after four characters
bieleluk 3:3d7837ae4a37 64 pc.printf("%d",reg >> (31 - i));
bieleluk 3:3d7837ae4a37 65 reg -= ((reg >> (31 - i)) << (31 - i));
bieleluk 3:3d7837ae4a37 66 }
bieleluk 3:3d7837ae4a37 67 }
bieleluk 3:3d7837ae4a37 68 pc.printf("\n\r");
bieleluk 15:83d4dced2a28 69 // increment/decrement address if if there are more registers to read
bieleluk 3:3d7837ae4a37 70 if (number_of_words > 0){
bieleluk 3:3d7837ae4a37 71 address += 4;
bieleluk 3:3d7837ae4a37 72 }else{
bieleluk 3:3d7837ae4a37 73 address -= 4;
bieleluk 3:3d7837ae4a37 74 }
bieleluk 3:3d7837ae4a37 75
bieleluk 0:e36b454cc2e6 76 }
bieleluk 0:e36b454cc2e6 77
bieleluk 0:e36b454cc2e6 78 }
bieleluk 0:e36b454cc2e6 79
bieleluk 0:e36b454cc2e6 80 void Debug_register_print::format(int break_number, int line, int address, int value){
bieleluk 15:83d4dced2a28 81 // possible format: 0->none, 1->heca, 2->decimal, 3->binary(only for reg_value)
bieleluk 15:83d4dced2a28 82 count_format = break_number;
bieleluk 15:83d4dced2a28 83 line_format = line;
bieleluk 15:83d4dced2a28 84 address_format = address;
bieleluk 15:83d4dced2a28 85 register_format = value;
bieleluk 0:e36b454cc2e6 86
bieleluk 0:e36b454cc2e6 87 }