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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版