博士
最后登录1970-1-1
在线时间 小时
注册时间2020-5-11
|
本帖最后由 bg6agf 于 2020-5-13 09:44 编辑
没有村长的大宝剑,只好发点旧帖子骗积分摆脱小学生状态
十行代码搞定STM32IAP(不断电调用原厂ISP)
直接上代码
#define IapAdr 0x1FFFF000
typedef void (*pFunction)(void);
uint8_t JumpToApp(uint32_t Addr)
{
if ((((__IO uint32_t)Addr) & 0x2FFE0000 ) == 0x20000000)
{
__set_MSP((__IO uint32_t) Addr);
((pFunction) ((__IO uint32_t) (Addr + 4)))();
}
}
void isp_boot(void) // 开机直接调这个
{
if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET) //HAL库版
{
JumpToApp(IapAdr);
while(1);
}
RCC_ClearFlag();
}
void reset2isp(void) //想进ISP的时候掉调这个。
{
__set_FAULTMASK(1);
NVIC_SystemReset();
}
用法。在主程序开头 加一个isp-boot,应用中reset2isp 就直接进isp了。用官方isp软件即可
不能直接进ISP必须重启进。应该是因为外设设置初始化的问题,如果用的HAL库。直接 DEINIT 一下串口就可以直接跳转。复位重启进是为了解决环境复杂的问题
自动重启进入ISP下载并且复位运行程序
把下面保存为bat,根据你的情况调整运行环境。下位机即可自动复位进入ISP并且更新重启动运行 需要安装ST的 flash loader.(其实是需要里面的stmflashloader)
@echo off
cd D:\CODE\UD71\UD20OS
set /a StartS=%time:~6,2%
set /a StartM=%time:~3,2%
echo 开始时间:%time%
mode com4:115200
echo r >com4
“D:\Program Files (x86)\STMicroelectronics\Software\Flash Loader Demo\stmflashloader.exe” -c --pn 4 --br 115200 --db 8 --pr EVEN --sb 1 --ec OFF --to 1000 --co OFF -i STM32F1_High-density-value_512K -e --sec 60 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 -d --fn update.hex --v -r --a 8000000
set /a EndS=%time:~6,2%
set /a EndM=%time:~3,2%
echo 结束时间:%time%
set /a diffS_=%EndS%-%StartS%
set /a diffM_=%EndM%-%StartM%
if %diffS_% LSS 0 (
set /a diffS_=%diffS_%+60
set /a diffM_=%diffM_%-1
)
echo 程序运行时间: %diffM_%分钟%diffS_%秒
echo %DATE% %time% 消耗时间%diffM_%分钟%diffS_%秒>>.\isplog.txt
pause
不需要我解释了吧。?
|
|