stm32f417 Bootloader works with program jump, but not with boot pins

I have a firmware updater for stm32f417, written in C#, that does a software jump to the bootloader and uses the USART protocol (AN3155) to erase and install the firmware to flash.

The newest version of our board has a jumper for configuring the boot pins. Normally, boot0 and boot1 are held low (flash startup), removing the jumper sets boot0 high, which configures a bootloader, or System Memory, startup.

Running the updater during normal operation of the board configures the system and jumps to the bootloader, and completes an upgrade of the firmware.

Removing the jumper and starting the board in the bootloader causes the updater to fail (System.TimeoutException). The update is normal until it reaches sending the Extended Erase Memory command; sending the command gets a ACK (0x79) back from the board, but I receive a timeout exception before the erase is completed.

Since the update occurs while the bootloader is running, the only difference seems to be HOW the system arrives in the bootloader. Here is my code that sets up the system before entering the bootloader:

121 (0x79) is ACK for commands sent to the board. So, the erase procedure starts, but fails with a System.TimeoutException before the erase is complete.

Running a test on the software jump to bootloader shows that a single page erase can be completed and continue on to write:

Erasing flash memory...

Erase byte - page 2 = 121 Erase Complete byte - page 2 = 121

Write byte = 121

Does anyone have experience with performing an upgrade by configuring the boot pins. Since my software jump version works, I thought the boot pin version would also work. Do you need to do anything other than configure the pins and apply power to the board?

Checking on rise times, power comes from DC-DC converter with caps, shouldn't be too fast or too slow

Checking on NRST, I believe there is an external pull-up added

How do signal transitions impact the bootloader?

PA12 is not connected on our board.

What exactly am I looking for in this scenario, where the bootloader is running (connects, and processes commands sent), but failing on tasks that it can accomplish when I do the software jump to bootloader?

As far as I know, the bootloader is a black box. Is there any way to see why it might fail on an erase command?