2023-12-19 03:13 AM - edited 2023-12-19 05:02 AM
I'm using a STM32F105 and can program the firmware with an ST-Link to get firmware with USB DFU device driver on the device.
The device gets recognised if I connect it with USB and I can connect and read the memory without issues.
If I try to program a new firmware over USB it all looks good but after the verify step I get an error: Download verification failed.
When I check the firmware is not updated at all. It's weird because in the log I see that the sectors get ereased and download is complete but it seems nothing is written to the flash.
See print screen below.
Solved! Go to Solution.
2023-12-20 06:20 AM
Sorry but I don't follow you.
Of course I can use ST-Link to erase and program but I want to use USB DFU for software updates so the client does not need a ST-Link to update.
With the ST-link connected I can erase but if I try with a USB connection I get an error.
Error: Mass erase operation failed.Please verify flash protection
I also don't see the sectors table in the Erasing & programming tab if connected with USB.
2023-12-20 06:27 AM
AFAIK, There is no working bootloader in your MCU (other than the one invoked by pulling the BOOT0 pin high). The CubeMX DFU project is just a skeleton and you are responsible for the actual implementation of Flash operations.
2023-12-20 06:52 AM
Here is a discussion about the error download verification failed: https://community.st.com/t5/stm32cubeprogrammer-mcus/stm32cubeprogrammer-error-download-verification-failed/td-p/256342
You can also check this STMCUBE IDE tutorial to find out if you're missing something.
https://www.theengineeringprojects.com/2021/10/first-project-using-stm32-in-stm32cubeide.html
2023-12-20 08:59 AM
Hi Meige maybe im not clean
1.STLink use to erase only no program and disconnect it = empty mcu
2.Boot system bootloader and connect over USB (system not your) if you dont know howto work with system boot read AN2606 or as here
And ofcourse you plan update sw , but first you need understand how on clean mcu
2024-01-18 12:52 AM
I removed the software update class and just check VBUS during boot and jump to the device system bootloader if USB power is detected because I only use USB for software updates...
int main(void)
{
/* USER CODE BEGIN 1 */
// Check if we can detect VBUS
// if so we jump to device system bootloader
// Configure GPIO pin : PA9
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_9) == GPIO_PIN_SET)
{
// VBUS is present
JumpToBootloader();
}
else {
// if we do not detect VBUS on PA9 we deinitialize the pin configuration.
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9);
}
...
void JumpToBootloader(void) {
void (*SysMemBootJump)(void);
volatile uint32_t addr = 0x1FFFB000; // System memory bootloader address
SysMemBootJump = (void (*)(void)) (*((uint32_t *)(addr + 4)));
// Reset peripherals, disable interrupts
// we have no peripherals or interrupts started jet!
// Set main stack pointer
__set_MSP(*(uint32_t *) addr);
// Jump to bootloader
SysMemBootJump();
}