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

智能推荐

探秘GA-BP:一款强大的遗传算法与反向传播神经网络集成工具-程序员宅基地

文章浏览阅读411次,点赞4次,收藏7次。探秘GA-BP:一款强大的遗传算法与反向传播神经网络集成工具项目地址:https://gitcode.com/Grootzz/GA-BP项目简介GA-BP 是一个开源项目,它结合了遗传算法(Genetic Algorithm, GA)和反向传播(Backpropagation, BP)神经网络,旨在为机器学习和优化问题提供一种创新的解决方案。由开发者Grootzz维护,该项目提供了Pytho..._ga bpnn csdn

8个Python必备的PyCharm插件_pycharm常见插件-程序员宅基地

文章浏览阅读2k次,点赞28次,收藏35次。大家好,在PyCharm中浏览插件列表并尝试很多人推荐的插件后,总结了几个瑰宝插件,它们各自以独特的方式帮助开发者快速、简便、愉悦地开发,接下来将逐个介绍它们。_pycharm常见插件

java面试题之volatile和synchronized的使用方法和区别_javasynchronized和volatile面试题-程序员宅基地

文章浏览阅读8.3k次,点赞11次,收藏36次。我们先来看一下Java 内存模型中的可见性、原子性和有序性。可见性:可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。原子性:原子是世界上的最小单位,具有不可分割性。synchronized块之间的操作就具备原子性。volatile关键字定义的变量就可以做到这一点,Java还有两个关键字能实现可见性,即synchronized和final。有序性..._javasynchronized和volatile面试题

morphologyEx 形态学_morph_dilate-程序员宅基地

文章浏览阅读2.1k次。概念利用morphologyEx这个函数可以方便的对图像进行一系列的膨胀腐蚀组合。函数讲解●函数原型○c++void morphologyEx( InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1,-1), int iterations..._morph_dilate

查询字符串中指定字符的索引 python_寻找字符串i think hope中字符串hope的索引-程序员宅基地

文章浏览阅读959次。查询字符串中指定字符的索引_寻找字符串i think hope中字符串hope的索引

基于单片机科学计算器系统仿真设计-protues仿真全套资料_protues仿真计算器-程序员宅基地

文章浏览阅读179次。软件设计主要包括系统初始化、键盘扫描与处理、数学运算实现、LCD显示控制和时间显示控制等部分。数学运算实现负责根据用户输入的表达式执行相应的运算,并处理可能出现的异常情况。全局变量在设计中得到了统一的管理和使用,提高了代码的可读性和可维护性。通过实验验证,本系统能够正确识别用户输入的表达式,并执行相应的数学运算。本文设计了一种基于单片机的科学计算器系统仿真设计,实现了基本的数学运算、时间显示和错误提示等功能。因此,本文设计了一种基于单片机的科学计算器系统,旨在实现更丰富的数学运算功能和更好的用户体验。_protues仿真计算器

随便推点

推出 TensorFlow 图神经网络 (GNNs)-程序员宅基地

文章浏览阅读1.1k次。发布人:Sibon Li、Jan Pfeifer、Bryan Perozzi 和 Douglas Yarrington日前,我们很高兴发布了 TensorFlow 图神经网络 (Graph..._图神经网络是用thesfolw吗

产生死锁的必要条件_不是产生线程死锁的必要条件是 一个进程因请求资源而阻塞时,对已获得的资源保特不-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏2次。产生死锁的原因主要是:(1) 因为系统资源不足。(2) 进程运行推进的顺序不合适。(3) 资源分配不当等。如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可能产生死锁。产生死锁的四个必要条件:(1)互斥条件:一个资源每次只能被一个进程使用。(2)请求与保持条件(占有等待):..._不是产生线程死锁的必要条件是 一个进程因请求资源而阻塞时,对已获得的资源保特不

android软件安装到平板,新人看过来 安卓平板装机必备软件推荐-程序员宅基地

文章浏览阅读1.6k次。1平板与PC的桥梁:豌豆荚、91【PConline 应用】前几天我们为大家简单对比介绍了一下不同第三方安卓电子市场之间的差异。如今,安卓平板已经到手,也知道哪些电子市场好了,开始疯狂装软件呗。停!急切体验各种应用、游戏的心情可以理解,但不假思索的看见叫QQ的就下载,它真的适合你手中的平板吗?辛苦下载了20款软件,结果试用一圈后发现18个都不给力,这岂不是既浪费时间又影响心情。说的可能有点夸张,但如..._平板电脑装什么小程序可以用安卓手机

Spring-aop的四种增强方式_spring aop增强方法-程序员宅基地

文章浏览阅读144次。java_spring aop增强方法

ubuntu18.04安装cuda9.0+cudnn+tf_ubuntu 18.04 cuda 9-程序员宅基地

文章浏览阅读4.5k次。1.禁用nouveau安装完ubuntu18.04后,在“软件和更新“---附加驱动,会有驱动如果没有,那就自己去安装。首先,需要禁用 nouveau,只有在禁用掉 nouveau 后才能顺利安装 NVIDIA 显卡驱动。禁用方法就是在 /etc/modprobe.d/blacklist-nouveau.conf 文件中添加一条禁用命令,首先需要打开该文件,通过以下命令打开: ..._ubuntu 18.04 cuda 9

时序分解模型 | Matlab基于EMD-GWO-SVR基于经验模态分解和灰狼算法优化支持向量机的时间序列预测-程序员宅基地

文章浏览阅读208次。时序分解模型 | Matlab基于EMD-GWO-SVR基于经验模态分解和灰狼算法优化支持向量机的时间序列预测

推荐文章

热门文章

相关标签