IAR.docx
《IAR.docx》由会员分享,可在线阅读,更多相关《IAR.docx(49页珍藏版)》请在冰豆网上搜索。
IAR
文档信息
BasicRFTestingofCCxxxxDevices.pdf
物理特性演示
CC253x4xUserGuide.(Rev.C).pdf
数据手册
CC2530DevelopmentKitUserGuide.pdf
器件连接,驱动安装,代码演示,和电路图
CC2530SoftwareExamples.pdf
如何创建工程,下载程序,和DEMO讲解
cc2530_Data_Manual.pdf
数据手册
CC2530DKQuickStartGuide.pdf
熟悉产品的组装和操作显示
CC2530ZDKDevelopmentKitUserGuide.pdf
软件包用户向导
CC2530ZDKQuickStartGuide.pdf
和CC2530DKQuickStartGuide.pdf有点类似
IARIDEUserManual.pdf
简单的创建工程和简单的DEBUG,有些数据存储原理
linux-stm3220g-eval-bspg-1.3.1.pdf
SmartRF05EvaluationBoardUserGuide.pdf
安装驱动和2531连接,电路原理图,比较详细
SmartRFFlashProgrammerUserManual.pdf
很详细的介绍创建工程
SmartRFStudioSoftwareManifest.pdf
软件清单说明
SmartRF_Studio_7_Overview.pdf
Studio的使用和原理
SmartRF_Studio_7_Tutorial.pdf
详细的SmartRF_Studio_7_Overview.pdf
swra290.pdf
MAC层介绍
swra308a.pdf
电路原理和数据
UsingUARTinCC2530.pdf
串口的使用和原理
ZigBeeSensorMonitor.pdf
Sensor的使用
ZigBee_Sensor_Monitor_User_Guide.pdf
Sensor的安装
软件包信息
swrc044p.zip
烧写软件包
swrc045v.zip
Sniffer软件包
swrc096e.zip
Sensor组网调试软件包
swrc126g.zip
Zstack软件包
swrc135b.zip
驱动层的RF演示代码
swrc147c.zip
Sonser组网演示代码
swrc155b.zip
MAC
swrc176n.zip
Studio演示调试软件
组装设备
将P8调到ON,
跳线P11为USB/DC
跳线P13
跳线P15
P14调到Disable
P19调到SOC/TRX
用USB线连接CC2530和PC,
测试工具的使用
1smartRFstudio7
在将2个CC2530EB连接到PC后,
备注
Sensordemo必须放到C:
\TexasInstruments\ZStack-CC2530-2.5.1a\Projects\zstack\Samples\SensorDemo\CC2530DB才可以运行
IAR使用
IAR安装:
首先查看系统中是否安装了IAR,如果有,请在WINDOWS的程序管理中将其卸载,
首先下载软件包,IAR有对不同的设备提供不同的软件包,这里需要的是8051的编译器,安装没说明好说的,windows安装软件都是傻瓜式的一路下一步,最后就是注册,如果不注册有代码长度的限制,
这里使用的是IARFOR8051V7.60.1网上有对应的注册机
编译DEMO代码:
打开swrc135b/ide/cc2530_sw_example.eww
右键项目,option,linker,config标签下,overridedefault浏览你的C:
\ProgramFiles\IARSystems\EmbeddedWorkbench6.0\8051\config\devices\TexasInstrume\lnk51ew_cc2530F256.xcl选中你的版型,
右键项目,option,linker,ExtraOutput,Overridedefault,写入你的生成HEX文件名
右键项目,rebuildall,在你的该项目下会生成HEX文件
下载程序
打开FLASHPROGRAMMER,选中programCCxxxxSoCorMSP430,
在System-on-Chip标签下会有当前连接到PC的所有板子,
在Flashimage选中你的HEX文件,
Actions选中Erase,programandverify
点击performactions
程序就开始烧写到板子上
自己创建工程:
1,打开IAR
2,Project,CreateNewProject,选择你的编译工具链--Toolchain,这里只有8051,
3,选中Emptyproject,点OK,这是叫你选择保存的工程名和路径,
4,右键工程,选option,
选GeneralOptions,
在Target标签下,
Device我们选择我们的芯片类型CC2530F256,
CPUCORE就选择Plain
Codemodel,Near意思是不需要BANK支持,只需要64Kb的Flash内存,CC253XF32和CC253XF64必须选这个,但是CC253XF128和CC253XF256也可以选这个选项,如果想访问CC253XF128和CC253XF256的所有FLASH就要选择BANKED,
选择Datamodel为Large,这里是告诉编译器如何使用8051的内存存储变量,small---DATAmemoryspace,large---XDATA,访问DATA的速度快,但是容量内有XDATA大,
Numberofvirtual设置8,是否有额外的堆栈,设置没有,Callingconvention选择XDATAstackreentrant,选择RAMmemory
堆栈:
选择donotuseexternedstacks
Callingconvention:
xdatastackreentrant
Locationforconstantsandstr选RAM
在datapointer标签下
Numberofdptrs选1
Pageregisteraddr写0xa0
在codebank标签下
如果选择了banked的代码模式,需要增加一些设置,
numberofbanks:
0x07(CC2530设置7个codebank访问256KBFLASH,也适用于128KB),
registeraddress:
0x9f(CC2530FMAP寄存器,控制CODEBANK在8051中的地址映射,低3位代表bank数),
registermask:
0xff,
bankstart:
0x8000,
bankend:
0xffff
在output标签下
Outputfile选executable我们要的是执行文件,如果要链接库就选library
Outputdir的3个分别是执行文件,中间目标文件,编译MAP文件的存放路径
在libraryconfiguration标签下,
选择你的编译库,一般不会动去,选clib就好了
在libraryoption标签下
设置输出格式和输入格式
在stack/heap标签下
设置堆栈大小
选C/C++compiler
选中Mutilfilecompliation和discardunusedpublics10,
在language标签下
选择编译语言和编译格式等
在code标签下
不知道做什么的
在optimizations标签下
选择HIGH-SIZE,去掉codemotion
在output标签下
选中generatedebuginformat
在list标签下
不知道干什么的
在preprocessor标签下
Additioalincludedirectories加入你的文件搜索路径:
$PROJ_DIR$/../../../source/Components/utils
Preinclude:
预加载文件
definedsymbols:
预加载符号
比如chip=2530表示定义了个宏chip,值等于2530
在diagnostics标签下
不知道干什么的
在extraoptions标签下
不知道干什么的
选Assembler:
汇编的东西
选custombuild:
选buildactions:
选linker
在config标签下,
打开overridedefault
选择你的芯片类型
打开overridedefaultprogram
选中defaultbyapplicat
在output标签下
设置你的输出文件,如果选中了allowc-spy-specificextraoutputfile,extraoutput就可输入了
在extraoutput标签下
选中Gererateexternoutputfile
选中overridedefault,
输入你的HEX文件名,
outputformat:
选择intel-extended,
formatvariant选择NONE,
在list标签下
不知道
在extraoptions标签下
勾选usecommandlineoptions
输入-C$PROJ_DIR$\EndDevice-Pro.lib
调试:
F5快速运行,
F10,跳过运行
F11,单步运行
ZStack的SampleApp--DemoEB需要修改下TOOLS下的F8W2530.XCL,这个的-M(CODE)[(_CODEBANK_START+_FIRST_BANK_ADDR)-(_CODEBANK_END+_FIRST_BANK_ADDR)]*\
_NR_OF_BANKS+_FIRST_BANK_ADDR=0x8000
注释去掉,这样就可以使用BANK空间了
Light_switch-srf05_cc2530代码注释
首先找到入口main:
application下的light_switch.c里的
main
uint8appMode=NONE;//保存运行的事发送端还是接收端
basicRfConfig是一个配置结构体,配合他的协议层需要
Myaddr是
Panid是一个建网的标识
Channel是选用的频率频道
ackRequse是否需要回应
Halboardinit主板初始化时钟,LED,按钮,摇杆,LCD和总中断
halJoystickInit摇杆初始化,和Halboardinit有重复
halRfInit射频初始化:
需要应答和CRC校验,设置寄存器,开启中断(硬件层的操作)
halLedSet
(1);LED1亮
utilPrintLogo("LightSwitch");通过halLcdWriteLine输出
while(halButtonPushed()!
=HAL_BUTTON_1);等待按钮按下
halMcuWaitMs(350);通过nop操作等待350MS
halLcdClear();清空LCD
appMode=appSelectMode();摇杆选择后获取用户选择的模式
appSwitch
pTxData[0]=LIGHT_TOGGLE_CMD;给发送缓冲区赋值
basicRfConfig.myAddr=SWITCH_ADDR;赋值自己的地址
basicRfInit(&basicRfConfig)初始化RF,这里主要是协议层设置,并设置回调函数,并设置频道频率
basicRfReceiveOff();关闭接受
halJoystickPushed()等待摇杆
basicRfSendPacket(LIGHT_ADDR,pTxData,APP_PAYLOAD_LENGTH);发送数据,LIGHT_ADDR对方地址,pTxData数据地址,APP_PAYLOAD_LENGTH数据长度
halMcuSetLowPowerMode(HAL_MCU_LPM_3);睡眠模式3在中断的时候会醒来
applight
while(!
basicRfPacketIsReady());等待完整的数据包到来
basicRfReceive(pRxData,APP_PAYLOAD_LENGTH,NULL)取出字符串到pRxData中,最大取APP_PAYLOAD_LENGTH字节,NULL是返回信号强度,(这里为什么可以用NULL不会出错)
halRfRxInterruptConfig
设置中断回调处理函数,这里就pfISR=pf;然后我去查找pfISR,发现pfISR在一个HAL_ISR_FUNCTION函数中被执行
查找HAL_ISR_FUNCTION被调用的地方,发现HAL_ISR_FUNCTION没有被调用的地方,他是一个宏
#defineHAL_ISR_FUNCTION(f,v)\
HAL_ISR_FUNC_PROTOTYPE(f,v);HAL_ISR_FUNC_DECLARATION(f,v)
这2个也是宏
#defineHAL_ISR_FUNC_DECLARATION(f,v)\
_PRAGMA(vector=v)__near_func__interruptvoidf(void)
#defineHAL_ISR_FUNC_PROTOTYPE(f,v)\
_PRAGMA(vector=v)__near_func__interruptvoidf(void)
网上查找,说这个是中断必须按他的格式写,
仔细思考了下,就是一个申明,一个实现
V是中断号,f是函数名,所以不想一般的宏定义,f和v都不在函数中出现,
在整个DEMO中就接受中断和PORT0~PORT2中断处理函数
basicRfRxFrmDoneIsr
接收中断处理函数
pHdr=(basicRfPktHdr_t*)rxMpdu;缓冲区结构化
halRfDisableRxInterrupt();不允许接受中断嵌套
halIntOn();允许其他中断嵌套(在进来前是开着总中断的,不然怎么进来)
halRfReadRxBuf(&pHdr->packetLength,1);读取第1个字节,代表长度
pHdr->packetLength&=BASIC_RF_PLD_LEN_MASK;忽略高字节,因为FIFO位128字节
if(pHdr->packetLength==BASIC_RF_ACK_PACKET_SIZE)如果是5个字节的长度就是应答包
rxi.length=pHdr->packetLength-BASIC_RF_PACKET_OVERHEAD_SIZE;用户层数据长度要扣掉包头9个字节和后面2个字节的CRC
halRfReadRxBuf(&rxMpdu[1],pHdr->packetLength);读取包头+包体
rxi.ackRequest=!
!
(pHdr->fcf0&BASIC_RF_FCF_ACK_BM_L);判断是否需要回复
rxi.pPayload=rxMpdu+BASIC_RF_HDR_SIZE;指向payload层
rxi.rssi=pStatusWord[0];获取信号强度
if((pStatusWord[1]&BASIC_RF_CRC_OK_BM)&&(rxi.seqNumber!
=pHdr->seqNumber))如果CRC校验对,并且序列号对
if(((pHdr->fcf0&(BASIC_RF_FCF_BM_L))==BASIC_RF_FCF_NOACK_L))不需要回复
halIntOff();关闭总中断源(这里不理解,这样怎么发生中断)
halRfEnableRxInterrupt();重新开启RF接受中断
Per_test代码注释
Hal_timer_32k.c
//初始化
通过CLKCONCMD.TICKSPD获取定时器最大频率
设置预分频T1CTL.DIV,T1CTL.MODE=00,暂停计数,1-free,2-re3-up
T1CCTL{0-4}.MODE=0采集,=1比较
T1CCTL{0-4}.CMP和CAP设置
TIMIF.OVFIM=1;T1CCTL{0-4}.IM=1
IEN1.T1IE=1;
IEN0.EA=1;
//开始
T1CC0H:
T1CC0L设置溢出值
T1CNTL=任何数,置0X0000
T1CTL.MODE设置
//中断中
T1STAT.OVFIF=0,T1STAT.CH4IF=0//清除
IRCON.T1IF=0;
通过T1CNTH:
T1CNTL读取
//关闭
T1CTL.MODE=00
TIMIF.OVFIM=0;T1CCTL{0-4}.IM=0
IEN1.T1IE=0;
IEN0.EA=0;
在测试RF的性能时可以使用输入比较来获取时间
数据手册
2.2memory
Code:
只读空间,64KB
Data:
可读写空间,1个周期访问,256B,前128B可直接访问,后128B间接访问
Xdata:
可读写空间,4-5个周期访问,64KB
Sfr:
可读写空间,1个周期访问,128B
2.2.3
2.4
2.5
CPU有18个中断源
其中RFERR中断是缓冲区越界了,
中断掩码寄存器
IEN0(0XA8)
7:
EA:
中断总开关
6:
RES:
始终0
5:
STIE:
睡眠定时器掩码
4:
ENCIE:
AES加密/解密掩码
3:
URX1IE:
USART1接收掩码
2:
URX0IE:
USART0接收掩码
1:
ADCIE:
ADC掩码
0:
RFERRIE:
RF错误掩码
IEN1(0xB8)
7:
RES:
0
6:
RES:
0
5:
P0IE:
PORT0掩码
4:
T4IE:
定时器4掩码
3:
T4IE:
定时器3掩码
2:
T4IE:
定时器2掩码
1:
T4IE:
定时器1掩码
0:
DMAIE:
DMA掩码
IEN2(0x9A)
7:
RES:
0
6:
RSE:
0
5:
WDTIE:
看门狗掩码
4:
P1IE:
PORT1掩码
3:
UTX1IE:
USART1发送掩码
2:
UTX0IE:
USART0发送掩码
1:
P2IE:
USB掩码
0:
RFIE:
RF掩码
在一个中断发生的时候,我们也许不知道到底什么事情发生了,比如rf中断发生了,那是发送完成了呢,还是接受完成了,我们还需要一个标志位
TCON(0x88)
7:
URX1IF:
USART1接受中断
6:
RES:
0
5:
ADCIF:
ADC中断
4:
RES:
0
3:
URX0IF:
USART0接受中断
2:
IT1:
总设置1
1:
RFERRIF:
RFERR中断发生
0:
IT0:
总设置1
S0CON(0X98)
7:
RES:
0
6:
RES:
0
5:
RES:
0
4:
RES:
0
3:
RES:
0
2:
RES:
0
1:
ENCIF_1:
AES中断发生
0:
ENCIF_0:
AES中断发生
S1CON(0X9B)
7:
RES:
0
6:
RES:
0
5:
RES:
0
4:
RES:
0
3:
RES:
0
2:
RES:
0
1:
RFIF_1:
RF中断发生
0:
RFIF_0:
RF中断发生
IRCON(0XC0)
7:
STIF:
睡眠时钟
6:
RES:
0
5:
P0IF:
PORT0中断发生
4:
T4IF:
定时器4中断发生
3:
T4IF:
定时器3中断发生
2:
T4IF:
定时器2中断发生
1:
T4IF:
定时器1中断发生
0:
DMAIF:
DMA中断发生
IRCON2(0XE8)
7:
RES:
0
6:
RES:
0
5:
RES:
0
4:
WDTIF:
看门狗
3:
P1IF:
PORT1
2:
UTX1IF:
USART1
1:
UTX0IF:
USART0
0:
P2IF:
PORT2
4电源管理和时钟频率
4.4设备有一个内部的系统时钟或者叫做主时钟,这个时钟源可以为系统提供16MHZ或32MHZ,时钟频率是由CLKCONCMD设置
还有一个32KHZ的时钟源,同样也是由CLKCONCMD设置,
CLKCONSTA是一个只读寄存器,可以获取当前时钟状态
时钟允许选择高频率的晶体振荡器或者低频率的RC振荡器,但是RF要求使用32MHZ的晶体振荡器
系统时钟是由CLKCONCMD.OSC设置,CLKCONCMD被设置的时候不会马上生效,需要等到CLKCONSTA.OSC=CLKCONCMD.OSC这是因为在频率变化的时候,需要一段时间等待频率稳定,同时,CLKCONCMD.CLKSPD反应了系统时钟频率,所以也是CLKCONCMD.OSC的镜子
16MHZ是校准的,一旦32MHZ已经稳定了,比如CLKCONSTA.OSC从1变成0
CLKCONCMD(0XC6)
BIT7:
OSC32K:
0:
32KHZXOSC
1:
32KHZRCOSC
BIT6:
OSC:
0:
32MHZXOSC
1:
16MHZRCOSC
BIT5:
3:
TICKSPD:
000:
32MHZ
001:
16MHZ
010:
8MHZ
011:
4MHZ
100:
2MHZ
101:
1MHZ
110:
500KHZ
111:
250KHZ
BIT2:
0:
CLKSPD:
同上
CLKCONSTA(0X9E),同上,
6FLASH控制器
6.1FLASH结构
FLASH存储器被分为2048B或者1024B每页,页是最小的擦除单元,32bit是最小的写入单元,
在写模式下,FLASH存储器通过写入是一个16bit的字地址寄存器FADDRH:
FADDRL访问
在擦除模式下,FLASH会擦除FADDRH[7:
1](CC2530/CC2531/CC2540/CC2541)或者FADDRH[6:
0](CC2533)的地址,所以这里就可以看出,前者是2K/页。
后者是1K/页,一个地址4个字节
6.2FLASH写操作