嵌入式开发 DSP芯片运行方式(挖坑-填坑中-坑已平 :))

博主使用德州仪器TMS320F28335芯片实现走马灯时,发现控制板下电再上电后程序不运行。经分析,可能是程序下载到RAM而非FLASH导致。博主通过查看芯片存储空间、编程手册,调整下载配置文件等方式解决问题,最终将程序写入FLASH,并分享了整改后的完整程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前两天用德州仪器的TMS320F28335芯片,试着实现了一个走马灯,感觉挺好; 但后来,发现,这里面有个 ”坑“;【报告: 2024.2.23 这个坑终于填平了 ,下电后再上电,走马灯依然正常跑了

一、”坑“ 的现象:

发现这个走马灯的控制板正常带电的时候,下载完程序 运行 的时候,运行的很正常;但是一但控制板下电,再重新上电,哎? 不运行了,走马灯不跑了。 嘻嘻嘻嘻!

二、分析这个“坑”

为什么呢? 一脑袋的 Question Mark,  不过瞬间就想明白了,DSP芯片运行的程序(二进制执行码), 这个执行码应该可以存在RAM中,也可以存在FLASH,两个地方 啊,是不是程序下载的地方错了。

另:说说RAM和FLASH的特性:

RAM 一旦掉电,保存在RAM中的东西就 ”丢了“

FLASH 保存在这里的东西,下电后这个东西一直会保存着, 不会丢

三、开始解决(填坑):(写这篇小字的时候,这个坑还没填上)

1、看看这个芯片的存储空间:ROM在哪里,RAM在哪里,FLASH在哪里: 查资料截图如下:

看上面图:

红色框部分-ROM 只读的 掉电不丢失,也不可以写(这里面安装的是DSP基础程序 类似 BIOS)

绿色框部分-SARAM 读写 数据或程序 掉电会丢失;

蓝色框部分-FLASH 读写 数据或程序 写入后 掉电不会丢失;

”是不是我下载的程序 下载到了 RAM中, 应该下载到FLASH里就对了“

再看看德州仪器的这款芯片的内存、IO、等设备与地址映射图: 下面哈

从德州仪器这款芯片设计可以看出:

地址: 0x00XXXX-(0X000800-1) 这一段是RAM  掉电就丢失了;32*32 +1K*16+1K*16

地址: 0x008000-(0X010000-1) 这一段是RAM  掉电就丢失了;8*4K*16

地址:0x30XXXX-(0x33FFF8-1) 这一段是FLASH 掉电不丢失;256K  [靠 !运行码应该下载到这里吧]

地址: 0x3FXXXX-(0X3FC000-1)这一段是RAM  掉电就丢失了;

地址:0x3FE000-(0x3FFFC0-1) 这一段是ROM  掉电 不丢失 但也写不进去 芯片出厂被写死写,类似BIOS

2、 找找这个芯片编程手册、直接写下结论、手册说在编译源程序是有下载配置文件,nonBIOS 一共有三个

 【1】DSP2833x_Headers_nonBIOS.cmd【2】 28335_RAM_lnk.cmd 【3】F28335.cmd 这是德州仪器编译系统给的。

1)   如果运行码在RAM运行 使用 文件【1】和【2】

2)   如果运行码在FLASH运行 使用 文件 【1】和【3】

一般放在项目目录下,我放在了这里(这个是运行在RAM)

3、DSP2833x_Headers_nonBIOS.cmd的内容:

/*
// TI File $Revision: /main/5 $
// Checkin $Date: May 11, 2007   13:43:46 $
//###########################################################################
//
// FILE:    DSP2833x_Headers_nonBIOS.cmd
//
// TITLE:   DSP2833x Peripheral registers linker command file 
//
// DESCRIPTION: 
// 
//          This file is for use in Non-BIOS applications.
//
//          Linker command file to place the peripheral structures 
//          used within the DSP2833x headerfiles into the correct memory
//          mapped locations.
//
//          This version of the file includes the PieVectorTable structure.
//          For BIOS applications, please use the DSP2833x_Headers_BIOS.cmd file
//          which does not include the PieVectorTable structure.
//
//###########################################################################
*/

MEMORY
{
 PAGE 0:    /* Program Memory */

 PAGE 1:    /* Data Memory */
 
   DEV_EMU     : origin = 0x000880, length = 0x000180     /* device emulation registers */
   FLASH_REGS  : origin = 0x000A80, length = 0x000060     /* FLASH registers */
   CSM         : origin = 0x000AE0, length = 0x000010     /* code security module registers */
  
   ADC_MIRROR  : origin = 0x000B00, length = 0x000010     /* ADC Results register mirror */

   XINTF       : origin = 0x000B20, length = 0x000020     /* external interface registers */
   
   CPU_TIMER0  : origin = 0x000C00, length = 0x000008     /* CPU Timer0 registers */
   CPU_TIMER1  : origin = 0x000C08, length = 0x000008     /* CPU Timer0 registers (CPU Timer1 & Timer2 reserved TI use)*/
   CPU_TIMER2  : origin = 0x000C10, length = 0x000008     /* CPU Timer0 registers (CPU Timer1 & Timer2 reserved TI use)*/

   PIE_CTRL    : origin = 0x000CE0, length = 0x000020     /* PIE control registers */
   PIE_VECT    : origin = 0x000D00, length = 0x000100     /* PIE Vector Table */

   DMA         : origin = 0x001000, length = 0x000200     /* DMA Rev 0 registers */

   MCBSPA      : origin = 0x005000, length = 0x000040     /* McBSP-A registers */
   MCBSPB      : origin = 0x005040, length = 0x000040     /* McBSP-B registers */

   ECANA       : origin = 0x006000, length = 0x000040     /* eCAN-A control and status registers */ 
   ECANA_LAM   : origin = 0x006040, length = 0x000040     /* eCAN-A local acceptance masks */
   ECANA_MOTS  : origin = 0x006080, length = 0x000040     /* eCAN-A message object time stamps */
   ECANA_MOTO  : origin = 0x0060C0, length = 0x000040     /* eCAN-A object time-out registers */
   ECANA_MBOX  : origin = 0x006100, length = 0x000100     /* eCAN-A mailboxes */

   ECANB       : origin = 0x006200, length = 0x000040     /* eCAN-B control and status registers */ 
   ECANB_LAM   : origin = 0x006240, length = 0x000040     /* eCAN-B local acceptance masks */
   ECANB_MOTS  : origin = 0x006280, length = 0x000040     /* eCAN-B message object time stamps */
   ECANB_MOTO  : origin = 0x0062C0, length = 0x000040     /* eCAN-B object time-out registers */
   ECANB_MBOX  : origin = 0x006300, length = 0x000100     /* eCAN-B mailboxes */

   EPWM1       : origin = 0x006800, length = 0x000022     /* Enhanced PWM 1 registers */
   EPWM2       : origin = 0x006840, length = 0x000022     /* Enhanced PWM 2 registers */
   EPWM3       : origin = 0x006880, length = 0x000022     /* Enhanced PWM 3 registers */
   EPWM4       : origin = 0x0068C0, length = 0x000022     /* Enhanced PWM 4 registers */
   EPWM5       : origin = 0x006900, length = 0x000022     /* Enhanced PWM 5 registers */
   EPWM6       : origin = 0x006940, length = 0x000022     /* Enhanced PWM 6 registers */

   ECAP1       : origin = 0x006A00, length = 0x000020     /* Enhanced Capture 1 registers */
   ECAP2       : origin = 0x006A20, length = 0x000020     /* Enhanced Capture 2 registers */
   ECAP3       : origin = 0x006A40, length = 0x000020     /* Enhanced Capture 3 registers */
   ECAP4       : origin = 0x006A60, length = 0x000020     /* Enhanced Capture 4 registers */         
   ECAP5       : origin = 0x006A80, length = 0x000020     /* Enhanced Capture 5 registers */         
   ECAP6       : origin = 0x006AA0, length = 0x000020     /* Enhanced Capture 6 registers */         
 
   EQEP1       : origin = 0x006B00, length = 0x000040     /* Enhanced QEP 1 registers */
   EQEP2       : origin = 0x006B40, length = 0x000040     /* Enhanced QEP 2 registers */   

   GPIOCTRL    : origin = 0x006F80, length = 0x000040     /* GPIO control registers */
   GPIODAT     : origin = 0x006FC0, length = 0x000020     /* GPIO data registers */
   GPIOINT     : origin = 0x006FE0, length = 0x000020     /* GPIO interrupt/LPM registers */
                 
   SYSTEM      : origin = 0x007010, length = 0x000020     /* System control registers */
   SPIA        : origin = 0x007040, length = 0x000010     /* SPI-A registers */
   SCIA        : origin = 0x007050, length = 0x000010     /* SCI-A registers */
   XINTRUPT    : origin = 0x007070, length = 0x000010     /* external interrupt registers */

   ADC         : origin = 0x007100, length = 0x000020     /* ADC registers */

   SCIB        : origin = 0x007750, length = 0x000010     /* SCI-B registers */

   SCIC        : origin = 0x007770, length = 0x000010     /* SCI-C registers */
   
   I2CA        : origin = 0x007900, length = 0x000040     /* I2C-A registers */
   
   CSM_PWL     : origin = 0x33FFF8, length = 0x000008     /* Part of FLASHA.  CSM password locations. */

   PARTID      : origin = 0x380090, length = 0x000001     /* Part ID register location */
}

 
SECTIONS
{
   PieVectTableFile : > PIE_VECT,   PAGE = 1

/*** Peripheral Frame 0 Register Structures ***/
   DevEmuRegsFile    : > DEV_EMU,     PAGE = 1
   FlashRegsFile     : > FLASH_REGS,  PAGE = 1
   CsmRegsFile       : > CSM,         PAGE = 1
   AdcMirrorFile     : > ADC_MIRROR,  PAGE = 1 
   XintfRegsFile     : > XINTF,       PAGE = 1
   CpuTimer0RegsFile : > CPU_TIMER0,  PAGE = 1
   CpuTimer1RegsFile : > CPU_TIMER1,  PAGE = 1
   CpuTimer2RegsFile : > CPU_TIMER2,  PAGE = 1  
   PieCtrlRegsFile   : > PIE_CTRL,    PAGE = 1     
   DmaRegsFile       : > DMA,         PAGE = 1 

/*** Peripheral Frame 3 Register Structures ***/
   McbspaRegsFile    : > MCBSPA,      PAGE = 1
   McbspbRegsFile    : > MCBSPB,      PAGE = 1

/*** Peripheral Frame 1 Register Structures ***/
   ECanaRegsFile     : > ECANA,       PAGE = 1
   ECanaLAMRegsFile  : > ECANA_LAM    PAGE
第二章程序说明: (1)2-1.asm对应第二章主程序代码; (2)2-2.asm对应第二章主程序中断向量代码; (3)2-3.cmd对应第二章主程序配置文件代码; (4)2-4.asm对应第二章写Flash程序代码; (5)2-5.cmd对应第二章写Flash配置文件代码; (6)2-6.asm对应第二章写Flash中断向量代码; (7)2-7.cmd对应第二章写Flash工具代码; (8)2-8.asm对应第二章DSP读USB接口代码; (9)6711.h为以上程序需要的头文件,书中没有原代码。 第三章程序说明: (1)3-1.asm对应第三章AD测试程序代码; (2)3-2.asm对应第三章AD测试程序中断向量代码; (3)3-3.cmd对应第三章AD测试程序配置文件代码; (4)3-4.asm对应第三章DA测试程序代码; (5)3-5.cmd对应第三章DA测试程序配置文件代码; (6)3-6.asm对应第三章写Flash程序代码; (7)3-7.cmd对应第三章写Flash配置文件代码; (8)3-8.asm对应第三章写FLAS中断向量代码; (9)3-9.asm对应第三章AD/DA联合调试程序代码; (10)3-10.asm对应第三章数据滤波程序代码; (11)vectors.asm为以上程序需要的文件,书中没有原代码。 第五章程序说明: (1)5-1.asm对应第五章语音信号的采集和播放主程序; (2)5-2.asm对应第五章语音信号的采集和播放中断向量程序; (3)5-3.cmd对应第五章语音信号的采集和播放配置文件; (4)5-4.asm对应第五章语音信号的u/A律压缩程序; (5)5-5.m对应第五章语音去噪的仿真程序; (6)5-6.asm对应第五章语音去噪的主程序; (7)5-7.c对应第五章CVSD编码的C语言程序代码; (8)5-8.asm对应第五章CVSD的解码程序; (9)5-9.asm对应第五章CVSD的编码程序。 第六章程序说明: (1)6-1.asm对应第六章DSP软件代码; (2)6-2.c对应第六章主机软件代码; (3)6-3.c对应第六章回音相消主程序代码; (4)6-4.c对应第六章回音相消汇编程序代码; (5)echo.h对应第六章回音相消头文件代码; (6)echocfg.h对应第六章回音相消头文件代码; (7)6-5.cmd对应第六章回音相消配置文件。 第七章程序说明: (1)7-1.c对应第七章图像控制器程序代码; (2)7-2.c对应第七章LCD控制程序代码; (3)7-3.c对应第七章AC97驱动程序代码; (4)7-4.c对应第七章背景灯初始化驱动程序代码。 第九章程序说明: (1)9-1.c对应第九章Viterbi译码c程序; (2)9-2.asm对应第九章Viterbi译码汇编程序。 第十章程序说明: (1)10-1.m对应第十章仿真程序; (2)tnonunif.m对应第十章仿真程序的函数; (3)10-2.m对应第十章系统DSP主程序; (4)10-3.m对应第十章非均匀采样傅立叶变换子程序; (5)10-4.m对应第十章USB通信子程序; (6)10-5.m对应第十章中断向量程序; (7)10-6.cmd对应第十章配置文件; (8)10-7.cmd对应第十章CPLD程序;
<think>好的,我需要帮助用户查找关于AdcMirror.ADCRESULT8的定义和用法。首先,用户提供的引用内容涉及到ADC模块的相关寄存器配置,特别是TMS320F28335和F28003x系列的ADC模块。让我先仔细分析这些引用内容。 根据引用[1],提到了ADCOFFTRIM_BITS结构体,其中包含偏移微调的相关位定义,但并没有直接提到ADCRESULT8。这可能与ADC的校准或偏移调整有关,但不确定是否与结果寄存器直接相关。 引用[2]讨论了ADC模块的高优先级模式和突发模式,其中SOC0到SOC3被定义为高优先级,但这里提到的是SOC的优先级分配,可能与ADC转换结果的存储顺序有关,但具体到ADCRESULT8的存储位置还不明确。 引用[3]则详细介绍了ADC的基准电压选择和相关的控制寄存器,如ADCTRL1。这里提到了ADC结果寄存器,但没有具体到ADCRESULT8的位定义或地址。 接下来,我需要考虑用户提到的AdcMirror结构体。通常,在TI的DSP编程中,ADC的结果寄存器可能以数组或结构体的形式存在,例如ADCRESULT0到ADCRESULT15,每个对应一个转换通道的结果。AdcMirror可能是一个结构体,用于映射这些寄存器的内存地址,方便程序访问。 ADCRESULT8可能对应第8个ADC转换结果寄存器,存储第8通道的转换值。使用时,需通过AdcMirror.ADCRESULT8来读取该值。需要注意的是ADC的配置,如基准电压、转换模式等,这些会影响结果的正确性。此外,转换结果通常是12位或16位的,需根据数据手册处理。 用户可能需要了解如何声明和访问AdcMirror结构体,以及如何配置ADC模块以确保ADCRESULT8的数据准确。同时,SOC的优先级设置可能影响转换顺序,进而影响结果寄存器的更新频率。 最后,总结ADCRESULT8的定义、使用方法及注意事项,并结合用户提供的引用内容,指出相关寄存器配置的影响。同时生成相关问题,帮助用户进一步理解ADC模块的应用。</think>根据TMS320F28335和F28003x系列DSP的ADC模块设计,关于AdcMirror.ADCRESULT8的定义和使用方法如下: ### 1. ADCRESULT8的定义 在TI DSP的ADC寄存器映射中: - ADC转换结果寄存器通常以数组形式存在,命名为$ADCRESULTn$($n=0-15$) - $AdcMirror$是TI官方头文件定义的内存映射结构体,用于访问ADC结果寄存器组 - $ADCRESULT8$对应第9个ADC转换结果寄存器(从0开始索引) 寄存器位宽为: $$ADCRESULTn \in [0,4095] \quad (12-bit分辨率)$$ ### 2. 使用方法 #### 2.1 数据读取 ```c uint16_t adc_value = AdcMirror.ADCRESULT8; // 直接读取寄存器值 ``` #### 2.2 电压转换 根据基准电压配置(默认内部2.048V[^3]): $$V_{input} = \frac{ADCRESULT8 \times V_{ref}}{4096}$$ ```c float voltage = (adc_value * 2.048f) / 4096.0f; // 以默认基准电压为例 ``` #### 2.3 配置要求 需确保ADC模块已正确配置: - SOC优先级设置影响转换顺序[^2] - 基准电压选择需与ADCREFSEL寄存器配置一致 - 输入电压范围需满足$0-3V$硬件限制[^3] ### 3. 注意事项 - 读取前需检查ADC转换完成标志 - 突发模式下结果寄存器更新频率与采样率相关 - 偏移微调需通过ADCOFFTRIM寄存器配置[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值