As mentioned in the other answer, it seems that it's not possible for an Arduino Uno to change its own fuses.
So here is how I did:
I used a Nano (loaded with "Arduino as ISP") as programmer for the Uno with this classical wiring (except that in my case, the left board, the programmer, is a Nano):
I added this to boards.txt (source here):
You need a programmer to burn fuses. If you have another arduino then you can use the Arduino as ISP example sketch in the IDE. You can't burn fuses just using the USB cable like you upload code with. The only reason that can talk to the chip at all is because there is another chip to convert it to serial and a bootloader on the 328P to allow it to upload ...
That error basically says the bootloader you are trying to burn does not appear to be for that device. This could be due to corruption or (more likely in your case) harvesting and reconfiguring the hardware.
If the error does not appear when you try to load the bootloader for the Uno (original device you harvested it from for those harvesting from other ...
You can temporarily put it in an UNO. Don't connect this UNO via USB, but use jumper wires to connect the ISP pins plus the power pins to the other Arduino that you are using as an ISP programmer. (You could also use the (2x3) ISP header on the UNO if that's more convenient.)
Or, you could use a high voltage programmer.
Or get/desolder a crystal from some ...
I assume that you have to wrap the directory in the option -U flash:w:C:\Users\Chry\AppData\Local\Temp\arduino_build_166520/TH3DUF_R2.ino.hex:i with "s. I don't promise that it'll work with that change, but C:\Users... will definitely confuse the parser due to the :!
SP = (uint16_t)(&dummy)
is changing the stack pointer. Not what you want. You want to instead
push the destination address to the stack. However, rather than
simulating a function return, it should be simpler to perform an
asm volatile("ijmp" :: "z"(dummy));
Don't forget that your naked ISR has to save all the call-used