【SAM R21 Xplained】无线部分初探

作者: 枫飞
上传时间为: 2015-03-10 03:09 PM

打算从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提供的开发样板,给了我这次使用机会,非常感谢!

全部评论 ()

创建讨论帖子

登录 后参与评论
系统提示