tag 标签: ti博客大赛

相关博文
  • 热度 26
    2012-11-24 16:58
    4786 次阅读|
    3 个评论
           写在最前,不喜请略过。本博文的主要内容已在QQ空间、人人网、网易博客、百度空间等平台发表过,最近进行了排错和修改,作者为Mr_D_prince(斌斌-龙臻),也就是本人,前两者均为我在非技术论坛的昵称。在技术论坛我更喜欢newofcortexm3这个昵称,原因无他,我就是个技术新人。之所以文章类型为什么是整理,是因为博文的主要内容均来自TI相关的技术手册,我只是做了下解读或者整理。     参与了一款两轮自平衡机器人的研究项目。随着项目实践深入,要实现的 功能 越来越复杂,所定义的常量、变量也越来越多。某一天,当我增加了 串口 通信 的代码之后,CCSV4.12竟然提醒 编译 不通过,提醒的内容是“.econst”的容量超限,如下图1所示,而把增加的代码删除之后,程序可以正常编译且运行。   图1:编译出现的问题     既然是容量问题,那我削减变量、常量的个数总可以吧,当我费了九牛二虎之力把可删减的常变量去掉之后,这个问题依然存在,。而此问题的原因恰恰是CCS安装完C2000目录下自带的 28335_Ram_lnk.cmd 文件 (09年之后)上的那些“段”的空间映射的太细,太小。新版本的28335_Ram_lnk.cmd 文件 上“.econst”段空间长度为0x1000,只有之前的版本的四分之一。     先来简单介绍下cmd文件。CCS的每一个项目都必须有CMD文件,CMD文件主要是用来对存储区域进行划分并对输出端进行地址分配。说的笼统点,就是将处理器的片内外存储器进行空间分配。     在CMD文件中,可以通过MEMORY伪指令确定目标存储器的属性及存储区域。每个存储区域包括:名字,起始地址,长度,属性选项,指定填充选项。F28xx系列DSP的数据和程序空间是相互独立的,在默认状态下,一部分存储器作为程序区域,一部分存储器作为数据区域。一般来说,MEMORY伪指令的PAGE0配置程序空间,PAGE1配置数据空间。使用MEMORY伪指令必须指明转载代码要用到的存储区域,以便链接器进行配置。MEMORY的一般指令格式如图2所示: 图2:MEMORY指令格式           在链接时,一般通过SECTIONS伪指令把输出段分配到MEMORY伪指令定义的存储区域。每一个输出段以名称开头,定义一个输出文件中的段。段名后面是段的属性,段的属性可能有以下几种:装载位置,运行位置,输出端,段类型,填充值。链接器为每一个输出段在目标存储器中分配两个地址,一个是段的装载位置,一个是段的运行位置。通常情况下,这两个地址相同。           可以通过一个或多个定位参数来控制地址分配,每一个参数包含一个关键字、可选的符号为等号或大于号。所用到的关键字有:LOAD(装载),Binding(绑定),Named MEMORY(命名存储器),Alignment(定位),Blocking(分块),Page(页)。相比较而言,Page的使用率远远高于其他几个关键字。SECTIONS的一般指令格式如图3所示: 图3:SECTION指令格式     在图3SECTIONS的指令格式中,我们看到了一些段名,有必要对这些段名做些解释。链接器定义了两种基本类型的段:一种是包括数据表格或执行代码的已初始化的段,另一种是分配在RAM空间的未初始化的段。 .text  此段存储所有执行代码和常数 .cinit此段存放初始化变量和常数,包含未用const声明的外部(extern)或静态(static)数据表 .pinit此段存放初始化变量和常数 .const此段存放字符串常量,声明,具备常数性质的全局和静态变量,包括已经用const声明的外部或静态数据表以及字符串常量 .econst此段的属性与.const相同。不同的是,.const的分配范围被限制在低64K16位数据区内,而.econst的分配范围是4M22位数据区 .switch  此段存放switch语句的常数表格   以上的段都是已经初始化了的段。 链接器定义的未初始化的段为:.bss,.ebss,.stack,.sysmem,.esysmem。 .bss此段为全局和静态变量保留空间。它是一种默认的COFF(Common Object File Format)(如有兴趣了解,请查看TI的手册)段。 .ebss此段的属性与.bss相同。不同的是,.bss的分配范围被限制在低64K16位数据区内,而.ebss的分配范围是4M22位数据区 .stack  此段为C系统的栈存储区,用来向函数传递数值与分配局部变量空间。 .sysmem此段为堆存储区 .esysmem此段为22位堆存储区 通过以上的解释,想必对CMD文件的框架应当有所了解,但要完全读懂CMD文件可能还要假以时日,当初笔者也是这样过来的。在阅读CMD文件时要前后对应,要将MEMORY指令中的名字与SECTIONS中的装载位置一一对应,并注意Page,弄清楚是在程序空间还是数据空间。     在09年之后的CMD文件中,.econst段存放在程序区以RAML1命名的程序空间,其空间存储量为0x001000。虽然以RAML1命名的程序空间有0x001000的容量,但并不是全部用来作为.econst段的,因此当代码中,字符串常量等数据量超过.econst段的容量时,就出现了图1的报错。只要扩大容量即可解决问题。
  • 热度 19
    2012-11-20 16:18
    10605 次阅读|
    2 个评论
    430的USCI串口(UART mode)初始化设置十分繁杂, UCA0BR0  UCA0BR1   UCA0MCTL 等还需按照波特率计算,并且有小数部分微调,在这里共享一个头文件,在操作串口时,只要一个init_uart(9600);就全搞定,注:9600还能改成4800 115200等其他波特率,十分方便。   #define clock 8000000 #define UCBRS(x) UCBRS_##x void uart_init(long baud) {       float  x  =  clock / baud ;       long  y  =  clock / baud ;       char n;       P1SEL  =  BIT1  +  BIT2 ;                     // P1.1 = RXD, P1.2=TXD       P1SEL2  =  BIT1  +  BIT2 ;          UCA0CTL1|=UCSSEL_2 ;             UCA0BR0  =  y % 256;                                UCA0BR1  =  y / 256;             n=(char)((x-y)*8);       UCA0MCTL=2*n; //UCBRS_n n为*2            UCA0CTL1 = ~UCSWRST;                           IE2  |=  UCA0RXIE ;           } UCA0MCTL=2*n; 这里是移位操作,详情请看register。 当然,时钟修改了的话,也要记得把clock修改一下。 好用的话,大家支持一个吧,下面我把头文件共享,支持printf,getchar等        
  • 热度 19
    2012-11-20 16:08
    5355 次阅读|
    2 个评论
    本文是之前写的,属9crk原创。 首先,c2000有多重启动方式,可以从datasheet 29页看到支持的启动模式,目前基本上都是使用仿真器,很少有使用其他方式下载的方案提供,不过有个SDflash软件,可以研究一下 Table 3-6. Boot Mode Selection GetMode Wait (see Section 3.3.10 for description) SCI Parallel IO EMU x x 1 Emulation Boot (就是仿真器) 很多人接触这个都是因为收到了21ic发的c2000开发套件,但发现上面的芯片写着TMX320f28035,感觉不解,请看datasheet 98页 TMX Experimental device that is not necessarily representative of the final device's electrical specifications TMP Final silicon die that conforms to the device's electrical specifications but has not completed quality and reliability verification TMS Fully qualified production device X就是实验用的,内部存在一些东西不支持,P就是确定电气特征,但不完全确定质量,S才是质量可靠的。 我拿到的是官网的28035实验套件。 首先,对于软件的使用:有ccs3.3和官网提供的ccs4可供选择,建议选择ccs4,因为在ccs4里可以选择位。这是eclipse开发环境的好处。 ccs3需要有型号支持,一般网上下载的ccs3.3都是不支持28035的,如果你一定要用,可以留言。我发给你。 然后就是你要下载一个库,里面包含了所有功能的实例代码和头文件、cmd文件,然后把它放到不要有中文名的路径下,随便放哪。 注:以下为针对ccs4的版本 然后开始新建工程: 新建一个工程都用默认选项,就是选择型号那里要选28035,这时会新建一个只有28035_RAM_link.cmd的工程。 注意:ccs可以同时打开多个工程,但只有黑粗体的那个工程才是当前激活工程,(也就是说你按编译,他就会编译那个黑粗体的工程) 可以右键设置任一工程为激活工程 然后右击当前工程link files to project 然后将你下载的那个库里的以下文件link进去 DSP2803x_CodeStartBranch.asm DSP2803x_DefaultIsr.c DSP2803x_PieCtrl.c DSP2803x_PieVect.c DSP2803x_SysCtrl.c DSP2803x_usDelay.asm DSP2803x_CodeStartBranch.asm DSP2803x_Headers_nonBIOS.cmd 一共八个文件,在不同的目录里,就在common和header的文件夹里,自己多找找就可以找到这几个文件了。 添加完文件了再就是添加include目录,因为那些头文件都在你放的库的目录里,你不添加进来这些.c文件会找不到定义。 右击工程点击build properties,然后在tool setting里面有很多东西,但我们只要关注两个东西: C2000 copalier下的include options和C2000 linker下的basic options 在include option里添加D:\v121\DSP2803x_common\include和D:\v121\DSP2803x_headers\include (注:这是我电脑上的路径,你们看情况)。然后再C2000 linker下的basic options里设置stack size,堆栈大小,可以设置成200或者300都可以。 然后保存设置,退出来。 新建一个main.c 写上下面的: #include "DSP28x_Project.h" void main(void) { InitSysCtrl();//将系统时钟设置为60M,如果是自己diy的板子,时钟不是10M,可以研究里面的参数设置一下 DINT;//关掉总中断 InitPieCtrl();//在dsp里,中断通过pie控制器来管理中断响应 IER = 0x0000;//这个是12组中断使能寄存器,都关掉 IFR = 0x0000;//这个是12组中断的标志位,清零 InitPieVectTable();//这个是初始化中断向量表的,就是将各种中断的中断函数入口地址指派一下 EALLOW; //在dsp里,有些寄存器设置时要先解开寄存器保护,这个命令是解开保护,下面这几条是设置io的功能 GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 0; //GPIO31作为普通IO GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; //GPIO34作为普通IO GpioCtrlRegs.GPADIR.bit.GPIO31 = 1; //GPIO31方向为输出 GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; //GPIO34方向为输出 EDIS; //对应解开保护,这个是关闭保护 while(1) { DSP28x_usDelay(10000000);//这个函数是用汇编定义的,在DSP2803x_usDelay.asm里面定义的,比较准确,参数是long 型的。? GpioDataRegs.GPATOGGLE.bit.GPIO31 = 1; //GPIO31端口电平翻转一次 GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1; //GPIO34端口电平翻转一次 } } 然后编译,不会有错误。 然后就是下载 点击 target-launch ti debugger target-connect target 此时会出现错误,连接不上(如果你没出现错误,下面的略过) //*********************错误解决步********************************** 先把连接结束(terminate all) 点击target-new target configuration 然后会弹出一个文件,在里面设置connection为xds100v1.0,然后选型号为28035 experiment kit然后save 然后重新编译、重复launch connect步骤,如果你还是在connect步骤出错,重启ccs就可以了。 //*********************错误步********************************** load program 选择你的工程debug目录下的.out文件,然后点击debug窗口的run就可以全速运行了,单步、over什么的不用我教了。
  • 热度 37
    2012-11-19 20:45
    3325 次阅读|
    6 个评论
        写在最前,不喜请略过。本博文的主要内容已在QQ空间、人人网、网易博客、百度空间等平台发表过,最近进行了排错和稍稍修改,作者为Mr_D_prince(斌斌-龙臻),也就是本人,前两者均为我在非技术论坛的昵称。在技术论坛我更喜欢newofcortexm3这个昵称,原因无他,我就是个技术新人。之所以文章类型为什么是整理,是因为博文的主要内容均来自TI相关的技术手册,我只是做了下解读或者整理。     用户可以通过 GPIO 限制选择寄存器来选择GPIO引脚的输入限制类型。主要由输入异步,仅与SYSCLKOUT同步,采用采样窗限制这几种限制类型。本博文主要讲第三种类型。      GPIO 控制寄存器 GPxCTRL(x=A,B,C) 为配置为输入限制的引脚指定了采样周期。采样周期介于限制采样周期之内,是相对于系统时钟周期的倍数,由该寄存器的QUALPRDn位来指定,一个采样周期可以用来配置8路输入信号,具体的配置请见表1。而 GPIO 限制选择寄存器 GPxQSELy(x=A,B,C;y=1,2) 指定了采样窗是 3 个采样点还是 6 个采样点。当有3个或6个连续的采样周期相同时,输入信号才会被采集。 表1: GPIO Port A Qualification Control (GPACTRL) Register Field Descriptions 以上介绍的两个寄存器主要是为 GPIO 的采样窗限制功能进行了必要的配置。下面我引入图 1 ( Qualification Using Sampling Window )和图 2 ( Input Qualifier Clock Cycles ),来使大家清楚地知道 GPIO 的输入限制是怎样完美的去除我们不需要的噪声的。 图1: Qualification Using Sampling Window 图2: Input Qualifier Clock Cycles 因为输入的信号时异步的,为了同步,在限制窗开始之前必须要有一个 SYSCLKOUT   的延迟。在图 2 中,输入限制将忽略这个尖刺小脉冲。 QUALPRD 位域值限制采样周期, 8 位值范围为 0~255。 当 QUALPRD 为 0 时,无限制输入,此时采样周期与 SYSCLKOUT 同步。对于任意一个“ n ”值,限制周期  = 2*n 个系统时钟周期( SYSCLKOUT ),即每 2*n 个系统时钟周期, GPIO 引脚进行一次采样。当 6 个采样都为同一个值时,才可以确定一个输入。 具体的采样周期的配置和采样窗的配置可参考上文列出的表格。     当有输入限制时将检测输入变化,输入必须稳定( 5*QUALPRD*2 )个 SYSCLKOUT 周期,以保证检测时 6 个采样点的采样相同。例如 QUALPRD=1 时,输入必须有 10 个或者 10 个以上的稳定的 SYSCLKOUT 周期,因为外部信号是异步驱动的, 11 个 SYSCLKOUT 周期宽度的脉冲可以确保可靠的识别。     欲完整了解GPIO可参考附件。由于水平有限,难免会有错误,一切以TI提供的技术手册为准。
  • 热度 18
    2012-11-19 18:50
    941 次阅读|
    0 个评论
    有幸参加了TI举办的一个研讨会,得了块MSP430G2553的开发板launchpad,网上查找资料关于MSP430的资料和帖子很多,还有一些非常好的在线课堂,给我们学习带来了很大的方便,所以说学习MCU从430入手可以少走许多弯路。TI网站上的资料很全,下了技术手册和和用户指南,并按开发板上的功能一步步的走下去,一个学习阶段下来,进步是显而易见的。有了入门了解就是用它做点小的试验啥的了,如果有项目会对我们的学习产生很大的推动作用。我们跟随着TI公司,一路走来,难忘一路追求着MSP430,一路学习,收获知识。