4 Replies Latest reply on Apr 20, 2017 8:25 PM by Clive One

    Accesing the field of a struct when it is a pointer?

    john doe

      Having trouble reading the MAC address using the HAL but mostly because of my inexperience.

       

       uint8_t             *MACAddr;                   /*!< MAC Address of used Hardware: must be pointer on an array of 6 bytes */

       

      printing heth.Init.MACAddr[0] does not print the first byte. It prints something, but not what I am expecting.  if I send &heth.Init.MACAddr[0] to printf, it does print the address, but the first try without the & produces what seems to be a different address. The value does not change no matter what I set the MAC Address to.  I'm obviously missing something when it comes to reading the value of a field of a struct when its a pointer.  Can someone help me get on the right path?

       

            len += sprintf(etherString+len, " MAC Address      : %02X:%02X:%02X:%02X:%02X:%02X\r\n",
                    heth.Init.MACAddr[0], heth.Init.MACAddr[1], heth.Init.MACAddr[2], heth.Init.MACAddr[3],
                    heth.Init.MACAddr[4], heth.Init.MACAddr[5]);

       

      produces

       MAC Address      : 84:00:00:20:2B:39

       

      the mac address is actually 00:80:E1:00:00:00

       

      what am I not getting?

        • Re: Accesing the field of a struct when it is a pointer?
          Alex R

          Hi,

           

          Note that MACAddr is a pointer, so it doesn't actually contain the data for the MAC address.

           

          How do you assign (write) the MAC address into the Init data structure?

           

          Regards,

           

          Alex.

          • Re: Accesing the field of a struct when it is a pointer?
            Clive One

            Kind of suggests that MACAddr isn't set to anything, or is set to a transient address for a local/auto variable, that's out of scope at the point of printing.

             

            ie

            heth.Init.MACAddr = malloc(6);

             

            heth.Init.MACAddr[0] = 0x11;

            heth.Init.MACAddr[1] = 0x22;

            heth.Init.MACAddr[2] = 0x33;

            heth.Init.MACAddr[3] = 0x44;

            heth.Init.MACAddr[4] = 0x55;

            heth.Init.MACAddr[5] = 0x66;

             

            1 of 1 people found this helpful
              • Re: Accesing the field of a struct when it is a pointer?
                john doe

                nailed it, once again. The HAL never updates that field of the struct anyway and as KIC8462852 EPIC204278916 suggested, I dug up how the MAC address is configured and it turns out the HAL just writes to the registers and, for a change, doesn't update the struct like it does for everything else.  I was also confusing which struct was being returned from the call to get its status.

                 

                this is how I ended up reading the MAC address on an stm32f769i-discovery board:

                 

                      uint32_t htempreg;
                      uint32_t ltempreg;
                      uint8_t  macAddr[6];
                      htempreg = (*(__IO uint32_t *)((uint32_t)(ETH_MAC_ADDR_HBASE)));
                      ltempreg = (*(__IO uint32_t *)((uint32_t)(ETH_MAC_ADDR_LBASE)));

                 

                      macAddr[0] = (ltempreg)       & 0xFF;
                      macAddr[1] = (ltempreg >> 8)  & 0xFF;
                      macAddr[2] = (ltempreg >> 16) & 0xFF;
                      macAddr[3] = (ltempreg >> 24) & 0xFF;
                      macAddr[4] = (htempreg)       & 0xFF;
                      macAddr[5] = (htempreg >> 8)  & 0xFF;

                 

                      len += sprintf(etherString+len, " MAC Address      : %02X:%02X:%02X:%02X:%02X:%02X\r\n",
                              macAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]);

              • Re: Accesing the field of a struct when it is a pointer?
                KIC8462852 EPIC204278916

                Find in file how the code is using or declaring MACAddr in the HAL.

                Human commented text won't be as accurate as C...

                 

                If using debug mode, open the structure contents and use the memory watch window to make sure everything is pointing as expected.

                1 of 1 people found this helpful