EDA365电子论坛网
标题:
stm32f103zg程序跳转到系统bootloader失败
[打印本页]
作者:
RNGxiaohu
时间:
2021-12-20 09:56
标题:
stm32f103zg程序跳转到系统bootloader失败
目前用的
芯片
是
STM32
f103zg,准备使用串口升级程序,看到手册AN2606中,该芯片是支持USART1通过系统boot loader更新程序的。现在的程序是用stm32cubemx生成的,程序如下
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configura
ti
on--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash inte
RF
ace and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system
clock
*/
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_10)==GPIO_PIN_RESET)
{
JumpToBootloader();
}
else
{
JumpToApp();
}
}
/* USER CODE END 3 */
}
/* USER CODE BEGIN 4 */
static void JumpToBootloader(void)
{
uint32_t i=0;
void (*SysMemBootJump)(void); /*声明一个函数指针*/
__IO uint32_t BootAddr = 0x1FFFE000;//0x1FFF0000; /* STM32F103 的系统 BootLoader 地址*/
/*关闭全局中断*/
__disable_irq();
/*关闭滴答定时器,恢复到默认值*/
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
/*设置所有
时钟
到默认状态,使用HSI时钟*/
HAL_RCC_DeInit();
/* 关闭所有中断,清除中断挂起标志 */
for (i = 0; i < 8; i++)
{
NVIC->ICER
=0xFFFFFFFF;
NVIC->ICPR
=0xFFFFFFFF;
}
/* 使能全局中断 */
__enable_irq();
/*设置重映射到系统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();
}
static void JumpToApp(void)
{
uint32_t i=0;
void (*SysMemBootJump)(void); /*声明一个函数指针*/
__IO uint32_t BootAddr = 0x8001800; /* APP程序地址*/
/*关闭全局中断*/
__disable_irq();
/*关闭滴答定时器,恢复到默认值*/
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
/*设置所有时钟到默认状态,使用HSI时钟*/
HAL_RCC_DeInit();
/* 关闭所有中断,清除中断挂起标志 */
for (i = 0; i < 8; i++)
{
NVIC->ICER
=0xFFFFFFFF;
NVIC->ICPR
=0xFFFFFFFF;
}
/* 使能全局中断 */
__enable_irq();
/* 跳转到系统 BootLoader,首地址是MSP,地址 +4 是复位中断服务程序地址 */
SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));
/* 设置主堆栈地址*/
__set_MSP(*(uint32_t *)BootAddr);
/*在RTOS工程,这条语句很重要,设置为特权模式,使用MSP指针 */
__set_CONTROL(0);
/* 跳转到系统 BootLoader */
SysMemBootJump();
}
/* USER CODE END 4 */
[color=rgb(51, 102, 153) !important]
复制代码
现在这个程序是可以正常跳转到APP程序的,就是跳转bootloader不成功,用stm32programmer,连接不上串口。如果直接把BOOT0置高是可以连接上串口的,所以硬件上应该没有问题。
请各位大神帮我看看到底是什么原因不能跳转到系统boot loader呢?
作者:
CLBuu
时间:
2021-12-20 10:18
上电不执行JumpToApp(),不跳转到APP程序,不就是bootloader中吗
作者:
showmaker
时间:
2021-12-20 10:18
用到boot时,程序的加载地址,中断向量要是修改的
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2