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

智能推荐

【优化选址】基于粒子群算法求解V图配电网电动汽车充电站选址优化问题附Matlab实现-程序员宅基地

文章浏览阅读88次。本文将介绍基于粒子群算法求解V图配电网电动汽车充电站选址优化问题算法流程。随着电动汽车的普及,充电站的建设变得越来越重要。如何在充电站数量有限的情况下,选取最优的位置,是一个需要解决的问题。本文将从以下几个方面进行介绍:一、问题描述 在V图配电网中,选取一些节点建设充电站,使得每个节点到最近的充电站的距离最小,同时保证所有充电站的容量之和不小于需求总量。该问题可以用数学模型表示如下:二、粒子群算法 粒子群算法是一种群体智能算法,模拟鸟群捕食时的行为,通过群体协作来寻找最优解。

【计算机毕业设计】医院门诊互联电子病历管理信息系统_毕设医院门诊系统-程序员宅基地

文章浏览阅读339次。管理员登陆后,主要模块包括首页、个人中心、用户管理、医生管理、项目分类管理、项目信息管理、预约信息管理、检查信息管理、检查报告管理、药品分类管理、药品信息管理、电子病历管理、系统管理等功能。用户登陆后,主要模块包括首页、个人中心、预约信息管理、检查信息管理、检查报告管理、药品信息管理、电子病历管理等功能。return R.ok("密码已重置为:123456");return R.error("用户已存在");return R.error("账号不存在");return R.error("用户已存在");_毕设医院门诊系统

7-26 单词长度 (C语言)_c语言单词长度你的程度要读入-程序员宅基地

文章浏览阅读1.5k次。7-26 单词长度 (15 分)你的程序要读入一行文本,其中以空格分隔为若干个单词,以.结束。你要输出每个单词的长度。这里的单词与语言无关,可以包括各种符号,比如it’s算一个单词,长度为4。注意,行中可能出现连续的空格;最后的.不计算在内。输入格式:输入在一行中给出一行文本,以.结束提示:用scanf(&quot;%c&quot;,…);来读入一个字符,直到读到.为止。输出格式:在一行中输出这行文本对应的..._c语言单词长度你的程度要读入

QCustomPlot的下载和使用_qcustomplot下载-程序员宅基地

文章浏览阅读668次。QCustomPlot是一个基于Qt画图和数据可视化的C++控件。在Qt下的绘图工具有Qwt、QChart和QCustomPlot,置于选择哪个绘图工具各有优缺点。在绘制大量数据(10万个点以上)时选择QCustomPlot,在数据量比较小时,QChart和QCustomPlot相差无几。_qcustomplot下载

【云原生 | 从零开始学istio】一、Istio介绍—服务网格-程序员宅基地

文章浏览阅读2.2k次,点赞16次,收藏24次。介绍了istio的功能以及什么是istio_istio

python必读三本书_自学Python6个月后,我发现学Python必看这三本书,让你少走一半弯路!...-程序员宅基地

文章浏览阅读772次。我是在半年前接触到Python的,我之前没有一点编程基础,但在我自学的这半年里,我发现自己越来越喜欢他,迄今为止,Python都非常友好并且易于学习!它几乎可以做任何事,从简单的脚本创建、web、到数据可视化以及AI人工智能,越来越多的人投身到Python的怀抱中。接下来我给大家推荐3本自学Python必看的书籍,会帮你少走很多弯路!1.《A Byte of Python》没错,这是一本全英文版的..._学习pathon必看书

随便推点

element-ui 设置table表头/单元格居中_elementui表头居中-程序员宅基地

文章浏览阅读7k次,点赞12次,收藏17次。vue_elementui表头居中

基于深度学习的推荐系统(一)Overview_cnn 推荐系统文献-程序员宅基地

文章浏览阅读2k次。这是对近年来基于深度学习的推荐系统的内容的一份综述,具体来说,大部分内容来自Deep Learning based Recommender System: A Survey and New Perspectives,我翻译和总结了其中的一些内容。同时,我有时也会阅读该survey提到的工作的原文,并对某些更具体的内容做一些补充。正文开始深度学习近年来在各个领域都被广泛应用,推荐系统也不例外,..._cnn 推荐系统文献

UE4_碰撞_使用蓝图控制物体移动时如何让被阻挡_ue中怎么让阻挡消失-程序员宅基地

文章浏览阅读280次。利用蓝图更改一个物体的位置,发现本来两个应该相互阻挡的物体被穿过去了。为了不让相互阻挡的物体被穿过去,我们需要设置好蓝图节点的参数Sweep。_ue中怎么让阻挡消失

ARM Cortex-M架构基本概念-程序员宅基地

文章浏览阅读1.5k次。R13寄存器可以作为stack pointer,SP用于记录当前堆栈的地址,当在不同任务中切换时,SP用于保存上下文(一般来说,SP寄存器中的地址是当前正在执行的指令所在的地址)Cortex-m0中可以将SP细化成MSP和PSP:在应用程序中,需要特权访问时使用MSP,例如异常访问和系统内核访问;R14可用于链式寄存器,主要功能:(1)用于保存子程序或者一个程序调用的返回地址 (2)当程序调用结束后,将LR中的返回地址加载到程序计数器(PC)中。(1)R0-R7可以被任意指令访问。_arm cortex-m

中国裁判文书网爬虫分析[email protected]程序员宅基地

文章浏览阅读8.7k次,点赞8次,收藏14次。前言本篇主要分析文书网爬虫思路,仅供个人学习之用,切勿用于任何商业用途。分析一中国裁判文书网首页地址:http://wenshu.court.gov.cn/ 随便点击一下搜索,进入: 进入第一个结果: 注意圆圈中的下载按钮,点击下载,一个.docx格式的文档就安安稳稳的躺在你的电脑硬盘上了。 到这里初步分析结束,我们自然就想到了爬虫的内容: [email protected]

Open3D 读取、显示、保存图片_open3d 保存图片不显示-程序员宅基地

文章浏览阅读10w+次,点赞3次,收藏5次。open3d实现图片、图像数据的读取显示和保存。_open3d 保存图片不显示

推荐文章

热门文章

相关标签