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

智能推荐

基于OpenCV的火焰检测(三)——HSI颜色判据-程序员宅基地

文章浏览阅读160次。上文向大家介绍了如何用最简单的RGB判据来初步提取火焰区域,现在我要给大家分享的是一种更加直观的判据——HSI判据。 为什么说HSI判据是更加直观的判据呢?老规矩,先介绍一下HSI色彩模型: HSI颜色模型用H、S、I三参数描述颜色特性,其中: H表示颜色的色调,它表示人的感官对不同颜色的感受,如红色、绿色、蓝色等,它也可表示一定范围的颜色,如暖色、冷色等..._c# 通过hsi进行颜色判断

实验四python程序设计之文件_python程序设计实验报告八:文件-程序员宅基地

文章浏览阅读560次。安徽工程大学Python程序设计实验报告班级物流191 姓名郭森学号3190505134 成绩日期2020.6.2 指导老师修宇实验八 文件【实验目的】掌握读写文本文件或 CSV 文件,进而对数据进行处理的方法。【实验条件】PC机或者远程编程环境【实验内容】完成二个编程题。1、水浒传词频统计水浒传-词频统计(1)描述使用词频统计的方法,生成《水浒传》出场次数最多的10个人物的姓名。(2..._根据所给素材:ctiyname.txt及不完整代码,参考创建项目,编写代码实现解析,并输出如

域名--泛解析-程序员宅基地

文章浏览阅读78次。背景:主域名下多数子域名访问后直接跳转至www域名的服务。百度百科--域名泛解析:在域名前添加任何子域名,均可访问到所指向的WEB地址。也就是客户的域名#.com之下所设的*.#.com全部。泛域名解析:利用通配符* (星号)来做次级域名以实现所有的次级域名均指向同一IP地址。子域名挖掘: 泛解析这个问题的解决方法很简单,向DNS请求*记录,然后把枚举子域名回来的..._dns枚举泛解析

基于对赋值为随机数的数组实现打印、求和及最大值、平均值的计算,排序问题_编写一个方法,对数组的元素用[0,100)之间的随机数进行初始化,初始化之后对数组进-程序员宅基地

文章浏览阅读206次。我们先定义一个数组x并为其分配储存空间,如下:int[] x=new x[100] 想要对数组中的每一个元素进行随机数赋值,需要用到循环控制语句,这里以for循环为例:定义一个变量i并赋值为0,作为for循环的起始条件;需要注意的是,数组的下标是从0开始的,比如x[0]到x[99],代表数组的长度为100。所以再写入判断语句的时候,不能写成a<=x.length;控制变量语句应写入自加语句。在循环体里,对x[a]进行随机数赋值,以0到100为例如图: 完成对x[a]的赋值之后,开始写入打印代_编写一个方法,对数组的元素用[0,100)之间的随机数进行初始化,初始化之后对数组进

为什么eMule总是未连接到服务器-程序员宅基地

文章浏览阅读1k次。<一>安装和版本问题1) eMule对Windows有什么要求?eMule能在Windows 95版本以上的Windows操作系统下运行。1个好的P2P软件需要好的拨号网络的支持,所以Windows 98和Windows ME的比较差网络运行情况可能会影响eMule的发挥;相对来说Windows 2000和Windows XP更适合使用eMule。2) 弹出错误信息说oleacc.dl..._emule v0.50b 最新服务器未连接

14 种编程语言书写关机脚本,真香_如何写强制关机脚本-程序员宅基地

文章浏览阅读2w次,点赞19次,收藏49次。批处理版本C 语言版本C++ 语言版本JAVA 语言版本C# 语言版本Python 语言版本NodeJS 语言版本PHP 语言版本Perl 语言版本Go 语言版本VB 语言版本SQL 语言版本树莓派 版本易语言 版本期待评论区故事的起源,有个家伙发来一个 BAT 的关机脚本,我顺手给改成了 八种语言的。_如何写强制关机脚本

随便推点

交流电过零点检测电路总结_交流过零检测电路-程序员宅基地

文章浏览阅读7.3k次,点赞3次,收藏32次。交流电的过零点检测方案较多,目前较常见的也是我之前所使用的方案如图1所示:图1 交流电光耦过零检测电路图1的电路可以检测到交流电经过零点的时间,但是它存在诸多的弊端,现列举如下:电阻消耗功率太大,发热较多。220V交流电,按照有效值进行计算三个47K的电阻平均每个电阻的功率为220^2/(3*47k)/3=114.42mw。对于0805的贴片电阻按照1/8w的功率计算,当前的消耗功率接近其额..._交流过零检测电路

MATLAB SOR统计滤波_sor滤波-程序员宅基地

文章浏览阅读202次。具体来说,我们采用了SOR算法求解图像中每个像素点周围的平均值,从而实现了一种基于统计特征的图像滤波方法。在本文中,我们将使用SOR算法实现统计滤波。具体来说,我们将考虑针对图像进行滤波,对于每一个像素点,我们将其周围的像素点取平均值,从而得到该像素点的新值。在本文中,我们将会讨论如何使用MATLAB实现SOR统计滤波。SOR算法是一种基于松弛因子的迭代算法,可以用于求解一般的n元线性方程组Ax=b。统计滤波是一种信号处理方法,旨在通过对信号的统计特征进行操作来实现滤波效果。MATLAB SOR统计滤波。_sor滤波

Qt TCP服务端和客户端连接_qtcpserver怎么回去客户端ip-程序员宅基地

文章浏览阅读3.3k次。前言传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。如需了解UDP与TCP对比,可点击了解UDP和TCP对比。下面简单介绍下T_qtcpserver怎么回去客户端ip

保研福利|九月CS保研冲刺大礼包!-程序员宅基地

文章浏览阅读20次。将原资料精简打包只为你能轻装上阵,冲刺梦校!▼志愿填报手册【九推版本】▼填报有疑问?九推无offer?这里有超详细的志愿填报指南,助你填报无忧!超周到的防鸽策略&捡漏策略,助你成功上岸!叮咚!九月份岛主发送的福利已经“上门”啦~亲,注意查收哦~

探秘MIP-NeRF:谷歌的实时三维重建新利器-程序员宅基地

文章浏览阅读371次,点赞5次,收藏5次。探秘MIP-NeRF:谷歌的实时三维重建新利器项目地址:https://gitcode.com/google/mipnerf项目简介MIP-NeRF 是由谷歌研究团队推出的一项创新性项目,它基于神经辐射场(NeRF)技术,旨在实现更高效、更真实的3D场景重建和渲染。该项目的目标是将复杂的三维建模过程简化为一个快速、实时的过程,让用户体验到前所未有的视觉效果。技术解析NeRF(神经辐射场...

poj1703 犯罪团伙 并查集_poj 团伙 倍增并查集-程序员宅基地

文章浏览阅读710次,点赞2次,收藏2次。 在讲解这个题目之前, 我不得不狠狠的吐槽cin和cout的效率, 我提交了6遍都是超时, 最后一遍提交时统统把cin和cout改为scanf和printf才过的, 当时心情又高兴又难受. 查看题目点击这里 Find them, Catch them POJ - 1703吐槽完了, 开始讲题. 第一次遇见这种题目是感觉满头痛的, 咦~, 并查集不是将关系是朋..._poj 团伙 倍增并查集