dsp 28377在线升级 实例总结
使用dsp品台28377d来实现在线升级的功能。
方案 : 升级程序 + 应用程序
升级程序 : 主要的目的是将上位机发送过来的应用程序数据(ccs编译生成的.bin文件)烧写到指定位置,之后在跳转到应用程序执行。
应用程序 : 等待升级的程序
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------
升级代码段 :
flash_programming_cpu01.c
//#########################################################################
// FILE: flash_programming_cpu01.c
// TITLE: Flash Programming Example for F2837xD.
//
//! \addtogroup dual_example_list
//! <h1> Flash Programming </h1>
//!
//! This example demonstrates F021 Flash API usage.
//
//#########################################################################
// $TI Release: F2837xD Support Library v170 $
// $Release Date: Mon Sep 21 16:52:10 CDT 2015 $
// $Copyright: Copyright (C) 2013-2015 Texas Instruments Incorporated -
// http://www.ti.com/ ALL RIGHTS RESERVED $
//######################################################################### #include "F28x_Project.h" // Device Headerfile and Examples Include<span style="white-space:pre"> </span>File
#include "F2837xD_Ipc_drivers.h" #include <string.h> //Include Flash API example header file
#include "flash_programming_c28.h" #define ENTRYADDR 0x88000 extern void lightflash(void); //*************************************************************************
// FILE Flash API include file
//*************************************************************************
#include "F021_F2837xD_C28x.h" //Data/Program Buffer used for testing the flash API functions
#define WORDS_IN_FLASH_BUFFER 3608 // Programming data buffer, words uint16 Buffer[WORDS_IN_FLASH_BUFFER + ];
uint32 *Buffer32 = (uint32 *)Buffer; #pragma DATA_SECTION(pbuffer , "PDATASAVE");
uint16 pbuffer[WORDS_IN_FLASH_BUFFER]= {
#include "P_DATA.h"
}; //*************************************************************************
// Prototype of the functions used in this example
//*************************************************************************
void Example_CallFlashAPI(void); //*************************************************************************
// This is an example code demonstrating F021 Flash API usage.
// This code is in Flash
//*************************************************************************
void main(void)
{
// Step 1. Initialize System Control:
// Enable Peripheral Clocks
// This example function is found in the F2837xD_SysCtrl.c file.
InitSysCtrl(); IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH); InitGpio(); InitPieCtrl(); IER = 0x0000;
IFR = 0x0000; InitPieVectTable(); EINT; // Enable Global interrupt INTM // Jump to RAM and call the Flash API functions
Example_CallFlashAPI(); DELAY_US(); static void (*APPEntry)(void); APPEntry = (void (*)(void))(ENTRYADDR); ESTOP0; (*APPEntry)(); while(); } //*************************************************************************
// Example_CallFlashAPI
//
// This function will interface to the flash API.
// Flash API functions used in this function are executed from RAM
//*************************************************************************
#pragma CODE_SECTION(Example_CallFlashAPI , "ramfuncs");
void Example_CallFlashAPI(void)
{
uint32 u32Index = ;
uint16 i = ; Fapi_StatusType oReturnCheck;
volatile Fapi_FlashStatusType oFlashStatus; // Gain pump semaphore
SeizeFlashPump(); EALLOW;
Flash0EccRegs.ECC_ENABLE.bit.ENABLE = 0x0;
EDIS; EALLOW; oReturnCheck = Fapi_initializeAPI(F021_CPU0_BASE_ADDRESS, );//for now keeping it out if(oReturnCheck != Fapi_Status_Success)
{
// Check Flash API documentation for possible errors
while();
} oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);
if(oReturnCheck != Fapi_Status_Success)
{
// Check Flash API documentation for possible errors
while();
} oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,
(uint32 *)ENTRYADDR); while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){} // In this case just fill a buffer with data to program into the flash.
for(i=, u32Index = ENTRYADDR; (u32Index < (ENTRYADDR + WORDS_IN_FLASH_BUFFER))&& (oReturnCheck ==Fapi_Status_Success); i=i+, u32Index = u32Index + )
{
oReturnCheck = Fapi_issueProgrammingCommand((uint32 *)u32Index,&pbuffer[i],
,
,
,
Fapi_DataOnly); while(Fapi_checkFsmForReady() == Fapi_Status_FsmBusy); if(oReturnCheck != Fapi_Status_Success)
{
// Check Flash API documentation for possible errors
while();
} // Read FMSTAT register contents to know the status of FSM after
// program command for any debug
oFlashStatus = Fapi_getFsmStatus();
} // Leave control over flash pump
ReleaseFlashPump();
}
第98行的函数 :
void Example_CallFlashAPI(void)
将数据烧写到地址为0x88000地址为首地址的flash内存当中。并且函数在ramfunc中运行,ramfunc和首地址的跳转在cmd文件中有体现
2837xD_FLASH_lnk_cpu1.cmd MEMORY
{
PAGE : /* Program Memory */
/* Memory (RAM/FLASH) blocks can be moved to PAGE1 for dataallocation */
/* BEGIN is used for the "boot to Flash" bootloader mode */ BEGIN : origin = 0x080000, length = 0x000002
RAMM0 : origin = 0x000122, length = 0x0002DE
RAMD0 : origin = 0x00B000, length = 0x000800
RAMLS0 : origin = 0x008000, length = 0x000800
RAMLS1 : origin = 0x008800, length = 0x000800
RAMLS2 : origin = 0x009000, length = 0x000800
RAMLS3 : origin = 0x009800, length = 0x000800
RAMLS4 : origin = 0x00A000, length = 0x000800
RAMGS14 : origin = 0x01A000, length = 0x001000
RAMGS15 : origin = 0x01B000, length = 0x001000
RESET : origin = 0x3FFFC0, length = 0x000002 /* Flash sectors */
FLASHA : origin = 0x080002, length = 0x001FFE /* on-chipFlash */
FLASHB : origin = 0x082000, length = 0x002000 /* on-chipFlash */
FLASHC : origin = 0x084000, length = 0x002000 /* on-chipFlash */
FLASHD : origin = 0x086000, length = 0x002000 /* on-chipFlash */
FLASHE : origin = 0x088000, length = 0x008000 /* on-chipFlash */
FLASHF : origin = 0x090000, length = 0x008000 /* on-chipFlash */
FLASHG : origin = 0x098000, length = 0x008000 /* on-chipFlash */
FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chipFlash */
FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chipFlash */
FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chipFlash */
FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chipFlash */
FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chipFlash */
FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chipFlash */
FLASHN : origin = 0x0BE000, length = 0x002000 /* on-chipFlash */ PAGE : /* Data Memory */
/* Memory (RAM/FLASH) blocks can be moved to PAGE0 for programallocation */ BOOT_RSVD : origin = 0x000002, length = 0x000120 /* Part ofM0, BOOT rom will use this for stack */
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chipRAM block M1 */
RAMD1 : origin = 0x00B800, length = 0x000800 RAMLS5 : origin = 0x00A800, length = 0x000800 RAMGS0 : origin = 0x00C000, length = 0x001000
RAMGS1 : origin = 0x00D000, length = 0x001000
RAMGS2 : origin = 0x00E000, length = 0x001000
RAMGS3 : origin = 0x00F000, length = 0x001000
RAMGS4 : origin = 0x010000, length = 0x001000
RAMGS5 : origin = 0x011000, length = 0x001000
RAMGS6 : origin = 0x012000, length = 0x001000
RAMGS7 : origin = 0x013000, length = 0x001000
RAMGS8 : origin = 0x014000, length = 0x001000
RAMGS9 : origin = 0x015000, length = 0x001000
RAMGS10 : origin = 0x016000, length = 0x001000
RAMGS11 : origin = 0x017000, length = 0x001000
RAMGS12 : origin = 0x018000, length = 0x001000
RAMGS13 : origin = 0x019000, length = 0x001000 CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400
CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400
} SECTIONS
{
/* Allocate program areas: */
.cinit : > FLASHB PAGE = , ALIGN()
.pinit : > FLASHB, PAGE = , ALIGN()
.text : >> FLASHB | FLASHC | FLASHD PAGE = ,ALIGN()
codestart : > BEGIN PAGE = , ALIGN()
ramfuncs : LOAD = FLASHD,
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = , ALIGN() /* Allocate uninitalized data sections: */
.stack : > RAMM1 PAGE =
.ebss : >> RAMLS5 | RAMGS0 | RAMGS1 PAGE =
.esysmem : > RAMLS5 PAGE = /* Initalized sections go in Flash */
.econst : >> FLASHF | FLASHG | FLASHH PAGE = ,ALIGN()
.switch : > FLASHB PAGE = , ALIGN() .reset : > RESET, PAGE = , TYPE = DSECT /* not used,*/ Filter_RegsFile : > RAMGS0, PAGE = SHARERAMGS0 : > RAMGS0, PAGE =
SHARERAMGS1 : > RAMGS1, PAGE =
ramgs0 : > RAMGS0, PAGE =
ramgs1 : > RAMGS1, PAGE = #ifdef __TI_COMPILER_VERSION
#if __TI_COMPILER_VERSION >= 15009000
.TI.ramfunc : {} LOAD = FLASHD,
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = , ALIGN()
#endif
#endif /* The following section definitions are required when using the IPC API Drivers */
GROUP : > CPU1TOCPU2RAM, PAGE =
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
} GROUP : > CPU2TOCPU1RAM, PAGE =
{
GETBUFFER : TYPE = DSECT
GETWRITEIDX : TYPE = DSECT
PUTREADIDX : TYPE = DSECT
} /* The following section definition are for SDFM examples */
Filter1_RegsFile : > RAMGS1, PAGE = , fill=0x1111
Filter2_RegsFile : > RAMGS2, PAGE = , fill=0x2222
Filter3_RegsFile : > RAMGS3, PAGE = , fill=0x3333
Filter4_RegsFile : > RAMGS4, PAGE = , fill=0x4444
Difference_RegsFile : >RAMGS5, PAGE = , fill=0x3333
PDATASAVE : > RAMGS0 , PAGE = } /*
141 //=========================================================================
==
142 // End of file.
143 //=========================================================================
==
144 */
应用程序代码如下所示 :
blinky_cpu01.c
//#########################################################################
// FILE: blinky_cpu01.c
// TITLE: LED Blink Example for F2837xD.
//
//! \addtogroup cpu01_example_list
//! <h1> Blinky </h1>
//!
//! This example blinks LED X
//
//#########################################################################
// $TI Release: F2837xD Support Library v180 $
// $Release Date: Fri Nov 6 16:19:46 CST 2015 $
// $Copyright: Copyright (C) 2013-2015 Texas Instruments Incorporated -
// http://www.ti.com/ ALL RIGHTS RESERVED $
//######################################################################### #include "F28x_Project.h" // Device Headerfile and Examples IncludeFile
#include <string.h> Uint16 test = ; //void setup_emif1_pinmux_async_16bit(Uint16 cpu_sel);
//***************************************************************
//usart initial block
//***************************************************************
void UsartInit(void)
{
GPIO_SetupPinMux(, GPIO_MUX_CPU1, );
GPIO_SetupPinOptions(, GPIO_INPUT, GPIO_PUSHPULL);
GPIO_SetupPinMux(, GPIO_MUX_CPU1, );
GPIO_SetupPinOptions(, GPIO_OUTPUT, GPIO_ASYNC); //---- USART configuration ----------
SciaRegs.SCIFFTX.all=0xE040;
SciaRegs.SCIFFRX.all=0x2044;
SciaRegs.SCIFFCT.all=0x0; SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA =;
SciaRegs.SCICTL2.bit.RXBKINTENA =;
SciaRegs.SCIHBAUD.all =0x0002;
Page 1blinky_cpu01.c
SciaRegs.SCILBAUD.all =0x008B;
// SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset //-DMA configuration
} //***************************************************************
//usart UsartSendData block
//just fit for 8 bit data to send
//***************************************************************
void UsartSendData(uint16_t data_in)
{
SciaRegs.SCITXBUF.all = data_in;
while(SciaRegs.SCIFFTX.bit.TXFFST !=); // wait for RRDY/RXFFST =1 fordata available in FIFO
} void main(void)
{
InitSysCtrl(); InitGpio(); DINT; InitPieCtrl(); // Disable CPU interrupts and clear all CPU interrupt flags:
IER = 0x0000;
IFR = 0x0000; InitPieVectTable(); EINT; // Enable Global interrupt INTM UsartInit(); EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO10 = ;
GpioCtrlRegs.GPADIR.bit.GPIO10 = ;
EDIS; GpioDataRegs.GPADAT.bit.GPIO10 = ; while(){ GpioDataRegs.GPADAT.bit.GPIO10 = ; DELAY_US(); GpioDataRegs.GPADAT.bit.GPIO10 = ; DELAY_US(); if(test == ) test = ; test = test + ; UsartSendData(test); DELAY_US();
}
}
应用程序在调试的时候出现了一个问题 :
就是在在线调试的过程中,从升级程序跳转到应用程序的时候:
static void (*APPEntry)(void); APPEntry = (void (*)(void))(ENTRYADDR); ESTOP0; (*APPEntry)();
进入应用程序,应用程序总是会在一些地方跳转到异常中断,最后找问题找到是在应用程序中的IntiFlash()函数,屏蔽掉该函数就正常啦。
IntiFlash()函数是嵌入到InitSysCtrl();中,就是应用程序最开始调用的那个函数。
2837xD_FLASH_lnk_cpu1.cmd MEMORY
{
PAGE : /* Program Memory */
/* Memory (RAM/FLASH) blocks can be moved to PAGE1 for data allocation */
/* BEGIN is used for the "boot to Flash" bootloader mode */ BEGIN : origin = 0x088000, length = 0x000002
RAMM0 : origin = 0x000122, length = 0x0002DE
RAMD0 : origin = 0x00B000, length = 0x000800
RAMLS0 : origin = 0x008000, length = 0x000800
RAMLS1 : origin = 0x008800, length = 0x000800
RAMLS2 : origin = 0x009000, length = 0x000800
RAMLS3 : origin = 0x009800, length = 0x000800
RAMLS4 : origin = 0x00A000, length = 0x000800
RAMGS14 : origin = 0x01A000, length = 0x001000
RAMGS15 : origin = 0x01B000, length = 0x001000
RESET : origin = 0x3FFFC0, length = 0x000002 /* Flash sectors */
FLASHA : origin = 0x080002, length = 0x001FFE /* on-chipFlash */
FLASHB : origin = 0x082000, length = 0x002000 /* on-chipFlash */
FLASHC : origin = 0x084000, length = 0x002000 /* on-chipFlash */
FLASHD : origin = 0x086000, length = 0x002000 /* on-chipFlash */
FLASHE : origin = 0x088002, length = 0x007FFE /* on-chipFlash */
FLASHF : origin = 0x090000, length = 0x008000 /* on-chipFlash */
FLASHG : origin = 0x098000, length = 0x008000 /* on-chipFlash */
FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chipFlash */
FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chipFlash */
FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chipFlash */
FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chipFlash */
FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chipFlash */
FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chipFlash */
FLASHN : origin = 0x0BE000, length = 0x002000 /* on-chipFlash */ Page 12837xD_FLASH_lnk_cpu1.cmd
PAGE : /* Data Memory */
/* Memory (RAM/FLASH) blocks can be moved to PAGE0 for programallocation */ BOOT_RSVD : origin = 0x000002, length = 0x000120 /* Part ofM0, BOOT rom will use this for stack */
RAMM1 : origin = 0x000400, length = 0x000400 /* on-chipRAM block M1 */
RAMD1 : origin = 0x00B800, length = 0x000800 RAMLS5 : origin = 0x00A800, length = 0x000800 RAMGS0 : origin = 0x00C000, length = 0x001000
RAMGS1 : origin = 0x00D000, length = 0x001000
RAMGS2 : origin = 0x00E000, length = 0x001000
RAMGS3 : origin = 0x00F000, length = 0x001000
RAMGS4 : origin = 0x010000, length = 0x001000
RAMGS5 : origin = 0x011000, length = 0x001000
RAMGS6 : origin = 0x012000, length = 0x001000
RAMGS7 : origin = 0x013000, length = 0x001000
RAMGS8 : origin = 0x014000, length = 0x001000
RAMGS9 : origin = 0x015000, length = 0x001000
RAMGS10 : origin = 0x016000, length = 0x001000
RAMGS11 : origin = 0x017000, length = 0x001000
RAMGS12 : origin = 0x018000, length = 0x001000
RAMGS13 : origin = 0x019000, length = 0x001000 CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400
CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400
} SECTIONS
{
/* Allocate program areas: */
.cinit : > FLASHE PAGE = , ALIGN()
.pinit : > FLASHE, PAGE = , ALIGN()
.text : >> FLASHE PAGE = , ALIGN()
codestart : > BEGIN PAGE = , ALIGN()
ramfuncs : LOAD = FLASHE,
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = , ALIGN() /* Allocate uninitalized data sections: */
.stack : > RAMM1 PAGE =
.ebss : >> RAMLS5 | RAMGS0 | RAMGS1 PAGE =
.esysmem : > RAMLS5 PAGE = /* Initalized sections go in Flash */
.econst : >> FLASHE PAGE = , ALIGN()
.switch : > FLASHE PAGE = , ALIGN() .reset : > RESET, PAGE = , TYPE = DSECT /* not used,*/ Filter_RegsFile : > RAMGS0, PAGE = SHARERAMGS0 : > RAMGS0, PAGE =
SHARERAMGS1 : > RAMGS1, PAGE =
ramgs0 : > RAMGS0, PAGE =
ramgs1 : > RAMGS1, PAGE = #ifdef __TI_COMPILER_VERSION
#if __TI_COMPILER_VERSION >= 15009000
.TI.ramfunc : {} LOAD = FLASHE,
RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = , ALIGN()
#endif
#endif /* The following section definitions are required when using the IPC APIDrivers */
GROUP : > CPU1TOCPU2RAM, PAGE =
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
} GROUP : > CPU2TOCPU1RAM, PAGE =
{
GETBUFFER : TYPE = DSECT
GETWRITEIDX : TYPE = DSECT
PUTREADIDX : TYPE = DSECT
} /* The following section definition are for SDFM examples */
Filter1_RegsFile : > RAMGS1, PAGE = , fill=0x1111
Filter2_RegsFile : > RAMGS2, PAGE = , fill=0x2222
Filter3_RegsFile : > RAMGS3, PAGE = , fill=0x3333
Filter4_RegsFile : > RAMGS4, PAGE = , fill=0x4444
Difference_RegsFile : >RAMGS5, PAGE = , fill=0x3333 } /*
140 //=========================================================================
==
141 // End of file.
142 //=========================================================================
==
143 */
升级程序完成,可用
dsp 28377在线升级 实例总结的更多相关文章
- 关于DSP的boot mode / boot loader /上电顺序 /在线升级等问题的总结
使用器件 ti dsp c2000 2837x 1.dsp的上电过程和boot mode以及boot loader 1)dsp的上电顺序, 对于双核系统而言 , 他的上电启动顺序如下所示: 系统复位或 ...
- 自学Linux Shell9.3-基于Red Hat系统工具包:RPM属性依赖的解决方式-YUM在线升级
点击返回 自学Linux命令行与Shell脚本之路 9.3-基于Red Hat系统工具包:RPM属性依赖的解决方式-YUM在线升级 本节主要介绍基于Red Had的系统(测试系统centos) yum ...
- C#做的在线升级小程序
转自原文C#做的在线升级小程序 日前收到一个小任务,要做一个通用的在线升级程序.更新的内容包括一些dll或exe或.配置文件.升级的大致流程是这样的,从服务器获取一个更新的配置文件,经过核对后如有新的 ...
- 【WCF】基于WCF的在线升级
一.前言 前不久因公司产品需要完成了在线升级功能,因为编程技术不精,不敢冒然采用Socket方法实现在线升级,所以使用比较方便稳妥的WCF方式 如果考虑并发能力的话还是Socket> ...
- Encrypting bootloader (程序BIN文件加密及在线升级)
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 在上一个博客随笔,我介 ...
- 【Remoting】.Net remoting方法实现简单的在线升级(上篇:更新文件)
一.前言: 最近做一个简单的在线升级Demo,使用了微软较早的.Net Remoting技术来练手. 简单的思路就是在服务器配置一个Remoting对象,然后在客户端来执行Remoting ...
- android 在线升级借助开源中国App源码
android 在线升级借助开源中国App源码 http://www.cnblogs.com/luomingui/p/3949429.html android 在线升级借助开源中国App源码分析如下: ...
- 利用mtd工具实现嵌入式设备在线升级
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 主要思路是:通过web post方式将升级文件交给CGI程序处理,然后通过mtd工具实现设备在线升级. 1.页面部分 & ...
- word文档标题级别批量更改——批量降级与升级实例
word文档标题级别批量更改——批量降级与升级实例 word文档标题级别批量更改——批量降级实例 2012年12月21日16:30:44 现有一个3级文档结构的word文档,如下图所示 先需要将上 ...
随机推荐
- 《机电传动控制》PLC仿真
1.红绿灯 经仿真,可以完成所设定的要求.对比普通的红绿灯,知识加了X25和X20的控制,来控制夜间模式 . 2.传送带 经仿真,可以完成所设定的要求. 总结:这两个仿真都是亲自完成,感觉难度有些大. ...
- git-----------------git:如何让git识别我修改了文件夹名字和文件名字的大小写问题。
修改每个项目里面的隐藏的.git文件里面的config文件.将箭头指的原本是true改成false.
- css3(border-radius)边框圆角详解
传统的圆角生成方案,必须使用多张图片作为背景图案.CSS3的出现,使得我们再也不必浪费时间去制作这些图片了,只需要border-radius属性,支持浏览器IE 9.Opera 10.5.Safari ...
- 滚动轮播效果,.net 没得混看来只能去写js 了
<!DOCTYPE html> <html> <head> <title> 滚动图片 </title> <style type=&qu ...
- 调优SQL思路
--调优SQL --sqlreview ->logshipping -> ag辅助副本 --查看正确的执行计划 打开实际的执行计划set statistics io on --查看错误的执 ...
- 微信接口php
官方提供的SDK只有一个文本消息功能,我们将所有消息的消息类型及事件响应都整理了进来,并且加入日志记录,代码如下: 更新日志: 2013-01-01 版本1.0,包含Token验证及基本消息接口的收发 ...
- 初学软件测试之——如何使用Junit4
前几天刚刚接触软件测试,这篇文章主要是介绍使用eclipse的插件——Junit4进行单元测试.下面先介绍一下单元测试的定义:单元测试(unit testing),是指对软件中的最小可测试单元进行检查 ...
- Material Design Lite,简洁惊艳的前端工具箱 之 交互组件。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接, 博客地址为http://www.cnblogs.com/jasonnode/ . 网站上有对应 ...
- dd-wrt 定时重连 pppoe 更换ip地址
因为做代理,IP时常被封的原因,所以,需要每天定时重启路由器,重启路由器影响太大,所以重新拨号是一个更好的选择. 在dd-wrt里面,杀掉pppoe服务进程就可以了,这个进程会自动重新启动,然后就相当 ...
- [转]九个Console命令,让js调试更简单
转自:九个Console命令,让js调试更简单 一.显示信息的命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!DOCTYPE html> <html ...