def download(self, startAddress, length, filePath):
        pageSize = min(248, length)
        data = bytearray()
        address = startAddress
        pages = int(length / pageSize)

        programmer = AvrIspFlow(self.xbee)
        
        self.resolve_target()
        self.reset_target()
        programmer.getTargetParameters()

        for i in range(0, pages):
            dataPage = programmer.readRomPage(address, pageSize)
            if len(dataPage) < pageSize:
                raise Exception("Read less bytes than the expected page size")
            data += dataPage
            address += pageSize

        if pages * pageSize < length:
            remainder = length - pages * pageSize
            print("reading remainder " + str(remainder))
            data += programmer.readRomPage(address, remainder)

        self.restore_target()

        writer = HexFileFormat(filePath)
        writer.save_bytes(data, startAddress)