新手上路
- 积分
- 38
- 金钱
- 38
- 注册时间
- 2019-3-7
- 在线时间
- 12 小时
|
5金钱
开发板:我使用的开发板是阿波罗F429IGT6开发板V2,我想通过软件的方式进行bootloader的跳转进而实现usb下载固件,代码如下面所示,在main函数中调用此函数。遇到的问题:每次在keil中使用dap下载器下载程序后,电脑可以识别到STM32Bootloader,但是当我按下开发板的复位按键后,电脑就再也无法识别到,想问一下这是什么原因导致的呀,就很奇怪!
图一:在keil中使用dap下载器下载程序后,电脑可以识别到STM32Bootloader
图二:按下开发板的复位按键后,电脑就再也无法识别到,显示的是未知USB设备,但是当在keil中重现download程序后,电脑还是可以识别到,只要一复位或者断电开发板就再也识别不到了
代码如下:
static void JumpToBootloader(void)
{
uint32_t i=0;
void (*SysMemBootJump)(void); /* 声明一个函数指针 */
__IO uint32_t BootAddr = 0x1FFF0000; /* STM32F4的系统BootLoader地址 */
/* 关闭全局中断 */
__set_PRIMASK(0);
/* 关闭滴答定时器,复位到默认值 */
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;
}
/* 使能全局中断 */
__set_PRIMASK(1);
/* 设置重映射到系统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)
{
}
}
|
|