3315|4

1万

帖子

25

TA的资源

版主

楼主
 

ASF 3.22修正了SAM R21的USB bug [复制链接]

本帖最后由 dcexpert 于 2015-4-2 23:59 编辑

上周看到ASF升级到了3.22,就想到再试试SAM R21上的USB功能是否修复了。因为参加SAM R21活动时,ASF还是3.21,在学习过程中发现使用ASF的USB功能出现错误,官方例程出现USB设备无法识别的情况。后来经过仔细检查,确认是ASF 3.21自身的一个bug。

https://bbs.eeworld.com.cn/thread-455138-1-1.html

这次升级后,在升级说明中也没有看到任何相关说明,不知道这个bug是否被修正了。于是新建了一个USB例程进行测试,发现USB功能果然正常了,USB设备可以被正常识别。这个例程是ASF中的HID Mouse Example,运行后,如果按下SW0键,屏幕上的鼠标光标就会自动上移。



既然bug修复了,我们就可以去看看这次ASF是做了哪些改进,分析一下。上次发现出问题的文件有两个,分别是:

  • ASF\sam0\utils\cmsis\samr21\include\samr21g18a.h
  • ASF\sam0\utils\cmsis\samr21\source\gcc\startup_samr21.c

所以这次也只需要重点看看这两个文件的变化。用文件比较工具查找新旧文件的差异,就可以很快看到不同,主要变化在startup_samr21.c文件中,文件samr21g18a.h基本无变化。为了简洁,下面只显示和USB相关的部分。

startup_samr21.c
ASF 3.21
  1. #ifdef USB_IRQn
  2. void USB_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler")));
  3. #endif

  4. ...

  5. #ifdef USB_IRQn
  6.         (void*) USB_Handler,            /*  7 Universal Serial Bus */
  7. #else
  8.         (void*) (0UL), /* Reserved */
  9. #endif
复制代码

ASF 3.22
  1. #ifdef ID_USB
  2. void USB_Handler             ( void ) __attribute__ ((weak, alias("Dummy_Handler")));
  3. #endif

  4. ...

  5. #ifdef ID_USB
  6.         (void*) USB_Handler,            /*  7 Universal Serial Bus */
  7. #else
  8.         (void*) (0UL), /* Reserved */
  9. #endif
复制代码

可以看到最主要就是将USB_IRQn变为了ID_USB。而USB_IRQn和ID_USB都是在samr21g18a.h中定义的:

USB_IRQn
  1. /** Interrupt Number Definition */
  2. typedef enum IRQn
  3. {
  4.   /******  Cortex-M0+ Processor Exceptions Numbers ******************************/
  5.   NonMaskableInt_IRQn      = -14,/**<  2 Non Maskable Interrupt                 */
  6.   HardFault_IRQn           = -13,/**<  3 Cortex-M0+ Hard Fault Interrupt        */
  7.   SVCall_IRQn              = -5, /**< 11 Cortex-M0+ SV Call Interrupt           */
  8.   PendSV_IRQn              = -2, /**< 14 Cortex-M0+ Pend SV Interrupt           */
  9.   SysTick_IRQn             = -1, /**< 15 Cortex-M0+ System Tick Interrupt       */
  10.   /******  SAMR21G18A-specific Interrupt Numbers ***********************/
  11.   PM_IRQn                  =  0, /**<  0 SAMR21G18A Power Manager (PM) */
  12.   SYSCTRL_IRQn             =  1, /**<  1 SAMR21G18A System Control (SYSCTRL) */
  13.   WDT_IRQn                 =  2, /**<  2 SAMR21G18A Watchdog Timer (WDT) */
  14.   RTC_IRQn                 =  3, /**<  3 SAMR21G18A Real-Time Counter (RTC) */
  15.   EIC_IRQn                 =  4, /**<  4 SAMR21G18A External Interrupt Controller (EIC) */
  16.   NVMCTRL_IRQn             =  5, /**<  5 SAMR21G18A Non-Volatile Memory Controller (NVMCTRL) */
  17.   DMAC_IRQn                =  6, /**<  6 SAMR21G18A Direct Memory Access Controller (DMAC) */
  18.   USB_IRQn                 =  7, /**<  7 SAMR21G18A Universal Serial Bus (USB) */
  19.   EVSYS_IRQn               =  8, /**<  8 SAMR21G18A Event System Interface (EVSYS) */

  20. ...

  21. } IRQn_Type;
复制代码

ID_USB
  1. // Peripheral instances on HPB1 bridge
  2. #define ID_PAC1          32 /**< \brief Peripheral Access Controller 1 (PAC1) */
  3. #define ID_DSU           33 /**< \brief Device Service Unit (DSU) */
  4. #define ID_NVMCTRL       34 /**< \brief Non-Volatile Memory Controller (NVMCTRL) */
  5. #define ID_PORT          35 /**< \brief Port Module (PORT) */
  6. #define ID_DMAC          36 /**< \brief Direct Memory Access Controller (DMAC) */
  7. #define ID_USB           37 /**< \brief Universal Serial Bus (USB) */
  8. #define ID_MTB           38 /**< \brief Cortex-M0+ Micro-Trace Buffer (MTB) */
  9. #define ID_SBMATRIX      39 /**< \brief HSB Matrix (SBMATRIX) */
复制代码

看起来这个bug更多的像是ATMEL工程师的一个笔误造成的。可能因为是低级错误,所以不好意思说出来,也可以省下一个奖励了。


为了方便大家分析,我把两个版本的例程上传。

  • MOUSE_EXAMPLE1.7Z (634.14 KB, 下载次数: 0) - ASF3.22
  • MOUSE_EXAMPLE2.7Z (633.29 KB, 下载次数: 0) - ASF3.21

















最新回复

这微妙区别都能找出来  详情 回复 发表于 2015-4-15 18:59
点赞 关注
 

回复
举报

1071

帖子

7

TA的资源

纯净的硅(中级)

沙发
 
楼主幸苦了,期待楼主的更多经验分享
 
 
 

回复

1891

帖子

2

TA的资源

纯净的硅(中级)

板凳
 
哇。。。。。
。nice
感谢楼主
 
个人签名
分享铸就美好未来。。。




 
 

回复

524

帖子

0

TA的资源

一粒金砂(高级)

4
 
呀,升级了,我回去试试,之前usb那块莫名其妙的问题看看解决没
 
 
 

回复

44

帖子

0

TA的资源

一粒金砂(中级)

5
 
这微妙区别都能找出来
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表