|
发表于 2021-12-24 12:08:57
|
显示全部楼层
硬汉哥,我在F767和F302中使用系统的BootLoader,但是stm32cubeprogramer 无法读取到usb,在f4就可以系统boot的地址也按照手册做了修改:F76xx的系统boot地址是0x1FF00000
代码如下:int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
HAL_Delay(500);
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
// MX_TIM3_Init();
// MX_TIM2_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_SET)
{
// /* Jump to user application */
// JumpAddress = *(__IO uint32_t*) (FLASHLOAD_ADDRESS + 4);
// JumpToApplication = (pFunction) JumpAddress;
// /* Initialize user application's Stack Pointer */
// __set_MSP(*(__IO uint32_t*) FLASHLOAD_ADDRESS);
// JumpToApplication();
JumpToBootloader();
}
HAL_Delay(1000);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_0|GPIO_PIN_1);
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
static void JumpToBootloader(void)
{
uint32_t i=0;
void (*SysMemBootJump)(void); /* 声明一个函数指针 */
__IO uint32_t BootAddr = 0x1FF00000; /* STM32F7的系统BootLoader地址 */
/* 关闭全局中断 */
DISABLE_INT();
/* 关闭滴答定时器,复位到默认值 */
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;
}
/* 使能全局中断 */
ENABLE_INT();
/* 设置重映射到系统Flash */
// __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();
/* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));
/* 设置朱堆栈指针 */
__set_MSP(*(uint32_t *)BootAddr);
// /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
// __set_CONTROL(0);
/* 跳转到系统BootLoader */
SysMemBootJump();
/* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
while (1)
{
}
}
|
|