zigbee从入门到砸开发板之CC2530(一)
文章目录
1. 初识zigbee
最小系统
VCC+VDD(CC2530背面)+去耦电容+偏置电阻
一般系统
最小系统+时钟电路+复位电路+精准时钟源+天线电路
仿真器条件
VCC+VDD+RESET+P2_1+P2_2
hello world
//点亮一个LED
#include <ioCC2530.h>
void main()
{
P1DIR = P1DIR|0x01;//设置输出模式
P1_0 = 0;
while(1);
}
2. IO口
一共有21个通用IO口,其中这21个分为3组P0\P1\P2(P0.0-P0.7 P1.0-P1.7 P2.0-P2.4)
两种工作状态:通用IO、片上外设控制
IO管理寄存器:
一组、共三个字节(默认为0)
0表示通用IO口,1表示片上外设,默认为0
P0SEL
P1SEL
P2SEL
注意:(P2.1 P2.2 用于程序写入,不作考虑)
P2SEL | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
对应IO | - | - | - | - | - | P2_4 | P2_3 | P2_0 |
通用IO口的输出模式控制寄存器:
(默认为0)
0表示输入,1表示输出
P0DIR
P1DIR
P2DIR
注意:
P2DIR | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
对应IO | - | - | - | P2_4 | P2_3 | P2_2 | P2_1 | P2_0 |
通用IO口的输入模式控制寄存器:
(默认为0)
0表示上下拉,1表示高阻态
P0INP
P1INP
P2INP
对于P2INP高三位:控制P012的上下拉:0上拉 1下拉
注意:
P2INP | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
对应IO | P2组 | P1组 | P0组 | P2_4 | P2_3 | P2_2 | P2_1 | P2_0 |
随心所欲控制IO的输入输出
- PxSEL配置IO功能(0:通用IO;1:外设IO),选择通用IO
- PxDIR配置IO方向(0:输入;1:输出)
- 输出
- Px_y = 0 、Px_y = 1
- 输入
- PxINP配置输入方式(0:上下拉、1:高阻态、P2INP高三位:0-上拉 1-下拉)
- if(Px_y == ?)
- 输出
3. 通用IO中断(外部中断)
概述
通用IO中断寄存器:
- 中断使能寄存器
- IENx
- PxIEN
- 中断状态标志寄存器
- PxIFG
- 中断控制寄存器
- PxCTL
中断使能寄存器
IEN0 | 7 | - | - | - | - | - | - | - |
---|---|---|---|---|---|---|---|---|
作用 | EA | - | - | - | - | - | - | - |
- EA = 1 :CPU开总中断
IEN1 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
作用 | - | - | P0IE | - | - | - | - | - |
- P0IE = 1 :P0 全部使能
IEN2 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
作用 | - | - | - | P1IE | - | - | P2IE | - |
- P1IE = 1 :P1 全部使能
- P2IE = 1 :P2 全部使能
PxIEN(x=0/1) | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
作用(对应控制每一个IO引脚) | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
P2IEN | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
作用 | - | - | - | 4 | 3 | 2 | 1 | 0 |
中断状态标志寄存器
PxIFG(x=0/1) | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
作用(对应标志每一个IO引脚) | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
P2IFG | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
作用 | - | - | - | 4 | 3 | 2 | 1 | 0 |
也可以用这种方式清空标志位(P0IF 、P1IF 共8位 P2IF共5位)
P0-P0IF
P1-P1IF
P2-P2IF
中断控制寄存器
PICTL | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
作用 | - | - | - | - | P2ICON | P1ICONH | P1ICONL | P0ICON |
0:上升沿引起中断
1:下降沿引起中断
P2ICON:P2_0~P2_4
P1ICONH:P1高四位
P1ICONL: P1低四位
P0ICON: P0
随心所欲控制IO中断
-
配置IO状态
通用IO+输入+上拉
-
开总中断
EA=1
-
开组中断
IENx
-
开指定引脚中断
PxIEN
-
设置中断触发方式
PICTL
-
设计中断服务程序
声明中断向量入口
设计子程序
清空标志位
实例
#include <ioCC2530.h>
//通过按键S5(P05),切换LED灯的状态(P10)
void delay()
{
int i,j;
for(i=0;i<1000;i++)
for(j=0;j<30;j++);
}
void main()
{
P0SEL &= 0xdf; //1101 1111 //设置通用IO
P0DIR &= 0xdf; //设置为输入
P0INP &= 0xdf; //设置为上下拉
P2INP &= 0xdf; //设置为上拉
EA = 1;//开总中断
P0IE = 1;//开P0中断//P2IE 不能位寻址
P0IEN |= 0x20;//0010 0000 //开P0_5中断
PICTL |= 0x01; //0000 0001 //设置P0触发方式为下降沿
P1SEL &= 0xfe; //1101 1111 //设置P1通用IO
P1DIR |= 0x01;//0000 0001 //设置P1为输出
while(1);
}
#pragma vector=P0INT_VECTOR//声明中断向量为P0INT
__interrupt void function()
{
//判断是否是P0中的5引脚触发的中断
if(P0IFG &= 0x20)//0010 0000
{
//P0_5触发中断
delay();
if(P0_5 == 0){
P1_0 ^= 1;
}
}
P0IFG = 0;
P0IF = 0;//清零中断标志位
}