灞波儿奔

  • 2020-08-04
  • 发表了主题帖: 罗列TI msp430单片机时钟的作用

    时钟模块是MSP430系列单片机不可缺少的模块,时钟模块可以使单片机实现不同的低功耗应用,不同的器件具有不同的时钟模块,一般来说,MSP430的时钟模块主要由高速晶体、低速晶体和DCO等器件通过MSP430时钟模块产生三个不同的时钟供不同的模块使用,产生的时钟为:辅助时钟(ACLK)、主系统时钟(MCLK)和子系统时钟(SMCLK)。由于时钟模块产生三个不同的时钟信号,这样可以利用不同的时钟从而达到低功耗的目的。一般来说,系统的功耗和系统的工作频率成正比关系,这样可以在低功耗应用情况下选用低速晶振。如果系统对运算要求比较高,则可以选用高速晶振产生较高的主系统时钟提供给CPU,以满足运算要求。如果对系统的实时性要求比较高,则可以采用ACLK时钟。总的来说,应该根据不同的应用来选择适当的时钟。        MSP430x1xx基础时钟模块有三个时钟输入源:    LFXT1CLK      低频时钟源    XT2CLK        高频时钟源    DCOCLK        数字控制RC振荡器     基础时钟模块可提供三种时钟信号:     ACLK 辅助时钟:ACLK是LFXT1CLK信号经1、2、4、8分频后得到的。ACLK可由软件选作各个外围模块的时钟信号,一般用于低速外设。     MCLK 系统主时钟:MCLK可由软件选择来自LFXT1CLK、XT2CLK、DCOCLK三者之一,然后经1、2、4、8分频得到。MCLK主要用于CPU和系统。     SMCLK 子系统时钟:可由软件选择来自LFXT1CLK和DCOCLK,或者XT2CLK和DCOCLK(由具体器件决定),然后经1、2、4、8分频得到。SMCLK主要用于高速外围模块。          通过设置时钟模块的寄存器(主要有DCOCTL、BCSCTL1、BCSCTL2)选择相应的时钟源和时钟频率,选择好之后,相应的模块就会利用选择的相应时钟。例如CPU和系统利用MCLK,按键利用ACLK等。 补充: 时钟就像是单片机的脉搏,没有时钟单片机是无法工作的,还有其他一些模块也是需要时钟如Timer_A. 上边是430时钟模块的框图,从上面可以看出 三个时钟输出:    辅助时钟ACLK(Auxillary Clock):由软件选择来自VLOCK、LFXT1CLK之一经过1,2,4,8分频之后得到,为外围模块提供时钟源。    主系统时钟MCLK(Main System Clock):由软件选择来自VLOCK、LFXT1CLK和DCOCLK之一经过1,2,4,8分频之后得到,为CPU和系统提供时钟。    子系统时钟SMCLK(Sub System Clock):和MCLK一样由软件选择来自VLOCK、LFXT1CLK和DCOCLK之一经过1,2,4,8分频之后得到,为外围各个模块提供时钟。 四个时钟源:    VLOCLK:片内超低功耗12KHz的内部振荡器。   XT2CLK:G2553是没有XT2CLK这个模块的。   DCOCLK:片内可数字控制的振荡器DCOCLK,在软件的调节下该时钟的输出范围为0.6MHz到26MHz。   LFXT1CLK:由外部时钟源提供的LFXT1CLK时钟源,也即LanuchPad开发板上未焊接的时钟电路,在这里我们可以焊接一个32.768KHz的低频时钟晶体由G2553的  XIN引脚输入。 他们几个的关系可以由下图表示:   在这三个时钟源的独立工作或是在三个时钟源相互协调配合(是可以通过软件配置的)下为2553系统提供了系统时钟ACLK、MCLK和SMCLK。ALCK、MCLK、SMCLK是和CPU或者外设连接起来的,而LFXT1CLK、XT2CLK、DCOCLK、VLOCLK这四个又是和ALCK、MCLK、SMCLK连接起来的,也就是说LFXT1CLK、XT2CLK、DCOCLK、VLOCLK是通过ALCK、MCLK、SMCLK和外设连接起来的。   上电后,系统默认使用的主系统时钟MCLK和子系统时钟SMCLK是同为DCOCLK产生的1MHz时钟,而辅助时钟ACLK则为内部VLOCLK产生的12KHz时钟。 G2553上电后时钟的初始状态我们可以用Grace来查看:   可以看出MCLK和SMCLK都是DCOCLK产生的1MHz的时钟,ACLK则是VLOCLK产生的12KHz的时钟。 DCO时钟: DCO时钟源产生的频率可以通过DCOCTL寄存器来设置寄存器来设定,通过设定DCOCTL中的高三位(其名字为DCOx),BCSCTL1基本时钟控制寄存器低四位(其名字为RSELx)就可以控制DCO振荡器产生100K~20M不等的时钟频率。设定时应尽量居中,以保持稳定。   1. DCOCTL, DCO Control Register   DCOx DCO频率选择寄存器,通过该位设置DCO的频率。 MODx 模式选择位。 2. BCSCTL1, Basic Clock System Control Register 1   XT2OFF       G2553该位无效,详细请参阅官方技术文档。 XTS             LFXT1,模式选择位 0 低频模式。 1 高频模式。 DIVAx             分频寄存器,分频后给ACLK提供时钟 00 /1。 01 /2。 10 /4。 11 /8。 RSELx             DCO频率选择寄存器,通过该位设置DCO频率。 3. BCSCTL2, Basic Clock System Control Register 2   SELMx             MCLK时钟源选择 00 DCOCLK。 01 DCOCLK,与00效果一样。 10 G系列单片机该位无效。 11 低频外部时钟。 DIVMx             时钟源分频寄存器,选择时钟源后经过该位分频后提供给MCLK 00        /1。 01        /2。 10        /4。 11        /8。 SELS             SMCLK时钟源选择寄存器 0 DCOCLK。 1 外部晶振。 DIVSx             时钟源分频寄存器,选择时钟源后经过该位分频后提供给SMCLK 00 /1。 01        /2。 10        /4。 11        /8。 DCOR             该位保留。 4. BCSCTL3, Basic Clock System Control Register 3   XT2Sx             G系列单片机该位无效 LFXT1Sx       对G系列单片机,当BCSCTL1寄存器中XTS = 0时,该位的设置才有效 00 外部接的是32768HZ的晶振。 01 保留位。 10 选择超低频外部时钟(VLOCLK) 11 数字外部时钟源。 XCAPx             振荡器电容选择寄存器,当XTS=0时该位有效,假如XTS = 1 或者LFXT1Sx =11,                XCAPx应该设置为00 00 ~1pF。 01 ~6pF。 10 ~10pF。 11 ~12.5pF。 XT2OF             对G系列单片机该位无效 LFXT1OF       LGXT1晶体振荡器故障状态寄存器 0 没有故障。 1 有故障。 5. IE1, Interrupt Enable Register 1中断使能寄存器   OFIE             晶体振荡器故障使能寄存器 0 禁止中断 1 使能中断 MSP430G22x0不支持该位。 6. IFG1, Interrupt Flag Register 1   OFIFG               晶体振荡器故障标志寄存器 0 没有发生中断。 1 有中断事件发生。 MSP430G22x0不支持该位。 有一些模块的时钟是有自己特有的时钟源的,如Timer_A:   Timer_A的时钟选择有四种:TACLK、ACLK、SMCLK和INCLK。Timer_A是不能选择MCLK作为时钟源的。而INCLK和TACLK是Timer_A特有的时钟源。

  • 发表了主题帖: 分享MSP430F5529 的时钟UCS编程注意事项

    有一个模块时钟源:MODOSC,产生MODCLK时钟源信号,一般只为闪存控制模块和ADC12模块提供服务。 该模块不被使用时自动关闭,任何模块对该时钟源提出使用要求时,MODOSC无需被使能即可响应该请求。430F5529中MODCLK为5MHZ。 *************************************************************** MSP430F5529有多个时钟源,而且很多模块其时钟源都是可以自由选择的。此外,由于一般情况下,系统功耗是和工作频率成正比的,因此有些时候通过选择较低频率的时钟源,在满足正常工作条件下,是可以有效降低功耗的。虽然函数库HAL_UCS.c/h,有完整的各个控制函数,但我觉得对于这一章还是对寄存器直接操作比较简单,因为函数太短、太多了。    3.1统一时钟系统(UCS)的简介             Unified Clock System,UCS。合理的配置时钟,可以达到平衡系统且降低功耗的目的。             MSPF5529时钟系统包含5个时钟源:             ①LFXT1 外部低频振荡源,32.768KHZ,可以用作FLL的参照源;    ②XT2 外部高频振荡源,4MHZ;    ③VLO (Internal very low)内部低耗低频振荡源,典型为10KHZ,精度一般;    ④REFO 内部低频参照源,32.768KHZ,常被用作锁相环FLL的基准频率,精度很高,不使用时不消耗电源,其设置往往要参考LPM模式的的设置;    ⑤DCO (Internal digitally-controlled)内部数字控制振荡源,一般通过FLL来设置;(很有用,很重要,之后会详细讲)    通常使用3种时钟信号,它们都来自于上述5个信号源:    ①ACLK (Auxiliary clock)辅助时钟,其时钟源可由软件控制从XT1、REFOC、VLO、DCO、DCOCLKDIV、XT2里面选取。其中DCOCLKDIV是由DCO经1、2、4、8、16或者32分频得到。注意,ACLK同样可以再次被1、2、4、8、16或者32分频。    ②MCLK (Master clock)主时钟,其特性与ACLK一模一样。    ③SMCLK (Subsystem master clock)子系统时钟,其特性与ACLK一模一样。   3.2 UCS的操作说明            开机上电时默认的时钟情况为(必须记清楚!!!!):             ACLK:XT1(低频模式被选择为XT1CLK时钟振荡器,XT1CLK被选择为ACLK的时钟源32.768KHZ)             MCLK:DCOCLKDIV(为1.048576MHZ,DCOCLK=2.097152MHZ)             SMCLK:DCOCLKDIV(为1.048576MHZ)             此外,FLL的参照源默认XT1;     如果连接XT1和XT2的引脚不进行PXSEL的设置,那么这两个时钟源都是无效的;      REFOCLK、VLOCLK、DCOCLK默认状态下是可用的;    系统稳定后,DCOCLK默认为2.097152MHZ,FLL默认2分频,则MCLK和SMCLK的频率都为1.048576MHZ。(实验三会提到如何计算)     另外,系统复位、系统工作模式LPM的选择都会对UCS有一定影响,这里限制太多,具体可参考TI官方资料UCS部分。LPM以及系统复位下章将会讲到。             关于操作说明的简单总结:(下面基本都是废话,了解即可)    ①VLO的选择是最简单的,不需要顾及其它情况;    ②REFO的选用,需要参考不同的工作模式,有多种限制;    ③XT1和XT2特点相同。使用的时候,不仅要配置与其相连的引脚,还要配置电容,还要注意其本身工作在低频还是高频模式。而且,在不同工作模式下也有不同的要求;    ④DCO作为数控振荡器,其频率的调节不仅可以通过自身设定,也可以通过FLL锁相环设定;    ⑤FLL锁相环,是变换频率的灵活选择。它既可以设置基准频率,也可以选择分频数,还可以被直接关闭来实现降低功耗等目的;    ⑥UCS系统带有时钟信号错误保护机制;    ⑦对有严格时序要求的地方,要选择精度高的时钟源,并且做好FLL和DCO部分的调制设置;    ⑧不同模式下(有些时钟源是禁止的)的时钟控制图:(只需用到的时候注意一下即可,查表)   3.3 UCS寄存器控制操作           共有10组16位读写寄存器,为UCSCTL0-UCSCTL9。同样支持字和字节操作,即UCSCTL0包括UCSCTL0_H和UCSCTL0_L。            注:凡是标记“Reserved”的位,如果没有特意声明,则读回时都按0处理。   UCSCTL0   DCO  :DCO频拍选择。选择DCO的频拍并在FLL运行期间(因MOD位的变化)自动调整。DCO 的5个控制位把由DCORSELx选择的DCO频率分为32等份,间隔大约8% 。   MOD:调制位计数器。选择调制类型,所有的MOD位在FLL运行期间自动调整,无需用户干预。    UCSCTL1           DCORSEL:DCO频率范围选择   DISMOD:调制器禁止使能位。0—使能调制器;1—禁止调制器。    UCSCTL2    FLLD:预分频器(即fDCO分频)。000-1分频,001-2分频,010-4分频,011-8分频,100-16分频,101-32分频,110以及111都是备用的,默认为32分频。     FLLN:倍频系数。设置倍频值N,N必须大于0,如果FLLN=0,则N被自动设置为1。   UCSCTL3   SELREF:FLL参考时钟选择。000-XT1,001-待用,默认为XT1,010-REFO,101-XT2,其余均为待用,默认为REFO。   FLLREFDIV:FLL参考时钟分频器。000-1分频,001-2分频,010-4分频,011-8分频,100-12分频,101-16分频,110以及111都是备用的,默认为16分频。   UCSCTL4    SELA:ACLK时钟源选择。 000-XT1,001-VLO,010-REFO,011-DCO,100-DCOCLKDIV,101 -XT2有效时为XT2,否则为DCOCLKDIV 110 、111保留以备后来使用。当XT2有效时默认为XT2CLK,否则默认为DCOCLKDIV    SELS:SMCLK时钟源选择。设置同SELA   SELM:MCLK时钟源选择。设置同SELA   UCSCTL5   DIVPA:ACLK外部有效输出分频000-1分频,001-2分频,010-4分频,011-8分频,100-16分频,101-32分频,110以及111都是备用的,默认为32分频。           DIVA:ACLK时钟源分频,设置同DIVPA           DIVS:SMCLK时钟源分频,设置同DIVPA           DIVM:MCLK时钟源分频,设置同DIVPA           UCSCTL6   XT2DRIVE:XT2振荡器电流驱动能力调整 ,00 最低电流消耗。XT2振荡器工作在4MHz到8MHz …   XT2BYPASS:XT2旁路选择          0-XT2来源于内部时钟(使用外部晶振)         1-XT2来源于外部引脚输入(旁路模式)    XT2OFF:关闭XT2振荡器        0 -当XT2引脚被设置为XT2功能且没有被设置位旁路模式时,XT2被打开;  1 -当XT2没有被用作时钟源以及没有用作FLL参考时钟时,XT2被关闭。   XTS:XT1工作模式选择  0-低频模式(XCAP定义XIN和XOUT引脚间的电容) 1-高频模式(XCAP位没有被使用)   XCAP:振荡器负载电容选择   SMCLKOFF:SMCLK关闭控制位  0-SMCLK开           1-SMCLK关闭    XT1OFF:同XT2OFF          UCSCTL7   XT2OFFG:XT2出错时置位,同时OFFIFG也会置位,需要软件清零。   XT1HFOFFG:高频工作模式下XT1出错时置位,同时OFFIFG也会置位,需要软件清零。   XT1LFOFFG:低频工作模式下XT1出错时置位,同时OFFIFG也会置位,需要软件清零。   DCOOFFG:DCO出错时置位,但当DCO=1或31时,也会置位,同时OFFIFG也会置位,需要软件清零。    UCSCTL8    信号请求使能:0-相应的信号请求禁止      1-相应的信号请求允许         UCSCTL9    XT1、XT2旁路模式输入摇摆电平(范围)必须被设置 0-输入范围0~DVCC  1-输入范围0~DVIO        3.4实验总结  实验一:将MCLK和SMCLK配置为REFOCLK、VLOCLK(需要示波器测量) /* REFOCLK和VLOCLK是芯片默认提供的,只要芯片正常工作,这两个时钟就会正常工作,因此,该时钟配置非常简单,只需要修改UCSCTL4,将SELS和SELM配置为对应的选项VLOCLK或者REFOCLK即可*/ #include   void main(void){     WDTCTL = WDTPW+WDTHOLD;     P1SEL |= BIT0;//声明有特殊功能,将不被用作普通I/O     P1DIR |= BIT0;//ACLK输出端,用来测量ACLK频率,外接频率计测     P2SEL |= BIT2;P2DIR |= BIT2;//SMCLK输出端     P7SEL |= BIT7;P7DIR |= BIT7;//MCLK用输出端     //UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_1|SELM_1; //将SMCLK和MCLK配置为VLOCLK     UCSCTL4 = UCSCTL4&(~(SELS_7|SELM_7))|SELS_2|SELM_2; //将SMCLK和MCLK配置为REFOCLK /* UCSCTL4&(~(SELS_7|SELM_7))这一语句相当于先把SELS和SELM清零*/ while(1); }

  • 2020-08-02
  • 发表了主题帖: TI XDC工具简介

    1.XDC(Express DSP Component)是TI提供的一个命令行工具,它可以生成并使用实时软件组件包。       2.以上两图说明了XDC的工作方式:通过相关文件设定操作指令,读入源码、库文件以及已经存在的组件包最终生成可执行文件。 3.Package------XDC工作的基本单元。包括有:源码、库文件以及元数据;元数据这包含有该包的版本信息和依赖信息,以及模块(Module)信息。 4.XDC使用方法:     5.XDC需要的文件:config.bld  package.bld  package.xdc Package.xdc -------------描述该包的名称,版本信息,依赖文件,模块信息等   Config.bld --------------描述XDC要使用的编译工具的相关信息,如不同CPU所使用的编译工具目录,每种编译工具的编译选项,连接选项等基本信息;   Package.bld -------------------描述对于该包需要生成的平台,profile(debug,release)。通过Javascript脚本添加源码到生成执行文件的信息中。 Package.mak-------------------由XDC生成的文件,用于最终编译可执行文件。 6.XDC工作流程:   7.使用XDC所需的文件:源码、package.bld、package.xdc、config.bld。同时需要通过shell脚本将DVEVM的安装位置导出为环境变量。 各代码如下: Config.bld样本代码: +  expand sourceview plaincopy to clipboardprint? var MVArm9 = xdc.useModule("gnu.targets.MVArm9");    MVArm9.rootDir = "/opt/DVS357/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le";    MVArm9.lnkOpts.suffix = "-lpthread " + MVArm9.lnkOpts.suffix;    var Linux86=xdc.useModule("gnu.targets.Linux86");    Linux86.rootDir = "/usr";    Linux86.lnkOpts.suffix = "-lpthread " + Linux86.lnkOpts.suffix;    Build.targets = [ Linux86,MVArm9,];   var MVArm9 = xdc.useModule("gnu.targets.MVArm9"); MVArm9.rootDir = "/opt/DVS357/mv_pro_4.0/montavista/pro/devkit/arm/v5t_le"; MVArm9.lnkOpts.suffix = "-lpthread " + MVArm9.lnkOpts.suffix; var Linux86=xdc.useModule("gnu.targets.Linux86"); Linux86.rootDir = "/usr"; Linux86.lnkOpts.suffix = "-lpthread " + Linux86.lnkOpts.suffix; Build.targets = [ Linux86,MVArm9,]; Runxdc.sh样本代码: view plaincopy to clipboardprint? #! /bin/sh    #  import install paths     #  putting the first period before the shell invokation keeps the changes     #      to environment variables set here. Otherwise, changes to environment     #      are only within the context of the executed script       ./setpaths.sh   #  Define search paths for included packages    export XDCPATH="$CE_INSTALL_DIR/packages"  #  Define options for execution    export XDCBUILDCFG=$(pwd)"/config.bld     #  Execute xdc command to make all packages       /opt/DVS357/dvevm_1_20/xdc_2_94/xdc $@ -P *   #! /bin/sh  #  import install paths #  putting the first period before the shell invokation keeps the changes #      to environment variables set here. Otherwise, changes to environment #      are only within the context of the executed script ./setpaths.sh #  Define search paths for included packages export XDCPATH="$CE_INSTALL_DIR/packages" #  Define options for execution export XDCBUILDCFG=$(pwd)"/config.bld #  Execute xdc command to make all packages /opt/DVS357/dvevm_1_20/xdc_2_94/xdc $@ -P * Setpaths.sh样本代码: #!/bin/sh       export DVEVM_INSTALL_DIR="/opt/DVS357/dvevm_1_20/"   export BIOS_INSTALL_DIR=$DVEVM_INSTALL_DIR/bios_5_31_01    export CG_INSTALL_DIR=$DVEVM_INSTALL_DIR/cg6x_6_0_14    export CMEM_INSTALL_DIR=$DVEVM_INSTALL_DIR/cmem_1_02    export CE_INSTALL_DIR=$DVEVM_INSTALL_DIR/codec_engine_1_10_01    export CS_INSTALL_DIR=$DVEVM_INSTALL_DIR/codec_servers_1_23    export DSPLINK_INSTALL_DIR=$DVEVM_INSTALL_DIR/dsplink_1_30_08_02    export FMWK_INSTALL_DIR=$DVEVM_INSTALL_DIR/framework_components_1_10_04    export XDAIS_INSTALL_DIR=$DVEVM_INSTALL_DIR/xdais_5_10    export XDC_INSTALL_DIR=$DVEVM_INSTALL_DIR/xdc_2_94       export PATH=$XDC_INSTALL_DIR:$PATH   #!/bin/sh export DVEVM_INSTALL_DIR="/opt/DVS357/dvevm_1_20/" export BIOS_INSTALL_DIR=$DVEVM_INSTALL_DIR/bios_5_31_01 export CG_INSTALL_DIR=$DVEVM_INSTALL_DIR/cg6x_6_0_14 export CMEM_INSTALL_DIR=$DVEVM_INSTALL_DIR/cmem_1_02 export CE_INSTALL_DIR=$DVEVM_INSTALL_DIR/codec_engine_1_10_01 export CS_INSTALL_DIR=$DVEVM_INSTALL_DIR/codec_servers_1_23 export DSPLINK_INSTALL_DIR=$DVEVM_INSTALL_DIR/dsplink_1_30_08_02 export FMWK_INSTALL_DIR=$DVEVM_INSTALL_DIR/framework_components_1_10_04 export XDAIS_INSTALL_DIR=$DVEVM_INSTALL_DIR/xdais_5_10 export XDC_INSTALL_DIR=$DVEVM_INSTALL_DIR/xdc_2_94 export PATH=$XDC_INSTALL_DIR:$PATH package.bld样本代码: + expand sourceview plaincopy to clipboardprint? var targs = [MVArm9, Linux86];    var profiles = ["debug", "release"];    //  Define the base name for the executable(s) built    var basename = "app";    //  The following code uses the java.io.File.list() method to generate an array    //      of all files in the current directory ('.') and then sorts out .c files    var sources = java.io.File('.').list();    var csources = [];    for (var i = 0; i < sources.length; i++){           if(String(sources[i]).match(/.*\.c$/))                    csources.push(sources[i]);    }       //  The build phase cycles through the arrays of build targets and profiles    //       and adds an executable for each combination       for (var i = 0; i < targs.length; i++) {         for(var j = 0; j < profiles.length; j++){            Pkg.addExecutable( basename + "_" + profiles[j], targs[i],    targs[i].platform, {                         cfgScript: null,                         profile: profiles[j],                    }                    ).addObjects( csources );         }    }   var targs = [MVArm9, Linux86]; var profiles = ["debug", "release"]; //  Define the base name for the executable(s) built var basename = "app"; //  The following code uses the java.io.File.list() method to generate an array //      of all files in the current directory ('.') and then sorts out .c files var sources = java.io.File('.').list(); var csources = []; for (var i = 0; i < sources.length; i++){        if(String(sources[i]).match(/.*\.c$/))                 csources.push(sources[i]); } //  The build phase cycles through the arrays of build targets and profiles //       and adds an executable for each combination for (var i = 0; i < targs.length; i++) {      for(var j = 0; j < profiles.length; j++){         Pkg.addExecutable( basename + "_" + profiles[j], targs[i], targs[i].platform, {                      cfgScript: null,                      profile: profiles[j],                 }                 ).addObjects( csources );      } }    PS: 在 VIM中,给新的文件类型添加已知文件类型的语法高亮的方法是------在“/usr/share/vim/vimfiles/after”路径中添加一个文件“filetype.vim”(FC10系统下),在其中添加如下代码: augroup filetypedetect    au BufNewFile,BufRead *.bld setf javascript    augroup END   

  • 发表了主题帖: 如何在Linux环境下编DSP的汇编或线性汇编程序?

    在Codec Engine安装路径下/packages/config.bld文件里var C64P = xdc.useModule(‘ti.targets.C64P’); 之后添加:  C64P.extensions[“.sa”] = { suf: “.sa”, typ: “asm:-fl” } 或 C64P.extensions[“.asm”] = { suf: “.asm”, typ: “asm:-fa” DSP侧如何统计具体函数运行时间? TI DSPC64x+内核有一个64位的硬件定时器(Time Stamp Counter),它的频率和CPU频率一致。最简单的办法是使用TSC的低32位TSCL。注意在DM644x中,TSCH用于ARM。 #include void main (){ … TSCL=0; … t1=TSCL; my_code_to_benchmark(); t2=TSCL; printf(“# cycles == %d\n”, (t2-t1)); }  

  • 发表了主题帖: TMS320DM8148浮点DSP C674x + ARM Cortex-A8RGMIICAN总线接口

    处理器 2.1 DM8148 TI TMS320DM8148是一款高性能嵌入式32位工业级ARM Cortex-A8+DSP C674x处理器。拥有多种工业接口资源,以下是DM8148 CPU资源框图: CAN总线接口 此开发板搭载有两个CAN总线接口:CAN0和CAN1。CON17和CON18为对应接线端子,使用电镀隔离的隔离式芯片ISO1050作为CAN转发器,接口定义如下图:

  • 发表了主题帖: DM8148硬件介绍和MCFW软件架构说明

    DM8148硬件介绍和MCFW软件架构说明

  • 发表了主题帖: TI DM8148 多核DSP 的SDK 的编译

    拿到TI 的原装或者其他家第三方的dm8148的开发板的时候,面对SDK都是感觉无从下手,下面我简单介绍一下,TI的原始的SDK 是怎么安装和编译的,希望对大家有所帮助。        1 安装编译器        在linux下 安 装        arm-2009q1-203-arm-none-linux-gnueabi.bin , 先        chmod 777 arm-2009q1-203-arm-none-linux-gnueabi.bin,然后进行安装,如下        ./ arm-2009q1-203-arm-none-linux-gnueabi.bin 安装即可。        本说明的安装位置:/opt/arm-2009q1。               2 解压 DVSDK        在/opt/dvsdk 目录下,解压 DVSDK 源代码,tar zxvf DVRRDK_02.80.00.10.tar.gz。               3 设置和编译 DVRRDK        在 dvr_rdk 目录下,修改如下:        (1)板子类型        DVR_RDK_BOARD_TYPE := DM814X_EVM        (2)编译器位置        CODEGEN_PATH_A8 := /opt/arm-2009q1               4 编译 DVRRDK        进入源代码目录 dvr_rdk 下,开始编译:        Make lspcfg        Make lsp        编译好后,make all,编译 dvrrdk。        上面就是我总结的怎么样编译TI 原始的SDK

  • 2020-07-13
  • 发表了主题帖: CC2652LP驱动Δ∑ADC - ADS1261

        SensorController Studio里有很多例子,但是缺少在LaunchPad上使用I2C的例子。本文将使用TI的CC1352P无线MCU及OPT3004光照度传感器,来填补这一空缺。 介绍     OPT3004是一款用于测量可见光密度的传感器。传感器的光谱响应与人眼的视觉响应紧密匹配,并且具有很高的红外线阻隔率。OPT3004 器件具有精密的光谱响应和增强的红外阻隔功能,因此能够准确测量人眼可见光的强度,且不受光源影响。     CC1352P 是一款多协议低于 1GHz 和 2.4GHz 无线 MCU,面向无线 M-Bus、IEEE 802.15.4g、支持 IPv6 的智能对象 (6LoWPAN)、Thread、 Zigbee®、KNX RF、 Wi-SUN®、低功耗 Bluetooth® 5 以及专有系统,包括 TI 15.4-Stack。该器件包含具有一流效率的 +20dBm 集成高功率放大器,适用于远距离 应用 Sensor Controller传感器控制器是simplelink系列无线MCU CC26xx/CC13xx都包含的一个小型 CPU 内核,针对低功耗和高效外设运行进行了高度优化。传感器控制器位于 CC26xx/CC13xx 辅助 (AUX) 电源/时钟域中,可以独立于系统 CPU 和 MCU 域电源状态自主执行简单的后台任务,以达到极低功耗。   硬件连接 需要的硬件: OPT3004 EVM LAUNCHXL-CC1352P 连接如下图: 请根据实际板子情况进行连接,CC1352P的DIO5和DIO22已通过3.3KΩ电阻上拉,因此直接使用这两个引脚。

  • 发表了主题帖: 小型蓝牙低功耗 (BLE) 参考设计

    描述 本设计展示了 CC254x 系列的 Bluetooth® 低功耗 (BLE) 无线微控制器 (MCU) + 曲折型 F 天线,该系列器件外形紧凑,可焊接到现有 PCB 上。本参考设计可访问 BLE 无线 MCU 的所有 I/O,进而评估现有系统中的 BLE 连接。本设计兼容德州仪器的免版税 BLE 协议栈,该协议栈包含示例应用程序,可加速评估过程。 特性 提供汽车级型号 CC2541-Q1(注:引脚分配与 CC2541 略有不同) 提供蓝牙低功耗 (BLE) 天线设计的参考设计 - 利用低成本的跟踪天线 测试数据中已提供天线性能 提供 22 个引脚功能 2 个 SPI 端口/UART 端口 I2C 端口 2 个具有 20mA 驱动能力的 GPIO 端口 21 个多路复用 GPIO 8 个 ADC 通道 基于 32KHz 频率的休眠定时器 http://www.ti.com.cn/cn/lit/ug/tidu691/tidu691.pdf

  • 发表了主题帖: 毫米波RADAR与LIDAR探秘

        说起激光雷达和毫米波雷达,相信业内人士并不陌生,激光雷达是以发射激光束探测目标的位置、速度等特征量的雷达系统。而毫米波雷达是指工作在毫米波波段探测的雷达。毫米波实质上就是电磁波。毫米波的频段比较特殊,其频率高于无线电,低于可见光和红外线,频率大致范围是10GHz—200GHz。这是一个非常适合车载领域的频段。 那么激光雷达与毫米波雷达究竟有什么区别呢?跟小编一起来探个究竟吧!     从工作原理上来讲,激光雷达和毫米波雷达基本类似,都是利用回波成像来构显被探测物体的,就相当于人类用双眼探知而蝙蝠是依靠超声波探知的区别。不过激光雷达发射的电磁波是一条直线,主要以光粒子发射为主要方法,而毫米波雷达发射出去的电磁波是一个锥状的波束,这个波段的天线主要以电磁辐射为主。 从探测精度上来讲,激光雷达具有探测精度高、探测范围广及稳定性强等优点,在精确度方面,毫米波雷达的探测距离受到频段损耗的直接制约(想要探测的远,就必须使用高频段雷达),也无法感知行人,并且对周边所有障碍物无法进行精准的建模。这一点就大不如激光雷达。     从抗干扰能力上来讲,由于激光雷达通过发射光束进行探测,受环境影响较大,光束受遮挡后就不能正常使用,因此无法在雨雪雾霾天,沙尘暴等恶劣天气中开启,而毫米波导引头穿透雾、烟、灰尘的能力强,因此可以在糟糕的天气中探测,在这一点上毫米波雷达更胜一筹。     从价格上来讲,激光雷达比毫米波雷达在测距、识别障碍物方面更准确,但由于激光雷达获取的数据量远超毫米波雷达,所以需要更高性能的处理器来处理数据,成本高了,售价自然就更贵了。但激光雷达在准确性上可以得到更多的保证。 激光雷达应用 几种传感器性能对标     激光雷达和毫米波雷达。习惯且依赖驾驶汽车的人们,对这两种事物肯定不会陌生。前者在真正的无人车应用领域所向披靡,最近Apple又把它带入了消费电子类产品中,把Lidar概念引入到iPad中,让笔者以为iPad装上四个轱辘就可以自己开车了。而毫米波雷达目前被广泛应用在L2-L3的辅助驾驶汽车中,特斯拉汽车用8个摄像头、12个超声波传感器和一个77GHz毫米波雷达实现了autopilot辅助驾驶功能,当然mobileye的ADAS系统和nVidia的GPU也是功不可没的。 其实Lidar和毫米波雷达都属于电磁波雷达的范畴,只是毫米波雷达技术属于微波范畴,用毫米波作为发射源,而Lidar技术用红外线光、可见光或紫外光等纳米波作为光源。     其实在很久以前,有一种关于人类视觉成像的假说,这种假说认为人们觉得眼睛会发出的看不见的光线,然后击中了外面的世界中的物体,使它们变得对人类可见。当然,你我都知道,事实的情况情况并非如此,反而是物体发出的光击中了人眼,才让人们感知。 但这并不意味着这不是一个完美的观察方式。事实上,这种原理就是激光雷达背后的基本思想,一种数字式的成像形式,已经被证明在从考古学到自动驾驶汽车、消费电子产品所有领域都非常有用。前阵子,Lidar帮助考古学家对玛雅文化的古城进行了深度建模。 无论是毫米波雷达,还是Lidar,都需要存在一组或多组发射接收装置。以Lidar为例,传统的机械Lidar需要光源、反射镜、和接收器。由于早期的Lidar系统采用纯机械式探测方式,是指其发射系统和接收系统存在宏观意义上的转动,也就是通过不断旋转发射头,将速度更快、发射更准的激光从“线”变成“面”,并在竖直方向上排布多束激光(即32线或64线雷达),形成多个面,达到动态3D扫描并动态接收信息的目的。 这也就造成了它体积的庞大,不好与小型的消费电子产品集成。且价格十分昂贵。2018年Google发布的无人驾驶汽车,一个机械式Lidar的就要7万美元。这种体积庞大、价格昂贵的机械式Lidar难逃变为先烈的厄运。     归功于半导体技术的发展,制造内部非移动结构或相对较小的移动结构的Lidar器件,成为了Lidar小型化的首要任务,目前Lidar小型化的技术设想主要有三种。 1.MEMS(Micro-Electro-Mechanical System)微机电系统         MEMS指代的是将机械机构进行微型化、电子化的设计,将原本体积较大的机械结构通过微电子工艺集成在硅基芯片上,进行大规模生产。得益于MEMS技术的发展,这种技术成熟,易于量产,通过MEMS微镜来实现垂直方面的一维扫描,MEMS结构将机械微型化,扫描单元变成了MEMS微镜。 2.OPA(optical phased array)光学相控阵技术         相比其他技术方案,OPA方案给大家描述了一个激光雷达芯片级解决方案的美好前景,它主要是采用多个光源组成阵列,通过控制各光源发光时间差,合成具有特定方向的主光束。然后再加以控制,主光束便可以实现对不同方向的扫描。雷达精度可以做到毫米级,且顺应了未来激光雷达固态化、小型化以及低成本化的趋势,但难点在于如何把单位时间内测量的点云数据提高以及投入成本巨大等问题。目前一直没有进入量产阶段。 3.Flash         Flash激光雷达的原理也是快闪,它不像MEMS或OPA的方案会去进行扫描,而是短时间直接发射出一大片覆盖探测区域的激光,再以高度灵敏的接收器,来完成对环境周围图像的绘制。苹果在2020年iPad中引入的Lidar技术就是Flash Lidar技术,它采用dTOF的探测技术,依靠SPAD单光子雪崩二极管提高整体器件的灵敏度。 而在小型化的Lidar技术中,光学相控阵(OPA)激光雷达受到芯片成熟度不足等各种问题的牵制,离落地还有一段较长的路要走。Flash激光雷达暂时无法同时满足远近成像的要求,但随着单光子面阵探测技术的成熟,有望成为未来的激光雷达技术路线方向。所以,MEMS Lidar是目前最有可能先落地的车载Lidar方案。     第一是MEMS微振镜帮助激光雷达摆脱了笨重的马达、多棱镜等机械运动装置,毫米级尺寸的微振镜大大减少了激光雷达的尺寸,无论从美观度、车载集成度还是成本角度来讲,其优势都是十分明显的。     第二,MEMS微振镜的引入可以减少激光器和探测器数量,极大地降低成本。采用二维MEMS微振镜,仅需要一束激光光源,通过一面MEMS微振镜来反射激光器  的  光束,两者采用微秒级的频率协同工作,通过探测器接收后达到对目标物体进行3D扫描的目的。与多组发射/接收芯片组的机械式激光雷达结构相比,MEMS激光雷达对激光器和探测器的数量需求明显减少。     第三,MEMS微振镜不是新技术,可以直接使用。其最成功的应用案例就是德州仪器(TI)的DLP(DigitalLight Processing,数字光处理)显示,其DMD芯片全球独供,在投影机的BOM成本比例中占比也很高。此外,在3D摄像头、条形码扫描、激光打印机、医疗成像、光通讯等领域,MEMS微振镜也不乏成功应用案例。 但MEMS Lidar在车载上的落地工作也不是一帆风顺,车载环境有它的特殊难题,信赖性就是最大的因素。MEMS微振镜属于振动敏感性器件,车载环境下的振动和冲击容易对它的使用寿命和工作稳定性产生不良影响,使得激光雷达的测量性能恶化。     工作温度范围也是MEMS微振镜通过车规的一大门槛。通常情况下,车规级产品需要核心元器件满足-40℃到125℃的工作范围。在实际应用过程中,MEMS微振镜的材料属性会随着环境温度的改变而发生变化,从而导致微振镜运动特性的变化。因此材料的选择和制造工艺对实现车规级MEMS微振镜来说,是巨大的挑战。还有就是芯片尺寸缩小,会直接影响MEMS Lidar的旋转角度,而要得到较大的角度,就需要把芯片的尺寸做大,这与Lidar小型化、低成本化的初衷是矛盾的。 最后,激光由于波长较短,面对极端天气如雨、雾、霾时,测量准确性会大大下降。这时毫米波雷达的存在就显得十分有必要了。 在智能驾驶传感器领域,和LiDAR相比,毫米波雷达更接地气,在技术上已非常成熟,而且其市场出货量相当可观,毫米波实质上就是电磁波。毫米波的频段比较特殊,其频率高于无线电,低于可见光和红外线,频率大致范围是10GHz—200GHz。毫米波介于微波和THz(1000GHz)之间,可以说是微波的一个子集。 在这个频段,毫米波相关的特性使其非常适合应用于车载领域。目前,比较常见的车载领域的毫米波雷达频段有三类。     其一是24—24.25GHz这个频段,目前大量应用于汽车的盲点监测、变道辅助。雷达安装在车辆的后保险杠内,用于监测车辆后方两侧的车道是否有车、可否进行变道。这个频段也有其缺点,首先是频率比较低,另外就是带宽比较窄,只有250MHz。   第二类频段就是77GHz,这个频段的频率比较高,国际上允许的带宽高达800MHz。这个频段的雷达性能要好于24GHz的雷达,所以主要用来装配在车辆的前保险杠上,探测与前车的距离以及前车的速度,实现的主要是紧急制动、自动跟车等主动安全领域的功能。   第三类应用频段就是77GHz—81GHz,这个频段最大的特点就是其带宽非常宽,要比77GHz的高出3倍以上,大约为4GHz。这也使其具备非常高的分辨率,可以达到5cm。这个分辨率在自动驾驶领域非常有价值,因为自动驾驶汽车要区分行人等诸多精细物体,对带宽的要求很高。 而在波长方面,24GHz毫米波的波长是1.25cm,而77GHz毫米波的波长大概是4mm,毫米波的波长要比光波的波长长1000倍以上,所以它对物体的穿透能力更强。 77GHz雷达比24GHz的第一个优势在距离分辨率和精度。     与24GHz频段下的只有250MHz带宽的ISM频段相比,77GHz频段下的SRR频带可提供高达4GHz的扫描带宽,显著提高了距离分辨率和精度。 由于距离分辨率和精度与扫描带宽成反比,因此与24GHz雷达相比,77GHz雷达传感器在距离分辨率和精度方面的性能更好,经过测试发现可提高20倍。高距离分辨率可以更好地分离物体(例如站在汽车附近的人)并提供检测到物体的密集点,从而完善环境建模和物体分类,这对于研发先进的驾驶辅助算法和自动驾驶功能非常重要。     此外,分辨率越高,传感器识别的最小距离就越小,因此在停车辅助等需要高精确度的应用方面,77-81GHz雷达有着显著的优势。 第二个优势在速度分辨率和精度。速度分辨率和精度与射频频率成反比。 因此,频率越高,分辨率和精度就越好。与24 GHz传感器相比,77 GHz传感器可将速度分辨率和精度提高3倍。对于汽车停车辅助应用,速度分辨率和精度是至关重要的,因为在停车时需要以低速准确地操纵车辆。 第三个优势是芯片设计尺寸的缩小。较高射频频率的主要优势之一就是传感器尺寸可以更小。对于相同的天线视场和增益,77GHz天线阵列的尺寸可以在X和Y维度上减小约3倍。这种尺寸上的缩减在汽车上非常有用,主要体现在汽车周围的应用(包括需要安装近距离传感器的门和后备箱)和车内的应用。         但是毫米波雷达也存在一些不足,第一就是很难获得观测物体z坐标的数据,只能获得x轴和y轴的坐标,因此只能测距,无法输出图像信号。因此,xy与速度v信息只能得到一个3D的物体信息。第二,对横向目标敏感度低,例如:对横穿车辆检测效果不佳;第三,行人反射波较弱,对行人分辨率不高,探测距离近;第四,对高处物体和小物体的识别不佳。         如今毫米波雷达和Lidar都进入了4D识物的维度,毫米波雷达在努力完善自己对z轴坐标的获取,而Lidar则也凭借多普勒效应探测,可以获得物体速度信息。下图是Lidar获得的雷达点云图。 上文中也提到了,由于距离分辨率和精度与扫描带宽成反比,那么说明拥有更高扫描带宽的Lidar比毫米波雷达拥有更可靠的精度和探测距离。         我们坚信,未来的汽车自动驾驶技术不可能是单一技术独占的,一定是基于可见光视觉(CIS Camera)、毫米波雷达、超声波雷达、Lidar几种传感器相互配合的。         本月初在台湾发生的Tesla迎面撞向翻倒卡车的案例,就足以证明了毫米波雷达在防撞预警上的缺陷。因为毫米波雷达无法识别图像,而Tesla的算法也把毫米波雷达探测到的静止的物体直接交给Camera Sensor去解析,以免造成算力的浪费。但Camera Sensor对于白色的图像解析一直是Tesla的弱项,在前几年美国弗罗里达的事故中,Tesla也把卡车的白色侧面当作了天空中的云。可见自动驾驶技术目前其实只实现到L2-L3的水平,离我们所期待额L4-L6还存在很大的差距。 在不久的将来,低成本、小型化、高可靠性的Lidar登上汽车的时候,我们的驾驶信赖性也会随着多种传感器技术的不断配合而做的越来越好。

  • 发表了主题帖: 低功耗、无线型无线传感器网络设计

        无线技术的爆炸式发展催生了多种工业、科学及医疗(ISM)频带无线标准。由于有了这些新标准,各种无线应用渗透到我们日常生活的方方面面。毫无疑问,无线传感器网络(WSN)便是一种最为受益于这些标准的重要应用。     我们可以设想有一位美国中西部的农民正面临着一个这样的挑战:如何对几千头牛的体温进行日常监控,以便防止诸如口蹄疫等危及其牛群生存的动物疾病发生。利用无线技术,在每头牛的身上安装一个带有无线发射器的温度传感器,将其体温读取数据发射至一个主端子便可以轻松地克服这些挑战。这是一个WSN的简单例子,其表明无线技术的使用可以节省大量的时间和成本。本文将简单介绍ISM频带和WSN,以及支持它们的一些无线标准。 工业科学及医疗频带概况        ISM频带是无须授权、任何人均可使用频谱的一部分。在ISM频带开发产品的唯一要求遵守这部分频谱的一些规定。这些规定因国家不同而各异。 2.4GHz频带和几种1GHz以下频带是今天最广泛使用的ISM 频率空间。由于2.4GHz频带如此的纷繁杂乱,一些产品研发活动正在转向5GHz频带——但由于存在有效通信距离问题这一趋势仍然非常有限。 2.4GHz是一种通用频带,而分配给低功耗无线应用的1GHz以下频带在不同国家存在不同的情况。在美国,最普遍的剩余频带为902~928MHz,而在欧洲大多数无线通信活动都集中在868MHz频率范围内。 当需要与其他系统通用,以及在不同地理空间中工作运行是一个关键问题时,我们推荐使用2.4GHz频带。使用2.4GHz频带的主要缺点是其拥挤的空间,以及由于2.4GHz频率较差的传输特性所带来的有限通信距离。 选择在1GHz以下频带设计产品有助于解决在2.4GHz频带面临的一些问题;然而,1GHz以下频带也存在一些其自身的局限性: 1 受限占空比 2 无法实现与其他系统的互操作性 3 不同地理空间工作限制(例如,针对美国902~928MHz频带设计的无线仪表无法在欧洲正常工作)     根据不同的频率、目标数据速率、距离,以及互操作性的理想水平,新出现了几种工作在ISM频率空间中的标准。图1显示了无线工程师进行产品开发时最常使用的一些标准。 无线传感器网络概况     很明显,“智能”环境代表了建筑、公共事业、工业、家庭、交通运输和农业下一个演变发展阶段。因此,人们对WSN的关注度正在稳步上升。一个WSN由许多分布于某个地理区域的传感器组成。     WSN一般都包括一台主机或者“网关”,其通过一个无线电通信链路与大量无线传感器进行通信。数据收集工作在无线传感器节点完成,被压缩后,直接传输给网关,或者如果有要求,也可以利用其他无线传感器节点来将数据传递给网关。之后,网关保证该数据是系统的输入数据。 每个无线传感器都被看作一个节点,拥有无线通信能力,同时还具有一定的信号处理与网络数据的智能。根据应用的类型,每个节点都可以有一个指定的地址。图1显示了某个节点的通用结构图。它一般会包括一个传感装置、一个数据处理微控制器,以及一个无线连接RF模块。根据不同的网络定义,RF模块可以起到一个简单发射器或者收发器 (TX/RX)的作用。进行节点设计时,注意电流消耗和处理能力非常的重要。微控制器的内存非常依赖于所使用的软件栈。 图1   一个WSN节点的通用结构图 图2显示了家庭环境中应用的一个WSN。在这种网络中,我们可以观察到不同类型的传感器,例如,运动检测器、散热器、温度监控,等等。 WSN针对4种主要目标: 1 读取给定位置的一些参数值,并将其发送给主处理中心。在农业应用环境中,例如,前面介绍的牛群等,读取每头牛的体温可帮助确定哪一头牛需要更密切的监控。 2 监控某些事件的发生,例如,在医疗应用中,对血压和脉搏以及心律峰值进行监控。 3 对具体物体的运动进行跟踪,广泛应用于军事领域中,以跟踪敌方车辆。 4 帮助分类探测对象,特别是在交通控制应用环境中。 WSN中使用的两种主要拓扑结构: A) 星状网络:如图3所示,星状网络由一个点对多点无线连接组成,其一台单主机以双向或者单向方式连接至几个节点。如果低功耗和低软件开销为关键参数,则这种拓扑结构非常值得关注。其存在的局限性是有效通信距离,因为每个节点都要在主机通信距离范围以内。有几种标准可以用于实现这种拓扑结构。蓝牙、IEEE 802.15.4或者专有系统为使用最为广泛的一些标准。注意,由于一些蓝牙协议的局限性,蓝牙平台并未获得广泛的接受。 图3   WSN 应用的星形网络拓扑结构 B) 网状网络:在网状网络拓扑结构中,如图4所示,节点与许多冗余互连连接在一起。如果某个节点故障,有许多其他方法让两个节点进行通信。这种拓扑具有较好的可靠性,但在电流消耗和软件开销方面付出代价非常大。这种拓扑结构可以通过所有权或者Zigbee标准来实现。 图4   WSN应用中所使用的网状网络拓扑 结论       WSN每天都在发展,而随之出现的新标准也越来越多。然而,需要注意的是大多数这些标准都还没有达到成熟的水平。相反,它们都还处在刚刚起步的阶段。一位严谨的 WSN 设计工程师会在架构以及特定标准的能力方面深入研究其网络需求,以便满足电流消耗、最大允许节点数、电池寿命、数据速率和工作频率等关键要求。

  • 发表了主题帖: 针对恶劣工业环境选择以太网的三大注意事项

          在以太网取得了突飞猛进发展的当代,现已在商业和企业市场上得到了大量的应用。由于它具有定义明确的标准和易于部署的特性,以太网在工业世界中的广泛传播也是合乎常理的。然而,要在恶劣的工业环境中满足以太网的要求仍需要大量洞察和努力。 如图1所示,工业环境和商业环境完全不同,其自身会面临一系列挑战。工业环境往往包括许多恶劣的条件,如更高的温度范围和电压、更大的噪声、机械应力等。工业级以太网物理层(PHY)必须符合以太网协议的要求。在本文中,我将简要描述为您的系统选择以太网物理层时要考虑的三个最重要的因素。 图1:通过无线和有线连接(包括以太网)的现代工业设置     1.低延迟。延迟是指数据包从源传输到目标所需的时间。网络中的不同部分将导致总的网络延迟。工业网络中的通信对时间要求严格,这意味着用具有最低的延迟和最高的确定性。较高的延迟和不同的数据包到达时间会降低系统性能。 标准以太网具有不确定性。IEEE 802.3标准没有指定以太网物理层的最大延迟数。然而,对于工业环境中的以太网收发器来说,具有低且确定的延迟变得非常重要。低且确定的延迟能够加快响应时间并提高可预测性。低延迟可以让应用更快地运行,因为信息通过网络传播时等待时间的更短,而高确定性延时由于使延时保持不变,从而提高了不同网络的同步性。     2.EMI/EMC降低。电磁干扰(EMI)是系统无意间产生的电磁能量。另一方面,电磁兼容性(EMC)是指系统能够在其他系统产生电磁能量的环境中运行。电磁干扰(EMI)和电磁兼容性(EMC)是工业环境中的重要参数,因为其可能具有多种电磁能量来源。抗电磁干扰性能差的系统会辐射大量能量,会扰乱附近的敏感器件并降低效率,因为能量在辐射中被浪费。电磁兼容性差的设计会使系统高度敏感并导致性能问题。电磁兼容设计差的系统的性能会受其他典型辐射源影响,如Wi-Fi、手机等。 存在不同的EMI/EMC标准,如欧洲标准化委员会(EN)、国际无线电干扰特别委员会(CISPR)、美国联邦通信委员会(FCC)等,这些标准会因地区和预期市场而变化。设备在获得使用认证前,必须满足这些标准规定的要求。这些标准随设备的最终应用而变化。工业市场的EMI/EMC标准较商业市场更为严格。     3.ESD保护。静电放电(ESD)是一种突然进入系统的电流通过与与带电体接触。静电放电事件很短,但它们可以向系统注入大量能量。如果设备的设计不能承受此类事件,其结果对设备来说很可能是毁灭性的,通常会导致设备毁坏。由于静电放电并不总是留下明显的损坏迹象,因此在复杂的系统中很难找到损坏的设备。作为一个如此重要的参数, ESD标准已经被制定使器件根据它们的最终应用,必须满足其最低要求,例如国际电工委员会 (IEC) 61000-4-2,,。与EMI/EMC类似,工业市场的ESD要求比商业市场更为严格。     工业级以太网物理层应具有低的确定性延迟,符合严格的EMI/EMC标准,并能抵抗ESD事件。TI的以太网产品组合旨在满足这些要求,并已在世界各地的许多恶劣工业环境中投入使用,其中包括DP83867针对恶劣工业环境定制的千兆以太网 PHY和DP83826E低延迟性 10/100Mbps以太网物理层等设备。

  • 2020-07-10
  • 发表了主题帖: MSP430FR2311 微控制器 IR 反射感测参考设计

    设计展示了基于 MSP430™ FRAM 微处理器 (MCU) 且具有可配置模拟的红外反射感应解决方案,适用于感应和测量应用。它展示了 MCU 的超低功耗特性以及 FRAM 技术和集成式互阻抗放大器 (TIA) 的优势。单节 CR123 电池为板供电,使其使用寿命长达十多年。   特性 基于 FRAM 的 MSP430FR2311 省去了外部 EEPROM 集成型互阻抗放大器 (TIA) 具有 pA 水平的低漏电输入 超低平均功耗 (MCU 1μA) 凭借单节 CR123 电池实现长达十年的使用寿命 高 ESD 性能且布局简单

  • 2020-07-06
  • 发表了主题帖: C2000LaunchPad外部中断翻转LED

    程序功能:将GPIO12配置成中断输入。按键按下,触发下降沿中断,中断服务子程序翻转LED。 中断向量表 主函数,main.c /* Includes ------------------------------------------------------------------*/ #include<F2802x_Device.h> #include<DSP28x_Project.h> #include "SubFunction.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/   void main(void) {     // 系统控制初始化     InitSysCtrl();     InitGpio();     // 禁止全局中断     DINT;     InitPieCtrl();     // 禁止CPU中断     IER = 0x0000;     // 清楚CPU所有中断标志     IFR = 0x0000;     // 位向量表中的所有中断向量配置对应的入口地址     InitPieVectTable();     EXTI_Configure();     EINT;     // 允许访问受保护的空间     EALLOW;     // 配置I/O口为输出     GpioCtrlRegs.GPADIR.all=0x000f;     // 禁止访问受保护的空间     EDIS;     while(1){     } }   外部中断配置函数 /* Includes ------------------------------------------------------------------*/ #include<F2802x_Device.h> #include<DSP28x_Project.h> #include "C2000_it.h" /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/   /**************************************************************************** * Function Name  : EXTI_Configure * Description    : 配置外部中断 * Input          : None * Output         : None * Return         : None ******************************************************************************/ void EXTI_Configure(void) {     //允许访问受保护的空间     EALLOW;       PieVectTable.XINT1= &EXTI12_IRQHandler;     GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1;            //除能上拉电阻     GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;        //GPIO12作普通IO使用 p189     GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;            //配置为输入     GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 2;        // 6 samples     GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xFF;    //采样周期为510*Tsysclk,窗口宽度为5*510*Tsysclk=2550/60M=42.5us     GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12;    //GPIO12作为xint1的中断源       XIntruptRegs.XINT1CR.bit.POLARITY = 1;        //上升沿触发中断     XIntruptRegs.XINT1CR.bit.ENABLE = 1;          //外中断1使能       PieCtrlRegs.PIECTRL.bit.ENPIE = 1;            //使能PIE     PieCtrlRegs.PIEIER1.bit.INTx4 = 1;            //使能int1.4       IER |= 0x0001;                                //使能int1     //禁止访问受保护的空间     EDIS; } 中断服务程序 /* Includes ------------------------------------------------------------------*/ #include<F2802x_Device.h> #include<DSP28x_Project.h> /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/ /* Private functions ---------------------------------------------------------*/     /******************************************************************************* * Function Name  : EXTI12_IRQHandler * Description    : This function handles External interrupt Line 12 request. * Input          : None * Output         : None * Return         : None *******************************************************************************/ interrupt void EXTI12_IRQHandler(void) {     GpioDataRegs.GPATOGGLE.bit.GPIO0=1;     PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; }

  • 发表了主题帖: C2000LaunchPad学循环查询按键点亮LED

    #include<F2802x_Device.h> #include<DSP28x_Project.h> void main(void) {     // 系统控制初始化     InitSysCtrl();     InitGpio();     // 禁止全局中断     DINT;     InitPieCtrl();     // 禁止CPU中断     IER = 0x0000;     // 清楚CPU所有中断标志     IFR = 0x0000;     // 位向量表中的所有中断向量配置对应的入口地址     InitPieVectTable();     // 允许访问受保护的空间     EALLOW;     // 配置GPIO0 GPIO1 GPIO2 GPIO3为输出,GPIO12为输入     GpioCtrlRegs.GPADIR.all=0x000f;     // 禁止 GPIO12 内部上拉     GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1;     //禁止访问受保护的空间     EDIS;     while(1){         if(GpioDataRegs.GPADAT.bit.GPIO12 == 1){             GpioDataRegs.GPASET.bit.GPIO0 = 1;         }else{             GpioDataRegs.GPACLEAR.bit.GPIO0 = 1;         }     } } 总结两点: 1、原以为这个程序会很容易实现,可还是费了不少工夫。在原来InitGpio()函数中,把所有的脚配置成了上拉输入。C2000LaunchPad原理图为 出现的现象是:        程序开始执行后,GPIO12读到为低电平,按下按键,读到高电平,LED0熄灭。放开按键,再次按下,仿真看到仍然读到为高电平,LED无变化。 折腾了一阵子,身边两个万用表全没电了,没法看电阻R11上端电平。用导线把R11上端接地,GPIO12读到0,LED点亮。 分析原因:         可能是C2000内部上拉电阻小于R11,导致GPIO12读到一直为高电平,但又不明白为啥按键按下前不读到高电平.....有点邪乎。 某大牛曾说,每一个莫名其妙现象的背后,都有一个知识的盲点。好吧,暂不求甚解。 解决方法:         禁止GPIO12输入上拉后,测试OK

  • 发表了主题帖: TMS320F280049C 学习笔记15 DAC

    280049C有两路DAC,一般用来接示波器,将程序的内部变量输出出来观察,极大的方便了调试。 每个缓冲DAC具有以下功能: 12位可编程内部DAC 可选参考电压源 使用内部VREFHI时可选x1和x2增益 能够与EPWMSYNCPER同步 DAC的框图如图所示: DAC的参考电压源DACREF可在VDAC和VREFHI之间选择。只有当VREFHI设置为DACREF且使用内部参考模式时,x2增益模式才可用。另外,即使DAC选择x2增益模式,其最大输出电压也不会大于VDDA。下表列出了DAC支持的增益模式组合。在这个表中,x=A或B,X=Don’t Care,VDAC/VREFHI=2.5v,VDDA=3.3v,DACVAL=4095。 例程 官方提供了2个例程,位置在C:\ti\c2000\C2000Ware_3_01_00_00\driverlib\f28004x\examples\dac 在例程中使用了外部参考,LaunchPad需要从3.3V外接一根线。感觉不太实用。 这里根据自己的习惯,使用内部电压参考,并将输出范围设置为码值0-4095对应0-3.3V。也就是按照上表的红色箭头配置。 #include "F28x_Project.h" #include "device.h" #include "math.h" // DA输出值 int16_t dacVal = 2048; void configureDAC(void); void main(void) {     // 初始化时钟和外设 Initialize device clock and peripherals     Device_init();     // InitSysCtrl();  //本工程不能使用寄存器的InitSysCtrl();函数初始化。     /*//库函数版配置     // 初始化GPIO并设置为推挽输出 Initialize GPIO and configure the GPIO pin as a push-pull output     Device_initGPIO();     GPIO_setPadConfig(DEVICE_GPIO_PIN_LED1, GPIO_PIN_TYPE_STD);  // Push-pull output or floating input     GPIO_setDirectionMode(DEVICE_GPIO_PIN_LED1, GPIO_DIR_MODE_OUT);     */     InitGpio();  //寄存器指令配置 //    GPIO_SetupPinMux(DEVICE_GPIO_PIN_LED1, GPIO_MUX_CPU1, 0); //    GPIO_SetupPinOptions(DEVICE_GPIO_PIN_LED1, GPIO_OUTPUT, GPIO_PUSHPULL);     // 初始化PIE并清空PIE寄存器,关闭CPU中断     // Initialize PIE and clear PIE registers. Disables CPU interrupts.     Interrupt_initModule();     // 初始化PIE向量表     // Initialize the PIE vector table with pointers to the shell Interrupt     // Service Routines (ISR).     Interrupt_initVectorTable();     configureDAC();     // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)     EINT;     ERTM;     for(;;)     {         dacVal=dacVal<0?0:dacVal;         dacVal=dacVal>4095?4095:dacVal;         DAC_setShadowValue(DACA_BASE, dacVal);         DEVICE_DELAY_US(2);     } } // // 配置DACA,使用内部1.65V基准,设置输出范围为0-3.3V // void configureDAC(void) {     // 选择内部1.65V参考     EALLOW;     AnalogSubsysRegs.ANAREFCTL.bit.ANAREFA2P5SEL = 0;     // 使能内部参考     AnalogSubsysRegs.ANAREFCTL.bit.ANAREFASEL = 0;     EDIS;     DAC_setReferenceVoltage(DACA_BASE, DAC_REF_ADC_VREFHI);     // DAC输出增益2倍     DAC_setGainMode(DACA_BASE, DAC_GAIN_TWO);     // 使能DAC输出     DAC_enableOutput(DACA_BASE);     // 设置DAC影子寄存器输出0     DAC_setShadowValue(DACA_BASE, 0);     // 延迟,等待DAC上电启动     DEVICE_DELAY_US(10); }  

  • 发表了主题帖: C2000™关键技术指南

    本应用报告旨在对C2000 微控制器单元(MCU) 中与实时控制系统相关并使其性能脱颖而出的器件进行更深 入的研究。重点介绍了德州仪器(TI) 认为会对整体系统性能产生明显影响以及可增加MCU 带宽的特性。 本文档对系统的特定方面进行了扩展研究,并在所涉及主题方面对其进行了改进。最后,针对每个主题提供 了适用参考文件以及指向分离式器件型号(PN)、参考设计和演示套件的链接。

  • 回复了主题帖: 具有连接管理器的 TMS320F2838x 微控制器

  • 发表了主题帖: 具有连接管理器的 TMS320F2838x 微控制器

     

  • 2020-07-05
  • 发表了主题帖: C6000 处理器OMAP-L138 开发套件 (LCDK)

统计信息

已有135人来访过

  • 芯币:2157
  • 好友:1
  • 主题:845
  • 回复:36
  • 课时:--
  • 资源:--

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言