Nino 发表于 2016-6-3 14:22:53

任风吹吹 发表于 2016-6-3 10:55
对了,PC端的所有软件都是开源的。

不能及時使用自己寫的軟體更新->意思是產品已經售出在使用者手上, 我需要直接用軟體方式進行韌體更新, 所以這時MCU在APP區收到更新訊息, 需跳至IAP區做bootloader, 總不可能還用按按鍵的方式?

DFU可以做到這樣?

时光虫子 发表于 2016-6-3 15:41:24

你IAP是做跳转APP用的,你APP里面程序放在USB里面,你程序在APP里面跑,检测到USB升级了,把数据写到知道的一块FLASH里面,写入完成后,写一个标识,系统复位进入IAP,你IAP里面写一个读升级标识,如果有标识说明需要跳转APP,你直接映射就可以了,IAP里面完全不用使用USB

任风吹吹 发表于 2016-6-3 16:42:46

本帖最后由 任风吹吹 于 2016-6-3 17:37 编辑

Nino 发表于 2016-6-3 14:22
不能及時使用自己寫的軟體更新->意思是產品已經售出在使用者手上, 我需要直接用軟體方式進行韌體更新, 所 ...
你的这种需求完全是应用上的需求,与DFU没有关系,当然用DFU来做IAP来实现是完全可以的(目前我已经试验是可以的)。

我把我的思路说一下:
1 在IAP区
你完全可以用DFU的程序,或者串口IAP也罢,楼主写个全新的IAP程序也可以(只是个人感觉没有必要,有现成的为什么不用),这都没有关系,但这里最重要的是,IAP如何区分正常启动和从APP跳回来的启动? 针对两种不同的启动方式有不同的处理,前者则检查APP根据APP是否存在决定是否进入APP区,后者则进入IAP并等待升级。 这样的话就需要一个标志来区分这两种启动方式,我测试时时使用RCC下的CSR寄存器的SFTRSTF标志位,即在APP返回IAP时用软件复位的方式,这里只是检查软件复位标志来区分是何种启动,我使用的是STM32F407测试的,参考代码如下:
if(RCC->CSR & 0x10000000)
{
    RCC->CSR |=0x01000000;
    boot_flag =1;
}
else
{
    boot_flag =0;
}
if(0 ==boot_flag)
{
//检查APP区是否存在并决定是否进入APP
//...
}

//进入IAP
//...


IAP其他地方没有什么特殊的,就只是一个普通的IAP程序,串口IAP也好,DFU也罢,没任何关系。

2 在APP区
我使用的是0x0800C000地址

首先得修改工程确保如下两点:
ROM地址修改为0x0800C000
终端向量表地址修改为0x0800C000

其次,在源码文件system_stm32f4xx.c中找到 //对应F1的system_stm32f1xx.c文件
#define VECT_TAB_OFFSET0x0 一行
修改为:
#define VECT_TAB_OFFSET0xC000//即修改终端向量表的偏移寄存器,STM32F1xx也是有的,但STM32F0xx是没有此偏移寄存器的,得用代码来手动偏移


最后就是在收到出发信号后(入楼主你是用USB HID来触发?),进行软件复位。如:
//触发信号处理:
HAL_NVIC_SystemReset();

这样就可以了,我用DFU实现完全没有问题的。

任风吹吹 发表于 2016-6-3 16:51:03

本帖最后由 任风吹吹 于 2016-6-3 17:39 编辑

时光虫子 发表于 2016-6-3 15:41
你IAP是做跳转APP用的,你APP里面程序放在USB里面,你程序在APP里面跑,检测到USB升级了,把数据写到知道的 ...
是的,就是这样,这里就只需要一个IAP和APP都可以访问的升级标志而已,要么在备份域寄存器,要么在FLASH或外挂存储东东。 我使用的是软件复位,所以就用了软件复位标志来作为升级标志而已。
至于在IAP中是不是用USB没有任何关系,在APP中只是需要一个触发升级的信号而已,是不是用USB也没多大的关系,关键是要在实际产品中可以用的触发信号。

DFU只是一种通过USB进行升级的IAP并符合USB升级标准的程序,怎么使用的看使用者。

Nino 发表于 2016-6-6 16:06:38

任风吹吹 发表于 2016-6-3 16:51
是的,就是这样,这里就只需要一个IAP和APP都可以访问的升级标志而已,要么在备份域寄存器,要么在FLASH或 ...

謝謝您熱心的回應與幫助,我在這幾天已經完成我的線上韌體更新程序了,你們所說的我先前很早就寫進去了,我的問題其實很單純,就只是APP區與IAP區的跳轉USB重新列舉問題,我將每次跳轉前都重新reset USB裝置>等同於模擬手動插拔USB的動作,之後都能成功跳轉且USB都正常工作,總之謝謝你們的熱心回復^^

Nino 发表于 2016-6-6 16:08:39

任风吹吹 发表于 2016-6-3 16:42
你的这种需求完全是应用上的需求,与DFU没有关系,当然用DFU来做IAP来实现是完全可以的(目前我已经试验是 ...

沒錯關鍵就是要call這個程序->HAL_NVIC_SystemReset();
页: 1 [2]
查看完整版本: STM32f103xx USB HID做IAP功能