cc2530下载程序

lesson2 Zigbee的硬件相关及IO操作 (2)PxDIR寄存器介绍:P0DIR、P1DIR、P2DIR,负责管理所有IO口处于输入状态还是输出状态。(1)PxSEL寄存器介绍:P0SEL、P1SEL、P2SEL,负责管理所有IO处于普通IO还是片上外设。CC2530芯片可以直接操作IO口,不需要像51单片机那样使用之前先定义引脚sbit xxx=Px^x;比如想要配置P1_0为输出功能。相较于基本工作电路多了。 阅读详情
 

 外部mcu通过调试接口对CC2530进行编程,基本的功能函数如下:
<p>
//--cc2530 Debug commands---
#define CMD_CHIP_ERASE   0x10
#define CMD_WR_CONFIG    0x18
#define CMD_RD_CONFIG    0x20
#define CMD_READ_STATUS  0x30
#define CMD_RESUME       0x48
#define CMD_DEBUG_INSTR  0x50
#define CMD_BURST_WRITE  0x80
#define CMD_GET_CHIP_ID  0x68
//---------------------------

#define LOBYTE(w) ((unsigned char)(w))
#define HIBYTE(w) ((unsigned char)(((unsigned short)(w) >> 8) & 0xFF))

#define FCTL        0x6270
#define FADDRL      0x6271
#define FADDRH      0x6272
#define FWDATA      0x6273

#define DBGDATA     0x6260 //DMA register
#define X_DMAARM    0x70D6   //  DMA Channel Arm   
#define X_DMAREQ    0x70D7
#define X_DMA1CFGL  0x70D2   //  DMA Channel 1-4 Configuration Address Low Byte
#define X_DMA1CFGH  0x70D3   //  DMA Channel 1-4 Configuration Address High Byte  

// Buffers
#define ADDR_BUF0        0x0000 // 1K,存放来自调试接口的数据,长度为1K,0x0000--0x03FF
#define ADDR_DMA_DESC    0x0400 // 从0x0400地址开始存放16字节的数据
#define PROG_BLOCK_SIZE  0xFD

// DMA Channels
#define CH_DBG_TO_BUF0   0x02 //使用通道1
#define CH_BUF0_TO_FLASH 0x04 //使用通道2

//--mcu使用的下载接口引脚,可以根据具体的mcu修改----
sbit DcPin = PADBUF^5;
sbit DdPin = PADBUF^3;
sbit ResetPin = PADBUF^1;

sbit DcPinDir  = PADCON1^5;
sbit DdPinDir  = PADCON1^3;
sbit ResetPinDir = PADCON1^1;
//-------------------------------------------------------------------------

void Delayus(unsigned short us)
{
        while(us--)
        {
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
                _nop_();
        }
}

/*********************************************************************************
 * Writes a byte on the debug interface. Sets the direction of port 0 at the end.
 * DdPin must be output when this function is called.
 * param:
   num---Byte to write
  dir---Direction of all pins on port 0 that is to be written at the end.
*********************************************************************************/
void cc2530_Write_Debug_Byte(unsigned char num, unsigned char dir)
{
 unsigned char i;
 
 for (i=0; i<8; i++)
 {  
  DdPin = (num&0x80) ? 1 : 0;     
  DcPin = 1;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  _nop_();   
  num <<= 1;       
  DcPin = 0; //在时钟的下降沿把数据输出               
 }
 
 DdPinDir = dir;  
}

/*****************************************************
 * Reads a byte from the debug interface.
 * Requires DdPin to be input when function is called.
 * return:
      Byte read
*****************************************************/
unsigned char cc2530_Read_Debug_Byte(void)
{
 unsigned char i,num;
   
 for (i = 0; i < 8; i++)
 {  
  DcPin = 1; // clock out data  
  num <<= 1;  
  num |= DdPin;  
  DcPin = 0;  
 }
   
 return num;
}

/**********************************************************************************************************************
 * brief Issues a command on the debug interface. Only commands that return one
 * param:
   cmd---Command byte
  input_bytes---Pointer to the array of input bytes
  num_input_bytes---The number of input bytes
 * return Data:
  returned by command
**********************************************************************************************************************/
unsigned char cc2530_Write_Debug_Command(unsigned char cmd, unsigned char *input_bytes, unsigned short num_input_bytes)
{  
 unsigned short i;  
 unsigned char output = 0;  
 unsigned char dir;
       
 dir = (num_input_bytes == 0) ? 0 : 1;//如果没有输入字节,把方向改为输入  
 cc2530_Write_Debug_Byte(cmd, dir);
     
 for(i = 0; i < num_input_bytes; i++)
 {      
  dir = (i == num_input_bytes-1) ? 0 : 1;//在最后一个字节把方向改为输入  
  cc2530_Write_Debug_Byte(input_bytes[i], dir);  
 }
       
 while( DdPin&1 ) //等待cc2530的引脚方向改变完成,拉低此引脚,说明cc2530已经准备好输出数据
 {  
  cc2530_Read_Debug_Byte();  
 }
     
 output = cc2530_Read_Debug_Byte();
 
 //重新配置SDI引脚为输出
 DdPinDir = 1;

 return output;
}

/*************************************
* 读取cc2530的ID值
* 参数:
*   buf:输出数据缓存,2个字节
*************************************/
void cc2530_Get_Id(unsigned char *buf)
{
 cc2530_Write_Debug_Byte(CMD_GET_CHIP_ID,0);

 while( DdPin&1 ) //等待cc2530的引脚方向改变完成,拉低此引脚,说明cc2530已经准备好输出数据
 {  
  cc2530_Read_Debug_Byte();  
 }
     
 buf[0] = cc2530_Read_Debug_Byte();
 buf[1] = cc2530_Read_Debug_Byte();
}

/*************************************************************************
 * write a byte to the XDATA in the DUP

 * param:
 *    address----XDATA address
   values---the bytes to write
 *************************************************************************/
void cc2530_Write_Xdata_Memory(unsigned short address, unsigned char value)
{
 unsigned char instr[3];
 
 instr[0] = 0x90;  
 instr[1] = HIBYTE(address);  
 instr[2] = LOBYTE(address);  
 cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 3, instr, 3); //MOV DPTR,#data16
 

 instr[0] = 0x74; //把立即数送到寄存器A    
 instr[1] = value;    
 cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 2, instr, 2); //MOV A,#data
 
 instr[0] = 0xF0; //把数据从寄存器A写入外部RAM    
 cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 1, instr, 1); //MOVX @DPTR,A
    
}

/**********************************************************************************************************
 * Writes a block of data to the XDATA region in the DUP
 * param:
      address---XDATA start address
      values---Pointer to the array of bytes to write
    num_bytes---Number of bytes to write
***********************************************************************************************************/
void cc2530_Write_Xdata_Memory_Block(unsigned short address, const unsigned char *values, unsigned short num_bytes)
{
 unsigned char instr[3];
 unsigned short i;
 
 instr[0] = 0x90;  
 instr[1] = HIBYTE(address);  
 instr[2] = LOBYTE(address);  
 cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 3, instr, 3); //MOV DPTR,#data16
 
 for (i = 0; i < num_bytes; i++)
 {
  instr[0] = 0x74; //把立即数送到寄存器A    
  instr[1] = values[i];    
  cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 2, instr, 2); //MOV A,#data
  
  instr[0] = 0xF0; //把数据从寄存器A写入外部RAM    
  cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 1, instr, 1); //MOVX @DPTR,A
  
  instr[0] = 0xA3; //增加数据指针    
  cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 1, instr, 1);//INC DPTR
 }
}

/***********************************************************
 * Read a byte from a specific address in XDATA in the DUP

 * param:
 *    address----XDATA address

 * return Value
 *    read from XDATA
 ***********************************************************/
unsigned char cc2530_Read_Xdata_Memory(unsigned short address)
{
 unsigned char instr[3];

 instr[0] = 0x90;  
 instr[1] = HIBYTE(address);  
 instr[2] = LOBYTE(address);  
 cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 3, instr, 3); //MOV DPTR,#data16  
 
 instr[0] = 0xE0; //把外部RAM(16为地址)的值写入寄存器A  
 return cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 1, instr, 1); //MOVX A,@DPTR
}

/************************************************************************************************************
 * 读取cc2530 xdata区的数据
 * 参数:
 *   address:xdata区地址
 *   pOutBuf:输出数据缓存
 *   num_bytes:要读取的数据长度
 * 返回值:
 *   无
 ***********************************************************************************************************/
void cc2530_Read_Xdata_Memory_Block(unsigned short address, unsigned char *pOutBuf, unsigned short num_bytes)
{
 unsigned char instr[3];
 unsigned short i;

 instr[0] = 0x90;  
 instr[1] = HIBYTE(address);  
 instr[2] = LOBYTE(address);  
 cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 3, instr, 3); //MOV DPTR,#data16
 
 for( i=0; i<num_bytes; i++ )
 {
  instr[0] = 0xE0; //把外部RAM(16为地址)的值写入寄存器A  
  pOutBuf[i] = cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 1, instr, 1); //MOVX A,@DPTR

  instr[0] = 0xA3; //增加数据指针    
  cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 1, instr, 1); //INC DPTR
 }
}

/****************************************************
 * 写cc2530的sfr寄存器
 * 参数:
 *   address:寄存器地址
 *   value:要写入的值
 * 返回值:
 *   无
 ***************************************************/
void cc2530_Write_Sfr(unsigned char address,unsigned char value)
{
 unsigned char instr[3];
     
 instr[0] = 0x75;//移动一个立即数到直接地址,此处即把bank值写入寄存器address
    instr[1] = address;
 instr[2] = value;
 cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 3, instr, 3); //MOV direct,#data
}

/****************************************************
 * 读取cc2530的sfr寄存器
 * 参数:
 *   address:寄存器地址
 * 返回值:
 *   寄存器中的值
 ***************************************************/
unsigned char cc2530_Read_Sfr(unsigned char address)
{
 unsigned char instr[2];
 
 instr[0] = 0xE5;//把寄存器0x9F中的值写入寄存器A
    instr[1] = address;
 return cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 2, instr, 2);//MOV A,direct   
}

/********************************************************************
 * 依次把数据写入到调试接口
 * 参数:
 *   buf:要写入的数据缓存
 *   num_bytes:要写入的数据字节数
 ********************************************************************/
void cc2530_Burst_Write(unsigned char *buf, unsigned char num_bytes)
{
 unsigned char i;
 
 cc2530_Write_Debug_Byte( CMD_BURST_WRITE, 1 );  
 cc2530_Write_Debug_Byte( num_bytes, 1 );
 
 for(i=0; i<num_bytes-1; i++)
 {
  cc2530_Write_Debug_Byte(buf[i], 1); //
 }
 
 cc2530_Write_Debug_Byte(buf[i], 0); // change dir. to input
 
 while( DdPin&1 )
 {
  cc2530_Read_Debug_Byte();
 }
 
 cc2530_Read_Debug_Byte(); // ignore output
 
 //重新配置SDI引脚为输出
 DdPinDir = 1;
}

/******************************************************************************************************************
* 往cc2530的flash中写入数据
* 参数:
*   lAddr:flash中的线性地址
*   buf:写入数据缓存
*   num_bytes:要写入的字节数
* 返回值:
*   无
*******************************************************************************************************************/
void cc2530_Write_Code_Memory(unsigned long lAddr, unsigned char *buf, unsigned char num_bytes)
{    
 unsigned short sAddr;
     unsigned char dma_desc[16] =
 {
  // Debug Interface -> Buffer 0 (Channel 1)  
  HIBYTE(DBGDATA),   // src[15:8]  
  LOBYTE(DBGDATA),   // src[7:0]
  
  HIBYTE(ADDR_BUF0),  // dest[15:8]  
  LOBYTE(ADDR_BUF0),  // dest[7:0]
  
  HIBYTE(PROG_BLOCK_SIZE),  
  LOBYTE(PROG_BLOCK_SIZE),
  
  31,                      // trigger DBG_BW  
  0x11,                    // increment destination
  
  // Buffer 0 -> Flash controller (Channel 2)
  HIBYTE(ADDR_BUF0),   // src[15:8]  
  LOBYTE(ADDR_BUF0),   // src[7:0]
  
  HIBYTE(FWDATA),    // dest[15:8]  
  LOBYTE(FWDATA),    // dest[7:0]
  
  HIBYTE(PROG_BLOCK_SIZE),  
  LOBYTE(PROG_BLOCK_SIZE),
  
  18,                     // trigger FLASH  
  0x42,                  // increment source   
 };//此处只配置了通道1与通道2,通道1把调试接口输入的数据搬移到ADD_BUF0开始的xdata空间,通道2把ADD_BUF0处的数据写入flash
 
 sAddr = (unsigned short)(lAddr>>2);//由于写入flash时是字(4字节)寻址的,用16位地址(64K)访问256k的空间,256K=64*4

 dma_desc[5] = dma_desc[13] = num_bytes;
     
 // Write the 2 DMA descriptors  
 cc2530_Write_Xdata_Memory_Block(ADDR_DMA_DESC, dma_desc, 16);// 16 bytes,从0x0400地址开始存放dma_desc数组中的数据
     
 // Set the pointer to the DMA descriptors  
 cc2530_Write_Xdata_Memory(X_DMA1CFGH, HIBYTE(ADDR_DMA_DESC));  
 cc2530_Write_Xdata_Memory(X_DMA1CFGL, LOBYTE(ADDR_DMA_DESC));    
   
 cc2530_Write_Xdata_Memory(FADDRH, HIBYTE(sAddr));//设置flash的地址  
 cc2530_Write_Xdata_Memory(FADDRL, LOBYTE(sAddr));    
         
 cc2530_Write_Xdata_Memory(X_DMAARM, CH_DBG_TO_BUF0);//把数据从调试接口搬移到xdata区  
 cc2530_Burst_Write(buf,num_bytes);    
 
 // wait for write to finish  
 while(cc2530_Read_Xdata_Memory(FCTL) & 0x80);
     
 // start programming current buffer  
 cc2530_Write_Xdata_Memory(X_DMAARM, CH_BUF0_TO_FLASH);  
 cc2530_Write_Xdata_Memory(FCTL, 0x06); //把数据从xdata区写入flash中
     
 // Programming last buffer in progress, wait until done  
 while(cc2530_Read_Xdata_Memory(FCTL) & 0x80);
}

/******************************************************************************************************************
* 读取cc2530flash中的代码
* 参数:
*   sAddr:bank区中的地址值,其中bank0:0x0000--0x7FFF, bank1-bankn:0x8000--0xFFFF
*   bank:对应的bank值
*   pOutBuf:输出数据缓存
*   num_bytes:要读取的字节数
* 返回值:
*   无
* 对应flash中的线性地址(linear address)与bank值和bank中的地址对应的计算公式如下:
* 如果sAddr<0x8000, linear address = sAddr;
* 如果sAddr>=0x8000,linear address = (sAddr&0x7fff) + bank*0x8000
*******************************************************************************************************************/
void cc2530_Read_Code_Memory(unsigned short sAddr, unsigned char bank, unsigned char *pOutBuf, unsigned char num_bytes)
{ 
 unsigned char i;
 unsigned char instr[3];
       
    instr[0] = 0x75;//移动一个立即数到直接地址,此处即把bank值写入寄存器0x9F
    instr[1] = 0x9F;
 instr[2] = bank;
 cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 3, instr, 3);

 instr[0] = 0x90;  
 instr[1] = HIBYTE(sAddr);  
 instr[2] = LOBYTE(sAddr);  
 cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 3, instr, 3);
 
 for( i=0; i<num_bytes; i++)
 {
  instr[0] = 0xE4; //清寄存器A        
  cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 1, instr, 1);
  
  instr[0] = 0x93; //把数据从外部RAM写入寄存器A    
  pOutBuf[i] = cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 1, instr, 1);
  
  instr[0] = 0xA3; //增加数据指针    
  cc2530_Write_Debug_Command(CMD_DEBUG_INSTR | 1, instr, 1);
 } 
}

//配置下载主控器的编程引脚
void mcu_Init_Debug_Io()
{
 unsigned char debug_config;
 unsigned short X_CLKCONCMD = 0x70C6;
 unsigned short X_CLKCONSTA = 0x709E;

 //引脚方向性选择,初始化配置调试接口为输出
 DdPinDir = 1;//0->输入,1->输出
 DcPinDir = 1;
 ResetPinDir = 1;

 ResetPin = 1; //初始化复位引脚为高电平
 DcPin = 0; //初始化时钟电平为低电平
 DdPin = 0;
 Delayus(10);   //大约延时24us

 //在复位线拉低的情况下,输出两个clk
 ResetPin = 0;
 Delayus(10);

 DcPin = 1;
 _nop_();
 _nop_();
 _nop_();
 DcPin = 0;
 _nop_();
 _nop_();
 _nop_();

 DcPin = 1;
 _nop_();
 _nop_();
 _nop_();
 DcPin = 0;
 _nop_();
 _nop_();
 _nop_();

 Delayus(10);
 ResetPin = 1;      

 debug_config = 0x22;  
 cc2530_Write_Debug_Command(CMD_WR_CONFIG, &debug_config, 1);
     
 // Switch to 32 Mhz and wait for it to be stable. This is recommended if  
 // 32 MHz crystal is available during programming. If 32 MHz crystal is  
 // not available, comment out these two lines.  
 cc2530_Write_Xdata_Memory(X_CLKCONCMD, 0x80);  
 while(cc2530_Read_Xdata_Memory(X_CLKCONSTA) != 0x80);
}

//主控器通过调试接口擦除cc2530
void mcu_Erase_Cc2530()
{
 cc2530_Write_Debug_Command(CMD_CHIP_ERASE, 0, 0);  
 while(cc2530_Write_Debug_Command(CMD_READ_STATUS, 0, 0) & 0x80);//查询擦除是否完成,擦除完成后最高位清0
}
</p>

用SmartRF04EB仿真器给TI CC2530下载程序:IAR工程配置与硬件连接实操 本文详细介绍了使用SmartRF04EB仿真器为TI CC2530下载程序的完整流程,包括硬件连接规范、驱动配置、IAR工程设置及调试技巧。通过实操步骤和常见问题解决方案,帮助开发者高效完成物联网设备的程序烧录,提升开发效率。特别适合使用CC2530芯片和IAR Embedded Workbench的开发者参考。 阅读详情

相关推荐

zigbee初级教程(零) : cc2530开发环境搭建

0、开发环境搭建 设备需求: Zigbee 的开发环境主要是在 IAR 集成开发上面实现的,Zigbee 开发设备需求: 1、CC2530 核心板加带下载接口的底板 2、IAR 集成开发环境,推荐使用 8.1 以上版本,兼容 WIN 7、WIN8 、win10 ,使用方便。 3、Smart RF04EB 仿真器或者 CC Deb...

柚子君的小窝 1万+

CC2530-ZigBee下载程序

之前要用ZigBee(CC2530),但是程序用IAR烧不进去。后来用这个软件,就行了。 ①随便在那个编译器,编译程序生成.hex文件 ②用此软件烧录.hex文件。只需要连接班长上程序下载接口就行了。 软件示意图如下所示: ...

weixin_42571453的博客 5306

zigbee cc2530环境搭建及程序开发大概流程

首先要安装IAR   IAR Embedded Workbench 是一个用单片机程序开发的集成开发环境,它对CC2530提供完美的支持 直接按照提示一步步安装就好 注意:别忘了使用IAR注册机 安装好了之后可以先使用IAR新建一个工程 尝试着编译一下 具体的新建工程步骤及编译时工程的设置我就不在这里粘贴了 网上很多教程都有 注意要实现编译成功 且有生成 然后再

wszzyy的博客 4527

第十二次博文:免费教你从官网中下载全部AD库,保姆级别!

1:电脑打开官网网址: Other Installers | User Manual | Documentation (altium.com)https://www.altium.com/documentation/other_installers#!libraries2:将网页划到 网页3/10 位置,看见如图 含有 Libraries 字样 3:打开第一个 点一下 “ + ’”号,将看到如图。蓝色表明的就是我们需要安装的 AD库了,然后下载,再解压,再到...

weixin_49492286的博客 1万+

CC2530硬件平台调试小结

自己设计的PCB板子,在焊上元器件之后,经反复检查有无漏焊、短路的故障,确定没有问题以后,就需要进行下一步检查——上电下载程序验证功能。本文档就着眼于这一问题,总结自己在实践操作中遇到的一些奇怪的现象和自己解决问题的办法,以摸索规律,分享经验,供大家一起交流。 一,搭建环境 1,编译环境的搭建。使用的IAR Embedded Workbench IDE 作为编译环境。该软件安装方法简单。就不多

shanekong的专栏 4427

zigbee CC2530 系列教程 2 软件开发平台的搭建

所有课程见此链接: zigbee CC2530 系列教程 0 课程介绍 IAR集成开发环境搭建及程序下载调试 相信物联网在近几年的电子产品领域大家都有所耳闻,而zigbee作为无线传输领域中的佼佼者,也将在未来的物联网领域中大显身手,相信对此感兴趣的爱好者都已经摩拳擦掌了,那么在学习了前面章节的关于zigbee概要介绍,大家已经对zigbee有了一个系统而简要的认识,从此章开始我们将要...

连志安 3972

CC2530 批量 程序下载 校验失败

碰到问题,做了一批CC2530的板子,已经焊接样板测试过,是没有问题的。做了70片的时候,发现所有的烧录不了程序,提示校验失败。 解决思路: 1.核查图纸,明确了电路板PCB生产无问题 2.检查CC2530焊接,重新焊接了几片2530,发现CC2530无问题。 3.找了一个空板,焊接下载接口及CC2530,发现无法识别设备。 4.明确程序烧录无需晶振。 5.接上最小系统的56kΩ的电阻

NightIsDark的博客 978

精通IAR与CC2530:开发与调试实战指南

本文详细介绍了在IAR开发环境中针对CC2530节点的软件安装、工程创建、烧写工具使用、协议栈安装、网络监测工具部署以及调试过程。通过实际操作步骤,为读者展示了如何从零开始搭建一个基于8051的IAR应用程序,并对编译、下载和调试程序进行了细致的说明。

weixin_32324637的博客 450

CC2530-Note2:程序下载及仿真

1、仿真器小TIP 2、视图终端 3、在线调试

weixin_52531526的博客 613

CC2530程序下载工具

CC2530程序下载工具

cc2530模块底板电路图

CC2530模块底板有三种模块接口,有下载口、四个按键、4个LED灯,引脚全部引出,方便开发使用,已经验证过了,板子没有问题的

CC2530初始学习记录

第一次运行CC2530例程报错 是由于电脑环境不同引起的。应将路径选择到自己安装IAR软件的路径中(我的安装路径在F盘,从8051开始选择一样的路径和文件): 并且在不同的板子上程序下载前需要按复位键,硬件未连接好会报错如下: ...

qq_45725659的博客 355

CC2530 ALTIUM AD集成库文件(原理图库+PCB库).zip

CC2530 ALTIUM AD集成库文件(原理图库+PCB库).IntLib后缀文件,拆分后文件为PcbLib+SchLib格式,Altium Designer原理图库+PCB封装库,已在项目中验证使用,可以直接应用到你的项目开发。

01_IAR新建CC2530工程

由于很多Zigbee商家提供的教程未有从零建立CC2530工程的讲解,可能会导致后面的开发中出现一些琐碎的问题。本文将以**LED流水灯**为例,从0到1用**IAR**建立CC2530工程。

nanxl1的博客 3000

CC2530-AD.rar_CC2530 AD pudn_cc2530_cc2530 ad_cc2530 ad_cc253

CC2530 A/D 转换程序设计软件,非常实用的程序

极具性价比的步进电机驱动芯片-TMC2226/TMC2209使用小结

TMC2226/2209相对于TMC2660C、TMC5160来说,价格低了很多,同时功能并没有太多阉割。对比TMC5160,少了内部加减速曲线,电流足够(Ipeak = 2.8A),相对5160而言功能也很足够,所以毫无疑问TMC2226是极具性价比的步进驱动芯片。

Trinamic_TMC的博客 7008

CC2530 Flash读写测试程序

CC2530 Flash读写测试程序 去发现同类优质开源项目:https://gitcode.com/ 此仓库提供了一款自主开发的CC2530 Flash存储器读写测试程序。本程序包含了擦除、写入和读取等功能的函数实现,并配备了测试程序,是一个完整的IAR工程,用户可以方便地直接使用。 本程序具有以下特点: 支持CC2530 Flash存储器的读写操作。 提供了擦除、写入和读取等功能的函数。 配...

gitblog_06795的博客 289

把外部系统一键装进 SAP Build Work Zone:从零开始创建 HTML5 URL App

HTML5 URL App 是一种轻量级解决方案,可将外部网页或系统入口快速集成到SAP企业门户中。开发者只需在manifest.json中配置目标URL、导航模式等参数,无需开发完整前端应用。该方案利用SAP BTP的HTML5 Application Repository集中存储静态资源,通过HTML5 Apps Content Provider将应用暴露给子账号,最终在SAP Build Work Zone中以Fiori磁贴形式呈现。文章详细介绍了manifest.json的关键配置、三种基础设施组件

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 241

Serial Boot Loader for CC2530 资料整理

1 参考网址 http://processors.wiki.ti.com/index.php/CC253x_Serial_Boot_Loader Serial Boot Loader for CC2530 Soc https://wenku.baidu.com/view/dfd0e8112cc58bd63086bd8b.html C:\Texas Instruments\ZStack-CC2530...

abc 1610

YOLOv11改进 | Conv/卷积篇 | 利用Hype-YOLO提出MANet增强YOLOv11特征提取能力

本文给大家带来的最新改进机制是由Hype-YOLO提出的MANet结构,其是一种C3、C2f、C3k2的升级版,用于增强特征提取能力。MANet可以理解为C2f的升级版,其整合了DSConv和C2f结构,这些模块的组合使得信息流动更加丰富,有助于在训练过程中提高梯度流动,从而增加基础特征的语义深度。官方发布的数据中HypeYOLO的精度是高于YOLOv11的,本文内容包含MAnet替换C3k2的教程以及原理介绍。欢迎大家订阅我的专栏一起学习YOLO,购买专栏读者联系读者入群获取进阶项目文件!

Snu77的博客 2160

进阶06:C#连接TwinCAT 3使用ADS通讯

本文介绍了使用C#通过ADS协议与倍福TwinCAT3 PLC通讯的实现方法。主要内容包括:1)在两台电脑上安装TwinCAT3开发环境并建立网络连接;2)在TwinCAT中定义变量和结构体;3)使用C# Winform开发界面,通过TwinCAT.Ads.dll实现读写功能;4)实现主动读取和通知两种数据获取方式。详细说明了连接建立、变量定义、读写操作及事件通知的实现代码。该方案实现了对PLC寄存器数据的实时监控和操作,为工业控制系统的开发提供了参考。

weixin_38637405的博客 3688

IAR编译ZStack-CC2530为可下载运行的HEX文件的正确配置

【按:对一个技术人员来说,最痛苦的事莫过于按照手册和教程的说明把工作都做好以后却怎么也呈现不出想要的结果。       这两天来一直在做Zstack-CC2530的实验,读了手册也看了教程,却怎么也做不出应该有的结果,一度陷入绝望中~~今天偶然看到一篇说IAR配置的文章,才恍然大悟~TI啊!!你发布Zstack的时候为什么不把IAR该有的配置都配置好呢!!白白浪费了两天的时间啊,你还我时间!!  

虫子牛虻——我和我的影子 574

矢量网络分析仪校准:原理、方法与系统适配性

矢量网络分析仪(VNA)校准是射频测量的关键环节,通过误差建模(12项误差项)和标准件测量,可将系统不确定度从±5dB降至±0.1dB以下。主流校准方法包括SOLT(适用于同轴系统)和TRL(适用于波导系统),二者在标准件、误差重点及频率上限等方面存在显著差异。随着6G与量子通信的发展,动态实时校准将成为新趋势。工程师需根据传输结构、频率范围及精度需求选择合适方法,确保测量精度。

u014344410的博客 262
上一篇: 80C51存储器与C51内存优化
下一篇: 每个程序员都应该知道的8个Linux命令
sygdp21
博客等级 码龄20年 39粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值