Trying to understand the relationship between bootloaders and clock frequency

I've read many bootloader posts and learned there are two commonly available bootloader speeds, 8Mhz and 16Mhz. Folks asking about other speeds 10Mhz etc are told to stay with the standard speeds or it gets complicated quickly.

My question is; what is unique about each speed of bootloader that makes moving to a different frequency so painful? I understand the basic concept of a bootloader, but do not know why it paired so strictly to a specific frequency. Is it as simple as the USART speed would be off if the target clock were not as expected by the bootloader. Is there more? I've seen some posts talking about fuses, I didn't think it was possible for the bootloader to change a fuse setting.

Thank
JohnRob

Yeah, it's just the uart baud rates. All you need to do is recompile the bootloader with the desired f_cpu.

@DrAzzy

Thank you. It helps when I understand the reason behind these recommendations. I have a personality flaw, I need to understand to accept.

John

BTW Is the "standard" baud rate 9600?

9600 is a standard baud rate (as I'm sure you know, there are a bunch of common baud rates, generally multiples of 9600 and 14400 (9600 * 1.5) - you need to stick to those; most serial adapters can't use an arbitrary baud rate)

There is no "standard" baud rate for arduino bootloaders. The nano used 57600, the uno uses 115200, Arduino as ISP uses 19200, and so on.

In addition to having to build the bootloader at the right F_CPU so the baud rates match, you also need to pick a baud rate that works at that F_CPU, see the wormfood avr baud tables: WormFood's AVR Baud Rate Calculator Ver. 2.1.1 (note - U2X is generally used, except on older parts that don't support it).

9600 is very popular in arduino-land; it's a very conservative choice, will work even at 1MHz no problem - though people often default it without thinking (ex, for sketch serial output) and are surprised when they realize that their code is rapidly filling the serial buffer, leading to Serial.print statements becoming blocking: 9600 baud is about 1ms per character!