回答

收藏

【SAM R21 Xplained】无线部分初探

#其他 #其他 1497 人阅读 | 0 人回复 | 2015-03-10

打算从WsnDemo这个简单点的工程入手展开研究。

具体步骤就不说了,跟其他的工程一样,唯一比较让我惊讶的,这个工程编译时间好长呀

不停的编译,持续了好一会,我都要开始怀疑是不是哪出问题了,编译成功了

两块板子烧写程序的区别主要在config.h文件
#if APP_ADDR == 0#define APP_CAPTION     "Coordinator"#define APP_NODE_TYPE   0#define APP_COORDINATOR 1#define APP_ROUTER      0#define APP_ENDDEVICE   0#elif APP_ADDR < 0x8000#define APP_CAPTION     "Router"#define APP_NODE_TYPE   1#define APP_COORDINATOR 0#define APP_ROUTER      1#define APP_ENDDEVICE   0#else#define APP_CAPTION     "End Device"#define APP_NODE_TYPE   2#define APP_COORDINATOR 0#define APP_ROUTER      0#define APP_ENDDEVICE   1#endif由这段代码可知判断板子所属的角色主要是通过 设定的APP_ADDR,这在config.h的开头部分修改
#define APP_ADDR                0x0000#define APP_PANID               0x1234#define APP_SENDING_INTERVAL    2000#define APP_ENDPOINT            1#define APP_SECURITY_KEY        "TestSecurityKey0"#define APP_ADDR                0x9000#define APP_PANID               0x1234#define APP_SENDING_INTERVAL    2000#define APP_ENDPOINT            1#define APP_SECURITY_KEY        "TestSecurityKey0"我就改了下APP_ADDR,然后分别下载程序到两块板子中。两块板子分别接在笔记本的两个usb端口上。
这现象怎么说呢,作为End Device的板子的led每闪一次,作为Coordinator板子的led状态就改变一次,可以看出End Device板子控制Coordinator板子led的亮灭。现象还是很明显。
看下具体程序
int main(void){        #if SAMD || SAMR21        system_init();        delay_init();        #else        sysclk_init();        board_init();        #endif        irq_initialize_vectors();        wsndemo_main();}<br>这是主函数,总体上看还是比较清晰的。
个人觉得SAMR21的判断就蛮有特色的,其他厂家的芯片上就没见过这种表示,一步步切进去看了下
/** SAMR21 Family */#define SAMR21 (SAMR21G || SAMR21E)/** * \name SAMR21 series * @{ */#define SAMR21G ( \                SAM_PART_IS_DEFINED(SAMR21G16A) || \                SAM_PART_IS_DEFINED(SAMR21G17A) || \                SAM_PART_IS_DEFINED(SAMR21G18A) \        )#define SAMR21E ( \                SAM_PART_IS_DEFINED(SAMR21E16A) || \                SAM_PART_IS_DEFINED(SAMR21E17A) || \                SAM_PART_IS_DEFINED(SAMR21E18A) \        )/** * \name Convenience macros for part checking * @{ *//* ! Check GCC and IAR part definition for 8-bit AVR */#define AVR8_PART_IS_DEFINED(part) \/* ! Check GCC and IAR part definition for 32-bit AVR */#define AVR32_PART_IS_DEFINED(part) \        (defined(__AT32 ## part ## __) || defined(__AVR32_ ## part ## __))/* ! Check GCC and IAR part definition for SAM */#define SAM_PART_IS_DEFINED(part) (defined(__ ## part ## __))/** @} */切到这就切不下去了,似乎是GCC和IAR编译器关于SAM的一种用法,具体的原理等我有时间研究下在附上。
扯远了,再回到主函数
system_init();        delay_init();这是常见的初始化操作,不用说了
irq_initialize_vectors();这个函数是干嘛的?
/** * \brief Initialize interrupt vectors * * For NVIC the interrupt vectors are put in vector table. So nothing * to do to initialize them, except defined the vector function with * right name. * * This must be called prior to \ref irq_register_handler. */#  define irq_initialize_vectors()   \        do {                             \        } while(0)有这边注释可知是中断这边得有的
int wsndemo_main(void){        SYS_Init();#if APP_ENDDEVICE        sm_init();#endif#if APP_COORDINATOR        sio2host_init();#endif        cpu_irq_enable();        while (1) {                SYS_TaskHandler();                APP_TaskHandler();        }}这便是无线通信的精华了,得好好研究研究。
不早了,明天再重点研究这块的使用,大家晚安啦!
最后,感谢EEWORLD提供的开发样板,给了我这次使用机会,非常感谢!
关注下面的标签,发现更多相似文章
分享到:
回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条