1. 程式人生 > 其它 >使用內建bootloader進行串列埠IAP韌體升級——STM32F103RCT6

使用內建bootloader進行串列埠IAP韌體升級——STM32F103RCT6

STM系列有內建的bootloader,支援通過CAN、SPI、I2C、USB DFU、USART進行韌體升級。
需配合STM32CubeProgrammer使用,以下為串列埠接收到0x55後,進入內建bootloader的例子,其中地址0x1FFFF000需要查詢《AN2606
Application note—STM32 microcontroller system memory boot mode》

/*
*********************************************************************************************************
*	函 數 名: JumpToBootloader
*	功能說明: 跳轉到系統BootLoader
*	形    參: 無
*	返 回 值: 無
*********************************************************************************************************
*/
void JumpToBootloader(void)
{
	uint32_t i = 0;
	void (*SysMemBootJump)(void);		 /* 宣告一個函式指標 */
	__IO uint32_t BootAddr = 0x1FFFF000; // STM32F1系列內建bootloader地址

	/* 關閉全域性中斷 */
	__set_PRIMASK(1);

	/* 關閉滴答定時器,復位到預設值 */
	SysTick->CTRL = 0;
	SysTick->LOAD = 0;
	SysTick->VAL = 0;

	/* 設定所有時鐘到預設狀態,使用HSI時鐘 */
	HAL_RCC_DeInit();

	/* 關閉所有中斷,清除所有中斷掛起標誌 */
	for (i = 0; i < 8; i++)
	{
		NVIC->ICER[i] = 0xFFFFFFFF;
		NVIC->ICPR[i] = 0xFFFFFFFF;
	}

	/* 使能全域性中斷 */
	__set_PRIMASK(0);

	/* 跳轉到系統BootLoader,首地址是MSP,地址+4是復位中斷服務程式地址 */
	SysMemBootJump = (void (*)(void))(*((uint32_t *)(BootAddr + 4)));

	/* 設定主堆疊指標 */
	__set_MSP(*(uint32_t *)BootAddr);

	/* 在RTOS工程,這條語句很重要,設定為特權級模式,使用MSP指標 */
	__set_CONTROL(0);

	/* 跳轉到系統BootLoader */
	SysMemBootJump();

	/* 跳轉成功的話,不會執行到這裡,使用者可以在這裡新增程式碼 */
	while (1)
	{
	}
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

	if (aRxBuffer[0] == 0x55)
	{
		JumpToBootloader();
	}

	HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1);
}
  1. 選擇串列埠,“偶校驗”
  1. 連線成功

3.選擇檔案,寫入

參考
《安富萊_STM32-V6開發板_使用者手冊 第28-30章》