debug tool for STM32F042F6P6
Diff: debug_complete.cpp
- Revision:
- 12:5e618e97cb24
- Child:
- 19:841a5c532145
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/debug_complete.cpp Tue Apr 16 16:26:37 2019 +0000 @@ -0,0 +1,584 @@ +#include "Debug.h" + + +// create object of class Debug_led +//------------------------------------------------------------------------------------------------------------------ + +Debug_complete::Debug_complete(PinName tx_pin, PinName rx_pin, int baudrate) : pc(tx_pin,rx_pin, baudrate) { + init(); +} + + +// init function +//------------------------------------------------------------------------------------------------------------------ +void Debug_complete::init() { + + pc.printf("\ec"); + wait_ms(50); + pc.printf("-----------------\n\r|\e[1m\e[97;40m\e[93;40mBREAKPOINT AREA\e[22m\e[97;40m|\n\r-----------------\n\r\033[s"); + pc.printf("serial successfully initialised\n\r\e[32;40mto start program press any button\e[97;40m"); + breakpoint_count=0; + pc.getc(); + pc.printf("\r\e[2K\e[31;40mprogram is running\e[97;40m\r"); + pc.printf("\033[60;0H------------------\n\r|\e[1m\e[93;40mSERIAL PORT AREA\e[22m\e[97;40m|\n\r------------------\n\r\033[s"); +} + + +// perform one breakpoint +//------------------------------------------------------------------------------------------------------------------ +void Debug_complete::breakpoint(int line_number) { + breakpoint_count++; + clear_from_n_up_to_m(59,3); + if (line_number == -1){ + pc.printf("Breakpoint number %d\tunknown line number \n\r",breakpoint_count); + }else{ + pc.printf("Breakpoint number %d\tline number %d\n\r",breakpoint_count,line_number); + } + + + // show pin configuration + pin_t pins_F042[] = { + {'A',0},{'A',1},{'A',2},{'A',3},{'A',4},{'A',5},{'A',6},{'A',7}, + {'A',9},{'A',10},{'A',13},{'A',14},{'B',1},{'B',8},{'F',0},{'F',1} }; + int num_of_pins = 16; + + show_clk_config(); + show_adc1_config(); + pc.printf("\e[93;40mTimer configuration:\e[97;40m\n\r"); + pc.printf("-----------------------------------------------------------------\n\r"); + pc.printf("| TIM\t| Prescaler\t| Auto reload value\t| Alignment\t|\n\r"); + pc.printf("-----------------------------------------------------------------\n\r"); + show_tim_config(1); + pc.printf("\n\r-----------------------------------------------------------------\n\r"); + show_tim_config(3); + pc.printf("\n\r-----------------------------------------------------------------\n\r"); + show_tim_config(14); + pc.printf("\n\r-----------------------------------------------------------------\n\r"); + show_tim_config(16); + pc.printf("\n\r-----------------------------------------------------------------\n\r"); + pc.printf("\e[93;40mPin configurations:\e[97;40m\n\r"); + pc.printf("-------------------------------------------------------------------------\n\r"); + pc.printf("| PIN\t| mode of pin\t\t| Configuration\t\t\t| value\t|\n\r"); + pc.printf("-------------------------------------------------------------------------\n\r"); + + for (int i = 0; i < num_of_pins; i++ ){ + show_pin_config(pins_F042[i]); + pc.printf("-------------------------------------------------------------------------\n\r"); + } + + pc.printf("\n\r\e[32;40mto continue press any button\e[97;40m"); + pc.getc(); + pc.printf("\r\e[2K\e[31;40mprogram is running\e[97;40m\n\r"); + pc.printf("\e[u"); + wait(0.1); +} + + +// show configuration of pin +//------------------------------------------------------------------------------------------------------------------ +void Debug_complete::show_pin_config(pin_t pin){ + char portx = pin.port; + int pin_number = pin.number; + + // definition of important constants + const uint32_t AFRL_Offset = 0x20; + const uint32_t AFRH_Offset = 0x24; + + const uint32_t MODER_Offset = 0x00; + const uint32_t PUPDR_Offset = 0x0C; + const uint32_t OSPEEDR_Offset = 0x08; + + const uint32_t OTYPER_Offset = 0x04; + const uint32_t IDR_Offset = 0x10; + const uint32_t ODR_Offset = 0x14; + + const uint32_t gpioa = 0x48000000; + const uint32_t gpiob = 0x48000400; + const uint32_t gpiof = 0x48001400; + + uint32_t reg_0; + switch (portx){ + case 'A': + case 'a': + reg_0 = gpioa; + pc.printf("| PA"); + break; + case 'B': + case 'b': + reg_0 = gpiob; + pc.printf("| PB"); + break; + case 'f': + case 'F': + reg_0 = gpiof; + pc.printf("| PF"); + break; + default: + pc.printf("non existing port\n\r"); + return; + + } + pc.printf("%d\t| ",pin_number); + + // check the mode of pin + int return_value; + uint32_t reg_1 = MODER_Offset; + return_value = check_2_bit(reg_0,reg_1,pin_number); + + // check other meaningful features depending on mode of the pin + if (return_value == 0){ //input mode + pc.printf("input mode\t\t| "); + // chceck pupdr register + reg_1 = PUPDR_Offset; + return_value = check_2_bit(reg_0,reg_1,pin_number); + if (return_value == 0){ // pull none + pc.printf("no resistor\t|\t\t"); + }else if (return_value == 1){ // pull up + pc.printf("pull up\t|\t\t"); + }else if (return_value == 2){ // pull down + pc.printf("pull down\t|\t\t"); + }else{ + pc.printf("ERROR, reserved value\n\r"); + return; + } + pc.printf("| "); + // check input value + reg_1 = IDR_Offset; + return_value = check_1_bit(reg_0,reg_1,pin_number); + if (return_value == 0){ // log.0 + pc.printf("log.0"); + }else { // log.1 + pc.printf("log.1"); + } + pc.printf(" |\n\r"); + }else if (return_value == 1){ //output mode + pc.printf("output mode\t\t| "); + + // check output mode register + reg_1 = OTYPER_Offset; + return_value = check_1_bit(reg_0,reg_1,pin_number); + if (return_value == 0){ // push pull + pc.printf("push pull\t"); + }else{ // open drain + pc.printf("open drain\t"); + } + pc.printf("| "); + + // check speed of output pin + reg_1 = OSPEEDR_Offset; + return_value = check_2_bit(reg_0,reg_1,pin_number); + if (return_value == 0 || return_value == 2){ // low speed + pc.printf("low speed\t"); + }else if (return_value == 1){ // medium speed + pc.printf("medium speed\t"); + }else{ // high speed + pc.printf("high speed\t"); + } + pc.printf("| "); + + // check output value + reg_1 = ODR_Offset; + return_value = check_1_bit(reg_0,reg_1,pin_number); + if (return_value == 0){ // log.0 + pc.printf("log.0"); + }else{ // log.1 + pc.printf("log.1"); + } + pc.printf("\n\r"); + }else if(return_value == 2){ // alternate mode + pc.printf("alternate mode\t| "); + int af_mode; + // chceck whether the pin belongs between the lower 8 pins and use AFRL register + // or he pin belongs between the higher 8 pins and use AFRH register + if (pin_number <= 7){ + af_mode = check_alternative_mode(reg_0,AFRL_Offset,pin_number); + }else{ + af_mode = check_alternative_mode(reg_0,AFRH_Offset,pin_number - 8); + } + // print exact alternate functionality + print_af_mode(portx, pin_number, af_mode); + + }else{ //analog mode + pc.printf("analog mode\t\t|"); + if ((portx == 'A' || portx == 'a') && pin_number >= 0 && pin_number <= 7){ + show_analog_config(pin_number); + }else if((portx == 'B' || portx == 'b') && pin_number == 1){ + show_analog_config(9); + }else{ + pc.printf("error"); + return; + } + + } +} + +// print alternate function of pin +//------------------------------------------------------------------------------------------------------------------ +void Debug_complete::print_af_mode( char portx, int pin_number, int af_mode){ + if ( (portx == 'a' || portx == 'A') && pin_number == 0 && af_mode == 1){ + pc.printf("USART2_CTS"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 0 && af_mode == 2){ + pc.printf("TIM2_CH1_ETR"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 0 && af_mode == 3){ + pc.printf("TSC_G1_IO1"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 1 && af_mode == 0){ + pc.printf("EVENTOUT"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 1 && af_mode == 1){ + pc.printf("USART2_RTS"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 1 && af_mode == 2){ + pc.printf("TIM2_CH2"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 1 && af_mode == 3){ + pc.printf("TSC_G1_IO2"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 2 && af_mode == 1){ + pc.printf("USART2_TX"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 2 && af_mode == 2){ + pc.printf("TIM2_CH3"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 2 && af_mode == 3){ + pc.printf("TSC_G1_IO3"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 3 && af_mode == 1){ + pc.printf("USART2_RX"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 3 && af_mode == 2){ + pc.printf("TIM2_CH4"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 3 && af_mode == 3){ + pc.printf("TSC_G1_IO4"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 4 && af_mode == 0){ + pc.printf("SPI1_NSS, I2S1_WS"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 4 && af_mode == 1){ + pc.printf("USART2_CK"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 4 && af_mode == 2){ + pc.printf("USB_NOE"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 4 && af_mode == 3){ + pc.printf("TSC_G2_IO1"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 4 && af_mode == 4){ + show_pwm_config(14, 1); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 5 && af_mode == 0){ + pc.printf("SPI1_SCK, I2S1_CK"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 5 && af_mode == 1){ + pc.printf("CEC"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 5 && af_mode == 2){ + pc.printf("TIM2_CH1_ETR"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 5 && af_mode == 3){ + pc.printf("TSC_G2_IO2"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 6 && af_mode == 0){ + pc.printf("SPI1_MISO, I2S1_MCK"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 6 && af_mode == 1){ + show_pwm_config(3, 1); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 6 && af_mode == 2){ + pc.printf("TIM1_BKIN"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 6 && af_mode == 3){ + pc.printf("TSC_G2_IO3"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 6 && af_mode == 5){ + pc.printf("TIM16_CH1"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 6 && af_mode == 6){ + pc.printf("EVENTOUT"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 7 && af_mode == 0){ + pc.printf("SPI1_MOSI, I2S1_SD"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 7 && af_mode == 1){ + pc.printf("TIM3_CH2"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 7 && af_mode == 2){ + show_pwm_config(1, 1); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 7 && af_mode == 3){ + pc.printf("TSC_G2_IO4"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 7 && af_mode == 4){ + pc.printf("TIM14_CH1"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 7 && af_mode == 5){ + pc.printf("TIM17_CH1"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 7 && af_mode == 6){ + pc.printf("EVENTOUT"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 9 && af_mode == 1){ + pc.printf("USART1_TX"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 9 && af_mode == 2){ + show_pwm_config(1, 2); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 9 && af_mode == 3){ + pc.printf("TSC_G4_IO1"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 9 && af_mode == 4){ + pc.printf("I2C1_SCL"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 9 && af_mode == 5){ + pc.printf("MCO"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 10 && af_mode == 0){ + pc.printf("TIM17_BKIN"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 10 && af_mode == 1){ + pc.printf("USART1_RX"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 10 && af_mode == 2){ + show_pwm_config(1, 3); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 10 && af_mode == 3){ + pc.printf("TSC_G4_IO2"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 10 && af_mode == 4){ + pc.printf("I2C1_SDA"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 13 && af_mode == 0){ + pc.printf("SWDIO"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 13 && af_mode == 1){ + pc.printf("IR_OUT"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 13 && af_mode == 2){ + pc.printf("USB_NOE"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 14 && af_mode == 0){ + pc.printf("SWCLK"); + }else if ( (portx == 'a' || portx == 'A') && pin_number == 14 && af_mode == 1){ + pc.printf("USART2_TX"); + }else if ( (portx == 'b' || portx == 'B') && pin_number == 1 && af_mode == 0){ + pc.printf("TIM14_CH1"); + }else if ( (portx == 'b' || portx == 'B') && pin_number == 1 && af_mode == 1){ + pc.printf("TIM3_CH4"); + }else if ( (portx == 'b' || portx == 'B') && pin_number == 1 && af_mode == 2){ + show_pwm_config(1, 3); + }else if ( (portx == 'a' || portx == 'B') && pin_number == 1 && af_mode == 3){ + pc.printf("TSC_G3_IO3"); + }else if ( (portx == 'b' || portx == 'B') && pin_number == 8 && af_mode == 0){ + pc.printf("CEC"); + }else if ( (portx == 'b' || portx == 'B') && pin_number == 8 && af_mode == 1){ + pc.printf("I2C1_SCL"); + }else if ( (portx == 'b' || portx == 'B') && pin_number == 8 && af_mode == 2){ + show_pwm_config(16, 1); + }else if ( (portx == 'b' || portx == 'B') && pin_number == 8 && af_mode == 3){ + pc.printf("TSC_SYNC"); + }else if ( (portx == 'a' || portx == 'B') && pin_number == 8 && af_mode == 4){ + pc.printf("CAN_RX"); + }else if ( (portx == 'f' || portx == 'F') && pin_number == 0 && af_mode == 0){ + pc.printf("CRS_SYNC"); + }else if ( (portx == 'f' || portx == 'F') && pin_number == 0 && af_mode == 1){ + pc.printf("I2C1_SDA"); + }else if ( (portx == 'f' || portx == 'F') && pin_number == 1 && af_mode == 1){ + pc.printf("I2C1_SCL"); + }else{ + pc.printf("ERROR"); + } + pc.printf("\t|\n\r"); +} + +// show configuration of pin in analog mode +//------------------------------------------------------------------------------------------------------------------ +void Debug_complete::show_analog_config(int channel){ + int config = ADC1->CHSELR; + ADC1->CR|=ADC_CR_ADSTP; + ADC1->CR &= !ADC_CR_ADSTART; + ADC1->CHSELR = 1 << channel; + + ADC1->CR |= ADC_CR_ADEN; + while ( (ADC1->ISR & ADC_ISR_ADRDY) == 0){} + ADC1->CR |= ADC_CR_ADSTART; /* Start the ADC conversion */ + while ((ADC1->ISR & ADC_ISR_EOC) == 0){} + + pc.printf("\t\t|\t\t| %d\t|\n\r",ADC1->DR); + ADC1->CHSELR = config; +} + +// print configuration of pin in pwm output mode +//------------------------------------------------------------------------------------------------------------------ +void Debug_complete::show_pwm_config(int timer, int channel){ + + pc.printf("CCR = "); + if (timer == 1 && channel == 1){ + pc.printf("%3d",TIM1->CCR1); + }else if (timer == 1 && channel == 2 ){ + pc.printf("%3d",TIM1->CCR2); + }else if (timer == 1 && channel == 3 ){ + pc.printf("%3d",TIM1->CCR3); + }else if (timer == 3 && channel == 1){ + pc.printf("%3d",TIM3->CCR1); + }else if (timer == 14 && channel == 1){ + pc.printf("%3d",TIM14->CCR1); + }else if (timer == 16 && channel == 1){ + pc.printf("%3d",TIM16->CCR1); + } +} + +// print configuration of timer +//------------------------------------------------------------------------------------------------------------------ +void Debug_complete::show_tim_config(int timer){ + int alignment; + pc.printf("| TIM%d\t| ",timer); + if (timer == 1){ + pc.printf("%3d\t\t| %5d\t\t| ",TIM1->PSC,TIM1->ARR); + alignment = ((TIM1->CR1&TIM_CR1_CMS)>>5); + if (alignment){ + pc.printf("center mode %d\t|",alignment); + }else{ + pc.printf("edge mode\t|"); + } + }else if (timer == 3){ + pc.printf("%3d\t\t| %5d\t\t| ",TIM3->PSC,TIM3->ARR); + alignment = ((TIM3->CR1&TIM_CR1_CMS)>>5); + if (alignment){ + pc.printf("center mode %d\t|",alignment); + }else{ + pc.printf("edge mode\t|"); + } + }else if (timer == 14){ + pc.printf("%3d\t\t| %5d\t\t| ",TIM14->PSC,TIM14->ARR); + alignment = ((TIM14->CR1&TIM_CR1_CMS)>>5); + if (alignment){ + pc.printf("center mode %d\t|",alignment); + }else{ + pc.printf("edge mode\t|"); + } + }else if (timer == 16){ + pc.printf("%3d\t\t| %5d\t\t| ",TIM16->PSC,TIM16->ARR); + alignment = ((TIM16->CR1&TIM_CR1_CMS)>>5); + if (alignment){ + pc.printf("center mode %d\t|",alignment); + }else{ + pc.printf("edge mode\t|"); + } + } +} + +// print configuration of adc1 converter +//------------------------------------------------------------------------------------------------------------------ +void Debug_complete::show_adc1_config(){ + + pc.printf("\e[93;40mADC configuration:\e[97;40m\n\r"); + + //configuration of adc clock + pc.printf("ADC Clock = "); + switch ((ADC1->CFGR2&ADC_CFGR2_CKMODE)>>30){ + case 0: + pc.printf("ADCCLK"); + break; + case 1: + pc.printf("PCLK/2"); + break; + case 2: + pc.printf("PCLK/4"); + break; + case 3: + pc.printf("Reserved"); + break; + + } + + // resolution of adc1 + pc.printf("\t Resolution = %d bits\t Sampling time = ", 12-2*((ADC1->CFGR1&ADC_CFGR1_RES)>>2)); + switch (ADC1->SMPR&ADC_SMPR_SMP){ + case 0: + pc.printf("1.5"); + break; + case 1: + pc.printf("7.5"); + break; + case 2: + pc.printf("13.5"); + break; + case 3:pc.printf("28.5"); + break; + case 4:pc.printf("41.5"); + break; + case 5:pc.printf("55.5"); + break; + case 6: + pc.printf("71.5"); + break; + case 7:pc.printf("239.5"); + break; + } + pc.printf("clk cycles\n\r"); +} + +//print configuration of board's clock +//------------------------------------------------------------------------------------------------------------------ +void Debug_complete::show_clk_config(){ + pc.printf("\e[93;40mClock configuration:\e[97;40m\n\r"); + + // type of clock + int clk_typede = RCC->CFGR & RCC_CFGR_SW; + if (clk_typede == 0 && RCC->CR&RCC_CR_HSION){ // hsi clock + pc.printf("HSI\t"); + + }else if (clk_typede == 1 && RCC->CR&RCC_CR_HSEON){ // hse clock + pc.printf("HSE\t"); + if (RCC->CR & RCC_CR_HSEBYP){ // bypassed hse clock + pc.printf(" BYPASS"); + } + + }else if (clk_typede == 2 && RCC->CR&RCC_CR_PLLON){ // pll clock + pc.printf("PLL\t"); + int var = (RCC->CFGR&RCC_CFGR_PLLMUL)>>18; // multiplication factor of pll clock + pc.printf("mul. factor = %d\t",(var<14)?(var+2):16); + + var = (RCC->CFGR2&RCC_CFGR2_PREDIV); // divider of pll input clock + pc.printf("PREDIV = %d\tPLL input:",var+1); + + int pllscr = (RCC->CFGR&0x00018000)>>15; // type of pll input clock + switch (pllscr){ + case 0: + pc.printf(" HSI/2"); + break; + case 1: + pc.printf(" HSI/PREDIV"); + break; + case 2: + pc.printf(" HSE/PREDIV"); + break; + case 3: + pc.printf("HSI48/PREDIV"); + break; + } + pc.printf(" "); + + }else if (clk_typede == 3 && (RCC->CR2&RCC_CR2_HSI48ON)){ //hsi48 clock + pc.printf("HSI48"); + }else{ // none of previous options + pc.printf("ERROR"); + } + pc.printf("\n\r"); +} + +// clear screen from m line up to n line +//------------------------------------------------------------------------------------------------------------------ +void Debug_complete::clear_from_n_up_to_m(int m, int n){ + pc.printf("\033[%d;0H",m); + wait(1); + while (m > n){ + m--; + pc.printf("\033[K\033[%d;0H",m); + } + pc.printf("\n\r"); + +} + +//print formatted string to debug serial port +//------------------------------------------------------------------------------------------------------------------ +int Debug_complete::printf(const char* format, ...){ + + int ret = pc.printf(format); + pc.printf("\e[s"); + return ret; +} + +//print character to debug serial port +//------------------------------------------------------------------------------------------------------------------ +int Debug_complete::putc(int character){ + + int ret = pc.putc(character); + pc.printf("\e[s"); + return ret; +} + +//read character from debug serial port +//------------------------------------------------------------------------------------------------------------------ +int Debug_complete::getc(){ + return pc.getc(); +} + +//print one 32-bit word from memory +//------------------------------------------------------------------------------------------------------------------ +void Debug_complete::print_reg(uint32_t address, uint32_t offset){ + + uint32_t word = read_word(address,offset); + pc.printf("\n\r-----------------------------------------------------------------------\n\r| ADDRESS: 0x%-8x |\t OFFSET: 0x%-8X |\t HEX VAL: 0x%-8x |",address,offset,word); + pc.printf("\n\r-----------------------------------------------------------------------"); + pc.printf("\n\r| bit | 31| 30| 29| 28| 27| 26| 25| 24| 23| 22| 21| 20| 19| 18| 17| 16| \n\r"); + pc.printf( "-----------------------------------------------------------------------\n\r| val | "); + for (int i = 31; i>= 16; i--){ + pc.printf("%d | ",(word&(0x1U<<i))>>i); + } + pc.printf("\n\r-----------------------------------------------------------------------\n\r-----------------------------------------------------------------------"); + pc.printf("\n\r| bit | 15| 14| 13| 12| 11| 10| 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |\n\r"); + pc.printf("-----------------------------------------------------------------------\n\r| val | "); + for (int i = 15; i>= 0; i--){ + pc.printf("%d | ",(word&(0x1U<<i))>>i); + } + pc.printf("\n\r-----------------------------------------------------------------------"); + pc.printf("\e[s"); + + +} \ No newline at end of file