|
参照硬汉哥发的V6的跳转系统Boot进行串口IAP升级教程,目前是在移植到F103ZET上,代码如下- static void JumpToBootloader(void)
- {
- uint32_t i=0;
- void (*SysMemBootJump)(void); /* 声明一个函数指针 */
- __IO uint32_t BootAddr = 0x1FFFF000; /* STM32F1的系统BootLoader地址 */
- /* 关闭全局中断 */
- DISABLE_INT();
- /* 关闭滴答定时器,复位到默认值 */
- SysTick->CTRL = 0;
- SysTick->LOAD = 0;
- SysTick->VAL = 0;
- /* 设置所有时钟到默认状态,使用HSI时钟 */
- RCC_DeInit();
- /* 关闭所有中断,清除所有中断挂起标志 */
- for (i = 0; i < 8; i++)
- {
- NVIC->ICER[i]=0xFFFFFFFF;
- NVIC->ICPR[i]=0xFFFFFFFF;
- }
- /* 使能全局中断 */
- ENABLE_INT();
- /* 跳转到系统BootLoader,首地址是MSP,地址+4是复位中断服务程序地址 */
- SysMemBootJump = (void (*)(void)) (*((uint32_t *) (BootAddr + 4)));
- /* 设置主堆栈指针 */
- __set_MSP(*(uint32_t *)BootAddr);
-
- /* 在RTOS工程,这条语句很重要,设置为特权级模式,使用MSP指针 */
- __set_CONTROL(0);
- /* 跳转到系统BootLoader */
- SysMemBootJump();
- /* 跳转成功的话,不会执行到这里,用户可以在这里添加代码 */
- while (1)
- {
- bsp_LedOn(1);
- }
- }
复制代码 当前是通过程序正常启动后,通过串口1发送字符‘6’,进行跳转
- static void TestDemo(void)
- {
- uint8_t ucData;
-
- /* 轮询测试demo命令 */
- if(comGetChar(COM1,&ucData))
- {
- switch(ucData)
- {
- case '1':
- RunWaterLed(); /* 流水灯测试 */
- DispMenu();
- break;
-
- case '2':
- DemoSpiFlash(); /* SPI_flash测试demo */
- // printf("测试未添加\r\n");
- DispMenu();
- break;
-
- case '3':
- DemoFatFS_SpiFlash(); /* Fatfs测试demo */
- // printf("测试未添加\r\n");
- DispMenu();
- break;
-
- case '4':
- DemoFatFS_SDcard(); /* Fatfs测试demo */
- // printf("测试未添加\r\n");
- DispMenu();
- break;
-
- case '5':
- DemoEEPROM(); /* eeprom测试demo */
- DispMenu();
- break;
-
- case '6':
- // printf("\r\n跳转至系统BOOT");
- bsp_LedOn(2);
- JumpToBootloader();
- // DispMenu();
- break;
-
-
- default:
- DispMenu(); /* 无效命令,重新打印命令提示 */
- break;
- }
- }
- }
复制代码 目前测试,好像是跳转成功了,LED1没有亮,但是设备管理器上识别出来不是STM Bootloader, 用STM32CubeProg也连接不上,请问会是什么问题导致的呢?
|
|