zstack -Serial Boot Loader(串口下程序)_vddwait(vdd_min_run);-程序员宅基地

技术标签: 文档  ZigBee  zstack  BootLoad  

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

  1 首先打开$INSTALL_DIR$\Projects\zstack\Utilities\BootLoad\CC253x\Boot.eww。就是boot文件。

       

打开


编译看有没有错误,有可能出现

Error[e72]: Segment PDATA_Z must be defined in a segment definition option (-Z, -b or -P)

我在网上找到了解决方法;http://feibit.com/forum.php?mod=viewthread&tid=9459

没有错误就可以下载进去了CC2530


第二部分,生成bin文件,

TI给的文档很详细,照着做就行了。有三点要注意

1 TI给的3条命令要修改成自己的名字(第一条不改) 命令之间加空格

"$PROJ_DIR$\..\..\..\Tools\CC2530DB\oad.exe" 

"$PROJ_DIR$\RouterEB\Exe\GenericApp.sim"

 "$PROJ_DIR$\RouterEB\Exe\GenericApp.bin"


2定义关键字MAKE_CRC_SHDW


3. CRC Shadow 把他改成一样


最后连好串口,打开官方下载软件就下载成功了




下载进去就会发现第一次可以跳转。重启之后就不行了。这是因为有两个按键控制的跳转。



/**************************************************************************************************
 * @fn          main
 *
 * @brief       C-code main functionality.
 *
 * input parameters
 *
 * None.
 *
 * output parameters
 *
 * None.
 *
 * @return      None.
 **************************************************************************************************
 */
void main(void)
{
  vddWait(VDD_MIN_RUN);//检查电压
  HAL_BOARD_INIT();//初始化时钟,按键 P0_1 p2-0

  if (sbImgValid()) //代码是否有效 CRC Shadow 匹配
  {
    if ((SB_UART_DELAY == 0) || ResetWasWatchDog)//看门狗复位就会直接跳转到代码区(上电只执行一次串口下载)
    {
      sblJump();//接跳转到代码区
    }

    sblInit();//初始化串口
    sblWait();//跳转等待
  }
  else
  {
    sblInit();//初始化串口
  }

  vddWait(VDD_MIN_NV);//检查写flsh电压
  sblExec();//写入代码
  HAL_SYSTEM_RESET();
}

/**************************************************************************************************
 * @fn          sblExec
 *
 * @brief       Infinite SBL execute loop that jumps upon receiving a code enable.
 *
 * input parameters
 *
 * None.
 *
 * output parameters
 *
 * None.
 *
 * @return      None.
 **************************************************************************************************
 */
static void sblExec(void)
{
  uint32 dlyCnt = 0;

  while (1)
  {
    HalUARTPollISR();

    if (sbExec() && sbImgValid())
    {
      SB_TURN_ON_LED1();
      SB_TURN_ON_LED2();
      // Delay to allow the SB_ENABLE_CMD response to be flushed.
      for (dlyCnt = 0; dlyCnt < 0x40000; dlyCnt++)
      {
        HalUARTPollISR();//串口写代码
      }

      sblJump();//跳转
    }
    else if (dlyCnt++ & 0x4000)
    {
      SB_TOGGLE_LED1();
    }
  }
}

/**************************************************************************************************
 * @fn          sblInit
 *
 * @brief       SBL initialization.
 *
 * input parameters
 *
 * None.
 *
 * output parameters
 *
 * None.
 *
 * @return      None.
 */
static void sblInit(void)
{
  halUARTCfg_t uartConfig;
  /* This is in place of calling HalDmaInit() which would require init of the other 4 DMA
   * descriptors in addition to just Channel 0.
   */
  HAL_DMA_SET_ADDR_DESC0(&dmaCh0);

  HalUARTInitISR();
  uartConfig.configured           = TRUE;
  uartConfig.baudRate             = HAL_UART_BR_115200;
  uartConfig.flowControl          = FALSE;
  uartConfig.flowControlThreshold = 0;  // CC2530 by #define - see hal_board_cfg.h
  uartConfig.rx.maxBufSize        = 0;  // CC2530 by #define - see hal_board_cfg.h
  uartConfig.tx.maxBufSize        = 0;  // CC2530 by #define - see hal_board_cfg.h
  uartConfig.idleTimeout          = 0;  // CC2530 by #define - see hal_board_cfg.h
  uartConfig.intEnable            = TRUE;
  uartConfig.callBackFunc         = NULL;
  HalUARTOpenISR(&uartConfig);

  SB_INIT_LEDS();
}

/**************************************************************************************************
 * @fn          sblJump
 *
 * @brief       Execute a simple long jump from non-banked SBL code to non-banked RC code space.
 *
 * input parameters
 *
 * None.
 *
 * output parameters
 *
 * None.
 *
 * @return      None.
 */
static void sblJump(void)
{
  SB_TURN_ON_LED1();
  SB_TURN_ON_LED2();
 // while (SB1_PRESS || SB2_PRESS);判断按键
  SB_TURN_OFF_LED1();
  SB_TURN_OFF_LED2();
  asm("LJMP 0x2000\n");  // Immediate jump to run-code.
  HAL_SYSTEM_RESET();//复位
}

/**************************************************************************************************
 * @fn          sblWait
 *
 * @brief       A timed-out wait loop that exits early upon receiving a force code/sbl byte.
 *
 * input parameters
 *
 * None.
 *
 * output parameters
 *
 * None.
 *
 * @return      None.
 **************************************************************************************************
 */
static void sblWait(void)
{
  uint32 dlyCnt = SB_UART_DELAY;

  while (1)
  {
    uint8 ch;

    HalUARTPollISR();//读串口数据,等待命令。
    if (HalUARTReadISR(&ch, 1))
    {
      if (ch == SB_FORCE_BOOT)
      {
        break;
      }
      else if (ch == SB_FORCE_RUN)
      {
        dlyCnt = 0;
      }
    }

    if (SB1_PRESS)//如果P0_1为高就跳出(进入下载模式)
    {
      break;
    }

    if(SB2_PRESS || (dlyCnt-- == 0)) //(  (dlyCnt-- == 0)) P2_0位高或者等待1分到就跳转
    {
      sblJump();
    }

    // RR-xing LED display while waiting.
    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();
}

/**************************************************************************************************
 * @fn          vddWait
 *
 * @brief       Loop waiting for 16 reads of the Vdd over the requested limit.
 *
 * input parameters
 *
 * @param       vdd - Vdd level to wait for.
 *
 * output parameters
 *
 * None.
 *
 * @return      None.
 **************************************************************************************************
 */
static void vddWait(uint8 vdd)
{
  uint8 cnt = 16;

  do {
    do {
      ADCCON3 = 0x0F;
      while (!(ADCCON1 & 0x80));
    } while (ADCH < vdd);
  } while (--cnt);
}

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


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pangtao1991/article/details/46807783

智能推荐

get新技能!把学校饭卡复制到小米手环NFC版本上_nfc_reader_crack-程序员宅基地

文章浏览阅读7.8k次,点赞3次,收藏32次。*严正声明:本文仅限于技术讨论与分享,严禁用于非法途径。hello!大家好,欢迎来到网络安全情报局,网络安全特工将持续为您分享最新资讯、干货。也可以关注我的公众号:网络安全情报局,获取最新消息。一、NFC是什么?NFC是Near Field Communication缩写,即近距离无线通讯技术。由飞利浦公司和索尼公司共同开发的NFC是一种非接触式识别和互联技术,可以在移动设备、消费类电子产品、PC和智能控件工具间进行近距离无线通信。NFC功能提供了一种简单、触控式的解决方案,可以让消费者简单_nfc_reader_crack

[转]Discuz! X3.0最新研发进度【提前预览】_discuzx3.0-程序员宅基地

文章浏览阅读1.2k次。【Discuz! X3.0研发进度-曝光】1、离Discuz! X2.5发布已有半年时间,很多站长和我一样,想了解下Discuz!产品的最新动态,咱们研发团队最近都在忙什么呢?  这段时间我们把主要精力放在了Discuz! 新产品的研发上了,在优化和完善Discuz! X2.5百项功能的基础上,开发Discuz! X3.0,目前Discuz! X3.0已进入最后攻坚阶段_discuzx3.0

DB2对SEQUENCE进行授权_db2 sequence授权-程序员宅基地

文章浏览阅读1k次。场景:在A模式下创建了序列TEST_SEQ,但是当B模式使用该序列时发现报错。此时就需要对B模式授权。具体步骤如下A模式下执行授权:grant usage on sequence igw.TEST_SEQ to ipay;B模式下创建别名:create or replace alias ipay.TEST_SEQ for sequence igw.TEST_SEQ这样模式A和B可以共用..._db2 sequence授权

qt5.9+vtk7.1.1+pcl1.8.1(使用qvtkWidget控件显示)_#include "qvtkwidget.h-程序员宅基地

文章浏览阅读571次,点赞3次,收藏3次。1.new file or project2.Qt Console A…3.add qvtkWidget.proSOURCES += \ main.cpp \ mainwindow.cppHEADERS += \ mainwindow.hFORMS += \ mainwindow.uiINCLUDEPATH += /usr/include/eigen3INCLUDEPATH += /usr/local/include/v_#include "qvtkwidget.h

UE5常用操作_ue5怎么隐藏摄像机-程序员宅基地

文章浏览阅读270次。使用ctrl+B跳转到对应object目录。_ue5怎么隐藏摄像机

2023全国职业院校技能大赛“云计算应用”赛项_全国大学生云计算大赛-程序员宅基地

文章浏览阅读3.9k次,点赞5次,收藏11次。2023全国云计算应用赛项对比2022国赛改点:改点一:由个人赛改为双人团体赛改点二:openstack版本还是采用2022年国赛版本Train版,k8s版本从v1.22.1升级为v1.25改点三:公有云部分新增边缘计算改点四:私有云30分不变,容器云由于原来的40分减少到30分,而公有云从30分增加到40分改点五:时间由三天改为一天有关于比赛任何问题或需要备赛提前了解环境的选手欢迎加q私聊学习交流省赛、国赛、职业院校技能大赛_全国大学生云计算大赛

随便推点

【机器学习】高斯回归过程GPR_高斯过程回归 kriging-程序员宅基地

文章浏览阅读418次。我是知识的搬运工_高斯过程回归 kriging

[Win32SDK基本]ListView Controls(1)Report (details) View 详解_syslistview32l 换行-程序员宅基地

文章浏览阅读7k次,点赞5次,收藏16次。本文由CSDN用户zuishiko所作,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/46872885老规矩,先上MSDN:https://msdn.microsoft.com/en-us/library/windows/desktop/bb774737(v=vs.85).aspx其实还是子窗口,static那节_syslistview32l 换行

QT 网络编程(一)-程序员宅基地

文章浏览阅读1.1k次,点赞38次,收藏20次。Qt 网络编程相关

软工视频总结-程序员宅基地

文章浏览阅读614次。经过十天的时间,对软工视频进行一下简单的总结。软工视频总共有24讲,一讲大约50分钟。前3章介绍软工视频的历史。 第 6 讲 1.需求分析的任务就是借助于当前系统的逻辑模型导出目标系统的逻辑模型,解决,目标系统的“做什么”的问题。 2.问题识别的另一项工作是建立分析所需要的通信途径,以保证能顺利地对问题进行分析。

python bad magic number_科学网-python反编译软件推荐uncompyle6-Bad magic number in .pyc-陈照强的博文...-程序员宅基地

文章浏览阅读2.6k次。背景从友方那边获得了pyc文件,但是由于他当时用的是python2.6编译的,而现在python2.6几乎被淘汰掉了,安装了python2.7 等其他版本无法运行该pyc文件,报错 RuntimeError: Bad magic number in .pyc file 。安装了python 2.6 后,运行该文件不报错,但是依赖模块openbabel,openbabel在python2.6中安装稍..._bad magic number in .pyc file

C语言中的数组(1)-程序员宅基地

文章浏览阅读902次,点赞29次,收藏17次。一维数组的创建和初始化,一维数组的使用,一维数组在内存中的存储,以及计算数组元素的个数的方法。

推荐文章

热门文章

相关标签