TMS320F28335_DA源代码
F28335各个程序代码简单描述
mcbsp_loopback_interrupts
McBSP通信实验(通过中断方法自发自收)
mcbsp_spi_loopback
McBSP作为SPI通信实验
sci_autobaud
SCI通信实验1(自动波特率)
sci_echoback
SCI通信实验2
scia_loopback
CAN通信实验(自发自收)
ecap_apwm
CAP实验(APWM)
ecap_capture_pwm
CAP实验
epwm_deadband
PWM实验(带死区)
epwm_dma
PWM实验(通过DMA传输数据)
epwm_timer_interrupts
PWM实验(定时中断)
epwm_trip_zone
PWM跳闸保护实验
epwm_up_aq
PWM向上计数实验
epwm_updown_aq
PWM中心对称计数实验
eqep_freqcal
QEP脉冲频率测量实验
eqep_pos_speed
QEP位置速度脉冲测量实验
external_interrupt
外部中断实验
external_interrupt_hanyuan
外部中断实验
上海汉远科技F28335各个程序代码的保存路径在
Code of TMS320F28335 CCS4\v120\DSP2833x_examples文件夹下面
文件名
描述
adc_dma
ADC模块采样通过DMA传输数据实验
adc_seq_ovd_test
ADC模块在排序器覆盖模式下采样实验
adc_seqmode_test
28333_TMS320F28335_PID调节
/*************************************************************************************/ #include "Task_Global_h.h"/*****************************************************************/extern void AdcComputer_HighSpeed(void);extern void WaveRecorder(void); /* 准备录波数据*/#pragma CODE_SECTION(PIDInitCtrl,".UserProgramCode")void PIDInitCtrl(void){n_0 = 4000000;n_1 = 4000000;n_2 = 4000000;Sys.PID.Ien_0 = 0;Sys.PID.Ien_1 = 0;Sys.PID.Ien_2 = 0; = 4000;OS_ENTER_CRITICAL();Sys.EnF0Reg.bit.PWM_Enable = OFF;OS_EXIT_CRITICAL();}/****************************************************************************/// PID输出到PWM最后输出的转换/****************************************************************************/#pragma CODE_SECTION(Transition,".UserProgramCode")void Transition(int16 Uk){int32 Temp;Uint16 Temp1, Temp2;if(Uk > UkMax)Uk = UkMax;if(Uk < UkMin)Uk = UkMin;Temp = Uk;Temp1 = (Sys.PWMCon.PR >> 1) - 125;Temp2 = (Uint16)((Temp * Sys.PWMCon.PR) / 20000);if(Temp2 > Temp1)Temp2 = Temp1;Sys.PID.Uc = Temp2;}/****************************************************************************/ // PID 参变量求值/****************************************************************************/ #pragma CODE_SECTION(PID_Par,".UserProgramCode")void PID_Par(int32 Kp, int32 Ti, int32 Td){int32 Ts; // 时间常数Ts = 50; // 运算周期50 usSys.PID.A = (Ts * Ts) + (Td * Ti) + (Ts * Ti);Sys.PID.B = ((Ts * Ts) - (Td * Ti)) << 1;Sys.PID.C = (Ts * Ts) + (Td * Ti) - (Ts * Ti);Sys.PID.S = Ts * Ti;Sys.PID.Kp = Kp;}/****************************************************************************/// 使双线性变换算子处于"零" 状态响应, 大电流模式下/****************************************************************************/ #pragma CODE_SECTION(SetZeroState,".UserProgramCode")void SetZeroState(void){n_2 = n_0;n_1 = n_0;Sys.PID.Ien_0 = Sys.PID.If * Sys.PID.Kp;Sys.PID.Ien_1 = Sys.PID.Ien_0;Sys.PID.Ien_2 = Sys.PID.Ien_0;}/****************************************************************************/ // 双线性变换算法,适合于大电流/****************************************************************************/ #pragma CODE_SECTION(InvariablenesCurrent,".UserProgramCode")void InvariablenesCurrent(void){int32 Temp;int64 ACC;n_2 = n_1;n_1 = n_0;Sys.PID.Ien_2 = Sys.PID.Ien_1;Sys.PID.Ien_1 = Sys.PID.Ien_0;Sys.PID.Ien_0 = Sys.PID.If * Sys.PID.Kp;MPY32(Sys.PID.Ien_0, Sys.PID.A);ACC = Sys.MpyResult64;MPY32(Sys.PID.Ien_1, Sys.PID.B);ACC += Sys.MpyResult64;MPY32(Sys.PID.Ien_2, Sys.PID.C);ACC += Sys.MpyResult64;ACC = (ACC / Sys.PID.S) + n_2;n_0 = (int32)ACC;Temp = n_0;if(Temp > 8500000)Temp = 8500000;if(Temp < 500000)Temp = 500000; = (int16)(Temp / 1000);}/****************************************************************************/ // 差分增量算法,适合于小电流/****************************************************************************/ #pragma CODE_SECTION(InvariablenesCurrentLC,".UserProgramCode")void InvariablenesCurrentLC(void){int32 Kp, Ki, Kd; // 放大1000 倍int32 DUk;int32 Ukp, Uki, Ukd;Q/ES041-2011 n_2 = n_1;n_1 = n_0;Sys.PID.Ien_2 = Sys.PID.Ien_1;Sys.PID.Ien_1 = Sys.PID.Ien_0;Sys.PID.Ien_0 = Sys.PID.If;#ifdef MaxCurrent_500Kp = 15000;Ki = 40;Kd = 300;#endif#ifdef MaxCurrent_1000Kp = 15000;Ki = 40;Kd = 300;#endif#ifdef MaxCurrent_1500Kp = 15000;Ki = 40;Kd = 300;#endifUkp = Kp * (Sys.PID.Ien_0 - Sys.PID.Ien_1);Uki = Ki * Sys.PID.Ien_0;Ukd = Kd * (Sys.PID.Ien_0 + Sys.PID.Ien_2 - (Sys.PID.Ien_1 << 1));DUk = Uki + Ukp + Ukd;n_0 += DUk;if(n_0 > 8500000)n_0 = 8500000;if(n_0 < 500000)n_0 = 500000; = (int16)(n_0 / 1000);}/****************************************************************************/ //*/****************************************************************************/ #pragma CODE_SECTION(Control_Code,".UserProgramCode")void Control_Code (void){AdcComputer_HighSpeed();#ifdef MaxCurrent_500Sys.PID.If = Sys.Given.Ig * 20;Sys.PID.If -= Sys.Simulate.If * 2; // 500 A 额定#endif#ifdef MaxCurrent_1000Sys.PID.If = Sys.Given.Ig * 10;Sys.PID.If -= Sys.Simulate.If; // 1000 A 额定#endif#ifdef MaxCurrent_1500Sys.PID.If = ((Sys.Given.Ig * 20 ) / 3);Sys.PID.If -= ((Sys.Simulate.If * 2) / 3); // 1500 A 额定#endifif(Sys.EnF2Reg.bit.PID == 0){InvariablenesCurrentLC();}else{InvariablenesCurrent();}if((Sys.Timer.CFD == 0) // 电流速降保护&&(Sys.EnF1Reg.bit.WeldingState == 2)){if(Sys.PID.If < - 900)Sys.EnF1Reg.bit.CFDGoing = 1;//1500为标准if(Sys.PID.If > - 180)Sys.EnF1Reg.bit.CFDGoing = 0;}else{Sys.EnF1Reg.bit.CFDGoing = 0;}if(Sys.EnF1Reg.bit.CFDGoing == 1) = 500;WaveRecorder();Transition();}//=========================================================================== // No more.//===========================================================================。
基于f28335呼吸灯c语言代码
基于f28335呼吸灯c语言代码呼吸灯的原理和应用呼吸灯的原理呼吸灯是一种通过改变灯光亮度的效果来呈现灯光闪烁的效果。
它是通过改变灯光亮度的幅值和频率来实现的。
基本原理是在一定的时间内,逐渐增加灯光亮度,然后逐渐减小灯光亮度,以达到灯光像呼吸一样变化的效果。
呼吸灯的应用呼吸灯通常被用于装饰、照明等领域。
例如,它可以用于室内装饰灯、舞台灯光设计等。
同时,呼吸灯也经常被使用在一些电子产品中,如路由器、手机等,用来表示设备工作状态。
TI TMS320F28335简介TI TMS320F28335是一款基于C28x内核的高性能数字信号处理器(DSP)。
它具有高速运算能力和丰富的外设接口,广泛应用于工业控制、电力电子、通信等领域。
该芯片支持大部分C语言编程,并配有专业的开发工具链,如Code Composer Studio,方便开发人员进行软件开发和调试。
基于TI TMS320F28335的呼吸灯实现硬件设计在开始编写呼吸灯的C语言代码之前,我们首先需要设计硬件电路。
以下是所需的硬件组成:•TI TMS320F28335开发板•LED灯•电阻和电容器具体的电路设计如下:1.将LED灯的一个引脚连接到TMS320F28335的GPIO引脚,作为控制信号输出。
2.将LED灯的另一个引脚连接到电源正极。
3.使用电阻和电容器构建一个RC电路,将电阻连接到LED灯的另一端,电容器连接到电源负极。
软件实现在完成硬件设计后,我们可以开始编写C语言代码来实现呼吸灯效果。
以下是所需的步骤:1.配置TMS320F28335的GPIO引脚为输出模式。
2.在无限循环中,逐渐增加LED灯的亮度,在经过一定时间后,逐渐减小LED灯的亮度。
这一过程可以通过改变控制引脚的电平来实现。
3.使用定时器来创建呼吸灯的频率效果。
通过定时器中断,我们可以准确地控制灯光的变化频率。
下面是基于TI TMS320F28335的呼吸灯C语言代码的主要实现部分:#include "DSP2833x_Device.h"// 定义LED灯控制引脚#define LED_GPIO_PIN GPIO0// 初始化GPIO引脚void GPIO_init(){// 将GPIO引脚配置为输出模式EALLOW;GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;EDIS;}// 初始化定时器void Timer_init(){// 配置定时器参数CpuTimer0Regs.TCR.bit.TSS = 0; // 启动定时器CpuTimer0Regs.TCR.bit.TRB = 1; // 重载定时器CpuTimer0Regs.PRD.all = 0x1234; // 设置定时周期}// 延时函数void delay(unsigned long count){unsigned long i;for(i = 0; i < count; i++);}// 主函数int main(void){// 系统初始化// 初始化GPIO引脚GPIO_init();// 初始化定时器Timer_init();// 主循环while(1){// 呼吸灯效果for(int i = 0; i < 100; i++){// 增加LED亮度for(int j = 0; j < 100; j++){// 设置引脚为高电平GpioDataRegs.GPASET.bit.LED_GPIO_PIN = 1; delay(100000);}// 减小LED亮度for(int j = 0; j < 100; j++){// 设置引脚为低电平GpioDataRegs.GPACLEAR.bit.LED_GPIO_PIN = 1; delay(100000);}}}}总结本文介绍了基于TI TMS320F28335的呼吸灯的实现过程。
dsp,tms320f28335,汇编编码,规范
竭诚为您提供优质文档/双击可除dsp,tms320f28335,汇编编码,规范篇一:tms320F28335中文资料tms320F28335中文资料tms320F28335采用176引脚lqFp四边形封装,其功能结构参见参考文献。
其主要性能如下:高性能的静态cmos技术,指令周期为6.67ns,主频达150mhz;高性能的32位cpu,单精度浮点运算单元(Fpu),采用哈佛流水线结构,能够快速执行中断响应,并具有统一的内存管理模式,可用c/c++语言实现复杂的数学算法;6通道的dma控制器;片上256kxl6的Flash存储器,34kxl6的saRam存储器.1kx16otpRom和8kxl6的bootRom。
其中Flash,otpRom,16kxl6的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个采样保持器、内外部参考电压,转换速度为80ns,同时支持多通道转换;88个可编程的复用gpio引脚;低功耗模式;1.9V内核,3.3Vi/o供电;符合ieeell49.1标准的片内扫描仿真接口(jtag);tms320F28335的存储器映射需注意以下几点:片上外设寄存器块0~3只能用于数据存储区,用户不能在该存储区内写入程序。
TMS320F28335中文资料(难得的资料)
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.XINT2 = &ISRExint; //告诉中断入口地址
EDIS; // This is needed to disable write to EALLOW protected registers
F28335 是带浮点运算的,动态范围更大。 F2833x 的执行速度,比相同时钟频率的 F28xx 系列定点芯片,快 50%。处理数学运算性能提
升 2.45 倍,控制算法性能提升 1.57 倍,DSP 性能提升 1.38 倍。总体性能提升近 2 倍。
TMS320F28335 的 ADC
TMS320F28335 上有 16 通道、12 位的模数转换器 ADC。他可以被配置为两个独立的 8 通道输 入模式,也可以通过配置 AdcRegs.ADCTRL1.bit.SEQ_CASC=1,将其设置为一个 16 通道的级 联输入模式。输入的方式可以通过配置 AdcRegs.ADCTRL1.bit.ACQ_PS=1,将其设置为顺序
{
EALLOW; // Before setting PLLCR turn off missing clock detect logic
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1; SysCtrlRegs.PLLCR.bit.DIV = val; EDIS;
// Optional: Wait for PLL to lock. // During this time the CPU will switch to OSCCLK/2 until // the PLL is staPU will
[原]TMS320F28335项目开发记录6_28335之cmd文件详解
[原]TMS320F28335项目开发记录6_28335之cmd文件详解2014-11-3阅读970 评论01.CMD文件的作用CMD文件的作用就像仓库的货物摆放记录一样,为程序代码和数据分配指定的空间。
2.C语言生成的段C语言生成的段大致分为两大类:初始化和未初始化,已初始化的段含有真正的指令和数据,未初始化段只是保留变量的地址空间。
已初始化段通常放在程序空间,未初始化段通常放在数据空间。
已初始化段:.text——C语言编译生成的汇编指令代码存放于此.cinit——存放初始化的全局和静态变量.const——字符串常量和const定义的全局和静态变量.econst——字符串常量和far const定义的全局和静态变量.print——全局构造器(C++)程序列表.switch——存放switch语句产生的常数表格以.const段为例:const int a = 10; //注意必须是全局的如果声明为局部const初始化变量,不会放在.const段,局部变量都是运行时放在.bss段中char * p = "ABC";数组和结构体的初始值——是局部变量时,产生的是.const,如果是全局变量,产生的是.cinit未初始化段:.bss——为全局变量和局部变量保留的空间,程序上电时,.cinit空间中的数据复制出来并存放在.bss空间中.ebss——为使用大寄存器模式时预留的全局和局部变量空间,程序上电时,.cinit空间中的数据复制出来并存放在.bss空间中.stack——堆栈空间,主要用于函数传递变量或为局部变量分配空间.system——为动态存储分配保留的空间(malloc),如果有宏函数,此空间被占用.esystem——为动态存储分配保留的空间(far malloc),如果有far函数,此空间会被占用3.自定义段上面的都是官方预先定义好的,我们可以定义自己的段么?可以,使用如下语句:#pragma CODE_SECTION(symbol, "section name");#pragma DATA_SECTION(symbol, "section name");symbol——符号,可以是函数名/变量名section name——自定义的段名CODE_SECTION用来定义代码段DATA_SECTION用来定义数据段注意:不能再函数体内声明#pragma;必须在符号被定义和使用之前声明#pragma例子:#pragma DATA_SECTION(data, "data_name");char data[100];4.CMD文件在DSP28335工程文件里(不用BIOS产生CMD文件),手写CMD文件一般有两个,RAM里调试时用的两个CMD文件分别为DSP2833x_Headers_nonBIOS.cmd 和28335_RAM_lnk.cmd,烧写到flash里时用的两个CMD文件分别为DSP2833x_Headers_nonBIOS.cmd和F28335.cmd,其中DSP2833x_Headers_nonBIOS.cmd文件可以在所有工程文件中通用,主要作用是把外设寄存器产生的数据段映射到对应的存储空间,可以跟DSP2833x_GlobalVariableDefs.c文件对照一下看看。
基于TMS320F28335的MODBUS-RTU从站程序
在CCS3.3,DSP/BIOS环境下,应用TMS320F28335的SCI功能,编写了MODBUS-RTU从站程序,可以使用03功能码和16功能码,机器上应用通过以下为源码,共四个文件/****************************************************************************** ******************* @file S_Usart.h* @author ww* @version* @date 2015年12月1日* @brief F28335的SCI初始化及使用* @history******************************************************************************* *******************/#ifndef _S_USART_H_#define _S_USART_H_// Prototype statements for functions found within this file.void scib_gpioInit();void setADM2587_RE(void);void setADM2587_DE(void);void clearADM2587_RE(void);void clearADM2587_DE(void);void scib_echoback_init(void);void scic_echoback_init(void);void scib_fifo_init(void);void scib_xmit(int a);void scib_msg(char *msg);#endif/****************************************************************************** ******************* @file S_Usart.c* @author ww* @version* @date 2015年12月1日* @brief F28335的sci功能初始化及使用,* @history******************************************************************************* *******************/#include "DSP2833x_Device.h" // DSP2833x Header File#include "DSP2833x_Examples.h" // DSP2833x Examples Include File#include "S_Gpio.h"#include "S_Usart.h"#include <std.h>#include <que.h>#include <log.h>#include <mem.h>#include <trc.h>#include <tsk.h>// Prototype statements for functions found within this file. void scib_gpioInit();void setADM2587_RE(void);void setADM2587_DE(void);void clearADM2587_RE(void);void clearADM2587_DE(void);void scib_echoback_init(void);void scib_fifo_init(void);void scib_xmit(int a);void scib_msg(char *msg);#define ADM2587_RE GPIO25#define ADM2587_DE GPIO24// Global counts used in this exampleUint16 LoopCount;Uint16 ErrorCount;void phase_ScibTest(Arg id_arg){Uint16 ReceivedChar;char *msg;// For this example, only init the pins for the SCI-A port.// This function is found in the DSP2833x_Sci.c file.scib_gpioInit();InitScibGpio();// Step 5. User specific code:LoopCount = 0;ErrorCount = 0;scib_fifo_init();// Initialize the SCI FIFOscib_echoback_init(); // Initalize SCI for echobacksetADM2587_DE();setADM2587_RE();msg = "\r\n\n\nHello Yan Xu!\0";scib_msg(msg);setADM2587_DE();setADM2587_RE();msg = "\r\nYou will enter a character, and the DSP will echo it back! \n\0";scib_msg(msg);for (;;){setADM2587_DE();setADM2587_RE();msg = "\r\nEnter a character: \0";scib_msg(msg);clearADM2587_DE();clearADM2587_RE();// Wait for inc characterwhile (ScibRegs.SCIRXST.bit.RXRDY != 1) { } // wait for XRDY =1 for empty state// Get characterReceivedChar = ScibRegs.SCIRXBUF.all;setADM2587_DE();setADM2587_RE();// Echo character backmsg = " You sent: \0";scib_msg(msg);clearADM2587_DE();clearADM2587_RE();scib_xmit(ReceivedChar);LoopCount++;}}void scib_gpioInit(){EALLOW;//初始化DM2587_RE的GPIOGpioCtrlRegs.GPAMUX2.bit.ADM2587_RE = 0;GpioCtrlRegs.GPADIR.bit.ADM2587_RE = 1;//IO为输出模式GpioCtrlRegs.GPAPUD.bit.ADM2587_RE = 0;//使能内部上拉GpioCtrlRegs.GPAQSEL2.bit.ADM2587_RE = 0;//与系统时钟同步//初始化DM2587_DE的GPIOGpioCtrlRegs.GPAMUX2.bit.ADM2587_DE = 0;GpioCtrlRegs.GPADIR.bit.ADM2587_DE = 1;GpioCtrlRegs.GPAPUD.bit.ADM2587_DE = 0;GpioCtrlRegs.GPAQSEL2.bit.ADM2587_DE = 0;EDIS;}//@name: setLedvoid setADM2587_RE(void){GpioDataRegs.GPASET.bit.ADM2587_RE = 1;}//@name: setLedvoid setADM2587_DE(void){GpioDataRegs.GPASET.bit.ADM2587_DE = 1;}//@name: clearLedvoid clearADM2587_RE(void){GpioDataRegs.GPACLEAR.bit.ADM2587_RE = 1;}//@name: clearLedvoid clearADM2587_DE(void){GpioDataRegs.GPACLEAR.bit.ADM2587_DE = 1;}// Test 1,SCIA DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity void scib_echoback_init(){// Note: Clocks were turned on to the SCIA peripheral// in the InitSysCtrl() functionScibRegs.SCICCR.all = 0x0007; // 1 stop bit, No loopback// No parity,8 char bits,// async mode, idle-line protocolScibRegs.SCICTL1.all = 0x0003; // enable TX, RX, internal SCICLK,// Disable RX ERR, SLEEP, TXWAKEScibRegs.SCICTL2.all = 0x0003;ScibRegs.SCICTL2.bit.TXINTENA = 1;ScibRegs.SCICTL2.bit.RXBKINTENA = 1;#if (CPU_FRQ_150MHZ)ScibRegs.SCIHBAUD = 0x0001; // 9600 baud @LSPCLK = 37.5MHz.ScibRegs.SCILBAUD = 0x00E7;#endif#if (CPU_FRQ_100MHZ)ScibRegs.SCIHBAUD = 0x0001; // 9600 baud @LSPCLK = 20MHz.ScibRegs.SCILBAUD = 0x0044;#endifScibRegs.SCICTL1.all = 0x0023; // Relinquish SCI from Reset}// Test 1,SCIA DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity void scic_echoback_init(){// Note: Clocks were turned on to the SCIc peripheral// in the InitSysCtrl() functionScicRegs.SCICCR.all = 0x0007; // 1 stop bit, No loopback// No parity,8 char bits,// async mode, idle-line protocolScicRegs.SCICTL1.all = 0x0003; // enable TX, RX, internal SCICLK,// Disable RX ERR, SLEEP, TXWAKEScicRegs.SCICTL2.all = 0x0003;ScicRegs.SCICTL2.bit.TXINTENA = 1;ScicRegs.SCICTL2.bit.RXBKINTENA = 1;#if (CPU_FRQ_150MHZ)ScicRegs.SCIHBAUD = 0x0001; // 9600 baud @LSPCLK = 37.5MHz.ScicRegs.SCILBAUD = 0x00E7;#endif#if (CPU_FRQ_100MHZ)ScicRegs.SCIHBAUD = 0x0001; // 9600 baud @LSPCLK = 20MHz.ScicRegs.SCILBAUD = 0x0044;#endifScicRegs.SCICTL1.all = 0x0023; // Relinquish SCI from Reset}// Transmit a character from the SCIvoid scib_xmit(int a){while (ScibRegs.SCICTL2.bit.TXRDY == 0) {}ScibRegs.SCITXBUF = a;}void scib_msg(char * msg){int i;i = 0;while (msg[i] != '\0'){scib_xmit(msg[i]);i++;}}// Initalize the SCI FIFOvoid scib_fifo_init(){ScibRegs.SCIFFTX.all = 0x8000;}//=========================================================================== // No more.//=========================================================================== /****************************************************************************** ******************* @file S_Modbus.h* @author ww* @version* @date 2015年12月1日* @brief F28335的modbus rtu初始化及使用* @history******************************************************************************* *******************/#ifndef _S_MODBUS_H_#define _S_MODBUS_H_struct MODBUS_MODULE {Uint16 Buf[256];Uint16 TxLen;Uint16 RxLen;Uint16Point;Uint16ReTryTime;Uint16TimeoutReg;Uint16 Tbl_SET1;Uint16Tbl_READ1;Uint16Tbl_SET2;Uint16 Tbl_READ2;Uint16Tbl_COIL_SET1;Uint16Tbl_COIL_READ1;Uint16ID;Uint16FunCode;Uint16RegAddr;Uint16RegNum;Uint16 Status;};// Prototype statements for functions found within this ConfigureModbus (void)void ConfigureModbus (void);interrupt void ScicTxInt (void);interrupt void ScicRxInt (void) ;Uint16 GetCRC16 (Uint16 volatile * ptr, Uint16 len);void ModbusSlaveSetNHldRegAnswer ( Uint16 board_adr, Uint16 start_address, Uint16 lenth); void ModbusSlaveReadHldRegAnswer ( Uint16 board_adr, Uint16 *com_buf, Uint16 lenth); Uint16 RTUSlaveFrameAnalyse (Uint16 *dest_p);void ModbusRTUSlaveRun (void);#endif//-------------------------------------------------------------------// FILE: S_Modbus.c// 程序分两部分:串口操作:中断接收和发送,采用缓冲区发送// 协议处理:分主战和从站两部分,具体的站需要宏定义指定。
[DSP编程] TMS320F28335开发总结
TMS320F28335开发总结1.如何查看CCS5.2中包含的源文件有哪些?以及他们的位置?CCS5.2工程中C语言源文件有两部分组成,一部分是在project路径下的.c文件,另外一部分是通过连接添加到工程里的(.project文件中的<linkedResources></linkedResources>字段)。
因此CCS5.2中的源文件一部分在工程目录下,另外一部分在.project文件中的<linkedResources></linkedResources>字段包含的路径下。
S中GEL文件的作用是什么?ccs的gel语言是一种交互式的命令,它是解释执行的,即不能被编译成可执行文件。
它的作用在于扩展了ccsstudio的功能,可以用gel来调用一些菜单命令,对DSP的存储器进行配置等等。
但是作者建议对于使用仿真器和DSP功能板的仿真环境用户来说,这种GEL语言文件是没必要加入到配置中的。
gel语言的重要性在于针对计算机模拟环境的用户,使用gel可以为其准备一个虚拟的DSP仿真环境,但也不是非用不可的。
3.引用例子中的源文件时要注意什么?使用CCS5.2导入例子中的源文件时,最好不要选择连接方式,而使用复制的方式,这样必要时可以更改这些源文件,而不会影响其他的程序的使用。
S5.2如果没有包含函数的声名头文件时也能运行但是结果会不正常,故当函数调用出现莫名其妙的问题时,要检查声名函数的头文件是否包含。
S5.2开发DSP28335程序时如何设置程序堆栈的大小?CCS5.2默认情况下堆栈的大小都为0x400,在Project->Properties->Build->C200 Linker->Basic Options下设置。
设置完堆栈的大小后,还要在cmd文件中分配堆栈存储空间的段的位置和大小,栈空间的段名为.stack用于函数中的临时变量,堆空间的段名为.sysmem用于c语言malloc函数分配内存,malloc最大可分配内存为Project->Properties->Build->C200 Linker->Basic Options下设置的大小减2。
F28335头文件说明
TMS320F2833X/2823X头文件函数(一)TI提供的SPR530(C2833x/C2823x C/C++ 头文件和外设示例)使我们非常方便的使用2833X和2823X 的外设。
下面就它定义的函数加一个说明。
// $TI Release: DSP2833x Header Files V1.10 $// $Release Date: February 15, 2008 $//**************在DSP2833x_Adc.c中定义的,共1个函数**************************//void InitAdc(void);//在DSP2833x_Adc.c中定义,初始化ADC,使能ADCCLK,调入ADC的出厂刻度数据,上电。
//**************在DSP2833x_DMA.c中定义的,共37个函数**************************//void DMAInitialize(void);//执行DMA硬件复位,设置DMA不受仿真器的影响。
// DMA Channel 1void DMACH1AddrConfig(volatile Uint16 *DMA_Dest,volatile Uint16 *DMA_Source);//设置DMA的源和目标void DMACH1BurstConfig(Uint16 bsize, int16 srcbstep, int16 desbstep);//设置每次Burst的字节数、源地址增量、目标地址增量。
注意对于28335,BYTE和WORD是一样的,都是16BIT。
void DMACH1TransferConfig(Uint16 tsize, int16 srctstep, int16 deststep);//设置每次传送包含多少个Burst、传送完毕发中断,源地址增量、目标地址增量void DMACH1WrapConfig(Uint16 srcwsize, int16 srcwstep, Uint16 deswsize, int16 deswstep);//设置传送完毕的源地址和目标地址void DMACH1ModeConfig(Uint16 persel, Uint16 perinte, Uint16 oneshot, Uint16 cont, Uint16 synce, Uint16 syncsel, Uint16 ovrinte, Uint16 datasize, Uint16 chintmode, Uint16 chinte);//设置DMA工作模式,包括触发源、是否使能触发源、是否使能oneshot模式、是否使能Continuous模式、是否使能外围设备同步、选择同步模式、溢出中断等。
tms320f28335编程实例
tms320f28335编程实例【原创实用版】目录1.TMS320F28335 简介2.TMS320F28335 编程实例的基本步骤3.TMS320F28335 编程实例的具体实现4.总结正文【1.TMS320F28335 简介】TMS320F28335 是一款 32 位定点数字信号处理器(DSP),广泛应用于各种实时控制系统中,如通信、音频处理、图像处理等领域。
TMS320F28335 具有高速、高效的运算能力,可实现大规模数据的快速处理。
同时,它还具有丰富的外设接口,方便与其他硬件设备相连。
【2.TMS320F28335 编程实例的基本步骤】编写 TMS320F28335 编程实例的基本步骤如下:(1)了解 TMS320F28335 的硬件结构和功能,确定处理器的工作模式。
(2)编写程序,实现所需功能。
编写程序时,需要使用 TMS320F28335 的编程语言,如 C 语言或汇编语言。
(3)将编写好的程序下载到 TMS320F28335 处理器中,进行运行测试。
(4)根据实际运行情况,对程序进行调试和优化,以满足实际应用需求。
【3.TMS320F28335 编程实例的具体实现】以一个简单的音频处理为例,具体实现如下:(1)首先,了解 TMS320F28335 的硬件结构,确定工作模式。
在本例中,我们使用 TMS320F28335 作为音频信号处理器,需要启用相应的外设接口,如串行通信接口、音频输入输出接口等。
(2)编写程序。
本例中,我们需要编写一个音频信号处理算法,如音频放大。
首先,我们需要配置 TMS320F28335 的音频输入输出接口,使其与外部音频设备相连。
然后,编写音频信号放大的算法,实现音频信号的实时处理。
(3)将编写好的程序下载到 TMS320F28335 处理器中,进行运行测试。
在测试过程中,我们需要对音频输入输出接口进行配置,以满足实际应用需求。
同时,通过观察音频信号处理结果,评估算法的性能。
TMS320F28335资料
TMS320F28335TechV_28335目录1 DSP的PWM信号 (1)1.1简介 (1)1.2端口对应关系 (2)1.3初始化程序注释 (2)2 DSP的CAN通信 (4)2.1CAN2.0B协议简述 (4)2.2CAN总线电平 (5)2.3CAN总线上的120欧电阻 (6)2.4DSP的CAN时钟模块 (6)2.5邮箱初始化例程注解 (7)2.6消息发送和接收 (8)2.7CAN的适配器存在的一些问题 (9)3 DSP的32位浮点运算测试 (10)4 DSP定时器中断 (11)4.1 DSP28335的定时器 (11)4.2定时器分频 (11)4.3 计数器计数 (12)4.4定时器时钟周期 (12)5 DSP看门狗复位 (12)5.1看门狗时钟 (12)5.2看门狗系统控制和状态寄存器(SCSR) (13)5.3看门狗计数寄存器(WDCNTR) (13)5.4看门狗重启管理器(WDKEY) (14)5.5看门狗控制寄存器(WDCR) (14)6 软件报错与处理 (15)6.1CCS Setup中仿真器的配置 (15)6.2Connect报错——1145——换仿真器解决 (17)6.3CAN口测试A发B收,数据发不出去 (19)6.4编译Pwm测试文件出错 (19)6.5could not open source file "DSP2833x_Device.h (20)7 备注与注意事项 (22)8 附录 C源程序 (22)8.1PWM初始化及脉冲产生函数 (22)8.2邮箱初始化函数 (33)8.3浮点运算测试函数 (36)8.4定时器中断初始化函数 (38)8.5采用定时器的延时函数 (39)8.6看门狗初始化函数 (40)1 DSP的PWM信号1.1简介DSP28335共12路16位的ePWM,能进行频率和占空比控制。
ePWM的时钟TBCLK=SYSCLKOUT/(HSPCLKDIV×CLKDIV):PWM信号频率由时基周期寄存器TBPDR和时基计数器的计数模式决定。
tms320f28335的gpioa组控制原理
tms320f28335的gpioa组控制原理TMS320F28335的GPIOA组控制简介TMS320F28335是德州仪器(Texas Instruments)推出的一款高性能数字信号处理器(DSP)。
作为一名资深的创作者,学习如何利用TMS320F28335的GPIOA组进行控制是十分重要的。
GPIO(General Purpose Input Output)是通用输入输出口,可以连接外部设备和传感器,用于数据的输入和输出。
本文将深入浅出地介绍TMS320F28335的GPIOA组控制的相关原理,帮助读者了解如何使用这个强大的功能。
GPIOA组GPIOA组是TMS320F28335芯片的一部分,它提供了32个独立的GPIO引脚,可以通过编程将其配置为输入或输出。
这些引脚可以连接到外部设备,例如LED灯、开关、传感器等。
引脚配置在开始控制GPIOA组之前,首先需要将引脚配置为输入或输出模式。
可以通过设置特定的寄存器来实现。
输入模式将引脚配置为输入模式时,可以读取外部设备或传感器的信号。
下面是配置引脚为输入模式的示例代码:= 0; // 设置GPIO0为普通IO口= 0; // 设置GPIO0为输入上述代码将将GPIO0配置为输入模式。
通过修改GPIO0的GPAMUX1和GPADIR寄存器的特定位,可以实现配置其他引脚为输入模式的操作。
输出模式将引脚配置为输出模式时,可以向外部设备发送信号。
下面是配置引脚为输出模式的示例代码:= 0; // 设置GPIO1为普通IO口= 1; // 设置GPIO1为输出上述代码将将GPIO1配置为输出模式。
通过修改GPIO1的GPAMUX1和GPADIR寄存器的特定位,可以实现配置其他引脚为输出模式的操作。
读取输入一旦将引脚配置为输入模式,就可以读取与之连接的外部设备或传感器的信号。
下面是读取输入信号的示例代码:Uint16 input = ; // 读取GPIO0的输入信号上述代码将GPIO0的输入信号读取到变量input中。
TMS320F28335教程
低功耗模式和省电模式
支持IDLE,STANDBY,HALT模式
禁止外设独立时钟
179引脚BGA封装或176引脚LQFP封装
DSP技术应用
DSP技术应用
SEED-DEC28335
DSP技术应用
原理框图
片上存储器: FLASH:256K x 16 SRAM:34K x 18 Boot ROM:8K x 16 OTP ROM:1K x 16 片上外设 PWM脉冲输出 GAP/QEP输入 A/D模拟输入 RS232/RS485 CAN总线 RTC+EEPROM EPWM输出:12通道 HRPWM:6通道
简化软件开发,加快上手速度
无需再将程序转换为定点,节省开发时间 提供完善的用户手册和源程序,缩短新芯片的学习时间
DSP技术应用
处理器性能
300 MFLOPS at 150MHz Single-cycle 32-bit MAC 6-channel DMA support for EMIF, ADC, McBSP Code security 68 存储器 512 KB KB Flash 512KB flash and 68KB RAM RAM Configurable 16- or 32-bit EMIF Memory Bus 控制外设 DMA PWM outputs interfaces for three
使用
• 最佳的代码密度 • 兼容C54x™ DSP软件
• 兼容C62x™ DSP软件
DSP技术应用
C2000系列DSP
子系列
C2xx子系列:16位定点DSP、20MIPS
代表器件:TMS320F206PZ C24x子系列:16位定点DSP、20MIPS
我的首个DSP (TMS320F28335) LED灯闪烁 项目实验 总结知识讲解
买视频资料、买书、买开发板(F28335)、各种版本开发环境安装,导入工程、创建工程、了解controlSUITE,终于创建了一个工程,且是按照自己的意愿将代码在开发板上跑起来,现总结如下:实验目的:将开发板上可控的两个LED灯LD3、LD4实现交替闪烁,并在RAM中仿真实验;实验步骤:1、创建工程、且包含main.c文件按照上面的五步操作,然后点击【finish】。
word可编辑遇到的问题:在第四步如果设置新的工作空间文件夹,在点击【finish】后,应实际的去工作空间文件夹下去看一下,是否确实创建好了。
建议:在点击完【finish】后,项目框架基本创建完成,然后关闭CCS,再次进去看看是否直接进入刚刚创建好的工程。
如果不能最好分析一下原因,重建一次。
我在这里反复了3次,也就是重建3次才成功。
如果可以进入,进入后面的步骤。
2、复制controlSUITE下C:\ti\controlSUITE\device_support\f2833x下面的DSP2833x_common和DSP2833x_headers两个文件夹到所创建的工程目录;复制完成后最好仔细浏览一下每个目录下都有哪些文件。
3、在项目的属性设置对话框中设置include路径如下:word可编辑4、在main.c添加如下头文件:#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File#include "DSP2833x_Examples.h" // DSP2833x Examples Include File word可编辑5、这是可以编译一下,肯定会出错,需要删除一些文件。
如下以上红圈内的文件全部删除6、然后再编译一下,看看有什么问题就自己处理吧,呵呵。
7、现在已经有了基本的函数库、头文件,剩下就是实现LED灯的控制了。
代码如下:word可编辑word可编辑#include"DSP2833x_Device.h"// DSP2833x Headerfile Include File#include"DSP2833x_Examples.h"// DSP2833x Examples Include File#define LD3_ON() GpioDataRegs.GPACLEAR.bit.GPIO0 = 1#define LD3_OFF() GpioDataRegs.GPASET.bit.GPIO0 = 1#define LD4_ON() GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1#define LD4_OFF() GpioDataRegs.GPBSET.bit.GPIO34 = 1/** main.c*/int main(void) {InitSysCtrl();DINT;IER = 0x0000;IFR = 0x0000;InitPieCtrl();InitPieVectTable();InitGpio();EALLOW; //这里是DSP对寄存器的安全访问控制成对出现//引脚工作在IO模式GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;// 0 gpio modeGpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;// 0 gpio mode//IO引脚方向设置word可编辑GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;//1 output 0 inputGpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;//1 output 0 input//IO引脚上下拉设置GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;//1 enable pullup 0 disable pullup GpioCtrlRegs.GPBPUD.bit.GPIO34 = 0;//1 enable pullup 0 disable pullup EDIS; //这里是DSP对寄存器的安全访问控制while(1){EALLOW;LD3_ON();LD4_OFF();EDIS;//delay functionEALLOW;LD3_OFF();word可编辑LD4_ON();EDIS;//delay function }}word可编辑。
TMS320F28335经验若干要点
TMS320F28335经验若干要点TMS320F28335开发过程中常见问题总结1.SPI驱动TLE7241E出现返回值不对的问题。
主要是由于时序的不对,导致TLE7241E输入采样时数据还没有建立,所以TLE7241E 收到的命令不正确,所以返回值不正确。
2.SPI驱动EEPROM时,如果用金属物触到clock pin时,能正确运行,否则不能正确运行。
出现次问题也是由于时序的问题,金属物触到clock导致clock出现微小幅度的偏移,导致正好和eeprom 的时序对上,而不用金属物触碰时时序不正常,当使dsp MOSIpin数据发送提前半个周期后,eeprom工作正常。
3.示波器有时会导致显示的波形被消尖,所以用示波器测量时周期不能太大。
TMS320F28335笔记-I2C1.响应和非响应的区别是什么?关于i2c的响应问题:对于每一个接收设备(从设备,slaver),当它被寻址后,都要求在接收到每一个字节后产生一个响应。
因此,the master device 必须产生一个额外的时钟脉冲(第九个脉冲)用以和这个响应位相关联。
在这个脉冲期间,发出响应的从设备必须将SDA拉低并在时钟脉冲的高电平期间保持住。
这表示该设备给出了一个ACK。
如果它不拉低SDA 线,就表示不响应(NACK)。
另外,在从机(发送方)发送完最后一个字节后主设备(接收方)必须产生一个不响应位,用以通知从机(发送方)不要再发送信息了,这样从机就知道该将SDA释放了,而后,主机发出一个停止位给slaver。
总结下,i2c通讯中,SDA 和SCL 都是有主机控制的,从设备只是能够将SDA线拉低而已。
对于SCL线,从机是没有任何能力去控制的。
从机只能被动跟随SCL再说的清楚些:主机发送数据到从机的状态下:主机控制SCL信号线和SDA信号线,从机只是在SCL线为高的时候去被动读取SDA 线。
主机读取从机的数据:主机来发出时钟信号,从机只是保证在时钟信号为高电平的时候的SDA的状态而已。
基于tms320f28035的三相电压保护程序设计
基于tms320f28035的三相电压保护程序设计
基于TMS320F28035的三相电压保护程序设计可以分为以下
步骤:
1. 初始化:设置引脚和寄存器的功能和配置。
例如,将ADC
配置为采样三相电压输入,设置GPIO引脚作为输出,用于触
发保护动作。
2. 执行ADC采样:将ADC设置为连续模式,并配置ADC通
道选择、采样速率等参数。
使用ADC启动命令开始采样,将
三相电压输入连接到相应的ADC通道。
等待ADC采样完成
的中断或定时器中断。
3. 电压检测:在ADC采样完成后,读取三相电压的ADC值,并进行处理。
可以使用移动平均滤波算法对ADC值进行平滑
处理。
4. 电压判断:根据设定的电压保护阈值,判断三相电压的状态是否正常。
例如,如果任意一相电压超过设定的最大值或低于设定的最小值,则表示存在电压异常,执行保护动作。
5. 保护动作:当电压异常时,触发保护动作。
可以通过设置GPIO引脚为高电平或低电平来控制外部继电器或断路器的动作,以保护系统。
同时,可以发送报警信号给控制器或监测系统。
6. 循环执行:程序通过循环执行以上步骤,实时监测三相电压
的状态。
可以使用定时器中断来触发循环执行,以保证保护程序的实时性。
需要注意的是,以上步骤只是一个基本的框架,具体的实现细节和保护策略可以根据实际需求进行调整和优化。
TMS320F28335系列芯片地址映射表
TMS320F28335系列芯⽚地址映射表本表⾮官⽅资料,纯属个⼈学习笔记,欢迎补充本表⾮官⽅资料,纯属个⼈学习笔记,欢迎补充本表⾮官⽅资料,纯属个⼈学习笔记,欢迎补充开始地址长度名称物理器件程序数据只读Protected受到密码保护详细0x0000000x000002BEGIN RAM YES YES0x0000020x00004E BOOT_RSVD RAM YES查看详细0x0000500x0003B0M0RAM YES YES查看详细0x0004000x000400(1K)M1RAM YES YES查看详细0x0008000x000500PF0RAM YES查看详细0x000D000x000100PIE中断向量表RAM YES查看详细0x000E000x001200(4.5K)PF0RAM YES查看详细0x0020000x003000(12K)外部扩展CS0YES查看详细0x0050000x001000(4K)PF3 DMA RAM YES查看详细0x0060000x001000(4K)PF1RAM YES查看详细0x0070000x001000(4K)PF2RAM YES查看详细0x0080000x001000(4K)L0SRAM YES YES YES查看详细0x0090000x001000(4K)L1SRAM YES YES YES查看详细0x00A0000x001000(4K)L2SRAM YES YES YES查看详细0x00B0000x001000(4K)L3SRAM YES YES YES查看详细0x00C0000x001000(4K)L4SRAM YES YES查看详细0x00D0000x001000(4K)L5SRAM YES YES查看详细0x00E0000x001000(4K)L6SRAM YES YES查看详细0x00F0000x001000(4K)L7SRAM YES YES查看详细0x0100000x0F0000??查看详细0x1000000x100000(1M)?外部扩展CS6查看详细0x2000000x100000(1M)?外部扩展CS7查看详细0x3000000x040000(256K)-0x10FLASH FLASH YES YES YES查看详细0x33FFFA0x000010(128Bit)密码FLASH YES YES YES查看详细0x3400000x040000(256K)??查看详细0x3800000x000400(1K)TIOTP OTP YES YES YES/NO查看详细0x3804000x000400(1K)USEROTP OTP YES YES YES/NO查看详细0x3408000x008000??查看详细0x3F80000x001000(4K)L0SARAM YES YES查看详细0x3F90000x001000(4K)L1SARAM YES YES查看详细0x3FA0000x001000(4K)L2SARAM YES YES查看详细0x3FB0000x001000(4K)L3SARAM YES YES查看详细0x3FC0000x002000(8K)??查看详细0x3FE0000x002000(8K)-4BootROM ROM YES查看详细0x3FFFFC0x000004BROM向量表ROM YES查看详细关于BEGIN {#BEGIN}此处存放⼀条指令,当CPU从M0引导的时候,会从这⾥开始关于BootROM{#BootROM}CPU上电后从0x3FFFC0(reset)开始执⾏,此处只有⼀个跳转命令,跳⼊0x3ff34c (bootloader,位于⽚内ROM)这⼀步会检测外部IO状态,决定引导⽅式.。
我的首个DSP (TMS320F28335) LED灯闪烁 项目实验 总结
买视频资料、买书、买开发板(F28335)、各种版本开发环境安装,导入工程、创建工程、了解controlSUITE,终于创建了一个工程,且是按照自己的意愿将代码在开发板上跑起来,现总结如下:实验目的:将开发板上可控的两个LED灯LD3、LD4实现交替闪烁,并在RAM中仿真实验;实验步骤:1、创建工程、且包含main.c文件按照上面的五步操作,然后点击【finish】。
遇到的问题:在第四步如果设置新的工作空间文件夹,在点击【finish】后,应实际的去工作空间文件夹下去看一下,是否确实创建好了。
建议:在点击完【finish】后,项目框架基本创建完成,然后关闭CCS,再次进去看看是否直接进入刚刚创建好的工程。
如果不能最好分析一下原因,重建一次。
我在这里反复了3次,也就是重建3次才成功。
如果可以进入,进入后面的步骤。
2、复制controlSUITE下C:\ti\controlSUITE\device_support\f2833x下面的DSP2833x_common和DSP2833x_headers两个文件夹到所创建的工程目录;复制完成后最好仔细浏览一下每个目录下都有哪些文件。
3、在项目的属性设置对话框中设置include路径如下:4、在main.c添加如下头文件:#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File5、这是可以编译一下,肯定会出错,需要删除一些文件。
如下以上红圈内的文件全部删除6、然后再编译一下,看看有什么问题就自己处理吧,呵呵。
7、现在已经有了基本的函数库、头文件,剩下就是实现LED灯的控制了。
代码如下:#include"DSP2833x_Device.h"// DSP2833x Headerfile Include File#include"DSP2833x_Examples.h"// DSP2833x Examples Include File#define LD3_ON() GpioDataRegs.GPACLEAR.bit.GPIO0 = 1#define LD3_OFF() GpioDataRegs.GPASET.bit.GPIO0 = 1#define LD4_ON() GpioDataRegs.GPBCLEAR.bit.GPIO34 = 1#define LD4_OFF() GpioDataRegs.GPBSET.bit.GPIO34 = 1/** main.c*/int main(void) {InitSysCtrl();DINT;IER = 0x0000;IFR = 0x0000;InitPieCtrl();InitPieVectTable();InitGpio();EALLOW; //这里是DSP对寄存器的安全访问控制成对出现//引脚工作在IO模式GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;// 0 gpio modeGpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;// 0 gpio mode//IO引脚方向设置GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;//1 output 0 inputGpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;//1 output 0 input//IO引脚上下拉设置GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0;//1 enable pullup 0 disable pullupGpioCtrlRegs.GPBPUD.bit.GPIO34 = 0;//1 enable pullup 0 disable pullup EDIS; //这里是DSP对寄存器的安全访问控制while(1){EALLOW;LD3_ON();LD4_OFF();EDIS;//delay functionEALLOW;LD3_OFF();LD4_ON();EDIS;//delay function}}。
TMS320F28335外部中断总结
TMS320F28335外部中断总结作者:Free 文章来源:Free 点击数:93 更新时间:2010-8-26在这里我们要十分清楚DSP的中断系统。
C28XX一共有16个中断源,其中有2个不可屏蔽的中断RESET和NMI、定时器1和定时器2分别使用中断13和14。
这样还有12个中断都直接连接到外设中断扩展模块PIE上。
说的简单一点就是PIE 通过12根线与28335核的12个中断线相连。
而PIE的另外一侧有12*8根线分别连接到外设,如AD、SPI、EXINT等等。
这样PIE共管理12*8=96个外部中断。
这12组大中断由28335核的中断寄存器IER来控制,即IER确定每个中断到底属于哪一组大中断(如IER |= M_INT12;说明我们要用第12组的中断,但是第12组里面的什么中断CPU并不知道需要再由PIEIER确定)。
接下来再由PIE模块中的寄存器PIEIER中的低8确定该中断是这一组的第几个中断,这些配置都要告诉CPU(我们不难想象到PIEIER共有12总即从PIEIER1-PIEIER12)。
另外,PIE模块还有中断标志寄存器PIEIFR,同样它的低8位是来自外部中断的8个标志位,同样CPU的IFR寄存器是中断组的标志寄存器。
由此看来,CPU的所有中断寄存器控制12组的中断,PIE的所有中断寄存器控制每组内8个的中断。
除此之外,我们用到哪一个外部中断,相应的还有外部中断的寄存器,需要注意的就是外部中断的标志要自己通过软件来清零。
而PIE和CPU的中断标志寄存器由硬件来清零。
EALLOW; // This is needed to write to EALLOW protected registersPieVectTable.XINT2 = &ISRExint; //告诉中断入口地址EDIS; // This is needed to disable write to EALLOW protected registersPieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block使能PIE PieCtrlRegs.PIEIER1.bit.INTx5= 1; //使能第一组中的中断5IER |= M_INT1; // Enable CPU 第一组中断EINT; // Enable Global interrupt INTMERTM; // Enable Global realtime interrupt DBGM也就是说,12组中的每个中断都要完成上面的相同配置,剩下的才是去配置自己的中断。