您的位置:首页 > 其它

zstack -Serial Boot Loader(串口下程序)

2015-07-08 19:58 507 查看
一直想同归串口给CC2530下程序,就看了一下官方的文档。里面讲的不是太详细,加上自己英语也不好。理解不了,胡乱瞎搞了两天,就成功了。今天做下总结.

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);
}

/**************************************************************************************************
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: