开发者学堂课程【嵌入式之RFID开发与应用2020版:Zigbee自定义任务初始化】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/665/detail/11138
Zigbee自定义任务初始化
代码学习分析
这节课介绍代码,该代码比较完整。
首先,创建了一个任务即“my_Init”,该任务在 window-6OSAL_SampleApp.c(Project\...\Source)中,将原身的注释掉了,加入了自己的“my_Init”,其他的在讲 osl 时已经讲过了。在注册任务时,首先是串口初始化,因为在提供的资料里面有介绍如何去修改串口,不过官方提供的代码有一点问题是不能支持 printf,若想支持 printf,需要做一些简单的修改。官方提供的接口为“HaLARWrite”,其只能打印字符串,不能格式化输出,所以需要修改后即可使用 printf。这里 printf 还做了一些包装,将其包装成 debug,从而在调试信息时,可以知道是在哪一行输出的,比较人性化,非常有利于调试。
//任务初始
void my_Init( uint8 task id)
{
my_TaskID= task_id;
MT_UartInit();
//串口初始化
MT_UartRegisterTaskID(task_id)
;//登记任务号
/*GPIO初始化 */
P1DIR =(1<<0);
//P1_0定义为输出
P1DIR =(1<<1);
//P1_1定义为输出
P2INP &=~(1<<6)
;//打开上拉
LOCAL LED1 = SWITCH LED CLOSE;
LOCAL LED2 = SWITCH LED CLOSE;
P1INP &=~(1<<3);
P1SEL &=~((1<<0)|(1<<1)|(1<<3));
P1DIR=(1<<0)(1<<1)(1<<3);
SWITCH LED = SWITCH LED CLOSE;
另外,双串口有兴趣的可以自行查看,在初始化时加了一些东西,其是纯双串口基于裸机开发。因为这部分模块串口设计的有些问题,此处看一下底板就知道了,
比如上图调试差的 USB,该处用的为 P0 2/UARTO RX 串口0用到 CP2102的 USB 上面去 USB 转串,例如串口一个功能用于调试即 debug,但是对于协调器,应该还有一个串口用于网关通信,uart->gatway,要将数据通过串口、网关传送到 pc 或云端,但如果只有一个串口,该串口做了调试口就无法做网关的通讯接口。所以准备用另一个串口,该串口正好外面有4个帧没有焊,接口已引出,遗憾的是 p02、p03竟然和 CP2102中一模一样,即把同一个串口引到了不同的地方,所以 CC25xx_TOP_INTERFACE 中接口无法使用,若用还是刚刚的串口。还有一个串口在 DIP_2*5_2.54mm 中,该位置是接传感器的地方,意味着协调器必须将传感器去掉,才能够连接串口和三维机通信。
该模块黑色的线为 USB,手指位置是串口,两处用的是同一个串口,所以无法使用该串口。仅可使用传感器下的串口,需要将传感器拔掉。拔掉后只有核心板,该传感器已经被拔掉,从中单独接几根线接到电脑上去完成通信,所以会稍微麻烦一点,而且本身不支持第二个串口,也是需要稍微修改一下,让其支持第二个串口。以上是需要注意的几个地方,在原身的基础上做的一些修改。
接下来继续分析代码,以上是串口部分,登记任务号是为了保证将来能够将数据发到串口中。接下来是初始化了 LOCAL ,该处用到的 LOCAL 主要是三个。第一个是接电器 SWITCH_LED P1_3,其实就是一个 LOCAL,其通过底板可以看出它只是用到了 P1_3,而 P1_3是作为接电器的 L,要控制强电需要它来控制。除此之外,还有两个分别是 LOCAL_LED1 和 LOCAL_LED2,
P1_0 、P1_1是板上的两个 LED 灯。
#define SWITCH_LED P1_3
#define LOCAL_LED1 P1_0
#define LOCAL_LED2 P1_1
接下来看一下实物,手指位置为接电器,由 P1_3 控制的接电器。下方有两个灯即为 P1_0和 P1_1,两个灯直接可以看到,接电器可以外接,可以有常开常闭,也可以自己接外设,如灯、风扇灯均可。这是三个灯的介绍,要清楚是介绍什么的。
接下来对三个 LOCAL 都配置了输出,SWITCH_LED 是开关,不是 LED 的,其上面也有 LED,但主要是为了实现强电的控制。
P1INP &=~(1<<3);
P1SEL &=~((1<<0)|(1<<1)|(1<<3));
P1DIR=(1<<0)(1<<1)(1<<3);
SWITCH LED = SWITCH LED CLOSE;
下面是端点的初始化,需要 endPointDesc_t my_epDesc 印一个端点,然后对其端点号进行初始化,此处延用了官方提供的代码20,任务号为当前,描述信息如下(端点号、PROF、DEVICEID、版本),这些随便输入即可,没有什么要求,只要能够区分开,不超过里面最大长度即可。TRUE、命令等也是自己约定的,约定的是一组命令,比如实例的是两种情况,一个是 SAMPLEAPP_SENSOR_CLUSTERID,另一个是接电器的控制 SAMPLEAPP_CTRL_CLUSTERID。实际做产品应该写的更具体一些,比如表示温度、湿度等,会使命令列表更加的有针对性。节点创建好了后,还有性标的类型 noLatencyReqs 直接默认即可。接下来是注册,注册完了后,如果注册成功就会返回一个正确的结果,因为注册过程中就是将端点添加到链表当中,叫做 epList,后面讲解还会再提到。在向链表中添加时,有可能会去判断端点是否被注册过,如果被注册过,当然就会失败;如果端点没有问题,注册就会成功。结束后,还需设置地址,该地址实际上是自己的地址,自己设置即可,因为要给别人发数据,所以要将地址告诉他人,包括地址是多少、地址模式是什么(,Addr16Bit)。协调器是将地址默认为0,这就是初始化代码。初始化完了之后,紧接着要进入任务处理函数,即 my_ProcessEvent,该函数不会主动执行,它是因为四建而触发执行。
/*端点初始化 */
my_epDesc.endPoint=MY_ENDPOINT;
my_epDesc.task_id =&my_TaskID;
my_epDesc.simpleDes
c
=(SimpleDescriptionFormatt*&my_SimpleDesc; my_epDesc.latencyReq=noLatencyReqs;
if (afRegister(&myepDesc)== afstatus_INVALID_PARAMETER)
debug
("端点注册失败\n");
else
debug
("端点注册成功\n");
/*地址结构初始化 */
my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;
//点播
my_DstAddr.endPoint=MY_ENDPOINT;
my_DstAddr.addr.shortAddr = 0x0000;
//默认为协调器地址
}« end my_Init »