|
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
- #ifdef USB_IRQn
- void USB_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler")));
- #endif
- ...
- #ifdef USB_IRQn
- (void*) USB_Handler, /* 7 Universal Serial Bus */
- #else
- (void*) (0UL), /* Reserved */
- #endif
复制代码
ASF 3.22
- #ifdef ID_USB
- void USB_Handler ( void ) __attribute__ ((weak, alias("Dummy_Handler")));
- #endif
- ...
- #ifdef ID_USB
- (void*) USB_Handler, /* 7 Universal Serial Bus */
- #else
- (void*) (0UL), /* Reserved */
- #endif
复制代码
可以看到最主要就是将USB_IRQn变为了ID_USB。而USB_IRQn和ID_USB都是在samr21g18a.h中定义的:
USB_IRQn
- /** Interrupt Number Definition */
- typedef enum IRQn
- {
- /****** Cortex-M0+ Processor Exceptions Numbers ******************************/
- NonMaskableInt_IRQn = -14,/**< 2 Non Maskable Interrupt */
- HardFault_IRQn = -13,/**< 3 Cortex-M0+ Hard Fault Interrupt */
- SVCall_IRQn = -5, /**< 11 Cortex-M0+ SV Call Interrupt */
- PendSV_IRQn = -2, /**< 14 Cortex-M0+ Pend SV Interrupt */
- SysTick_IRQn = -1, /**< 15 Cortex-M0+ System Tick Interrupt */
- /****** SAMR21G18A-specific Interrupt Numbers ***********************/
- PM_IRQn = 0, /**< 0 SAMR21G18A Power Manager (PM) */
- SYSCTRL_IRQn = 1, /**< 1 SAMR21G18A System Control (SYSCTRL) */
- WDT_IRQn = 2, /**< 2 SAMR21G18A Watchdog Timer (WDT) */
- RTC_IRQn = 3, /**< 3 SAMR21G18A Real-Time Counter (RTC) */
- EIC_IRQn = 4, /**< 4 SAMR21G18A External Interrupt Controller (EIC) */
- NVMCTRL_IRQn = 5, /**< 5 SAMR21G18A Non-Volatile Memory Controller (NVMCTRL) */
- DMAC_IRQn = 6, /**< 6 SAMR21G18A Direct Memory Access Controller (DMAC) */
- USB_IRQn = 7, /**< 7 SAMR21G18A Universal Serial Bus (USB) */
- EVSYS_IRQn = 8, /**< 8 SAMR21G18A Event System Interface (EVSYS) */
- ...
- } IRQn_Type;
复制代码
ID_USB
- // Peripheral instances on HPB1 bridge
- #define ID_PAC1 32 /**< \brief Peripheral Access Controller 1 (PAC1) */
- #define ID_DSU 33 /**< \brief Device Service Unit (DSU) */
- #define ID_NVMCTRL 34 /**< \brief Non-Volatile Memory Controller (NVMCTRL) */
- #define ID_PORT 35 /**< \brief Port Module (PORT) */
- #define ID_DMAC 36 /**< \brief Direct Memory Access Controller (DMAC) */
- #define ID_USB 37 /**< \brief Universal Serial Bus (USB) */
- #define ID_MTB 38 /**< \brief Cortex-M0+ Micro-Trace Buffer (MTB) */
- #define ID_SBMATRIX 39 /**< \brief HSB Matrix (SBMATRIX) */
复制代码
看起来这个bug更多的像是ATMEL工程师的一个笔误造成的。可能因为是低级错误,所以不好意思说出来,也可以省下一个奖励了。
为了方便大家分析,我把两个版本的例程上传。
|
|