物联网实训开发-指导书 - 图文

更新时间:2024-01-29 21:46:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

物联网实训开发

2012年12月

CC2530 基础实验

6.1 CC2530简介

6.1. 1 CC2530概述

图1-1 的方块图列出了CC2530的内部构造模块。

1.1 CPU和存储器

CC2530芯片中使用的是8051CPU核心是一个单周期的8051兼容核心。它有3个不同的存储器访问总线(特殊功能寄存器SFR、数据DATA和代码/外部数据CORE/XDATA),单周期访问SFR,DATA和主SRAM,它还包含一个调试接口和扩展的18路输入中断单元。

中断控制器共有18个中断源,分为6个中断组,每个中断组赋值为4个中断优先级之一。当该设备处于空闲模式,任何的中断可以把CC2530恢复到主动模式。某些中断还可以将设备从睡眠模式(功耗模式1-3)唤醒。

存储器交叉开关/仲裁是位于系统核心,它通过SFR总线将CPU和DMA控制器与物理存储器和所有的外接设备连接起来。存储器仲裁有4个存储器访问点,访问可以被映射到3个物理存储器中的一个:1个8KB SRAM,Flash存储器和XREG/SFR存储器。存储器仲裁负责访问到一个物理存储器的同步存储器访问进行仲裁和排序。

8KB SRAM映射到数据存储空间和部分外部数据存储空间。8KB SRAM是一个超低功耗的SRAM,甚至当数字部分掉电后(功耗模式2和3)它也能保持它的数据。对于低功耗应用,这是一个很重要的特性。

1.2 时钟和电源管理

数字内核和外部设备由一个1.8V低差稳压供电。它提供了电源管理功能,可以实现使用不同的功耗模式以达到低功耗运行,来延长电池寿命。复位设备有5种不同的复位电源。

1.3 外部设备

CC2530包括许多不同的外部设备,使得应用程序开发者可以进行高级应用程序开发。

调试接口实现了一个专用的两线串行接口来进行调试。通过调试接口可以对Flash存储器进行全片擦除,控制启动哪一个振荡器,停止和开始执行用户程序,在8051内核上执行供电指示,设置代码断点,在代码中通过指令进行单步调试。利用这些特性可以完美的实现在电路调试和外部Flash编程。

CC2530包含用于存储程序代码的Flash存储器。通过调试接口用软件可以对Flash存储器进行编程。Flash控制器处理对嵌入式Flash存储器的写和擦除。Flash 控制器允许页擦除和4字节擦除。

I/O控制器负责所有通用I/O引脚。CPU可以配置某些引脚是否外部设备模块控制、由软件控制每个引脚的输入和输出,每个引脚上单独使能CPU中断。每个连接到I/O引脚的外部设备可以在两种不同的I/O引脚位置进行选择以确保在各种应用中的灵活性。

系统能有一个通用的5通道的DMA控制器,并且使用外部数据存储器空间来访问存储器,因此可以访问所有物理存储器。每个通道可以在存储器的任何位置用DMA描述来配置(触发、优先顺序、传输模式、寻址方式、源指针和目的指针、传输计数)。很多硬件外接设备(AES核心、Flash控制器、USART、定时器、ADC接口)依靠DMA控制器在SFR或XREG

地址和Flash/SRAM之间的数据传输来有效运行。

定时器1是一个16位的定时器,具有定时器/计数器/脉宽调制功能。它有一个可编程的分频器,1个16为周期值和4个单独可编程计数器/捕获通道,每一个通道有一个16位比较值。

图1-1 CC2530方块图

每个计数器/捕获通道可以用来当作PWM输出或用来捕捉输入信号的边沿时间,它

还可以在IR产生模式里进行配置,用来计算定时器3的周期,输出是同定时器3的输出相与,以产生具有最小CPU相互影响的已调制的用户IR信号。

定时器2(MAC 定时器)是为支持一个IEEE 802.15.4 MAC或其他软件中时间跟踪协议而特别设计的。该定时器具有一个可配置时间周期和一个可以用来记录已经发生的周期数轨道的8位溢出计数器。它还有一个16位捕捉寄存器,用来记录一个帧的开始定界符接收/

发送的精确时间或者传输完成的精确时间,以及一个可以在特定时间对无线模块产生的各种命令选通信号的16位输出比较寄存器。

定时器3和定时器4是8位定时器,具有定时器/计数器/PWM功能。它们有一个可编程的分频器,一个8位周期值和一个具有8位比较值的可编程计数信道。每一个计数信道可以被用来当作PWM输出。

睡眠定时器是一个超低功耗定时器,计数32KHz晶体振荡器或32KHz RC振荡器周期。睡眠定时器在所有运行模式下(除了功耗模式3)都可以连续运行。睡眠定时器的典型应用是被当作一个实时计数器,或者被当作一个唤醒定时器来离开功耗模式1或2,。

ADC在理想的32KHz~40KHz带宽下支持7~12位的分辨率。直流和音频转换最多可达8个输入通道。输入可以被选择为单端输入或者差分输入。参考电压可以是内部AVDD,或者一个单端或者差分外部信号。ADC也有温度传感器输入通道。ADC可以自动操作定时器采样过程或者通道序列转换过程。

随机数发生器使用一个16位线性反馈移位寄存器(LFSR)来产生随机数,它可以被CPU读取或者被命令选通处理器直接使用。随机数可以被用来安全机制所需要产生的随机数密钥。

AES加密/解密核心允许用户128位密钥的AES算法来加解密数据。该核心可以支持IEEE802.15.4 MAC安全、ZigBee网络层和应用层所需要的AES操作。

内置看门狗定时器允许CC2530在固件挂起时复位自己。当通过软件使能时,看门狗定时器必须被周期性擦除,否则时间一到它就会复位设备。或者它可以被配置为作为一般32KHz定时器使用。

USART0和USART1均可以配置为一个主/从SPI或一个UART。它们提供在接收和发送时的双缓冲和硬件流控制,因而非常适合于大吞吐量的全双工应用。每一个都有它自己的高精度的波特率发生器,因此可以解放普通计数器出来其他用途。

1.1.4 无线

CC2530具有一个IEEE802.15.4标准的无线收发器。RF核心控制模拟无线模块。另外,它为MCU和无线之间提供了一个接口,以使得可以发送命令、读取状态、自动操作和对无线事件进行排序。无线部分还包括一个数据包过滤和地址识别模块。

6.1.2 引脚和I/O端口配置

CC2530引脚对应的功能如表1-1所示。

表1-1 引脚功能表 引脚名称 AVDD1 AVDD2 AVDD3 AVDD4 AVDD5 AVDD6 DCOUPL DVDD1 DVDD2 GND GND P0_0 P0_1 P0_2 P0_3 P0_4 P0_5 P0_6

引脚号 28 27 24 29 21 31 40 39 10 - 1,2,3,4 19 18 17 16 15 14 13 引脚类型 电源(模拟) 电源(模拟) 电源(模拟) 电源(模拟) 电源(模拟) 电源(模拟) 电源(数字) 电源(数字) 电源(数字) 地 未使用 数字I/O口 数字I/O口 数字I/O口 数字I/O口 数字I/O口 数字I/O口 数字I/O口 描述 2.0-3.6V模拟电源供电 2.0-3.6V模拟电源供电 2.0-3.6V模拟电源供电 2.0-3.6V模拟电源供电 2.0-3.6V模拟电源供电 2.0-3.6V模拟电源供电 1.8V数字电源供电退耦。提供外部电路未使用 2.0-3.6V数字电源供电 2.0-3.6V数字电源供电 芯片底部焊盘必须连接到PCB的接地层 连接到底 端口P0_0 端口P0_1 端口P0_2 端口P0_3 端口P0_4 端口P0_5 端口P0_6

P0_7 P1_0 P1_1 P1_2 P1_3 P1_4 P1_5 P1_6 P1_7 P2_0 P2_1 P2_2 P2_3/XOSC32K_Q2 P2_4/XOSC32K_Q1 RESET_N RF_N RF_P XOSC_Q1 XOSC_Q2 12 11 9 8 7 6 5 38 37 36 35 34 33 32 20 26 25 22 34 数字I/O口 数字I/O口 数字I/O口 数字I/O口 数字I/O口 数字I/O口 数字I/O口 数字I/O口 数字I/O口 数字I/O口 数字I/O口 数字I/O口 端口P0_7 端口P1_0 端口P1_1 端口P1_2 端口P1_3 端口P1_4 端口P1_5 端口P1_6 端口P1_7 端口P2_0 端口P2_1 端口P2_2 数字模拟I/O口 端口P2_3/32.768KHz XOSC 数字模拟I/O口 端口P2_4/32.768KHz XOSC 数字输入 射频I/O口 射频I/O口 模拟I/O口 模拟I/O口 复位,低有效 RF接收期间负RF输入信号到LNA发送期间负RF从PA输出信号 RF接收期间负RF输入信号到LNA发送期间负RF从PA输出信号 32MHZ晶体振荡器引脚1或外部时钟输入 32MHZ晶体振荡器引脚2 6.1.3 特殊功能寄存器

CC2530的特殊功能寄存器(SFR)用来控制8051CPU内核以及外设I/O。其中一部分寄存器同标准的51单片机,而另一部分不同于标准的51单片机,用来控制外设单元及RF收发器。

特殊功能寄存器如下表:

表1-2 特殊功能寄存器1 寄存器名称 址 ADCCON1 ADCCON2 ADCCON3 ADCL ADCH RNDL RNDH ENCDI 0XB4 0XB5 0XB6 0XBA 0XBB 0XBC 0XBD 0XB1 ADC ADC ADC ADC ADC ADC ADC AES 模数转换控制1 模数转换控制2 模数转换控制3 ADC低位数据 ADC高位数据 随机数发生器低位数据 随机数发生器高位数据 加密/解密数据输入 SFR地模块 描述

ENCDO ENCCS P0 SP DPL0 DPH0 DPL1 DPH1 PCON TCON P1 DPS S0CON IEN2 S1CON P2 IEN0 IP0 IEN1 IP1 IRCON PSW ACC IRCON2 B DMAIRQ DMA1CFGL DMA1CFGH DMA0CFGL DMA0CFGH DMAARM DMAREQ - - - -

0XB2 0XB3 0X80 0X81 0X82 0X83 0X84 0X85 0X87 0X88 0X90 0X92 0X98 0X9A 0X9B 0XA0 0XA8 0XA9 0XB8 0XB9 0XC0 0XD0 0XE0 0XE8 0XF0 0XD1 0XD2 0XD3 0XD4 0XD5 0XD6 0XD7 0XAA 0X8E 0X99 0XB0 AES AES CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU CPU DMA DMA DMA DMA DMA DMA DMA - - - - 加密/解密数据输出 加密/解密控制和状态 端口0,能够从XDATA(0X7080)读取 堆栈指针 数据指针0低位 数据指针0高位 数据指针1低位 数据指针1高位 功耗模式控制 中断标志 端口1,能够从XDATA(0X7090)读取 数据指针选择 中断标志2 中断使能2 中断标志3 端口1,能够从XDATA(0X70A0)读取 中断使能0 中断优先级0 中断使能1 中断优先级1 中断标志4 程序状态字 累加器 中断标志5 B寄存器 DMA中断标志 DMA通道1~4配置低位地址 DMA通道1~4配置高位地址 DMA通道0配置高位地址 DMA通道0配置高位地址 DMA通道准备工作 DMA通道启动请求和状态 保留 保留 保留 保留

- - P0IFG P1IFG P2IFG PICTL P0IEN P1IEN P2IEN P0INP PERCFG APCFG P0SEL P1SEL P2SEL P1INP P2INP P0DIR P1DIR P2DIR PMUX MEMCTR FMAP RFIRQF1 0XB7 0XC8 0X89 0X8A 0X8B 0X8C 0XAB 0X8D 0XAC OX8F OXF1 OXF2 OXF3 OXF4 OXF5 OXF6 OXF7 OXFD OXFE OXFF OXAE 0XC7 0X9F 0X91 - - 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 输入/输出控制(IOC) 存储器 存储器 RF 保留 保留 端口0中断状态标志 端口1中断状态标志 端口2中断状态标志 端口引脚中断控制 端口0中断使能 端口1中断使能 端口2中断使能 端口0输入模式 外部设备I/O配置 模拟外部设备I/O配置 端口0功能选择 端口1功能选择 端口2功能选择 端口1输入模式 端口2输入模式 端口0方向 端口1方向 端口2方向 掉电信号多路器 存储器系统控制 Flash存储器bank映射 RF中断标志MSB

RFD RFST RFORQF0 RFERRF ST0 ST1 ST2 STLOAD STEEPCMD SLEEPSTA CLKCONCMD CLKCONSTA T1CC0L T1CC0H T1CC1L T1CC1H T1CC2L T1CC2H T1CNTL T1CNTH T1CTL T1CCTL0 T1CCTL1 T1CCTL2 T1STAT T2CTRL T2EVTCFG T2IRQF T2M0 T2M1 T2MOVF0 T2MOVF1 T2MOVF2 T2IRQM T2MSEL T3CNT T3CTL T3CCTL0 T3CC0 T3CCTL1

0XD9 0XE1 0XE9 0XBF 0X95 0X96 0X97 0XAD 0XBE 0X9D 0XC6 0X9E 0XDA 0XDB 0XDC 0XDD 0XDE 0XDF 0XE2 0XE3 0XE4 0XE5 0XE6 0XE7 0XAF 0X94 0X9C 0XA1 0XA2 0XA3 0XA4 0XA5 0XA6 0XA7 0XC3 0XCA 0XCB 0XCC 0XCD 0XCE RF RF RF RF 睡眠定时器(ST) 睡眠定时器(ST) 睡眠定时器(ST) 睡眠定时器(ST) PMC PMC PMC PMC 定时器1(Timer1) 定时器1(Timer1) 定时器1(Timer1) 定时器1(Timer1) 定时器1(Timer1) 定时器1(Timer1) 定时器1(Timer1) 定时器1(Timer1) 定时器1(Timer1) 定时器1(Timer1) 定时器1(Timer1) 定时器1(Timer1) 定时器2(Timer2) 定时器2(Timer2) 定时器2(Timer2) 定时器2(Timer2) 定时器2(Timer2) 定时器2(Timer2) 定时器2(Timer2) 定时器2(Timer2) 定时器2(Timer2) 定时器2(Timer2) 定时器2(Timer2) 定时器3(Timer3) 定时器3(Timer3) 定时器3(Timer3) 定时器3(Timer3) 定时器3(Timer3) RF数据 RF命令选通 RF中断标志LSB RF错误中断标志 睡眠定时器0 睡眠定时器1 睡眠定时器2 睡眠定时器负载状态 睡眠模式控制命令 睡眠模式控制状态 时钟控制命令 时钟控制状态 定时器1通道0捕获/比较值低位 定时器1通道0捕获/比较值高位 定时器1通道1捕获/比较值低位 定时器1通道1捕获/比较值高位 定时器1通道2捕获/比较值低位 定时器1通道2捕获/比较值高位 定时器1计数器低位 定时器1计数器高位 定时器1控制和状态 定时器1通道0捕获/比较控制 定时器1通道1捕获/比较控制 定时器1通道2捕获/比较控制 定时器2状态 定时器2控制 定时器2事件配置 定时器2中断标志 定时器2复用寄存器0 定时器2复用寄存器1 定时器2复用溢出寄存器0 定时器2复用溢出寄存器1 定时器2复用溢出寄存器2 定时器2中断使能 定时器2复用选择 定时器3计数器 定时器3控制 定时器3通道0比较控制 定时器3通道0比较值 定时器3通道1比较控制

T3CC1 T4CNT T4CTL T4CCTL0 T4CC0 T4CCTL1 T4CC1 TIMIF U0CSR U0DBUF U0BAUD U0UCR U0GCR U1CSR U1DBUF U1BAUD U1UCR U1GCR WDCTL 0XCF 0XEA 0XEB 0XEC 0XED 0XEE 0XEF 0XD8 0X86 0XC1 0XC2 0XC4 0XC5 0XF8 0XF9 0XFA 0XFB 0XFC 0XC9 定时器3(Timer3) 定时器4(Timer4) 定时器4(Timer4) 定时器4(Timer4) 定时器4(Timer4) 定时器4(Timer4) 定时器4(Timer4) 定时器中断 串行0(USART0) 串行0(USART0) 串行0(USART0) 串行0(USART0) 串行0(USART0) 串行1(USART1) 串行1(USART1) 串行1(USART1) 串行1(USART1) 串行1(USART1) 看门狗 通通通通通通通通通通信信信信信信信信信信定时器3通道1比较值 定时器4计数器 定时器4控制 定时器4通道0比较控制 定时器4通道0比较值 定时器4通道1比较控制 定时器4通道1比较值 定时器1/3/4联合中断使能/标志 串行通信0控制和状态 串行通信0收/发数据缓存 串行通信0波特率控制 串行通信0UART控制 串行通信0通用控制 串行通信1控制和状态 串行通信1收/发数据缓存 串行通信1波特率控制 串行通信1 UART控制 串行通信1通用控制 看门狗定时器控制

XREG寄存器是XDATA寄存器空间里另外的寄存器。这些寄存器主要用于无线配置和控制。表1-3给出了每一个寄存器的地址空间概述。

表1-3 XREG寄存器概览

XDATA 0X6000-0X61FF 0X6200-0X62BB 0X6249 0X624A 0X6260 0X6270 寄存器名称 - - CHVER CHIPID DBFDATA FCTL 描述 无线电寄存器 USB寄存器 芯片版本 芯片ID 调试接口写数据 FLASH控制

0X6271 0X6272 0X6273 0X6276 0X6277 0X6290 0X62A0 0X62A1 0X62A2 0X62A3 0X62A4 0X62A6 0X62A7 0X62A8 0X62A9 FADDRL FADDRH FWDATA CHIPINFO0 CHIPINFO1 CLD T1CCTL0 T1CCTL1 T1CCTL2 T1CCTL3 T1CCTL4 T1CC0L T1CC0H T1CC1L T1CC1H FLASH地址低 FLASH地址高 FLASH写数据 芯片信息字节0 芯片信息字节1 时钟丢失检测 定时器1通道0捕获/比较控制(SFR映射寄存器) 定时器1通道1捕获/比较控制(SFR映射寄存器) 定时器1通道2捕获/比较控制(SFR映射寄存器) 定时器1通道3捕获/比较控制 定时器1通道4捕获/比较控制 定时器1通道0捕获/比较值低位(SFR映射寄存器) 定时器1通道0捕获/比较值高位(SFR映射寄存器) 定时器1通道1捕获/比较值低位(SFR映射寄存器) 定时器1通道0捕获/比较值高位(SFR映射寄存器) 定时器1通道2捕获/比较值低位(SFR映射寄存器) 定时器1通道2捕获/比较值高位(SFR映射寄存器) 定时器1通道3捕获/比较值低位(SFR映射寄存器) 定时器1通道3捕获/比较值高位(SFR映射寄存器) 定时器1通道4捕获/比较值低位(SFR映射寄存器) 定时器1通道4捕获/比较值高位(SFR映射寄存器) 睡眠定时器捕获控制 睡眠定时器捕获状态 睡眠定时器捕获值字节0 睡眠定时器捕获值字节1 睡眠定时器捕获值字节2 0X62AA T1CC2L 0X62AB T1CC2H 0X62AC T1CC3L 0X62AD T1CC3H 0X62AE 0X62AF 0X62B0 0X62B1 0X62B2 0X62B3 0X62B4

T1CC4L T1CC4H STCC STCS STCV0 STCV1 STCV2

6.2 实验一 建立一个简单的实验工程 6.2.1 实验目的

通过本实验的学习,使用户熟悉如何使用CC2530的软件开发环境IAR Embedded WorBench for MCS-51 V7.51A来新建一个工程以完成自己的设计和调试。

注意:本实验只是讲解如何基于IAR来新建一个工程,其他关于IAR的使用,请参照IAR开发环境的使用手册,IAR的详细说明文档请到IAR官方网站查找或者在IAR安装文件夹下查找(x:\\Program Files\\IAR Systems\\Embedded Workbench 5.3\\8051\\doc)。

6.2.2 实验内容

闪烁FANTAI_ZigBee开发评估板上的LED灯

6.2.3 实验条件

1. 在用户PC上(Microsoft Windows XP以上系统平台)正确安装IAR Embedded WorBench for MCS-51 V7.51A集成开发环境;

2. FANTAI_ZigBee开发评估板一个(插有FANTAI_CC2530模块); 3. FANTAI-CC Debugger 多功能仿真器/调试器1个; 4. USB线两条

6.2.4 实验原理

由FANTAI_ZigBee开发评估板原理图可知,出厂默认设置: LED1(LED_G)用户指示灯由CC2530得P1.0引脚控制。P1.0输出高电平时LED_G点亮,输出低电平时LED_G熄灭。

6.2.5 实验步骤

2.5.1建立一个新的工程

按图2-1打开IAR集成开发环境,打开后会显示如图2-2所示的窗口,选择\project in current workspace\后会显示建立新工程的对话框,如图2-3所示。在\栏下拉菜单选择8051,在\ templates\栏选择\project\,然后单击下方的OK按钮。根据需要选择工程保存的位置,更改工程名称,例如\,然后单击保存按钮,如图2-4所示。这样就建立了一个新的工程。

图2-1 IAR打开路径

图2-2 当前窗口创建新的工程

图2-3 新建工程对话框

图2-4 文件保存对话框

IAR产生两个创建配置:调试(Debug)和发布(Release),如图2-5所示。本实验只是使用Debug配置。单击菜单栏上的保存按钮,如图2-6所示。保存工作区文件,指定工作区文件名和存放路径,本实验把它放到新建的工程目录下,然后单击保存按钮,如图2-7所示。

图2-5 工作区界面

图2-6 保存工作区文件

图2-7 工作区文件保存对话框

2.5.2 添加或新建程序文件

一个新的工程已经建立成功了,现在可以向工程里面添加程序文件。如果用户有现成的程序文件,那么可以选择菜单Project\\Add Files…来添加已有的程序文件,如图2-8所示。也可以在工作区窗口中单击鼠标右键,在弹出的快捷菜单中选择Add\\Add Files…来添加已有的文件,如图2-9所示。

图2-8 添加已有程序文件

图2-9 添加已有程序文件

如果没有编辑好的程序文件,可以单击工具栏上的新建按钮或选择菜单Files\\New\\Files新建一个空的文件,如图2-10所示,然后向这个文件里添加程序代码。

图2-10 新建程序文件

程序清单:

/* 包含头文件 */

#include \ // 引用头文件

/********************************************************************* * 函数名称:delay * 功 能:软件延时 * 入口参数:无 * 出口参数:无 * 返 回 值:无

********************************************************************/ void delay(void) {

unsigned int i; unsigned char j;

for(i = 0; i < 1000; i++) {

for(j = 0; j < 200; j++) {

asm(\ asm(\ asm(\ } } }

/********************************************************************* * 函数名称:main

* 功 能:main函数入口 * 入口参数:无 * 出口参数:无 * 返 回 值:无

********************************************************************/ void main(void) {

P1SEL &= ~(0x01 << 0); // 设置P1.0为普通IO口

P1DIR |= 0x01 << 0; // 设置为输出

while(1) {

P1_0 ^= 1; delay();

} } 在新建的程序文件里添加问代码后,窗口如图2-11所示。选择菜单File\\Save打开保存对话框,保存程序文件。新建一个source文件夹,然后将程序文件保存到该目录下,同时修改文件名。如图2-12和2-13所示。

图2-11 添加完代码后

图2-12 新建程序文件夹

图2-13 保存程序文件

点击WorkSpace中的LEDtest工程文件名,然后右击鼠标来添加工程文件,如图2-14。

图2-14 添加工程文件 添加完工程文件后,整个工程界面如图2-15所示

如图2-15 添加工程文件后的界面

2.5.3 配置工程设置

配置工程编译和文件输出等选项设置,选择菜单Project\\Options…来对工程进行配置。也可以在工作区窗口中右击鼠标,在弹出的快捷菜单中选择Options…来实现配置。如图2-16所示。

图2-16 编译选项

(1) 配置\选项中的相关项目

在窗口左侧的\列表框中选择\选项,在窗口右侧将会显示该选项相应的选项卡,如图2-16所示。

选择\选项卡,设置有关选项:

在\子栏目录中的\中选择\为CC2530设备。点击右端按钮,在弹出的对话框中选择正确的设备信息,选择路径为:x:\\Program Files\\IAR Systems\\Embedded Workbench 5.3\\8051\\config\\devices\\Texas Instruments\\CC2530.i51,其他选项保持不变,如图2-17所示。.

图2-17 Target选项配置

(2) 设置\选项中的相关设置

选择\选项卡,设置相关选项: 在\选项,\子栏中,若使用FANTAI-CC Debugger在IAR集成环境下在线下载和调试程序,默认设置即可,若图2-18所示。若只生成*.hex文件,则需要勾选\file\下的\default\选项,在\一栏中,点选\项,\为\,\为\,\设置为\,如图2-19所示。

图2-18 Linker选项卡配置

图2-19 生成 *.hex文件的配置

选择\选项卡配置相关选项: 在\选项,\选项卡中的\command file\栏目中勾选\

default\选项,使下拉菜单有效,选择为:$TOOLKIT_DIR$\\config\\lnk51ew_cc2530b.xcl。其路径为:x:\\Program Files\\IAR Systems\\Embedded Workbench 5.3\\8051\\config\\lnk51ew_cc2530b.xcl。其配置结果如图2-20 所示。

图2-20 Linker-Config选项配置

若使用IAR集成开发环境仅生成*.hex文件,以上的配置即可,若要使用FANTAI-CC Debugger仿真器在线调试代码,则需要进行以下配置。

(3) 设置\选项中的相关项目

在\选项的\选项卡中\一栏中,选择\,并且勾选\default\,然后再指定设备描述文件,标准路径及文件为x:\\Program Files\\IAR Systems\\Embedded Workbench 5.3\\8051\\config\\devices\\Texas Instruments\\CC2530.ddf。其他保持不变,如图2-21所示。

图2-21 Setup是指选项配置

若用户第一次使用CC2530芯片,则需要在\选项中的\选项卡中,勾选\。如图2-22所示。

图2-22 擦出flash选项配置

注意:以上各个配置完成后,最后一步均要点击OK按钮来保存当前设置。

2.5.4 下载程序到CC2530

通过以上正确设置后,用户可以通过以下两种方法将程序下载到CC2530芯片中,以便观察程序是否正确,以及实验现象是否正确。

注意:在下载程序到CC2530之前,首先需要确保硬件连接正确。既将FANTAI-CC Debugger使用USB电缆和10PiN扁平电缆,分别连接用户PC机和FANTAI_ZigBee开发评估板。确保FANTAI-CC Debugger多功能仿真器驱动安装正确。

编译程序代码,点击菜单栏\或者直接点击快捷按钮文件进行编译。

,对程序

图2-23 编译程序文件

方法一、在线调试工程代码

若用户需要在线调试代码,则可以点击菜单栏\或者直接点击快捷按钮,或者使用快捷键\,如图2-24所示,进入在线调试主界面,如图2-25所示。

图2-24 启动调试功能

图2-25 调试主界面

如何使用调试工具进行代码调试,在图2-25的调试界面中分别有如下的按钮,如

,对程序进行在

下面列出所示。可以使用调试工具栏线调试。

:复位 :停止调试

:每一步执行一个函数调用 :进入内部函数或子程序 :从内部函数或子程序跳出 :每次执行一个语句 :运行到光标处 :全速运行 :退出在线调试 变量的查看和表达式的方法:

? 使用自动窗口

选择\菜单打开自动窗口,如图2-26所示。用户可以连续点击在自动窗口中观察相应变量或者表达式的值的变化情况。

? 设置监控点

选择\菜单打开监控窗口,如图2-27所示。

按钮,然后

图2-26 仿真界面

图2-26 监控窗口界面

单击监控窗口中的虚线框,出现输入光标时输入 要观察的变量,在这里输入变量j并且回车。用户可以连续点击所示。

按钮,观察监控窗口中监控变量j的值变化情况。如图2-27

图2-27 监控窗口监控变量变化

如果要在监控窗口中删除一个变量,先选中该变量然后按键盘上的\键或者右击鼠标在弹出的菜单中选择\。

默认情况下,变量的值以十六进制的方式显示,我们可以选择其他显示方式显示。

选中该变量,右击鼠标,在弹出的菜单中选择所希望的显示方式,如图2-28。

图2-28 修改变量显示方式

插入/删除断点的方法介绍:

假如使程序运行到delay函数的for循环的第二个asm(\语句终止,可以通过设置断点的方法实现。首先将光标移动到该语句上双击左键,如图2-29所示。或者选中该语句后,点击设置/取消断点按钮

图2-29 设置断点

点击全速运行按钮,使程序运行,程序会自动运行到刚才设置断点处,观察到变量j的值变化情况,如图2-30所示。

图2-30 程序运行到设置断点处

可以继续点击全速运行按钮,可以观察到j值依次递增,每次增加1。

方法二、通过第三方软件下载代码

可以利用TI公司提供的SmartRF Flash Programmer来下载编译后的*.hex文件。具体操作过程如下:

首先打开SmartRF Flash Programmer软件,选择\选项卡,如图2-31。

图2-31 SmartRF Flash Programmer软件界面

在图2-31中可以看出,在\选项卡中,检测到EBID:8238(注意:每个FANTAI-CC Debugger仿真器都有一个自己的ID)、Chip Type(CC2530)、EB Type(CC Debugger)、EB firmware rev(0009)等信息,表示FANTAI-CC Debugger仿真器已经找到片上系统设备CC2530,连接成功。如果没有出现以上信息,请检查PC机、FANTAI-CC Debugger仿真器与FANTAI_ZigBee开发评估板连接是否正确。

点击\右端\按钮选择当前工程中已编译好程序的hex文件。在\选项中勾选\,program and verify\最后点击\actions\按钮,执行下载命令,成功下载完成后,显示如图2-32界面。

图2-32 程序下载成功界面

注意:点击\actions\后,要耐心等待擦擦、烧写及校验完成,所需时间根据*.hex文件大小不同。最后提示\,说明烧写并校验成功。

注意:不论采取何种方式对CC2530进行变成烧写,在执行完毕后,为避免影响实验最后结果,请把FANTAI_ZigBee开发评估板或者FANTAI_ZigBee开发节点上的JTAG座上的10PIN扁平电缆取下后,进行试验演示和观察。

2.6 实验结果 通过本实验,可以观察到:LED_1指示灯交替闪烁。

6.3实验二 通用数字I/O实验

6.3.1 实验目的

通过本实验的学习,使用户熟悉CC2530芯片通用数字I/O口的配置和使用。

6.3.2 实验内容

闪烁FANTAI_ZigBee开发评估板上的4个用户LED指示灯LED1-LED4(LED_G\\LED_R\\LED_Y\\LED_B)

6.3.3 实验条件

1. 在用户PC上(Microsoft Windows XP以上系统平台)正确安装IAR Embedded WorBench for MCS-51 V7.51A集成开发环境;

2. FANTAI_ZigBee开发评估板一个(插有FANTAI_CC2530模块); 3. FANTAI-CC Debugger多功能仿真器/调试器1个; 4. USB线两条

6.3.4 实验原理

由FANTAI_ZigBee开发评估板原理图可知,出厂默认设置: LED1(LED_G)用户指示灯由CC2530得P1.0引脚控制。P1.0输出高电平时LED_G点亮,输出低电平时LED_G熄灭。

LED2(LED_R)用户指示灯由CC2530得P1.1引脚控制。P1.1输出高电平时LED_R点亮,输出低电平时LED_R熄灭。

LED3(LED_Y)用户指示灯由CC2530得P1.4引脚控制。P1.4输出高电平时LED_Y点亮,输出低电平时LED_Y熄灭。

LED4(LED_B)用户指示灯由CC2530得P0.1引脚控制。P0.1输出高电平时LED_B点亮,输出低电平时LED_B熄灭。

本实验涉及CC2530的通用输入输出接口(GPIO)的配置及操作。由于CC2530的21个数字I/O口引脚具有可编程功能,可通过设置相关寄存器配置为通用数字I/O和用于连接ADC、定时/计数器或者USART等片内外设的特殊功能I/O。这些特殊功能I/O口的用途,通过以下几个表中列出了本实验用到的几组寄存器。

表3-1 I/O端口名称

Port0、Port1 、Port2 位 7:0 7:0 7:5 4:0 表 3-2 I/O接口功能选择

名称 P0[7:0] P1[7:0] - P2[7:0] 复位 0XFF 0XFF 000 0x1F 读/写 P0(0X80-P0口) R/W R/W R0 R/W Port0.GPIO口或者外设IO,可位寻址 P1(0X90-P1口) Port1.GPIO口或者外设IO,可位寻址 P2(0XA0-P2口) Port2.GPIO口或者外设IO,可位寻址 描述

I/O接口功能选择 位 名称 复位 读/写 P0SEL(0XF3-P0口功能选择) 7:0 SELP0[7:0] 0X00 R/W P0_7~P0_0功能选择 0 GPIO 1 外设 P1_7~P1_0功能选择 0 GPIO 1 外设 不使用 P1口外设优先级控制。当PERCFG同时分配USART0和USART1到同一引脚时,该位决定其优先级顺序。 0 USART0优先; 1 USART1优先 P1口外设优先级控制。当PERCFG同时分配USART1和Timer3到同一引脚时,该位决定其优先级顺序。 0 USART1优先; 1 Timer3优先 P1口外设优先级控制。当PERCFG同时分配Timer1和Timer4到同一引脚时,该位决定其优先级顺序。 0 Timer1优先; 1 Timer4优先 P1口外设优先级控制。当PERCFG同时分配USART0和Timer1到同一引脚时,该位决定其优先级顺序。 0 USART0优先; 1 Timer1优先 P2_4功能选择 0 GPIO 1 外设 P2_3功能选择 0 GPIO 1 外设 P2_0功能选择 0 GPIO 1 外设 描述 P1SEL(0XF4-P1口功能选择) 7:0 SELP1[7:0] 0X00 R/W P2SEL(0XF5-P2口功能选择) 7 - 0 R0 6 PRI3P1 0 R/W 5 PRI2P1 0 R/W 4 PRI1P1 0 R/W 3 PRI0P1 0 R/W 2 SELP2_4 0 R/W 1 SELP2_3 0 R/W 0 SELP2_0 0 R/W

表3-3 I/O接口方向选择 P0口、P1口、P2口方向

位 名称 复位 读/写 P0DIR(0XFD-P0口方向) 描述 P0_7~P0_0方向选择 0 输入input 1 输出output P1_7~P1_0方向选择 0 输入input 1 输出output P0口外设优先级控制。当PERCFG同时分配几个外设到同一引脚时,该两位将决定其优先级顺序。 00 第1高优先级:USART0 第2高优先级:USART1 第3高优先级:Timer1 01 第1高优先级:USART1 第2高优先级:USART0 第3高优先级:Timer1 10 第1高优先级:Timer1通道0、1 第2高优先级:USART1 第3高优先级:USART0 第4高优先级:Timer1通道2、3 11 第1高优先级:Timer1通道2、3 第2高优先级:USART0 第3高优先级:USART1 第4高优先级:Timer1通道0、1 未使用 P2_4~p2_0 I/O方向选择 0 输入input 1 输出output 7:0 DIRP0[7:0] 0X00 R/W P1DIR(0XFD-P1口方向) 7:0 DIRP1[7:0] 0X00 R/W P2DIR(0XFD-P2口方向) 7:6 PRIP0 00 R/W 5 - 0 R0 4:0 DIRP2_[4:0] 00000 R/W

表3-4 I/O接口输入模式选择

P0口、P1口、P2口输入模式 位 名称 复位 读/写 P0INP(0X8F-P0输入模式)

描述

7:0 MDP0[7:0] 0X00 R/W P0_7~P0_0输入模式 0 上拉/下拉 1 三态 P1_7~P1_0输入模式 0 上拉/下拉 1 三态 P2口上拉/下拉选择,对所有P2口引脚设置为上拉/下拉输入 0 上拉 1下拉 P1口上拉/下拉选择,对所有P1口引脚设置为上拉/下拉输入 0 上拉 1下拉 P0口上拉/下拉选择,对所有P0口引脚设置为上拉/下拉输入 0 上拉 1下拉 P2_4~P2_0输入模式 0 上拉/下拉 1 三态 P1INP(0XF6-P1输入模式) 7:0 MDP0[7:0] 0X00 R/W P2INP(0XF7-P2输入模式) 7 PRIP2 0 R/W 6 PRIP1 0 R/W 5 PRIP0 0 R/W 4:0 MDP2_[4:0] 00000 R/W 由上述几个表可知,当用作通用I/O时,引脚可以组成3个8位口,定义为P0口、P1口、P2口。其中,P0口和P1口是完全8位口,而P2口仅5位可用。所有I/O口均可位寻址,或通过特殊功能寄存器由P0、P1和P2字节寻址。每个口可以单独设置为通用I/O或者外设特殊功能I/O。所有的I/O口用于输出,均具备4mA的驱动能力,出了两个高输出口P1_0和P1_1外,他们具备20mA的驱动能力。

寄存器PxSEL(其中x为I/O口标号,其值为0~2),用来设置I/O口为8位通用I/O或者外部设备特殊功能I/O。任何一个I/O口在使用之前,必须首先对其寄存器PxSEL赋值。默认情况下,每当复位以后,所有I/O引脚都设置为通用I/O;且均为输入。

在任何时候,若改变I/O的方向,只需设置寄存器PxDIR即可。设置PxDIR中的指定位为1,那么其对应的引脚就被设置为输出;为0,则对应的引脚就被设置为输入。

当使用输入时,每个通用I/O引脚可以设置为上拉、下拉或者三态模式。作为缺省情况,复位之后,所有口均为上拉输入。要取消其上拉或者下拉,就要将PxINP中的对应位设置为1.

在本实验中,为了驱动4个LED灯的亮灭,需要将相应的I/O口设置为输出模式,并使用相应的I/O口输出“1”或者“0”来切换LED的亮灭状态。在亮灭之间,插入一定的

延时,才能保证看到LED的闪烁效果。

6.3.5 实验步骤

3.5.1 建立一个新工程

注意:本步骤,请用户自行参考实验《建立一个简单的试验工程》,这里就不再赘述。

3.5.2 添加或新建程序文件

如何添加或者新建程序文件,请参考实验《建立一个简单的试验工程》,这里就不再赘述。

程序清单1:

#include \ // 引用头文件 #include \

/********************************************************************* * 函数名称:delay * 功 能:软件延时 * 入口参数:无 * 出口参数:无 * 返 回 值:无

********************************************************************/ void delay(void) {

int16 i; uint8 j;

for(i = 0; i < 1000; i++) {

for(j = 0; j < 200; j++) {

asm(\ asm(\ asm(\ } } }

/********************************************************************* * 函数名称:main

* 功 能:main函数入口 * 入口参数:无 * 出口参数:无

* 返 回 值:无

********************************************************************/ void main(void) {

LED1_DDR |= LED1_BV; // 设置P1.0,P1.1,P1.4为输出 LED2_DDR |= LED2_BV; LED3_DDR |= LED3_BV;

LED4_DDR |= LED4_BV; // 设置P0.1为输出

while(1) {

HAL_TURN_ON_LED1(); HAL_LED_BLINK_DELAY(); HAL_TURN_ON_LED2(); HAL_LED_BLINK_DELAY(); HAL_TURN_ON_LED3(); HAL_LED_BLINK_DELAY();

HAL_TURN_ON_LED4(); // 点亮四个LED HAL_LED_BLINK_DELAY(); delay(); // 延时 HAL_TURN_OFF_LED1(); HAL_LED_BLINK_DELAY(); HAL_TURN_OFF_LED2(); HAL_LED_BLINK_DELAY(); HAL_TURN_OFF_LED3(); HAL_LED_BLINK_DELAY();

HAL_TURN_OFF_LED4(); // 熄灭四个LED HAL_LED_BLINK_DELAY(); delay(); } }

程序清单2:

/******************************************************************************

* 文件名称: hal_board_cfg.h * 功 能:板级类型定义描述库 * 作 者:POWER * 公 司:

* 日 期:2009-06-09

******************************************************************************/

#ifndef HAL_BOARD_CFG_H

#define HAL_BOARD_CFG_H /* 包含头文件 */ #include \#include \#include \#include \

…………

/* 绿色LED */

#define LED1_BV BV(0) #define LED1_SBIT P1_0 #define LED1_DDR P1DIR

#define LED1_POLARITY ACTIVE_HIGH

/* 红色LED */

#define LED2_BV BV(1) #define LED2_SBIT P1_1 #define LED2_DDR P1DIR

#define LED2_POLARITY ACTIVE_HIGH

/* 黄色LED */

#define LED3_BV BV(4) #define LED3_SBIT P1_4 #define LED3_DDR P1DIR

#define LED3_POLARITY ACTIVE_HIGH

/* 蓝色LED */

#define LED4_BV BV(1) #define LED4_SBIT P0_1 #define LED4_DDR P0DIR

#define LED4_POLARITY ACTIVE_HIGH

…………

3.5.3配置工程设置

如何配置工程设置,请参考实验《建立一个简单的试验工程》,在这里就不再赘述。

3.5.4下载程序到CC2530

如何下载程序到CC2530,请参考实验《建立一个简单的试验工程》,在这里就不

再赘述。

6.3.6 实验结果

通过以上几个步骤,最终下载正确的程序到CC2530后,用户可以观察到LED1~LED4四个LED同时点亮,同时熄灭,流水灯。

注意:为方便用户熟悉Z-Stack架构中的硬件抽象层定义,基础实验1到实验18,所有的宏文件、头文件等程序文件,均来自Z-StackV2.2.0-1.3.0协议栈。

6.4 实验三 OLED屏显示实验I(软件模拟SPI总线)

6.4.1 实验目的

通过本实验的学习,使用户熟悉OLED屏的驱动编写,以及建立自己的图形界面。

6.4.2 实验内容

在FANTAI_ZigBee开发评估板的OLED屏上显示汉字、字符等内容。 注意:本实验采用CC2530数字I/O口软件模拟SPI总线方式来驱动OLED显示器。

6.4.3 实验条件

1. 在用户PC上(Microsoft Windows XP以上系统平台)正确安装IAR Embedded

WorBench for MCS-51 V7.51A集成开发环境;

2. FANTAI_ZigBee开发评估板一个(插有FANTAI_CC2530模块); 3. FANTAI-CC Debugger 多功能仿真器/调试器1个; 4. USB线两条

6.4.4 实验原理

由FANTAI_ZigBee开发评估板原理图可知,OLED-SSD1306-12864是一块128X64点阵的LED显示屏,该屏幕没有字库,没有基本的画图功能能,但是我们在评估板上加上了字库芯片,其型号为GT20L16S1Y。由一套汉字字库和6套ASCII字符字库6套。用户可以根据自己的需要在各个字库之间切换。OLED-SSD1306-12864和GT20L16S1Y均采用SPI接口、接口简单、操作方便;与CC2530链接的方式如下表:

表1 OLED-SSD1306-12864和GT20L16S1Y与CC2530接口

OLED-SSD1306-12864 CS# RES# D/C# SCLK SDA GT20L16S1Y CS# SCLK SI SO

CC2530 P1.2 P0.0 P2.2 P1.5 P1.6 P2.1 P1.5 P1.6 P1.7 本实验涉及了简单字符的数字和字母等显示实验,关于如何在OLED屏幕上显示

字符,请查阅本套评估板套件的配套资料。

OLED-SSD1306-12864上分布着128X64个像素点,当对应的像素点处置1时该像素点就被点亮。在使用过程中,用户可以不必关心OLED的显示原理,只需掌握如何通过SPI接口函数控制即可。在本实验中没有采用Z-Stack提供的代码,而是重新写的OLED和字库芯片驱动程序。

本实验使用CC2530的GPIO来用软件模拟SPI接口时序,驱动OLED模块和字库芯片。在初始化表1中的引脚连接的对应关系后,使用关键的底层通信函数来实现对屏幕和字库的各种操作。

6.4.5 实验步骤

4.5.1 建立一个新工程

注意:本步骤,请用户自行参考实验《建立一个简单的试验工程》,这里就不再赘述。

4.5.2 添加或新建程序文件

如何添加或者新建程序文件,请参考实验《建立一个简单的试验工程》,这里就不再赘述。

程序清单1:

/*******************************************************************************

* 文件名称:LCDTest.c

* 功 能:CC2530基础实验 --- 液晶显示

* 驱动128*64点阵图形OLED进行显示

* 硬件连接:液晶模块与CC2530的硬件连接关系如下:

* 液晶模块 CC2530 * CS(PIN2) P1.2 * SDA(PIN3) P1.6 * SCK(PIN5) P1.5 * RESET(PIN6) P0.0 * VDD(PIN1) x * NC(PIN4) x * VSS(PIN7) x *

* 作 者:w

* 公 司:无锡泛太科技有限公司

******************************************************************************/

/* 包含头文件 */

/********************************************************************/ #include \#include \

#include \

/********************************************************************/

/********************************************************************* * 函数名称:main

* 功 能:main函数入口 * 入口参数:无 * 出口参数:无 * 返 回 值:无

********************************************************************/ void main(void) {

HAL_BOARD_INIT();

LCD_Init(); // LCD初始化 LCD_Clear(); // LCD清屏

/* 显示信息 */

LCD_WriteString(20,1,\

LCD_WriteString(0,3,\ LCD_WriteString(0,5,\ LCD_WriteString(6,7,\ while(1); }

程序清单2:

/*******************************************************************************

* 文件名称:hal_led.c * 功 能:OLED驱动

* 使用硬件SPI总线驱动128*64点阵OLED液晶 * 硬件连接:液晶模块与CC2530的硬件连接关系如下:

* 液晶模块 CC2530 * CS P1.2 * SDA P1.6 * SCK P1.5 * RESET P0.0 * D/C# P2.2 * 字库芯片

* CS# P2.1 * SCLK P1.5 * SI P1.6 * SO P1.7 *

* 作 者:w

* 公 司:无锡泛太科技有限公司

******************************************************************************/

/* 包含头文件 */

/********************************************************************/ #include \#include \#include \

/********************************************************************/

/* 本地变量 */

/********************************************************************/ uint8 X_Witch = 6; uint8 Y_Witch = 1; uint8 X_Witch_cn = 16; uint8 Y_Witch_cn = 16; uint8 Dis_Zero = 0;

/********************************************************************/

#define FUNCTION_SET(options,OLED_DC) halOLED_control(options,OLED_DC)

/********************************************************************* * 函数名称:LCD_TimeDelay * 功 能:延时函数

* 入口参数:Timers 延时时间参数 * 出口参数:无 * 返 回 值:无

********************************************************************/ void LCD_TimeDelay(uint16 Timers) {

uint16 i;

while(Timers) {

Timers--;

for(i = 0; i < 100; i++)NOP(); } }

/********************************************************************* * 函数名称:LCD_SPISSSet

本文来源:https://www.bwwdw.com/article/9w4w.html

Top