建设标准网站,网站开发工程师招聘要求,图文生成二维码免费,下载京东购物bootloader写法#xff1a; 假设app的起始地址#xff1a;0x08020000#xff0c;则bootloader的范围是0x0800,0000~0x0801,FFFF。 #define APP_ADDR 0x08020000 // 应用程序首地址定义
typedef void (*APP_FUNC)(void); // 函数指针类型定义
/*main函数中调用rum_app#x…bootloader写法 假设app的起始地址0x08020000则bootloader的范围是0x0800,0000~0x0801,FFFF。 #define APP_ADDR 0x08020000 // 应用程序首地址定义
typedef void (*APP_FUNC)(void); // 函数指针类型定义
/*main函数中调用rum_app进入app程序其中app_addr是app程序的flash首地址也就是0x08020000*/
void run_app(uint32_t app_addr)
{uint32_t reset_addr 0;APP_FUNC jump2app;/* 下面的判断语句是说app程序的烧写首地址存放的是SRAM中的栈地址
需要判断一下这个站地址是不是在以0x2000,0000为开始地址的SRAM
这个地址是stm32的内部RAM首地址。这里意义不大因为首地址中存放的栈地址
是在启动文件中定义由汇编编译器和链接器生成的不会有错 */if (((*(uint32_t *)app_addr) 0x2FFE0000) 0x20000000) // 判断是否是在128k的SRAM里面。{/* 设置栈指针这是一个内联函数定义在cmsis_armcc.h中 */ __set_MSP(*(volatile uint32_t *)app_addr); //把app_addr地址中的内容放到站寄存器中/* 获取复位地址 */reset_addr *(uint32_t *)(app_addr 4); //app程序入口地址是在0x08020004上jump2app (APP_FUNC)reset_addr;__disable_irq();; //hal库中的关所有中断函数jump2app();}
} /* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */ run_app(APP_ADDR);/* USER CODE END 2 *//* Infinite loop */在main中插入上面的代码run_app(APP_ADDR);就行 app写法 /* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//*因为在项目启动文件(startup_stm32f401xc.s)中会先于用户main函数之前调用中断初始化函数SystemInit(system_stm32f4xx.c文件中),这个函数中有条语句:/* Configure the Vector Table location -------------------------------------*/
#if defined(USER_VECT_TAB_ADDRESS)SCB-VTOR VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
#endif /* USER_VECT_TAB_ADDRESS */其中VECT_TAB_BASE_ADDRESS FLASH_BASE0x08000000VECT_TAB_OFFSET 0这个中断向量表地址是没有跳转的中断向量表地址所以需要用到下面的语句更换一下。*/SCB -VTOR FLASH_BASE | 0x20000;//这里就是app程序的起始地址__enable_irq(); //hal库开所有中断/* USER CODE END SysInit */