你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32f103xx USB HID做IAP功能

[复制链接]
Nino 提问时间:2016-6-1 17:27 /
阅读主题, 点击返回1楼
收藏 评论15 发布时间:2016-6-1 17:27
15个回答
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测试的,参考代码如下:
  1.   if(RCC->CSR & 0x10000000)
  2.   {
  3.     RCC->CSR |=0x01000000;
  4.     boot_flag =1;
  5.   }
  6.   else
  7.   {
  8.     boot_flag =0;
  9.   }
  10. if(0 ==boot_flag)
  11. {
  12. //检查APP区是否存在并决定是否进入APP
  13. //...
  14. }

  15. //进入IAP
  16. //...
复制代码


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

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

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

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


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


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

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 很给力!

查看全部评分

任风吹吹 回答时间: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();
12

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版