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

STM32f103xx USB HID做IAP功能

[复制链接]
Nino 提问时间:2016-6-1 17:27 /
小弟最近遇到很頭痛的問題,
從IAP區跳轉至APP區USB通訊都正常,
但是當從APP區跳轉回IAP區時,USB列舉卻失敗,導致IAP區無法做USB通訊,也有試過IAP區不初始化USB,但中斷卻無效,
我很確定的是我IAP區與APP區都有重新設置RCC跟NVIC中斷向量
在IAP區的NVIC是NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);在APP區的NVIC是NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000);在APP區中的options IROM1我也有改成0x8004000,
跳轉到IAP區就是沒辦法做USB通訊,請問各位大大是甚麼問題啊???????????




kkkkkkkkmmmmmm.jpg
收藏 评论15 发布时间:2016-6-1 17:27

举报

15个回答
任风吹吹 回答时间: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升级标准的程序,怎么使用的看使用者。
任风吹吹 回答时间: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 很给力!

查看全部评分

shanji 回答时间:2016-6-3 09:44:05
用过ST的DFU,就知道多难用了。
任风吹吹 回答时间:2016-6-2 17:22:57
我不明白的是,ST官方给的USB示例里边,不是有个DFU的例子吗? 就是用来USB升级的,当做IAP。
你为什么还自己使用HID写个,多费神。。再官方给的例子上改下就变成自己需要的了。
xmshao 回答时间:2016-6-2 14:26:19
那你意思是说IAP和APP里各有相应的USB服务程序?
Nino 回答时间:2016-6-3 09:35:27
xmshao 发表于 2016-6-2 14:26
那你意思是说IAP和APP里各有相应的USB服务程序?

是的, IAP與APP裡都各有USB服務程序,但功能是一樣的,還是我只需要在一區使用USB服務程序就好?
Nino 回答时间:2016-6-3 09:51:53
shanji 发表于 2016-6-3 09:44
用过ST的DFU,就知道多难用了。

沒錯, 還是自己寫IAP比較快,因我是做產品需要在軟體上即時做韌體更新, 跟DFU差很多
Nino 回答时间:2016-6-3 09:53:17
任风吹吹 发表于 2016-6-2 17:22
我不明白的是,ST官方给的USB示例里边,不是有个DFU的例子吗? 就是用来USB升级的,当做IAP。
你为什么还自 ...

大大, 需求不一樣啊, DFU一定要用他自己的協議還有他自己的檔案格式,又不能及時使用自己寫的軟體做更新, 請問不自己用HID寫IAP要怎麼做??
任风吹吹 回答时间:2016-6-3 10:31:30
"不能及時使用自己寫的軟體做更新", 不明白这句话。

使用DFU可以将自己生成的HEX,BIN,S19格式的文件,官方有提供一个转化工具可以转化为DFU格式,就可以升级了,随时可以把自己的软件生成的烧录文件烧录到到MCU内。

且DFU做IAP的代码是开源的,自己可以做随意修改和二次开发。至于DFU的类定义,这也是遵循USB标准类定义0xFE,0x01,可以到usb.org官网上查看。通讯协议代码为0x02,DFU mode protocol也是标准的,usb.org官网上可以查看,给个链接吧:http://www.usb.org/developers/docs/devclass_docs/DFU_1.1.pdf

但话说,是什么通讯协议重要么?

总而言之,使用DFU的IAP是对于固件升级是完全可以满足的,且开源,只不过你对其不够了解罢了。
任风吹吹 回答时间:2016-6-3 10:55:31
对了,PC端的所有软件都是开源的。
dfu.png
xmshao 回答时间:2016-6-3 11:35:32
Nino 发表于 2016-6-3 09:35
是的, IAP與APP裡都各有USB服務程序,但功能是一樣的,還是我只需要在一區使用USB服務程序就好? ...

这个要看你的需求。
问题应该出在从APP到IAP跳转那个地方。
12下一页

所属标签

相似问题

官网相关资源

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