»
(008) CubeIDE Implementation of USB Peripherals*
(018) C99 pointer*
(019) C99 With only value assignment*
(022) POSIX pthread multi-threads mutex*
(023) POSIX pthread multi-threads programming*
(027) C99 time and wait*
(028) High-precision calculation with GMP*
(029) Web Service Lib*
(030) International Components for Unicode (ICU)*
(031) Performance of C is higher than C++, because...*
(050) Load new firmware online
STM32实现热加载新固件的关键:修改MSP主栈指针(代码开始地址指针)指向的地址,让芯片运行新地址的程序:MSP主栈地址+4 也就是: 1、禁止所有中断请求: __disable_irq(); 2、关闭系统滴答: SysTick->CTRL = 0; SysTick->LOAD = 0; SysTick->VAL = 0; 3、使用芯片内部时钟HSI: HAL_RCC_DeInit(); 4、设置用于C语言调用的启动入口函数 void (NewSysBootFunction*)(void);//声明函数指针变量 NewSysBootFunction=(void (*)(void))(*(volatile uint32_t *) (NewFirmwareAddr + 4));//函数指针变量指向新固件程序入口地址 5、修改主程序栈指针(程序开始地址)MSP为NewFirmwareAddr volatile uint32_t NewFirmwareAddr = 0x08 FFFF 0000 __set_MSP(NewFirmwareAddr);//需要include头文件:cmsis_os.h,如果不使用OS,可以参考cmsis_os.h中的汇编代码 6、进入RTOS特权模式 __set_CONTROL(0); 7、设置新的中断向量表 SCB->VTOR=NewFirmwareAddr; 8、调用程序入口函数 NewSysBootFunction();