zstack -Serial Boot Loader(串口下程序)
2015-07-08 19:58
507 查看
1首先打开$INSTALL_DIR$\Projects\zstack\Utilities\BootLoad\CC253x\Boot.eww。就是boot文件。
打开
编译看有没有错误,有可能出现
Error[e72]:SegmentPDATA_Zmustbedefinedinasegmentdefinitionoption(-Z,-bor-P)
我在网上找到了解决方法;http://feibit.com/forum.php?mod=viewthread&tid=9459
没有错误就可以下载进去了CC2530
第二部分,生成bin文件,
TI给的文档很详细,照着做就行了。有三点要注意
1TI给的3条命令要修改成自己的名字(第一条不改)命令之间加空格。
"$PROJ_DIR$\..\..\..\Tools\CC2530DB\oad.exe"
"$PROJ_DIR$\RouterEB\Exe\GenericApp.sim"
"$PROJ_DIR$\RouterEB\Exe\GenericApp.bin"
2定义关键字MAKE_CRC_SHDW
3.CRCShadow把他改成一样
最后连好串口,打开官方下载软件就下载成功了
下载进去就会发现第一次可以跳转。重启之后就不行了。这是因为有两个按键控制的跳转。
*@fnmain
*
*@briefC-codemainfunctionality.
*
*inputparameters
*
*None.
*
*outputparameters
*
*None.
*
*@returnNone.
**************************************************************************************************
*/
voidmain(void)
{
vddWait(VDD_MIN_RUN);//检查电压
HAL_BOARD_INIT();//初始化时钟,按键P0_1p2-0
if(sbImgValid())//代码是否有效CRCShadow匹配
{
if((SB_UART_DELAY==0)||ResetWasWatchDog)//看门狗复位就会直接跳转到代码区(上电只执行一次串口下载)
{
sblJump();//接跳转到代码区
}
sblInit();//初始化串口
sblWait();//跳转等待
}
else
{
sblInit();//初始化串口
}
vddWait(VDD_MIN_NV);//检查写flsh电压
sblExec();//写入代码
HAL_SYSTEM_RESET();
}
*@fnsblExec
*
*@briefInfiniteSBLexecuteloopthatjumpsuponreceivingacodeenable.
*
*inputparameters
*
*None.
*
*outputparameters
*
*None.
*
*@returnNone.
**************************************************************************************************
*/
staticvoidsblExec(void)
{
uint32dlyCnt=0;
while(1)
{
HalUARTPollISR();
if(sbExec()&&sbImgValid())
{
SB_TURN_ON_LED1();
SB_TURN_ON_LED2();
//DelaytoallowtheSB_ENABLE_CMDresponsetobeflushed.
for(dlyCnt=0;dlyCnt<0x40000;dlyCnt++)
{
HalUARTPollISR();//串口写代码
}
sblJump();//跳转
}
elseif(dlyCnt++&0x4000)
{
SB_TOGGLE_LED1();
}
}
}
/**************************************************************************************************
*@fnsblInit
*
*@briefSBLinitialization.
*
*inputparameters
*
*None.
*
*outputparameters
*
*None.
*
*@returnNone.
*/
staticvoidsblInit(void)
{
halUARTCfg_tuartConfig;
/*ThisisinplaceofcallingHalDmaInit()whichwouldrequireinitoftheother4DMA
*descriptorsinadditiontojustChannel0.
*/
HAL_DMA_SET_ADDR_DESC0(&dmaCh0);
HalUARTInitISR();
uartConfig.configured=TRUE;
uartConfig.baudRate=HAL_UART_BR_115200;
uartConfig.flowControl=FALSE;
uartConfig.flowControlThreshold=0;//CC2530by#define-seehal_board_cfg.h
uartConfig.rx.maxBufSize=0;//CC2530by#define-seehal_board_cfg.h
uartConfig.tx.maxBufSize=0;//CC2530by#define-seehal_board_cfg.h
uartConfig.idleTimeout=0;//CC2530by#define-seehal_board_cfg.h
uartConfig.intEnable=TRUE;
uartConfig.callBackFunc=NULL;
HalUARTOpenISR(&uartConfig);
SB_INIT_LEDS();
}
/**************************************************************************************************
*@fnsblJump
*
*@briefExecuteasimplelongjumpfromnon-bankedSBLcodetonon-bankedRCcodespace.
*
*inputparameters
*
*None.
*
*outputparameters
*
*None.
*
*@returnNone.
*/
staticvoidsblJump(void)
{
SB_TURN_ON_LED1();
SB_TURN_ON_LED2();
//while(SB1_PRESS||SB2_PRESS);判断按键
SB_TURN_OFF_LED1();
SB_TURN_OFF_LED2();
asm("LJMP0x2000\n");//Immediatejumptorun-code.
HAL_SYSTEM_RESET();//复位
}
/**************************************************************************************************
*@fnsblWait
*
*@briefAtimed-outwaitloopthatexitsearlyuponreceivingaforcecode/sblbyte.
*
*inputparameters
*
*None.
*
*outputparameters
*
*None.
*
*@returnNone.
**************************************************************************************************
*/
staticvoidsblWait(void)
{
uint32dlyCnt=SB_UART_DELAY;
while(1)
{
uint8ch;
HalUARTPollISR();//读串口数据,等待命令。
if(HalUARTReadISR(&ch,1))
{
if(ch==SB_FORCE_BOOT)
{
break;
}
elseif(ch==SB_FORCE_RUN)
{
dlyCnt=0;
}
}
if(SB1_PRESS)//如果P0_1为高就跳出(进入下载模式)
{
break;
}
if(SB2_PRESS||(dlyCnt--==0))//((dlyCnt--==0))P2_0位高或者等待1分到就跳转
{
sblJump();
}
//RR-xingLEDdisplaywhilewaiting.
if(dlyCnt&0x2000)
{
SB_TURN_OFF_LED2();
SB_TURN_ON_LED1();
}
else
{
SB_TURN_OFF_LED1();
SB_TURN_ON_LED2();
}
}
SB_TURN_OFF_LED1();
SB_TURN_OFF_LED2();
}
/**************************************************************************************************
*@fnvddWait
*
*@briefLoopwaitingfor16readsoftheVddovertherequestedlimit.
*
*inputparameters
*
*@paramvdd-Vddleveltowaitfor.
*
*outputparameters
*
*None.
*
*@returnNone.
**************************************************************************************************
*/
staticvoidvddWait(uint8vdd)
{
uint8cnt=16;
do{
do{
ADCCON3=0x0F;
while(!(ADCCON1&0x80));
}while(ADCH<vdd);
}while(--cnt);
}
/**************************************************************************************************
*/
相关文章推荐
- 凸优化:ADMM(Alternating Direction Method of Multipliers)交替方向乘子算法系列之六: L1-Norm Problems
- 网络请求回来json数据时去空格以及标示符
- android系统语言设置对app本身的影响
- 易經大意原稿(頁單位) 051-075
- Objective-C字符串处理
- vmware安装CentOS6.4详细步骤
- Python Web初学解惑之 WSGI、flup、fastcgi、web.py的关系
- 莫队算法
- HTTP协议中PUT和POST使用上的区别
- 随笔2
- Xcode设置项之Architectures和Valid Architectures
- CGI相关介绍
- I2C总线-I2C总线介绍
- HTML+CSS实现导航页
- mapreduce在hive中执行成功,在beeline中执行失败的问题解决
- 如何利用phpize在生产环境中为php添加新的扩展php-bcmath
- jdbc 连接mysql数据库
- CGI简介
- S3C2440 Linux下的I2C驱动以及I2C体系下对EEPROM进行读写操作。
- leetcode 012 —— Integer to Roman