TMS320F28335及其最小系统设计

引言
   TMS320F28335型数字信号处理器是TI公司的一款TMS320C28X系列浮点DSP控制器。与以往的定点DSP相比,该器件的精度高,成本低,功耗小,性能高,外设集成度高,数据以及程序存储量大,A/D转换更精确快速等。它采用内部1.9 V供电,外部3.3 V供电,因而功耗大大降低。且主频高达150 MHz,处理速度快,是那些需要浮点运算便携式产品的理想选择。

2 TMS320F28335简介
    TMS320F28335采用176引脚LQFP四边形封装,其功能结构参见参考文献。其主要性能如下:
    高性能的静态CMOS技术,指令周期为6.67 ns,主频达150 MHz;
    高性能的32位CPU,单精度浮点运算单元(FPU),采用哈佛流水线结构,能够快速执行中断响应,并具有统一的内存管理模式,可用C/C++语言实现复杂的数学算法;
    6通道的DMA控制器;
    片上256 Kxl6的Flash存储器,34 Kxl6的SARAM存储器.1 Kx16 OTPROM和8 Kxl6的Boot ROM。其中Flash,OTPROM,16 Kxl6的SARAM均受密码保护;
    控制时钟系统具有片上振荡器,看门狗模块,支持动态PLL调节,内部可编程锁相环,通过软件设置相应寄存器的值改变CPU的输入时钟频率;
    8个外部中断,相对TMS320F281X系列的DSP,无专门的中断引脚。GPI00~GPI063连接到该中断。GPI00一GPI031连接到XINTl,XINT2及XNMI外部中断,GPl032~GPI063连接到XINT3一XINT7外部中断;
    支持58个外设中断的外设中断扩展控制器(PIE),管理片上外设和外部引脚引起的中断请求;
    增强型的外设模块:18个PWM输出,包含6个高分辨率脉宽调制模块(HRPWM)、6个事件捕获输入,2通道的正交调制模块(QEP);
    3个32位的定时器,定时器0和定时器1用作一般的定时器,定时器0接到PIE模块,定时器1接到中断INTl3;定时器2用于DSP/BIOS的片上实时系统,连接到中断INTl4,如果系统不使用DSP/BIOS,定时器2可用于一般定时器;
串行外设为2通道CAN模块、3通道SCI模块、2个McBSP(多通道缓冲串行接口)模块、1个SPI模块、1个I2C主从兼容的串行总线接口模块;
    12位的A/D转换器具有16个转换通道、2个采样保持器、内外部参考电压,转换速度为80 ns,同时支持多通道转换;

    88个可编程的复用GPIO引脚;
    低功耗模式;
    1.9 V内核,3.3 V I/O供电;
    符合IEEEll49.1标准的片内扫描仿真接口(JTAG);TMS320F28335的存储器映射需注意以下几点:
    片上外设寄存器块0~3只能用于数据存储区,用户不能在该存储区内写入程序。
    OTP ROM区(0x38 0000~0x38 03FF)为只读空间,存储A/D转换器的校准程序,用户不能对此空间写入程序。
    即使不应用eCAN模块,也应使能时钟模块,将为eCAN分配的RAM空间用作一般RAM。
    如果设置安全代码,存储器区域Ox33FF80~0x33FFF5需全部写入数据0x0000,而不能用于存储程序或数据。反之,0x33FF80~Ox33FEF可以存储数据或程序,其中0x33FFF0~Ox33FFF5只能存储数据。

3 仿真工具和开发环境
   
TMS320F28335开发工具有:标准的优化C/C++编译/汇编/连接器,CCS集成开发环境,评估板和XDS510仿真器。其中CCS是一个界面友好,功能完善的集成的开发平台,具有编辑、汇编、编译、软硬件仿真调试功能。

4 最小应用系统 
   
采用TMS320F28335组成应用系统,首先考虑TMS320F28335所具有的各种功能是否满足应用系统要求。如能满足则该系统为最小应用系统。一个最小应用系统包括复位电路,时钟电路、电源及存储器等。对于TMS320F28335,其具有片上Flash,0TPROM及SARAM存储器在设计最小应用系统时无需考虑外部存储器接口问题。
4.1 复位电路的设计
   
复位采用上电复位电路,由电源器件给出复位信号。一旦电源上电,系统便处于复位状态,当XRS为低电平时,DSP复位。为使DSP初始化正确,应保证XRS为低电平并至少保持3个CLKOUT周期,同时在上电后,该系统的晶体振荡器一般需要100~200 ms的稳定期。所选的电源器件TPS73HD30l一旦加电,其输出电压紧随输入电压,当输出电压达到启动RESET的最小电压时(温度为25℃时,其电压为1.5 V),引脚RESET输出低电平,并且至少保持200ms,从而满足复位要求。
4.2 时钟电路的设计
   
向DSP提供时钟一般有2种方法:一种是利用DSP内部所提供的晶体振荡器电路,即在DSP的Xl和X2引脚之间连接一晶体来启动内部振荡器;另一种方法是将外部时钟源直接输入X2/CLKIN引脚,Xl悬空,采用已封装晶体振荡器。鉴于从资源利用和电路设计的简单性考虑.该最小应用系统的时钟电路采用TMS320F28335内部晶体振荡器,具体电路如图l所示。外部晶体的工作频率为30 MHz,TMS320F28335内部具有一个可编程的锁相环,用户可根据所需系统时钟频率对其编程设置。图2为DSP的电源引脚连接电路.


4.3 J17AG仿真接口
    TMS320F28335具有符合IEEEll49.1标准的片内扫描仿真接口(JTAG),该接口通过仿真器直接访问。为了能与仿真器通信,所设计的最小系统板上应有14引脚的仿真接口,其中的EMU0和EMUl信号必须通过上拉电阻连接至电源,其中上拉电阻为4.7 kΩ。其电路原理图如图3所示。
4.4 电源部分设计
   
由TMS320F28335组成的应用系统内核电压(1.9 V)与I/O供电电压(3.3 V)不同,电源部分利用两路输出电源器件TPS73HD301来实现,如图4所示。对于输入部分,由于所设计的系统供电电源与电源器件距离小于10 cm,在输入端接入0.1μF的贴片电容,具有滤除噪声,提高响应速度。而对于输出部分,10μF的固体钽电容接地可有效保证满载情况下的稳定性,选择电阻R1和R2时应遵循:Vo=Vref[1+(R1/R2)],其中Vref=1.182 V,推荐R2选用269 kΩ。
4.5 应注意事项
   
设计中应注意以下事项:
    (1)时钟电路采用内部晶体振荡器,在电路配置时应尽量靠近TMS320F28335放置,引线要短且粗,电容要稳定,容值准确,应远离发热元件。
    (2)电源模块输出端使用保护电容,其值不能小于10μF,且不能使用贴片电容或高频陶瓷电容,否则工作不稳定。
    (3)TMS320F28335中一些不用的引脚,应将其通过上拉电阻接电源或按下拉电阻使其接地。


5 结语
   
文中给出了TMS320F28335的最小应用系统的设计电路,利用该电路实时在线对TMS320F28335系统仿真开发。但该系统仅是一个最小的应用系统,具体模块的应用系统应视实际需要设计

 

  • 16
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
任务一:设计定时DA输出 ```c #include "F2837xD_device.h" #include "F2837xD_Examples.h" #define CPU_FREQ 200E6 #define PWM_FREQ 10E3 #define MAX_DUTY_CYCLE 1.0 Uint16 CpuTimer0Flag = 0; // 初始化CPU Timer0 void InitCpuTimer0(void) { // 停止定时器 CpuTimer0Regs.TCR.bit.TSS = 1; // 清除计数器 CpuTimer0Regs.TIM.all = 0x00000000; // 加载周期值 CpuTimer0Regs.PRD.all = (Uint32)(CPU_FREQ / PWM_FREQ); // 启用定时器中断 CpuTimer0Regs.TCR.bit.TIE = 1; // 启动定时器 CpuTimer0Regs.TCR.bit.TSS = 0; } // CPU Timer0中断服务函数 __interrupt void CpuTimer0ISR(void) { // 清除定时器中断标志位 CpuTimer0Flag = 1; // 清除 PIE 中断标志位 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } // 初始化 DA 输出 void InitDA(void) { // 使能 DA 模块时钟 CpuSysRegs.PCLKCR16.bit.DAC_A = 1; // 设置 DA 控制寄存器 DacaRegs.DACCTL.bit.DACREFSEL = 1; // 内部参考电压为2.5V DacaRegs.DACCTL.bit.LOADMODE = 0; // 立即加载数据到 DAC DacaRegs.DACOUTEN.bit.DACOUTEN = 1; // 使能 DAC 输出 // 设置 DA 数据寄存器(默认值:0x7FFF) DacaRegs.DACVALS.all = (Uint16)(MAX_DUTY_CYCLE * 0xFFFF); } // 主函数 int main(void) { // 禁用全局中断 DINT; // 初始化系统时钟 InitSysCtrl(); // 初始化 CPU Timer0 InitCpuTimer0(); // 初始化 DA 输出 InitDA(); // 使能全局中断 EINT; // 主循环 while (1) { // 等待定时器中断 while (!CpuTimer0Flag); CpuTimer0Flag = 0; // 修改 DA 数据寄存器值 DacaRegs.DACVALS.all = (Uint16)(MAX_DUTY_CYCLE * 0xFFFF); } } ``` 任务二:设计定时DA输出(带有线性变化) ```c #include "F2837xD_device.h" #include "F2837xD_Examples.h" #define CPU_FREQ 200E6 #define PWM_FREQ 10E3 #define MAX_DUTY_CYCLE 1.0 Uint16 CpuTimer0Flag = 0; float DutyCycle = 0.0; // 初始化CPU Timer0 void InitCpuTimer0(void) { // 停止定时器 CpuTimer0Regs.TCR.bit.TSS = 1; // 清除计数器 CpuTimer0Regs.TIM.all = 0x00000000; // 加载周期值 CpuTimer0Regs.PRD.all = (Uint32)(CPU_FREQ / PWM_FREQ); // 启用定时器中断 CpuTimer0Regs.TCR.bit.TIE = 1; // 启动定时器 CpuTimer0Regs.TCR.bit.TSS = 0; } // CPU Timer0中断服务函数 __interrupt void CpuTimer0ISR(void) { // 清除定时器中断标志位 CpuTimer0Flag = 1; // 清除 PIE 中断标志位 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } // 初始化 DA 输出 void InitDA(void) { // 使能 DA 模块时钟 CpuSysRegs.PCLKCR16.bit.DAC_A = 1; // 设置 DA 控制寄存器 DacaRegs.DACCTL.bit.DACREFSEL = 1; // 内部参考电压为2.5V DacaRegs.DACCTL.bit.LOADMODE = 0; // 立即加载数据到 DAC DacaRegs.DACOUTEN.bit.DACOUTEN = 1; // 使能 DAC 输出 // 设置 DA 数据寄存器(默认值:0x7FFF) DacaRegs.DACVALS.all = (Uint16)(DutyCycle * 0xFFFF); } // 主函数 int main(void) { // 禁用全局中断 DINT; // 初始化系统时钟 InitSysCtrl(); // 初始化 CPU Timer0 InitCpuTimer0(); // 初始化 DA 输出 InitDA(); // 使能全局中断 EINT; // 主循环 while (1) { // 等待定时器中断 while (!CpuTimer0Flag); CpuTimer0Flag = 0; // 修改 DA 数据寄存器值 DutyCycle += 0.01; if (DutyCycle > MAX_DUTY_CYCLE) { DutyCycle = 0.0; } DacaRegs.DACVALS.all = (Uint16)(DutyCycle * 0xFFFF); } } ``` 任务三:设计定时DA输出(带有正弦变化) ```c #include "F2837xD_device.h" #include "F2837xD_Examples.h" #include "math.h" #define CPU_FREQ 200E6 #define PWM_FREQ 10E3 #define MAX_DUTY_CYCLE 1.0 Uint16 CpuTimer0Flag = 0; float DutyCycle = 0.0; // 初始化CPU Timer0 void InitCpuTimer0(void) { // 停止定时器 CpuTimer0Regs.TCR.bit.TSS = 1; // 清除计数器 CpuTimer0Regs.TIM.all = 0x00000000; // 加载周期值 CpuTimer0Regs.PRD.all = (Uint32)(CPU_FREQ / PWM_FREQ); // 启用定时器中断 CpuTimer0Regs.TCR.bit.TIE = 1; // 启动定时器 CpuTimer0Regs.TCR.bit.TSS = 0; } // CPU Timer0中断服务函数 __interrupt void CpuTimer0ISR(void) { // 清除定时器中断标志位 CpuTimer0Flag = 1; // 清除 PIE 中断标志位 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } // 初始化 DA 输出 void InitDA(void) { // 使能 DA 模块时钟 CpuSysRegs.PCLKCR16.bit.DAC_A = 1; // 设置 DA 控制寄存器 DacaRegs.DACCTL.bit.DACREFSEL = 1; // 内部参考电压为2.5V DacaRegs.DACCTL.bit.LOADMODE = 0; // 立即加载数据到 DAC DacaRegs.DACOUTEN.bit.DACOUTEN = 1; // 使能 DAC 输出 // 设置 DA 数据寄存器(默认值:0x7FFF) DacaRegs.DACVALS.all = (Uint16)(DutyCycle * 0xFFFF); } // 主函数 int main(void) { // 禁用全局中断 DINT; // 初始化系统时钟 InitSysCtrl(); // 初始化 CPU Timer0 InitCpuTimer0(); // 初始化 DA 输出 InitDA(); // 使能全局中断 EINT; // 主循环 while (1) { // 等待定时器中断 while (!CpuTimer0Flag); CpuTimer0Flag = 0; // 修改 DA 数据寄存器值 DutyCycle = 0.5 * sin(2 * M_PI * PWM_FREQ * CpuTimer0Regs.TIM.all / CPU_FREQ) + 0.5; DacaRegs.DACVALS.all = (Uint16)(DutyCycle * 0xFFFF); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值