CC2530

CC2530是针对IEEE 802.15.4,Zigbee和RF4CE应用的真正片上系统(SoC)解决方案。 它能够以非常低的总物料成本构建强大的网络节点。 CC2530将领先的射频收发器的卓越性能与业界标准增强型8051 MCU,系统内可编程闪存,8 KB RAM以及许多其他强大功能相结合。 CC2530有四种不同的闪存版本:分别为CC2530F32 / 64/128/256对应32/64/128/256 KB的闪存。 CC2530具有多种工作模式,非常适合需要超低功耗的系统。 运行模式之间的短暂转换时间进一步确保了低能耗。

•CC2530是TI公司推出的用来实现嵌入式ZigBee应用的低功耗片上系统。

•在单个芯片上整合了ZigBee 射频(RF)前端、内存和微控制器。

•8 位MCU(增强型、标准8051指令集)。

•256 KB Flash和8 KB 的RAM,内部16MHz RC 和 32kHz RC 振荡器。

•8路12位ADC;18个中断源;4个Timer;硬件支持的AES128 ;WDT(1.9ms-1s);32 kHz晶振的休眠模式定时器、POR(上电复位)、BOD(掉电检测),以及21 个通用I/O 。

GPIO

简介

img

I / O端口具有以下主要功能:

  • 21个数字通用输入/输出引脚
  • 通用I / O或外设I / O
  • 输入上拉或下拉功能
  • 外部中断功能

所有21个I / O引脚都具有外部中断功能。 因此,如果需要,外部设备可能会产生中断。 外部中断功能也可用于将器件从睡眠模式(电源模式PM1,PM2和PM3)中唤醒

通用IO:共21个,分成3组,P0组、P1组、P2组,其中P0\P1组各8个IO,P2组5个(P2_0、P2_1、 P2_2、P2_3、 P2_4)。其中P1_0、P1_1有20mA的输出驱动能力,其余的只有4mA。

寄存器

  1. GPIO功能选择寄存器——PxSEL

    寄存器PxSEL(其中x是端口号0-2)用于将端口中的每个引脚配置为通用I/O引脚外设I/O引脚,可位寻址。 默认情况下,复位后,所有数字输入/输出引脚都配置为通用上拉输入引脚

    其中,P2SEL只有第0位至第2位是端口2的功能选择控制位,第3位至第6位是端口1的外设优先级控制位。

  • 0=通用
  • 1=外设I/O
  1. GPIO输入输出方向选择寄存器——PxDIR

    寄存器PxDIR用于将每个端口的引脚方向设置为输入方向输出方向。 因此,将PxDIR中的相应位设置为1,相应的引脚就变成输出方向,可位寻址。复位后为输入引脚

    其中,P2DIR只有第0位至第4位是端口2的方向选择控制位,第6位和第7位是端口0外设优先级控制位。

  • 0=输入

  • 1=输出

  1. GPIO输入模式寄存器——PxINP

    寄存器PxINP用于设置IO端口的输入模式,通用I / O端口引脚可配置为具有上拉下拉三态操作模式。 默认情况下,复位后,输入配置为带有上拉的输入。如果要取消输入端口的上拉或下拉功能,必须将PxINP中的相应位设置为1。

    • 请注意,即使IO端口是外设功能输入,配置为外设I / O信号的引脚也不具有上拉或下拉功能。

    其中,P2INP中,第0位至第4位是端口2的输入模式选择位

    第5位至第7位是端口0、端口1、端口2的上下拉选择位。

    • 0=PullUp
    • 1=PullDown
  • 0=上拉或下拉
  • 1=三态

Z-Stack

创建一个任务 Create Task

  • // 任务列表
    const pTaskEventHandlerFn tasksArr[] = {…..}
  • // 初始化任务
    void osalInitTasks( void )
    {…..}
  • // 任务处理函数
    uint16 Hello_ProcessEvent(uint8 task_id, uint16 events)
    {…}

HAL库之LED

  1. uint8 HalLedSet (uint8 leds, uint8 mode)
ModeName作用
HAL_LED_MODE_BLINK闪烁 (一次)
HAL_LED_MODE_FLASH闪烁
HAL_LED_MODE_ON
HAL_LED_MODE_OFF
HAL_LED_MODE_TOGGLE触发

定时器

  1. uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value )

    1
    2
    3
    //为指定的任务设置定时器

    osal_start_timerEx(task_id, 0x0001, 10000);

PAN_ID

  • 全称 Personal Area Network (网络标识符)

  • 相当于网络号,网段。

Tools\f8Config.cfg Line59

1
2
3
4
5
6
7
/* Define the default PAN ID.
*
* Setting this to a value other than 0xFFFF causes
* ZDO_COORD to use this value as its PAN ID and
* Routers and end devices to join PAN with this ID
*/
-DZDAPP_CONFIG_PAN_ID=0x0010

Z-Stack开发步骤

功能类型定义

1
2
3
4
5
6
7
// 功能类型值定义
enum {
DevTemp = 1,
DevHumm,
//略---------------------
DevMaxNum
};

枚举功能类型值,需要时添加即可。

定义节点功能列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/***************************************************/
/* 节点功能列表 */
/***************************************************/
struct ep_info_t funcList[] = {
#if defined(HAS_GAS)
{
//stat,income,timeout,resource
NULL, NULL, sensorGasTimeout, sensorGasResAvailable,
{ DevGas, 0, 3 }, // type, id, refresh cycle
},
#endif
//略----------------
#if defined(ZDO_COORDINATOR)
{ // 协调器
CoordinatorNwkStateChangeRoutine,
CoordinatorIncomingRoutine,
CoordinatorTimeoutRoutine,
CoordinatorResAvailableRoutine,
{ DevCoordinator, 0, 0 },
},
#elif defined(RTR_NWK)
{ // 路由器
RouterNwkStateChangeRoutine,
RouterIncomingRoutine,
RouterTimeoutRoutine,
RouterResAvailableRoutine,
{ DevRouter, 0, 30 },
},
#endif
};
  • 功能列表

  • 参考下面的 ep_info_t

    1
    2
    3
    4
    5
    // 不能修改下面的内容!!!
    const uint8 funcCount = sizeof(funcList) / sizeof(funcList[0]);
    #endif


  • 功能数量

ep_info_t

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
struct ep_info_t {
// 网络状态发生变化时会调用该函数
void (*nwk_stat_change)(struct ep_info_t *ep);
// 接收到数据时会调用该函数
void (*incoming_data)(struct ep_info_t *ep, uint16 addr, uint8 endPoint, afMSGCommandFormat_t *msg);
// 周期性调用的函数
void (*time_out)(struct ep_info_t *ep);
// 系统资源可用时调用该函数,系统资源指的是:串口接收到数据/中断等等
void (*res_available)(struct ep_info_t *ep, RES_TYPE type, void *res);
// NOTE: cycle成员会被用来计数,并周期性调用time_out函数
struct func_info_t function;

//以下数据用户不能进行更改!!!!!

// 当前端点号
uint8 ep;
// 与此端点绑定的任务ID
uint8 task_id;
// 递减计数,为0时调用time_out函数,并重载初值=cycle
uint8 timerTick;
uint8 userTimer;
endPointDesc_t SampleApp_epDesc;
SimpleDescriptionFormat_t simpleDesc;
};

//一个典型的初始化
#if defined(ZDO_COORDINATOR)
{ // 协调器
CoordinatorNwkStateChangeRoutine,//节点加入网络完成后调用
CoordinatorIncomingRoutine,//端点接收到数据后会调用
CoordinatorTimeoutRoutine,//周期调用
CoordinatorResAvailableRoutine,//系统初始化、串口收到数据、用户定时器到时 会调用
{ DevCoordinator, 0, 0 },//功能类型、功能编号、刷新周期
},

nwk_stat_change

节点加入网络完成后调用

  • 可用于读取当前 端点 信息
1
2
3
4
5
6
void xxNwkStateChange(struct ep_info_t *ep)

void sensorVoiceNwkStateChange(struct ep_info_t *ep)
{
voiceEndPoint = ep;
}

incoming_data

端点接收到数据后会调用

  • 下发的指令的处理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void xxReceiveData(struct ep_info_t *ep, uint16 addr, uint8 endPoint, afMSGCommandFormat_t *msg)

void testReceiveData(struct ep_info_t *ep, uint16 addr, uint8 endPoint, afMSGCommandFormat_t *msg)
{
//msg->Data[0] 是接受到的总 比特 数
if( (msg->Data[1]=='L')&&(msg->Data[2]=='E')&&(msg->Data[3]=='D') )
{
if( msg->Data[4]=='1' )
{
HalUARTWrite(HAL_UART_PORT_0, "LED_1\r\n", sizeof("LED_1\r\n") - 1);
//HalLedBlink(HAL_LED_1, 2, 50, 100);
}
}
}

time_out

周期调用

  • 读取传感器数据
1
2
3
4
5
6
7
8
void xxTimeout(struct ep_info_t *ep)


void sensorFireTimeout(struct ep_info_t *ep)
{
uint8 value = FireInfo();
SendData(ep->ep, &value, 0x0000, TRANSFER_ENDPOINT, sizeof(value));
}

res_available

系统初始化、串口收到数据、用户定时器到时 会调用

  • 初始化端口、
1
2
3
4
5
6
7
8
9
void xxResAvailable(struct ep_info_t *ep, RES_TYPE type, void *res)

void sensorRainResAvailable(struct ep_info_t *ep, RES_TYPE type, void *res)
{
if(type == ResInit)
{
RainInit();
}
}

IAR学习笔记

无法观察局部变量

在软件调试的时候发现Watch窗口中无法观察局部变量的值,总是显示
  设置IAR中的”Options — c/c++ compiler — Optimization — Level“ 选项:
  Level的缺省值为Low,当我把Level选为None之后,即不执行任何优化时,全局变量、静态局部变量、局部变量的值都可以看到。


CC2530
https://www.oikiou.top/2018/8d6db935/
作者
Oikiou
发布于
2018年2月11日
许可协议