TMS320F28335外部中断总结
DSP实验四、TMS320F28335 定时器 中断 IO中断 控制LED亮灭

继续我的第四个实验;实现定时器中断函数处理LD4翻转、按键IO中断控制LD3翻转;学习目的:中断寄存器的设置,IO中断、定时器中断的使用,F28335共有三个定时器:timer0、timer1、timer2(timer2也可用于DSP/BIOS);功能描述:上电默认LD3、LD4灭;初始化完成后,LD4以1HZ(1S)频率做状态翻转;LD3接受按键控制,每触发一次按键,状态翻转一次。
电路连接说明:LD4、LD3设置为通用GPIO 上拉输出初始化后默认为输出LED灯灭状态;LD4、LD3控制LED灯的负极,如下图;本次实验选用定时器0,程序时刻读取计数器的值,当值为0时,产生定时器0中断,LD4状态翻转;IO按键SW12中断控制LD3状态翻转。
定时器0中断程序设计说明:步骤一、定时器0的预定标寄存器和计数器设置:定时器输入时钟为sysclkout(=135MHz),1、如果定时1S(即1Hz)中断一次(即计数结束),1Hz=135Mhz/1350/100000预定标寄存器(即分频器)设为1350,计数器设为100000;2、如果定时1ms(即1000Hz)中断一次,计算公式为:1000Hz=135Mhz/1350/100预定标寄存器同样设为1350,计数器设为100;赋值语句如下://定时器0 设为1Hz = 135MHz/(1350*100000)CpuTimer0Regs.PRD.all= 100000;//计数周期寄存器,100000周期后计数器减为0CpuTimer0Regs.TPR.bit.TDDR= 1350& 0xFF;//0x546 预定标寄存器(预分频器)CpuTimer0Regs.TPRH.bit.TDDRH = (1350>>8) & 0x00FF;//0x546 预定标寄存器(预分频器)步骤二、a)设置定时器0相关中断寄存器使能定时器0中断,即CpuTimer0Regs.TCR.bit.TIE= 1; //使能定时器0中断b)设置PIE级相关中断寄存器定时器0中断所在PIE组使能,即PIEIERx寄存器设置c)设置CPU级中断相关寄存器CPU级使能上述PIE对应的通道,即IER寄存器设置步骤三、中断向量入口映射位置设置,如下:EALLOW; // This is needed to write to EALLOW protected registersPieVectTable.TINT0 = &cpu_timer0_isr; //将中断函数物理地址赋值给中断向量入口PieVectTable.XINT3 = &key_GPIO50_isr;EDIS; // This is needed to disable write to EALLOW protected registersIO中断程序设计说明:步骤一、设置IO引脚功能复用寄存器为普通IO、设为上拉、输入状态、使能引脚滤波功能;外部中断源选择寄存器设置:如GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL=50;//按键引脚编号设置步骤二、使能外部中断源中断;XIntruptRegs.XINT3CR.bit.ENABLE=1;//使能中断设置触发方式:XIntruptRegs.XINT3CR.bit.POLARITY=0;//下降沿触发剩余步骤同定时器0中断的设置。
单片机开发 F28335中断系统

2.2 使能/禁止复用外设中断的处理 应用外设中断的使能/禁止标志位使能/禁止外设中断,PIEIER
和CPU IER寄存器主要是在同一组中断内设置中断优先级。如果要 修改PIEIER寄存器的设置,有两种方法。第一种方法是保护相应的 PIE标志寄存器标志位,防止中断丢失。第二种方法是清除相应的 PIE寄存器的标志位。
(4)使能CPU中断及全局中断,这个通过对IER和EINT寄存器相应位设置进 行使能或者失能。比如外部中断1,其代码如下:
IER |= M_INT1; // 使能CPU中断1(INT1)
EINT;
// 开全局中断
(5)编写中断服务函数
配置好中断后如果有触发,即会进入中断服务函数,中断服务函数名在前 面已定义好,所以要保证一致,否则将不会进入中断服务函数内执行。在 DSP28335软件开发中,要在中断服务函数名前加上关键字interrupt。例如 外部中断1的中断服务函数:
F28335中断系统
本讲主要内容
1.中断介绍 2.中断操作 3.中断相关寄存器 4.中断配置
1.中断介绍
1.1 中断概念 中断其实就是当 CPU 执行程序时,由于发生了某种随机的事件
(外部或内部),引起 CPU 暂时中断正在运行的程序,转去执行一 段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事 件,该事件处理完后又返回被中断的程序继续执行,这一过程就称 为中断,引发中断的称为中断源。
PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能PIE组1的INT4
(2)使能外设中断,这个具体是由外设相关中断使能位来控制, 比如外部中断1,这个可由外部中断1的控制寄存器中相应中断使能 位来控制。
XIntruptRegs.XINT1CR.bit.ENABLE= 1;
[原]TMS320F28335项目开发记录2_CCS与JTAG仿真器连接问题汇总
![[原]TMS320F28335项目开发记录2_CCS与JTAG仿真器连接问题汇总](https://img.taocdn.com/s3/m/528b71fc102de2bd960588cb.png)
[原]TMS320F28335项目开发记录2_CCS与JTAG仿真器连接问题汇总CCS与仿真器连接问题实际使用过程中,仿真器和CCS连接可能出现这样或那样的问题,也许你的连接很成功,没碰到过什么问题,但我的问题的确不少,可能与电脑配置有关吧,也可能与人品有关吧;下面的自己的一些错误和解决方法总结,不一定对,但也算是一种解决方法,分享给大家:问题:1. jtag连接不上,报错:The controller has detected a dead JTAG clock.The user must turn-on or connect the JTAG clock for the target.连接dm8147没有问题,连接dsp f28335出现此问题;通过不接仿真器测试发现jtag的复位引脚11脚持续的发出低电平,该脚输入WID信号,WID信号输入有问题;所以,还是硬件28335板子硬件上的问题;最后得出:芯片没有问题,是JTAG硬件电路或其他电路的问题;看门狗的复位是由于Flash中没有程序,而复位的低电平脉冲不是造成仿真器连接不了的直接原因;仿真器连接不了,大部分原因是因为JTAG电路的问题,也不排除28335、虚焊、上电顺序等问题;最后查出JTAG上的引脚(TCK、RTCK)有问题!2. The controller has detected a target power loss.The user must turn-on or connect the power supply for the target.看看板子有没有上电。
3. Device is held in reset. Take the device out of reset, and retry the operation.不明原因。
4. The requested TCLK PLL frequency option is invalid.The utility or debugger has requested a selection ofthe JTAG PLL frequency or clock source that is invalid.The value of USCIF.TCLK_FREQUENCY is probably bad.手工设置jtag频率为0后报错5. Failure due to the controller command-finish taking too long.重启ccs或板子看看,一般可以解决。
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组中的每个中断都要完成上面的相同配置,剩下的才是去配置自己的中断。
DSPTMS320F28335---GPIO学习心得

DSPTMS320F28335---GPIO学习⼼得DSPTMS320F28335器件⽀持 88 个 GPIO 引脚。
GPIO 控制和数据寄存器被映射到外设帧 1 以在寄存器上启⽤ 32 位运⾏(连同 16 位运⾏)。
表 4-15显⽰了 GPIO 寄存器映射。
GPACTRL-------控制寄存器GPAQSEL1------限定器选择1寄存器GPAQSEL2-----限定器选择2寄存器GPAMUX1------复⽤1寄存器GPAMUX2------复⽤2寄存器GPAPUIR------⽅向寄存器GPAPUD-------上拉禁⽤寄存器GPIO模块配置步骤:步骤1。
计划的器件引脚:步骤2。
启⽤或禁⽤内部上拉电阻:步骤3。
选择输⼊的资格:步骤4。
选择引脚功能:步骤5。
数字通⽤I / O,选择⽅向的脚:步骤6。
选择低功耗模式唤醒步骤7。
选择外部中断源GPIO数据寄存器GPADAT 0x6FC0 2 GPIO A 数据寄存器(GPIO0 ⾄ 31)GPASET 0x6FC2 2 GPIO A 数据设定寄存器(GPIO0 ⾄ 31)GPACLEAR 0x6FC4 2 GPIO A 数据清除寄存器(GPIO0 ⾄ 31)GPATOGGLE 0x6FC6 2 GPIO A 数据切换寄存器(GPIO0 ⾄ 31)GPIO输⼊采样时间设置:如果SYSCLKOUT=150M,max=6.67ns min=3.4nsTI⽂档: TSM320X2833X System control and interrupt regerence guide ----- SPRUFBO0~87 共88个I/O端⼝,其中GPIO0~GPIO31可以配置成8个核⼼中断。
28335的GPIO⼝可以分为三组,分别为A⼝(GPIO0~GPIO31),B⼝(GPIO32~GPIO63)和C⼝(GPIO64~GPIO87)。
1 GPXCTRL (A,B) 设定采样频率2 GPXQSELX(A,B,1,2) 采样次数3 GPXDIR(A,B,C)数据⽅向设置4 GPXPUD 设置内部上拉与否貌似设置成上拉之后就会变成外设功能引脚5 GPXDAT 作为输出时:写⼊1 0 对应输出⾼低电平作为输⼊时:读⼊1 0 对应输⼊⾼低电平6 GPXSET 作为输出时:写⼊1会拉⾼引脚7 GPXCLEAR 作为输出时:写⼊1会拉低引脚8GPXTOGGLE 作为输出时:写⼊1会输出⽬前引脚状态相反的电平 1---0 0---19 GPIOXINTnSEL n=1~7 。
基于TMS320F28335外部中断配置过程

基于TMS320F28335外部中断配置过程TMS320F28335外部中断的配置关键void main(void){// Step 1. Initialize System Control:InitSysCtrl();// Step 3. Clear all interrupts and initialize PIE vector table: DINT; //禁止全局中断InitPieCtrl();//初始化PIE模块//清除CPU寄存器IER = 0x0000;IFR = 0x0000;//初始化中断服务表InitPieVectTable();//指向PIE向量。
表注意EALLOW和EDIS的使用,要不中间写的都无效的EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.XINT1 = &xint1_isr;PieVectTable.XINT2 = &xint2_isr;EDIS; // This is needed to disable write to EALLOW protected registers // 清除计数Xint1Count = 0; // Count Xint1 interruptsXint2Count = 0; // Count XINT2 interruptsLoopCount = 0; // Count times through idle loop// Enable Xint1 and XINT2 in the PIE: Group 1 interrupt 4 & 5 // Enable int1 which is connected to WAKEINT:PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE blockPieCtrlRegs.PIEIER1.bit.INTx4 = 1; // Enable PIE Gropu 1 INT4PieCtrlRegs.PIEIER1.bit.INTx5 = 1; // Enable PIE Gropu 1 INT5 IER |= M_INT1; // Enable CPU int1EINT;//使能全局中断// Enable Global Interrupts//初始化GPIOEALLOW;GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0; // GPI15 修改GpioCtrlRegs.GPADIR.bit.GPIO15 = 0; // inputGpioCtrlRegs.GPAQSEL1.bit.GPIO15 = 0; // Xint1 Synch to SYSCLKOUT onlyGpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // GPIO1GpioCtrlRegs.GPADIR.bit.GPIO1 = 0; // inputGpioCtrlRegs.GPAQSEL1.bit.GPIO1 = 2; // XINT2 Qual using 6 samplesGpioCtrlRegs.GPACTRL.bit.QUALPRD0 = 0xFF; // Each sampling window is510*SYSCLKOUTEDIS;//配置GPIO中断EALLOW;GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 15;//配置GPIO寄存器GPIOXINT1SEL把GPIO15作为Xint1中断GpioIntRegs.GPIOXINT2SEL.bit.GPIOSEL = 1; // XINT2 is GPIO1 //配置GPIO寄存器GPIOXINT2SEL把GPIO1作为Xint2中断EDIS;// Configure XINT1XIntruptRegs.XINT1CR.bit.POLARITY = 0; // Falling edge interrupt XIntruptRegs.XINT2CR.bit.POLARITY = 1; // Rising edge interrupt// Enable XINT1 and XINT2XIntruptRegs.XINT1CR.bit.ENABLE = 1; // Enable Xint1XIntruptRegs.XINT2CR.bit.ENABLE = 1; // Enable XINT2// Step 6. IDLE loop:for(;;){}}interrupt void xint1_isr(void){}interrupt void xint2_isr(void)}------------------------------------------------------------------------------------------------------------------------------------------ GpioDataRegs.GPBCLEAR.all = 0x4; // GPIO34 is low Xint2Count++; PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; GpioDataRegs.GPBCLEAR.all = 0x4; // GPIO34 is low Xint1Count++;PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;void InitPieCtrl(void){// Disable Interrupts at the CPU level:DINT;// Disable the PIEPieCtrlRegs.PIECTRL.bit.ENPIE = 0;}//---------------------------------------------------------------------------// EnableInterrupts: // Clear all PIEIFR registers: PieCtrlRegs.PIEIFR1.all = 0; PieCtrlRegs.PIEIFR2.all = 0; PieCtrlRegs.PIEIFR3.all = 0; PieCtrlRegs.PIEIFR4.all = 0; PieCtrlRegs.PIEIFR5.all = 0; PieCtrlRegs.PIEIFR6.all = 0; PieCtrlRegs.PIEIFR7.all = 0; PieCtrlRegs.PIEIFR8.all = 0; PieCtrlRegs.PIEIFR9.all = 0; PieCtrlRegs.PIEIFR10.all = 0; PieCtrlRegs.PIEIFR11.all = 0; PieCtrlRegs.PIEIFR12.all = 0; // Clear all PIEIER registers: PieCtrlRegs.PIEIER1.all = 0; PieCtrlRegs.PIEIER2.all = 0; PieCtrlRegs.PIEIER3.all = 0; PieCtrlRegs.PIEIER4.all = 0; PieCtrlRegs.PIEIER5.all = 0; PieCtrlRegs.PIEIER6.all = 0; PieCtrlRegs.PIEIER7.all = 0; PieCtrlRegs.PIEIER8.all = 0; PieCtrlRegs.PIEIER9.all = 0; PieCtrlRegs.PIEIER10.all = 0; PieCtrlRegs.PIEIER11.all = 0; PieCtrlRegs.PIEIER12.all = 0;//---------------------------------------------------------------------------// This function enables the PIE module and CPU interrupts//void EnableInterrupts(){// Enable the PIEPieCtrlRegs.PIECTRL.bit.ENPIE = 1;}const struct PIE_VECT_TABLE PieVectTableInit =PIE_RESERVED, // 0 Reserved spacePIE_RESERVED, // 1 Reserved spacePIE_RESERVED, // 2 Reserved spacePIE_RESERVED, // 3 Reserved spacePIE_RESERVED, // 4 Reserved spacePIE_RESERVED, // 5 Reserved spacePIE_RESERVED, // 6 Reserved spacePIE_RESERVED, // 7 Reserved spacePIE_RESERVED, // 8 Reserved spacePIE_RESERVED, // 9 Reserved spacePIE_RESERVED, // 10 Reserved spacePIE_RESERVED, // 11 Reserved spacePIE_RESERVED, // 12 Reserved space// Non-Peripheral InterruptsINT13_ISR, // XINT13 or CPU-Timer 1INT14_ISR, // CPU-Timer2DATALOG_ISR, // Datalogging interrupt // Enable Interrupts at the CPU level EINT; // Enables PIE to drive a pulse into the CPU PieCtrlRegs.PIEACK.all = 0xFFFF;RTOSINT_ISR, // RTOS interruptEMUINT_ISR, // Emulation interruptNMI_ISR, // Non-maskable interruptILLEGAL_ISR, // Illegal operation TRAPUSER1_ISR, // User Defined trap 1USER2_ISR, // User Defined trap 2USER3_ISR, // User Defined trap 3USER4_ISR, // User Defined trap 4USER5_ISR, // User Defined trap 5USER6_ISR, // User Defined trap 6USER7_ISR, // User Defined trap 7USER8_ISR, // User Defined trap 8USER9_ISR, // User Defined trap 9USER10_ISR, // User Defined trap 10USER11_ISR, // User Defined trap 11USER12_ISR, // User Defined trap 12// Group 1 PIE VectorsSEQ1INT_ISR, // 1.1 ADCSEQ2INT_ISR, // 1.2 ADCrsvd_ISR, // 1.3XINT1_ISR, // 1.4XINT2_ISR, // 1.5ADCINT_ISR, // 1.6 ADCTINT0_ISR, // 1.7 Timer 0WAKEINT_ISR, // 1.8 WD, Low Power// Group 2 PIE VectorsEPWM1_TZINT_ISR, // 2.1 EPWM-1 Trip ZoneEPWM2_TZINT_ISR, // 2.2 EPWM-2 Trip ZoneEPWM3_TZINT_ISR, // 2.3 EPWM-3 Trip ZoneEPWM4_TZINT_ISR, // 2.4 EPWM-4 Trip ZoneEPWM5_TZINT_ISR, // 2.5 EPWM-5 Trip ZoneEPWM6_TZINT_ISR, // 2.6 EPWM-6 Trip Zone rsvd_ISR, // 2.7 rsvd_ISR, // 2.8// Group 3 PIE VectorsEPWM1_INT_ISR, // 3.1 EPWM-1 InterruptEPWM2_INT_ISR, // 3.2 EPWM-2 InterruptEPWM3_INT_ISR, // 3.3 EPWM-3 InterruptEPWM4_INT_ISR, // 3.4 EPWM-4 InterruptEPWM5_INT_ISR, // 3.5 EPWM-5 InterruptEPWM6_INT_ISR, // 3.6 EPWM-6 Interruptrsvd_ISR, // 3.7rsvd_ISR, // 3.8// Group 4 PIE VectorsECAP1_INT_ISR, // 4.1 ECAP-1 ECAP2_INT_ISR, // 4.2 ECAP-2 ECAP3_INT_ISR, // 4.3 ECAP-3 ECAP4_INT_ISR, // 4.4 ECAP-4 ECAP5_INT_ISR, // 4.5 ECAP-5 ECAP6_INT_ISR, // 4.6 ECAP-6 rsvd_ISR, // 4.7rsvd_ISR, // 4.8// Group 5 PIE VectorsEQEP1_INT_ISR, // 5.1 EQEP-1 EQEP2_INT_ISR, // 5.2 EQEP-2 rsvd_ISR, // 5.3rsvd_ISR, // 5.4rsvd_ISR, // 5.5rsvd_ISR, // 5.6rsvd_ISR, // 5.7rsvd_ISR, // 5.8// Group 6 PIE VectorsSPIRXINTA_ISR, // 6.1 SPI-A SPITXINTA_ISR, // 6.2 SPI-A MRINTA_ISR, // 6.3 McBSP-A MXINTA_ISR, // 6.4 McBSP-A MRINTB_ISR, // 6.5 McBSP-B MXINTB_ISR, // 6.6 McBSP-Brsvd_ISR, // 6.7rsvd_ISR, // 6.8// Group 7 PIE VectorsDINTCH1_ISR, // 7.1 DMA channel 1DINTCH2_ISR, // 7.2 DMA channel 2 DINTCH3_ISR, // 7.3 DMA channel 3 DINTCH4_ISR, // 7.4 DMA channel 4 DINTCH5_ISR, // 7.5 DMA channel 5 DINTCH6_ISR, // 7.6 DMA channel 6 rsvd_ISR, // 7.7rsvd_ISR, // 7.8// Group 8 PIE VectorsI2CINT1A_ISR, // 8.1 I2CI2CINT2A_ISR, // 8.2 I2Crsvd_ISR, // 8.3rsvd_ISR, // 8.4SCIRXINTC_ISR, // 8.5 SCI-C SCITXINTC_ISR, // 8.6 SCI-Crsvd_ISR, // 8.7rsvd_ISR, // 8.8// Group 9 PIE VectorsSCIRXINTA_ISR, // 9.1 SCI-A SCITXINTA_ISR, // 9.2 SCI-A SCIRXINTB_ISR, // 9.3 SCI-B SCITXINTB_ISR, // 9.4 SCI-B ECAN0INTA_ISR, // 9.5 eCAN-A ECAN1INTA_ISR, // 9.6 eCAN-A ECAN0INTB_ISR, // 9.7 eCAN-B ECAN1INTB_ISR, // 9.8 eCAN-B// Group 10 PIE Vectorsrsvd_ISR, // 10.1rsvd_ISR, // 10.2rsvd_ISR, // 10.3rsvd_ISR, // 10.4rsvd_ISR, // 10.5rsvd_ISR, // 10.6rsvd_ISR, // 10.7rsvd_ISR, // 10.8// Group 11 PIE Vectorsrsvd_ISR, // 11.1rsvd_ISR, // 11.2rsvd_ISR, // 11.3rsvd_ISR, // 11.4rsvd_ISR, // 11.5rsvd_ISR, // 11.6rsvd_ISR, // 11.7rsvd_ISR, // 11.8// Group 12 PIE VectorsXINT3_ISR, // 12.1XINT4_ISR, // 12.2XINT5_ISR, // 12.3XINT6_ISR, // 12.4XINT7_ISR, // 12.5rsvd_ISR, // 12.6LVF_ISR, // 12.7LUF_ISR, // 12.8};//---------------------------------------------------------------------------// InitPieVectTable://---------------------------------------------------------------------------// This function initializes the PIE vector table to a known state. // This function must be executed after boot time.//void InitPieVectTable(void){} // Enable the PIE Vector Table PieCtrlRegs.PIECTRL.bit.ENPIE = 1; int16 i; Uint32 *Source = (void *) &PieVectTableInit; Uint32 *Dest = (void *) &PieVectTable; EALLOW; for(i=0; i < 128; i++) *Dest++ = *Source++; EDIS;。
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的状态而已。
DSPF28335---中断系统

DSPF28335---中断系统28335的中断系统中断概述通过硬件或软件驱动的信号,使CPU将当前的程序挂起,执行另一个称为中断服务子程序称为中断。
28335内部有16根中断线,其中有两个不可屏蔽中断(RESET、NMI)与16个可屏蔽中断(INT1-14、RTOSINT、DLOGINT),这里主要说明INT1-14。
在28335中,CPU定时器1、2一般预留给实时操作系统使用,中断线单独分配给INT13、INT14。
其余12个可屏蔽中断直接连接在外设中断扩展模块PIE上,供外部中断和处理器内部单元使用。
这就有一个问题,28335内部有很多个外设模块,这些外设都有自己的中断而且有很多个,那么剩余12个中断怎么够用。
为了解决这个问题所有引入PIE模块。
PIE通过12根线与28335核的12个中断线相连。
而PIE的另外一侧有12*8=96根线分别连接到外设,如AD、SPI、EXINT等等。
说明:PIE和CPU的中断标志寄存器由硬件来清零;但外部中断的标志位要通过软件来清零。
一.三级中断1.外设级中断如果有外设产生中断事件,则寄存器中相应的中断标志位被置一,如果相应的中断使能为(IE)被置位,那么外设就像PIE发出一个中断请求。
如果外设使能位没有被置位,那么中断标志(IF)位将保持为1直到软件清除。
2.PIE中断对于复用的中断源,PIE模块有相应的标志寄存器[PIEIFR(x,y) x=1-12,y=1-8]和中断使能寄存器PIEIER(x,y) ;对于每一个PIE中断组来说还有一个中断应答寄存器PIEACKx。
当有中断请求进入PIE模块的时候,如果相应的PIE中断标志位PIEIFR(x.y)和中断使能寄存器PIEIER(x,y)置1;这是PIE控制器就会检查PIEACKx标志位看CPU是否已经准备好接收这个PIE中断组的中断。
明:如果PIEACKZx被清零,PIE会把这个中断请求送到CPU级的INTx。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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组中的每个中断都要完成上面的相同配置,剩下的才是去配置自己的中断。
如我们提到的EXINT,即外面来个低电平我们就进入中断,完成我们的程序。
在这里要介绍一下,DSP的GPIO口都可以配置为外部中断口,其配置方法如下:GpioCtrlRegs.GPBMUX2.bit.GPIO54 = 0; //选择他们是GPIO口GpioCtrlRegs.GPBMUX2.bit.GPIO55 = 0;GpioCtrlRegs.GPBMUX2.bit.GPIO56 = 0;GpioCtrlRegs.GPBMUX2.bit.GPIO57 = 0;GpioCtrlRegs.GPBDIR.bit.GPIO54 = 0;//选择他们都是输入口GpioCtrlRegs.GPBDIR.bit.GPIO55 = 0;GpioCtrlRegs.GPBDIR.bit.GPIO56 = 0;GpioCtrlRegs.GPBDIR.bit.GPIO57 = 0;GpioCtrlRegs.GPBQSEL2.bit.GPIO54= 0;//GPIO时钟和系统时钟一样且支持GPIOGpioCtrlRegs.GPBQSEL2.bit.GPIO55= 0;GpioCtrlRegs.GPBQSEL2.bit.GPIO56= 0;GpioCtrlRegs.GPBQSEL2.bit.GPIO57= 0;GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL = 54;//中断3选择GPIOGpioIntRegs.GPIOXINT4SEL.bit.GPIOSEL = 55;GpioIntRegs.GPIOXINT5SEL.bit.GPIOSEL = 56;GpioIntRegs.GPIOXINT6SEL.bit.GPIOSEL = 57;XIntruptRegs.XINT3CR.bit.POLARITY= 0;//触发模式为下降沿触发XIntruptRegs.XINT4CR.bit.POLARITY= 0;XIntruptRegs.XINT5CR.bit.POLARITY= 0;XIntruptRegs.XINT6CR.bit.POLARITY= 0;XIntruptRegs.XINT3CR.bit.ENABLE = 1;//使能中断XIntruptRegs.XINT4CR.bit.ENABLE = 1;XIntruptRegs.XINT5CR.bit.ENABLE = 1;XIntruptRegs.XINT6CR.bit.ENABLE = 1;注意一点就是外部中断1和2只能对GPIO0—GPIO31配置;外部中断3和4、5、6、7只对GPIO32—GPIO63配置。
简简单单DSP”系列学习活动——第四期中断结构学习1、外围帧寄存器2812将外围帧寄存器分为3个空间,分别是:外围帧0:直接映射到CPU存储器总线外围帧1:映射到32位外围总线外围帧2:映射到16位外围总线,只允许16操作这里所说的外围帧寄存器就是外设寄存器,如ADC寄存器。
映射就是分配地址,外围一个地址,CPU一个地址,外围地址映射到CPU地址上。
(1)有的寄存器受保护,对其进行操作的时候好,要屏蔽保护(EALLOW),操作完在开启保护(EDIS).(2)外围中断扩展PIE外设寄存器中的中断标志位必须由软件清0,才能允许下一次中断进入,而且每次中断后要把PIEACKx清0,只有PIEACKx=0,才可以把中断送到CPU级中断分为3级:a、外设级b、PIE级c、CPU级下面分别介绍这个不同的中断级以及这3级的联系a、外设级一旦外设产生了中断,对应的外设中断标志寄存器中的中断标志位IF就会置位,如果此时对应的中断使能位设为1,那么外设中断信号可以送到PIE控制器,如果外设的中断被禁止输入进来,那么外设中断标志位保持为1,直到软件清0。
外设级和PIE级的联系就在外设中断使能位那了,实际外设的中断使能位使能的就是允许外设中断进入PIE级,相当于PIE级的中断源,就像外设的中断源一样,有了中断事件,外设中断标志位就会置位,这里也是外设级就是PIE级得中断事件,有了外设级的中断标志位置位,中断使能位使能,那么PIE级的中断标志位才会置1.注意的是外设中断标志寄存器中的中断标志位必须由软件清0,才能允许下一次中断进入。
b、PIE级PIE级有两中寄存器,一种是中断标志寄存器PIEIFRx,上面已经说过他跟外设级的联系,另一个是中断使能寄存器PIEIERx,这个跟外设级的中断使能寄存器功能差不多,实现的是和CPU级的联系.PIE级还有两个寄存器,一个是控制寄存器PIECTRL,这个是控制整个PIE级的,还有一个应答寄存器PIEACK,在PIEIFRx置位,PIEIERx使能还要PIEACKx清0才能把中断送到CPU级。
这里注意的是PIEIFRx由硬件清0,但是PIEACKx要由软件清0.c、CPU级CPU级是最终控制中断响应的,也是有两种寄存器,一个是中断标志寄存器IFR,另一个是中断使能寄存器IER。
IFR是这三级中断的最终的中断标志位,IER是这三级中断的最终中断使能位,只有这三级中断标志位同时置位,三级中断同时使能,这里还有一个CPU级的中断屏蔽位INTM,在以上条件满足的前提下,中断屏蔽位INTM=0,CPU才能响应中断,找到中断向量,跳转到中断函数,执行中断操作,CPU级的中断标志位由硬件清0,在中断函数中不用管。
这就是它的中断过程。
3、96个中断介绍2812分为12组中断,每组中断有8个中断源,以INTx.y表示,其中x是组(x=1~12),y(y=1~8)是组中的位.在配置中断的时候,外设级的中断使能位要使能;PIECTRL寄存器使能PIE;要知道INTx.y中的xy是多少,找到PIEIERx(x=1~12)的x是多少,使能PIEIERx;PIEACKx(x=1~12)的x是多少给其清0;IERx(x=1~12)的x是多少,使能IERx;中断屏蔽位INTM=0;中断函数中要处理的:外设中断标志位软件清0PIEACKx(x=1~12)软件清0;4、C代码分析以定时器0的C代码分析timer0的中断向量INT1.7(x=1,y=7),用到的PIE级的中断使能寄存器是PIEIER1,CPU级的IER1.在2812的库函数中有一个定义中断入口地址的函数,用户的中断函数内容可以在这里面写,就不容另外赋中断地址了。
中断函数入口地址interrupt voidTINT0_ISR(void)。
在DSP复位后,进入中函数前,看门狗开着的,所以在进入中函数后第一件事情是关看门狗,在这个函数里面InitSysCtrl();中断是开着的需要关闭(DINT;),PIE 寄存器(InitPieCtrl();//初始化pie寄存器)(IER = 0x0000;//禁止所有的中断IFR = 0x0000;)、中断向量表是没有初始化的,所以要初始化(InitPieVectTable();//初始化pie中断向量表)。
InitSysCtrl();//初始化cpuDINT;//关中断InitPieCtrl();//初始化pie寄存器IER = 0x0000;//禁止所有的中断IFR = 0x0000;InitPieVectTable();//初始化pie中断向量表EALLOW;// This is needed to write to EALLOW protected registersPieVectTable.TINT0 = &cpu_timer0_isr;//指定中断服务子程序,这个地方要是用到了DSP的库函数DSP281X_DefaultIsr()函数就不需要了。
EDIS;InitCpuTimers();//初始化定时器0ConfigCpuTimer(&CpuTimer0,150,9.75);//配置你要定时的时间StartCpuTimer0();//定时器开始计数PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能PIE级中断PIEIERx中的x=1,即使能的12组中的第1组第七个IER |= M_INT1;//使能CPU级的中断第1组EINT;// 使能INTMERTM;// 使能仿真时DBGM5、在中断函数中要做的interrupt voidTINT0_ISR(void)// CPU-Timer 0{PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //PIEACK清0CpuTimer0Regs.TCR.bit.TIF = 1;//外设中断标志位清0CpuTimer0Regs.TCR.bit.TRB = 1;//重新装载}。