tag 标签: delfino

相关博文
  • 热度 26
    2012-11-24 16:58
    4764 次阅读|
    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的报错。只要扩大容量即可解决问题。
  • 热度 37
    2012-11-19 20:45
    3286 次阅读|
    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提供的技术手册为准。
  • 热度 17
    2012-11-19 20:12
    3036 次阅读|
    0 个评论
        写在最前,不喜请略过。本博文的主要内容已在QQ空间、人人网、网易博客、百度空间等平台发表过,作者为Mr_D_prince(斌斌-龙臻),也就是本人,前两者均为我在非技术论坛的昵称。在技术论坛我更喜欢newofcortexm3这个昵称,原因无他,我就是个技术新人。之所以文章类型为什么是整理,是因为博文的主要内容均来自TI相关的技术手册,我只是做了下解读或者整理。      GPIO ( General-Purpose Input/Output )——通用输入 / 输出口,对大多数从事电子行业的人来说并不是什么陌生的东西。但它却是基础性的,很多 MCU 的后续开发都得用到 GPIO 。 F28335 有 88 个 IO 口,为 GPIO0 至 GPIO87 ,其中 GPIO0 至 GPIO63 可以配置为 8 个核心中断。 28335 的 GPIO 口可以分为三组,分别为 A 口( GPIO0 至 GPIO31 ), B 口( GPIO32 至 GPIO63 )和 C 口( GPIO64 至 GPIO87 )。 GPIO 的寄存器可以分为三种,分别是 GPIO 控制寄存器, GPIO 数据寄存器和 GPIO 中断与低功耗模式选择寄存器。 每个通用 I/O 端口都受多路复用( MUX ),方向( DIR ),数据( DAT ),置位( SET ),清楚( CLEAR ),以及切换( TOGGLE )寄存器的控制。   多路复用寄存器 GPxMUX ( x=A,B,C )用来配置引脚的功能,是外设操作还是 I/O 操作。复位时,所有的 GPIO 引脚都配置成数字 I/O 功能。当寄存器中某位置 1 时,相应的引脚配置成相应的外设。具体的管脚与外设功能见技术手册 sprufb0d —— System Control and Interrupts 的 Table 50 ( GPAMUX1 )。 方向控制寄存器 GPxDIR 用来将相应的 I/O 管脚配置成输出或输入,复位时,所有的 GPIO 引脚配置成输入,当 GPxDIR.bi t= 1 时,引脚配置成输出。在采用 GPxDIR 寄存器位将输入端口改变成输出端口之前,引脚的当前电平反应到 GPXDAT 寄存器上。在改变输入成输出状态之前,初始化 GPxDAT 用寄存器 GPxSET 、 GPxCLEAR 、 GPxTOGGLE实现 。 上拉电阻使能寄存器 GPxPUD 用来配置是否使能上拉电阻。复位时,所有的 GPIO 引脚使能上拉电阻,当 GPxPUD 寄存器的某位置 1 时,相应的引脚的上拉电阻不使能。 数据寄存器 GPxDAT ,是一个读 / 写寄存器,读入的该寄存器的值反应了输入限制后输入引脚当前的电平,写寄存器可设置输出引脚为相应的电平。但在实验过程中发现,要对该寄存器的某个位写1或置零,必须延迟多个系统周期才能实现。鉴于此对GPIO的某个具体引脚操作时不建议使用此寄存器,使用置位寄存器和清楚寄存器要来的高效的多。 置位寄存器 GPxSET 是一个只写寄存器,读为 0 。如果对应的引脚配置为输出,则向置位寄存器的该位写 1 ,将对应引脚的电平拉高,写 0 则无效。 清除寄存器 GPxCLEAR 是一个只写寄存器,读为 0 。如果对应的引脚配置为输出,则向清除寄存器的该位写 1 ,将把对应引脚的电平拉低,写 0 无效。 切换寄存器 GPxTOGGLE ,是一个只写寄存器,读为 0 。如果对应的引脚配置为输出,则向切换寄存器的该位写 1 ,将把对应引脚拉成反向电平,写 0 无效。 中断选择寄存器 GPIOXIMTnSEL 的功能是选择某位 I/O 引脚来配置中断。具体的配置见表 6 。该表配置的是 GPIO0 至 GPIO31 ,对应的是 XINT1 和 XINT2 ,具体的中断配置见寄存器 XINT1CR 和 XINT2CR。 低功耗模式唤醒选择寄存器 GPIOLPMSEL 针对的是 GPIO0 至 GPIO31 ,向寄存器的某位写 1 ,则相应的信号引脚将唤醒设备,无论设备处于 HALT 或者 STANDBY 低功耗模式。写 0 则无效。 下面介绍一个简单的例子,点亮LED。电路图如下图所示:     在图中,LED所连接的GPIO引脚是GPIO60和GPIO61 和 GPIO61 ,当GPIO60和GPIO61为低时,D1和D2发光。程序如下:   #define    LED1       GpioDataRegs.GPBDAT.bit.GPIO60 #define    LED2       GpioDataRegs.GPBDAT.bit.GPIO61 LED 的初始化程序 void configLED(void) { EALLOW; GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1; GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0; GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1; EDIS; }     在主函数中调用 configLED()函数,再对LED1和LED2进行简单的赋值即可实现LED的控制。例如:LED1亮,LED2灭,即LED1=0;LED2=1.