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

智能推荐

日语900句(衣食住行)PDF下载地址|百度云盘免费分享_日文原版pdf 百度云-程序员宅基地

文章浏览阅读1.5k次。有人说,金字塔的魅力就在于它完美的建筑结构,有坚实深厚的基础,才造就了塔尖的辉煌。 学好日语也是同样的道理,坚实的语言基础很多时候来源于大量的输入,量变达到质变,这种语言便能脱口而出,语感”则应运而生。本书为《日语900句,衣食住行》,围绕与现代生活息息相关的话题,分为“衣”、“食”、“住”、“行”四章,每章又分为若干个谈话主题,每个主题由日常用语一点通、经典句型、疯狂表达、疯狂对话、词句荟萃、疯狂链接和经典影像观摩几部分组成。其中日常用语一点通是一些与话题相关的经典表达,比较生活化,不乏幽默、风趣_日文原版pdf 百度云

android opengl es 2d,Android OpenGL ES 2.0 - glReadPixels()和glTexImage2D()绘制黑色纹理?-程序员宅基地

文章浏览阅读510次。我正在研究一些Android代码,用于在丢失和重新创建EGL上下文之间缓存和重绘帧缓冲区对象的颜色缓冲区。开发主要发生在运行Honeycomb的Xoom平板电脑上。无论如何,我想要做的是将直接ByteBuffer中的FBO调用glReadPixels()的结果存储起来,然后将该缓冲区与glTexImage2D()一起使用并将其拖回(现在已清除)帧缓冲区。所有这些似乎工作正常 - 根据Java无法理..._android glreadpixels 黑

windows远程桌面实现之一 (抓屏技术总览 MirrorDriver,DXGI,GDI)_getframedirtyrects-程序员宅基地

文章浏览阅读2.9w次,点赞20次,收藏103次。by fanxiushu 2017-06-14 转载或引用请注明原始作者要实现远程桌面功能,首先要做的就是桌面图片的截取,而且要达到比较流畅的视觉效果,需要到达每秒20帧以上。截取桌面图片,就是定时截取windows桌面的图片,随便怎么都能做到,好像挺简单的。通用的做法就是GetDC(GetDesktokWindow() )获取桌面的DC,然后使用Creat_getframedirtyrects

Python+Selenium简单实现Web自动化测试_使用python+selenium进行简单的自动化测试用例-程序员宅基地

文章浏览阅读2k次,点赞6次,收藏40次。这篇文章是入门级别的应用Python + Selenium进行自动化测试,包括环境搭建及简单的实例。基本思想是用Firefox Selenium IDE插件录制脚本并生成Python代码,用Python结合Selenium及浏览器驱动程序执行脚本。操作系统是Windows,过程中有不明白的地方记得百度下,比如不知道如何打开Windows CMD命令行、不知道如何设置环境变量等,因为本文的前提是读者已有一定的基础知识。安装Python,访问其官网www.python.org下载最新版本,建议选择Pytho._使用python+selenium进行简单的自动化测试用例

outlook2016 修改保存路径-程序员宅基地

文章浏览阅读5k次。http://blog.csdn.net/mergerly/article/details/50008529 (Outlook 2016 pst/ost邮件数据文件迁移实现)_outlook 2016 for mac 更改邮件存放路径

CubeMX+VSCode+Ozone的STM32开发工作流(二)VSCode环境配置_fpv4-sp-d16-程序员宅基地

文章浏览阅读4.5k次,点赞11次,收藏38次。使用arm gnu 工具链编译调试stm32程序,支持daplink和jlink、stlink_fpv4-sp-d16

随便推点

Excel 2010 VBA 入门 139 创建工作簿级的自定义选项卡_excel主选项卡的自定义为什么任何工作薄都能使用-程序员宅基地

文章浏览阅读2k次。题自定义选项卡,使得该设置仅对某个工作簿有效。码创建自定义选项卡的XML文件,将其添加进Excel工作簿文件中。步骤1 创建一个文件夹,将其命名为“customUI”。步骤2 打开“记事本”程序,在其中输入以下内容:<customUI xmlns="://schemas.microsoft.com/office/2009/07/customi"> <ribbon> <tabs> <tab id="customTab" labe.._excel主选项卡的自定义为什么任何工作薄都能使用

nxlog windows安装部署-程序员宅基地

文章浏览阅读2.7k次,点赞2次,收藏3次。nxlog 介绍 nxlog 是用 C 语言写的一个跨平台日志收集处理软件。其内部支持使用 Perl 正则和语法来进行数据结构化和逻辑判断操作。不过,其最常用的场景。是在 windows 服务器上,作为 logstash 的替代品运行。同时它也支持Linux、Android系统。官方下载地址:http://nxlog.co/products/nxlog-community-edit..._nxlog 绿色安装

nginx反向代理结合keepalived实现高可用_–no-header-程序员宅基地

文章浏览阅读1k次。一、概念正向代理正向代理最大的特点是客户端非常明确要访问的服务器地址。服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。总结  始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。客户端必须设置正向代理服务器,当然前提是要知道正向代理服务器的IP地址,还有代理程序的_–no-header

第七篇 STM32CubeMX创建STM32工程之TIM定时器实验_stm32cubemx怎么生成tim.c-程序员宅基地

文章浏览阅读206次。时间计算stm32f103c8t6时钟72M,进行7200分频得到1M信号,1M信号每计数5000进行一次跳变,频率为1hz,周期为1s。该工程配置时晶振选用的无源晶振,第二篇LED的配置中晶振为有源晶振,请读者在配置自己的工程时注意。该程序程序实现LED的翻转,每500ms跳变一次,周期为1S。2.配置毫秒定时器,定时时间500ms。1.配置LED引脚,参考第一篇。1.修改user.c代码如下。3.开启定时器更新中断。_stm32cubemx怎么生成tim.c

STK 11.6 (AGI System Tool Kit)安装包 Matlab与STK互联仿真_stk11 软件下载地址-程序员宅基地

文章浏览阅读1.7w次,点赞26次,收藏33次。软件安装包版本包含stk9.2,stk10,stk11.01,stk11.6。都可与matlab进行互联仿真。stk11.6包含官方各种附加模块,如EOIR,Analyzer,Schedule等等,同时可以用其他软件调用stk进行实时界面显示。同时本人承接stk仿真, matlab 与stk 互联仿真, matlab, GUI等方面项目,可以在咸鱼或添加微信私聊,也可以看博客其他内容介绍..._stk11 软件下载地址

Oracle数据库从入门到精通系列之十九:CDB、PDB、非CDB、SGA、PGA、重做日志、数据文件、临时文件、控制文件、闪回日志、表空间、连接Oracle数据库-程序员宅基地

文章浏览阅读47次。重做日志是由一组物理文件组成的,这些文件被称为重做日志文件组。这样,在数据库发生故障时,可以使用重做日志文件来恢复数据库到故障发生前的状态。重做日志的作用在于保证数据库的一致性和持久性,以及在数据库发生故障时,可以使用重做日志来恢复数据库到故障发生前的状态。总之,非CDB环境下的数据库实例是一种传统的单租户数据库实例,虽然不能实现多租户功能,但在一些特定的场景下,仍然具有一定的应用价值。Oracle数据库的重做日志(Redo Log)是一种记录数据库所有修改操作的机制,它可以保证数据库的持久性和一致性。