当前位置:首页 >> 能源/化工 >>

DSP学习


DSP 之时钟学习
先说软件设置 :
时钟倍频 Initpll 在 DSP280X_SysCtrl.c 文件中的系统初始化函数 InitSysCtrl();中设置。

void InitSysCtrl(void) { // Disable the watchdog DisableDog(); //首先应该关看门狗 // Initialize

the PLL control: PLLCR and CLKINDIV // DSP28_PLLCR and DSP28_CLKINDIV are defined in DSP280x_Examples.h InitPll(DSP28_PLLCR,DSP28_CLKINDIV);//PLL时钟设置 InitPeripheralClocks();//外设时钟启动 } //注:DSP28_PLLCR,DSP28_CLKINDIV这两个变量就是指定PLL倍频的数据,在DSP280x_Examples.h头文件中宏 定义的,但是可以在此头文件中去修改这两个数值。如下就是宏定义的原型。 #define DSP28_CLKINDIV 0 // Enable /2 for SYSCLKOUT //#define DSP28_CLKINDIV 1 // Disable /2 for SYSCKOUT //#define DSP28_PLLCR 10 //#define DSP28_PLLCR 9 //#define DSP28_PLLCR 8 //#define DSP28_PLLCR 7 #define DSP28_PLLCR 6 //#define DSP28_PLLCR 5 //#define DSP28_PLLCR 4 //#define DSP28_PLLCR 3 //#define DSP28_PLLCR 2 //#define DSP28_PLLCR 1 //#define DSP28_PLLCR 0 // PLL is bypassed in this mode // Initialize the peripheral clocks

进出CPU时钟CLKIN可以是PLL关闭 可以是PLL旁路 还可以是PLL 旁路, PLL使能 进出CPU时钟CLKIN可以是PLL关闭 可以是PLL旁路,还可以是PLL使能 CPU时钟CLKIN可以

注:
· 晶振操作: 此模式允许使用外部为器件提供时基。晶体连接到X1/X2 引脚,XCLKIN 连接到低电平。 · 外部时钟源操作: 此模式允许绕过内部振荡器。器件时钟根据引脚上的外部时钟源输入生成。必须将X1 连接到低电平 并让X2 悬空。在这种情况下,外部振荡器时钟连接到XCLKIN 引脚,允许使用3.3V 时钟源。 允许使用X1 和X2 引脚将晶体连接到280x 器件。 如果未使用晶体,则可以将外部振荡器直接连接 到XCLKIN 引脚,X2 引脚保留悬空,X1 连接到低电平。请参阅 TMS320F2808、TMS320F2806、TMS320F2801、UCD9501 数字信号处理器数据手册(文献编号SPRS230) 1: 来自X1,X2或者XCLKIN的时钟可以通过控制寄存器PLL 状态寄存器(PLLSTS)来控制是否需要经过PLL倍频,

当OSCOFF=0时来自X1,X2或者XCLKIN的时钟送至PLL,当OSCOFF=1时X1,X2或者XCLKIN的时钟不送PLL 2:a、简单的说就是若OSCOFF=1是关闭PLL,SYSCLKOUT直接就等于外部晶振或者晶体来的时钟OSCCLK 或者是OSCCLK/2,具体是OSCCLK/2还是OSCCLK还要通过设置寄存器PLLSTS[CLKINDIV]位,如下图:

b、OSCOFF=0且PLLOFF=0时就是打开PLL,通过设置PLLCR寄存器来控制倍频的倍数,控制SYSCLKOUT 的大小,见图PLLCR的值和CLKIN(SYSCLKOUT)对应关系:(还要设置PLLSTS[CLKINDIV]位)

c、当OSCOFF=0且PLLOFF=1时就是PLL作为旁路使用,PLL 关闭设置了PLLOFF 位时,PLL 模块应保 器件必须处于PLL 旁路模式(PLLCR = 0x0000), 然后才能将1 写入PLLOFF。 当PLL 关闭(PLLOFF 持断电。 = 1) 时,不要为PLLCR 写入非零值。当PLLOFF = 1时,STANDBY 和HALT 低功率模式将如预期正常工 作。在从HALT 或STANDBY 唤醒之后,PLL 模块将继续断电。
例:DSP280x_Examples.h头文件中 /*----------------------------------------------------------------------------Specify the PLL control register (PLLCR) and clock in divide (CLKINDIV) value. if CLKINDIV = 0: SYSCLKOUT = (OSCCLK * PLLCR)/2 if CLKINDIV = 1: SYSCLKOUT = (OSCCLK * PLLCR) -----------------------------------------------------------------------------*/ #define DSP28_CLKINDIV //#define DSP28_CLKINDIV 表示不二分频。 //#define DSP28_PLLCR //#define DSP28_PLLCR //#define DSP28_PLLCR //#define DSP28_PLLCR 10 9 8 7 0 // Enable /2 for SYSCLKOUT 1 // Disable /2 for SYSCKOUT 设置输出的时钟二分频与否 0表示二分频 1

#define DSP28_PLLCR //#define DSP28_PLLCR //#define DSP28_PLLCR //#define DSP28_PLLCR //#define DSP28_PLLCR //#define DSP28_PLLCR

6 5 4 3 2 1 0 // PLL is bypassed in this mode//旁路模式中使用

//#define DSP28_PLLCR

void InitPll(Uint16 val, Uint16 clkindiv) 函数也在 DSP280X_SysCtrl.c 中,

寄存器设置 Figure 3-3. Peripheral Clock Control 0 Register (PCLKCR0)
图 3-2./3-3. 外设时钟控制寄存器 0 (PCLKCR0/1)

高速外设时钟预分频器(HISPCP) 寄存器 图 3-5. 高速外设时钟预分频器

// HISPCP/LOSPCP prescale register settings, normally it will be set to default values SysCtrlRegs.HISPCP.all = 0x001 ;//高速时钟HISPCP = SYSCLKOUT/2 SysCtrlRegs.LOSPCP.all = 0x002;//低速时钟HISPCP = SYSCLKOUT/4 // XCLKOUT to SYSCLKOUT ratio. By default XCLKOUT = 1/2 SYSCLKOUT SysCtrlRegs.XCLK.bit.XCLKOUTDIV=10 ;

DSP 之 GPIO

格式的 带格式的: 字体: (默认) 华文行 楷, (中文) 华文行楷, 字体颜色: 红色 格式的 带格式的: 字体: (默认) 华文行 楷, (中文) 华文行楷, 字体颜色: 红色 格式的 带格式的: 字体: (默认) 华文行 楷, (中文) 华文行楷, 字体颜色: 红色

GPIO0—35 — 寄存器: 寄存器:

1

GPIO Port A MUX 1 (GPAMUX1) Register

引脚功能控制寄存器:GPAMUX1 控制 0-15 号引脚

GPAMUX2

控制 16-31 号引脚

GPBMUX1

控制 32-34 号引脚:

注 :GPIO 复用功能寄存器 MUX 可以根据设置相应的位来达到改变 GPIO 功能的作用 其中两位控制一个 GPIO GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0; // GPIO6 = GPIO6

2

Figure 4-13. GPIO Port A Direction (GPADIR) Register

方向控制器 GPADIR 控制 31-0

GPBDIR 控制 34-32

注: 方向寄存器是控制 GPIO 的方向的 寄存器的每一位控制一个 GPIO 对其写 0 代表 GPIO 输入,写 1 代表 GPIO 输出 GpioCtrlRegs.GPADIR.bit.GPIO17 = 1;

// GPIO17 = output

3 Figure 4-15. GPIO Port A Pullup Disable (GPAPUD) Registers

内部上拉控制寄存器 GPAPUD

控制 31-0 引脚

GPBPUD

控制 32-34 引脚

注:内部上拉控制寄存器是用来开启/关闭内部上拉 GpioCtrlRegs.GPAPUD.bit.GPIO8 = 0; // Enable pullup on GPIO8

4

Figure 4-17. GPIO Port A Data (GPADAT) Register

状态寄存器 GPADAT 控制 GPIO31-0

状态寄存器 GPBDAT 控制 32-34

注:DAT 状态寄存器可以用来读取 GPIO 的值 也可用来对 GPIO 进行赋值 寄存器的每一位控制一个 GPIO 当对位赋值 0 时并且但 GPIO 对应位是 OUTPUT 时才能驱动此端口为 0,如果 GPIO 设置的是

输入,则不能驱动端口输出 0。 Reading a 0 indicates that the state of the pin is currently low, irrespective of the mode the pin is configured for.(读取0状态操作) Reading a 1 indicates that the state of the pin is currently high irrespective of the mode the pin is configured for. (读取1状态操作) GpioDataRegs.GPADDAT.all = 0xFFFDFFFF //GPIO16输出低电平

5 Figure 4-19. GPIO Port A Set, Clear and Toggle (GPASET, GPACLEAR, GPATOGGLE) Registers

GPIO端口置位,清零,反转控制寄存器GPASET, GPACLEAR, GPATOGGLE 端口置位,清零,反转控制寄存器 端口置位 控制31-0引脚 引脚 控制

注:对置位,清零,反转操作时对寄存器写0被忽略不计,只有当对其写1是才起作用,比如对 某一位GPIO的GPACLEAR写1,则表示对此端口进行清零操作。 同理GPBSET, GPBCLEAR, GPBTOGGLE则是对32-34GPIO操作, 例:GpioDataRegs.GPASET.bit.GPIO12 = 1; //GPIO置1

6 Figure 4-21. GPIO XINT1, XINT2, XNMI Interrupt Select (GPIOXINT1SEL, GPIOXINT2SEL,GPIOXNMISEL) Registers

XINT1, XINT2, XNMI中断源控制寄存器 中断源控制寄存器

注:此处只拿XINT1作为参考 想把哪个GPIO作为XINT1的中断源只需要设置对应位寄存器就OK

7

Table 4-40. GPIO Low Power Mode Wakeup Select (GPIOLPMSEL)

Register Field Descriptions 低功耗唤醒设置寄存器

GPIO功能强大的硬件消抖 DSP GPIO功能强大的硬件消抖

很多工程师在对按键去抖动都会采用软件延时的方法,今天介绍下关于 所具有的硬件去抖功能. 很多工程师在对按键去抖动都会采用软件延时的方法 今天介绍下关于 Piccolo DSP GPIO 所具有的硬件去抖功能

信号首先同步于系统时钟,在输入到内核改变之前要经过一定周期个数的量化 这种方式可以滤除噪声 这种方式可以滤除噪声。 信号首先同步于系统时钟,在输入到内核改变之前要经过一定周期个数的量化,这种方式可以滤除噪声。量化 窗口输入的结构示意图如图所示。 窗口输入的结构示意图如图所示。

由图可知,外部的管脚输入信号经过一个量化窗口到达 DSP 内核。量化窗口的时间宽度取决于采样间隔和采样个数。采样 间隔由 GPxCTRL 寄存器决定,采样个数由寄存器 GPxQSELn 决定。 如果 QUxLPRDn = 0,采样间隔为一个系统周期整数倍。如果 QUxLPRDn = N (N≠0),采样周期为系统周期的 2N 倍。如表 所示

采样个数可以配置位三个或六个。通过寄存器 GPAQSEL1、GPAQSEL2、GPBQSEL1 来配置,当外部管脚电平状态发生变 化时,量化窗口检测到三个或六个周期内相同的状态时,才把此次状态改变传送到内核,否则会当成杂波滤除。

量化窗口的宽度与采样周期和采样个数有关,当采样周期和采样个数确定之后,量化窗口的宽度就确定了。量化窗口与采样 周期及采样个数的关系如表所示。

现举例说明量化窗口的用法及效果。假如某个 GPIO 引脚为数字输入,量化模式为 6 个采样周期量化,采样周期寄存器中 QUxLPRDn 值为一,则采样周期为两个系统时钟周期宽度,量化输入的结果如图所示。

注:值得注意的是在DEBUG 的时候必须,当触发中断的时候不能用单步执行程序, 因为由于DSP有端口硬件消抖的功能,输入的状态必须和系统时钟一致才能触发外中 断的发生,应该用RUN直接执行程序 。

DSP之 DSP之外部中断

带格式的: 字 格式的 字体颜色: 红色 格式的 字体: (默认) 华文行 带格式的: 字 楷, (中文) 华 华文行楷, 字体颜色: 红色

PIE
CPU 有 1 各部可屏蔽中断 NMI。 14 个可屏蔽中断 INT1---INT14。 2812 内有很多外设每一个外设可以产生一个或多个中断 内有很多外设每一个外设可以产生一个或多个中断、 专门设计一个 PIE 外设中断控制器 外设中断控制器。 CPU 没有能力同时处理所有中断请求

PIE 支持 96 个中断 12 组每组 8 个中断 个中断。 而且每组都被反馈到 CPU 内核 12 条中短线的某一条上面。 其实我们作用了 96 中断的 45 个。 。

CPU 是 3 级中断机制 外设级 PIE 级 不会执行该中断。

CPU 级。 对于一个具体的外设中断请求, 对于一个具体的外设中断请求 一个不许可 CPU

当某个外设中断事件发生了,这个外设某个寄存器和该中断标志置 1 这个外设某个寄存器和该中断标志置 如果该中断的中断使能位被置 1 外设就会向 PIE 发送中断请求,否则不会往 PIE 发送中断请求。不 否则不会往 管什么情况下外设中断标志寄存器中断中断标志 管什么情况下外设中断标志寄存器中断中断标志必须手动清除 例如

每一组 PIE 都有个 标志寄存器 PIEIFRx 使能寄存器 PIEIERx 还有个相应寄存器 ACK 一组同时一个中断被响应 因为 PIEACK 寄存器 12 位对应 INT1 --12 有中断 PIEACK 对应位置 1 等待手动清除 (标志寄存器自动清除)才能响应同组下一个中断 才能响应同组下一个中断 (如果中断请求还在) 。 DINT; //禁止中断 在设置某些寄存器的时候 EINT; // Enable Global interrupt INTM ERTM; // Enable Global realtime interrupt DBGM EALLOW; // This is needed to write to EALLOW protected registers 写自由 EDIS; // This is needed to disable write to EALLOW protected registers 禁止写某些特殊寄存器
所以简单点说,就是有些寄存器受到写保护的 就是有些寄存器受到写保护的,你要写它,就首先要用EALLOW禁止写保护 禁止写保护.写完了之后别忘 了用EDIS再是能写保护.

CPU 级也有 IFR IER CPU 接到中断请求暂停现在执行的程序 INTM 置位就不响应其他中断 1、 2、 PieVectTable.T1PINT = &eva_timer1_isr; // Enable PIE group 2 interrupt 4 for T1PINT PieCtrl.PIEIER2.all = M_INT4; 3、IER |= (M_INT2 | M_INT3 | M_INT4 | M_INT5); IER 4、interrupt void eva_timer1_isr(void) interrupt

清除 IER

IFR

EALLOW



带格式的: 字体颜色: 红色 格式的

1、外围帧寄存器2812将外围帧寄存器分为3个空间,分别是:外围帧0:直接映射到CPU存储器总线外围帧1:映射到32位外围 总线外围帧2:映射到16位外围总线,只允许16操作这里所说的外围帧寄存器就是外设寄存器,如ADC寄存器。映射就是分配 地址,外围一个地址,CPU一个地址,外围地址映射到CPU地址上。有的寄存器受保护,对其进行操作的时候好,要屏蔽保护 (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,在中断函数中不用管。这就 是它的中断过程。 96个中断介绍2812分为12组中断, 3、 每组中断有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 void TINT0_ISR(void) 。在DSP复位后,进入中函数前,看门狗开着的,所以在进入中函数后第一件事情是关看门狗,在这个函数里面InitSysCtrl();中 断是开着的需要关闭 (DINT;) PIE寄存器 InitPieCtrl();//初始化pie寄存器) IER = 0x0000;//禁止所有的中断 IFR = 0x0000;) , ( ( 、 中断向量表是没有初始化的,所以要初始化( InitPieVectTable();//初始化pie中断向量表) 。InitSysCtrl();//初始化cpu DINT;//关中断 InitPieCtrl();//初始化pie寄存器 IER = 0x0000;//禁止所有的中断 IFR = 0x0000; InitPieVectTable();//初始化pie中断向量表 EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.TINT0 = &cpu_timer0_isr;//指定中断服务子程序,这个地方要是用到了DSP的库函数DSP281X_DefaultIsr()函数就不 需要了。 EDIS; InitCpuTimers();//初始化定时器0 ConfigCpuTimer(&CpuTimer0,150,9.75);//配置你要定时的时间 StartCpuTimer0();//定时器开始计数 PieCtrlRegs.PIEIER1.bit.INTx7 = 1;//使能PIE级中断PIEIERx中的x=1,即使能的12组中的第1组第七个

IER |= M_INT1;//使能CPU级的中断第1组 EINT; // 使能INTM ERTM; // 使能仿真时 DBGM5、在中断函数中要做的interrupt void TINT0_ISR(void) // CPU-Timer 0{ PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //PIEACK清0 CpuTimer0Regs.TCR.bit.TIF = 1;//外设中断标志位清0 CpuTimer0Regs.TCR.bit.TRB = 1;//重新装载

中断矢量表

PieCtrlRegs.PIEIER1.bit.INTx4 = 1; PieCtrlRegs.PIEIER1.bit.INTx5 = 1;

// Enable PIE Gropu 1 INT4 // Enable PIE Gropu 1 INT5

注:指令集在程序的 DSP280x_Device.h
#define #define #define #define #define #define #define EALLOW; //GpioCtrlRegs.GPAMUX1.all = 0x0; //GpioCtrlRegs.GPADIR.all = 0xFF; //GpioDataRegs.GPADAT.all =0xFF; EDIS; EINT DINT ERTM DRTM EDIS asm(" clrc INTM") asm(" setc INTM") asm(" clrc DBGM") asm(" setc DBGM") asm(" EDIS")

头文件中 // // //INTM置0,开中断 置 , //INTM置1,关中断 置 , //使能调试事件 使能调试事件 //禁止调试事件 禁止调试事件

EALLOW asm(" EALLOW") ESTOP0 asm(" ESTOP0") // GPIO pin // Output pin // Close LEDs

说明:EALLOW 一般和 EDIS 配套使用,在对受保护的寄存器操作之后,用 EDIS 恢复寄存器的被 保护状态。

以下列寄存器受 EALLOW 保护:P · 器件仿真寄存器 · 闪存寄存器 · CSM 寄存器 · PIE 矢量表 · 系统控制寄存器 · GPIO MUX 寄存器 · 某些 eCAN 寄存器

1 Figure 6-13. External Interrupt 1 Control Register (XINT1CR) (Address 7070h)
XINT1 中断 方式 使能 控制寄存器 XINT1CR 方式/使能

XINT2 中断 方式 使能 控制寄存器 XINT2CR 方式/使能

注:此寄存器用来控制触发中断的方式以及使能和禁止中断的产生。

XIntruptRegs.XINT1CR.bit.POLARITY = 0; XIntruptRegs.XINT2CR.bit.POLARITY = 1; XIntruptRegs.XINT1CR.bit.ENABLE = 1; XIntruptRegs.XINT2CR.bit.ENABLE = 1;

// Falling edge interrupt // Rising edge interrupt // Enable XINT1 // Enable XINT2

2: Figure 6-10. Interrupt Flag Register (IFR) — CPU Register 终端标志寄存器IFR 终端标志寄存器

注:标志寄存器当对应位的终端来临时标志位值1,可以通过写0来清除它或者是中断请求,当写0表 示没有中断请求
// Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000;

3:Figure 6-11. Interrupt Enable Register (IER) — CPU : Register 中断使能/禁止寄存器 中断使能 禁止寄存器

表示禁止中断, 注:写0表示禁止中断,写1表示允许中断 表示禁止中断 表示允许中断
// Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000;

中断优先级的设置在 DSP280x_SWPrioritizedIsrLevels.h中 中
// 0 = not used // 1 = highest priority // ... // 16 = lowest priority #define INT1PL #define INT2PL #define INT3PL #define INT4PL #define INT5PL #define INT6PL #define INT7PL #define INT8PL #define INT9PL #define INT10PL #define INT11PL #define INT12PL #define INT13PL #define INT14PL #define INT15PL #define INT16PL // 0 = not used // 1 = highest priority // ... // 8 = lowest priority // #define G11PL #define G12PL #define G13PL #define G14PL #define G15PL #define G16PL #define G17PL #define G18PL #define G21PL #define G22PL #define G23PL #define G24PL #define G25PL 7 6 0 1 3 2 1 5 4 3 2 1 5 // SEQ1INT // SEQ2INT // reserved // XINT1 // XINT2 // ADCINT // TINT0 // WAKEINT (External) (External) (ADC) (CPU Timer 0) (WD/LPM) (ADC) (ADC) 2 1 4 2 2 3 0 0 3 0 0 0 4 4 4 4 // Group1 Interrupts (PIEIER1) // Group2 Interrupts (PIEIER2) // Group3 Interrupts (PIEIER3) // Group4 Interrupts (PIEIER4) // Group5 Interrupts (PIEIER5) // Group6 Interrupts (PIEIER6) // reserved // reserved // Group9 Interrupts (PIEIER9) // reserved // reserved // reserved // XINT13 // INT14 (TINT2) // DATALOG // RTOSINT

// EPWM1_TZINT (ePWM1 Trip) // EPWM2_TZINT (ePWM2 Trip) // EPWM3_TZINT (ePWM3 Trip) // EPWM4_TZINT (ePWM4 Trip) // EPWM5_TZINT (ePWM5 Trip)

#define G26PL #define G27PL #define G28PL

6 0 0

// EPWM6_TZINT (ePWM6 Trip) // reserved // reserved

注:此优先级可以自己改动的

2.2 定时器 0 中断设置
2.2 定时器 0 中断设置

定时器 0 中断设置由以下几个步骤组成。

1)定时器 0 中断的基本条件

除了对周期寄存器(PRDH:PRD)及定时器分频器(TPRH:TPR)进行必要的设置之外,使能定时器 0 中断有两条必须的指令:

1. 2.

CpuTimer0Regs.TCR.bit.TSS = 0; //启动定时器 Timer->RegsAddr->TCR.bit.TIE = 1; //使能定时器中断

如果缺少上面两条指令中的一条,将不会产生中断。

2)确定中断向量的入口地址

主程序通过“DSP281x_PieVect.c”文件中的 InitPieVectTable()函数,已经为 PIE 向量表中的所有中断向量配置了对应向量的入口地址。如果针对 某一个外设中断专门有一个中断服务程序,则这个中断服务程序的入口地址必须取代前面配置的入口地址,它由下面的指令完成:

1. 2. 3. 4.

EALLOW; //允许访问受保护的寄存器 PieVectTable.TINT0 = &cpu_timer0_isr; //取 cpu_timer0_isr 地址赋值给 //TINT0 中断向量 EDIS; //禁止访问受保护的寄存器

上面指令中,cpu_timer0_isr()函数是针对 TINT0 中断向量的一个中断服务程序,&cpu_timer0_isr 是该程序的入口地址。

3)使能 PIE 级及 CPU 级中断向量

这个步骤由下面 4 类指令完成:

先找出中断向量在 PIE 向量表中所在的组及在这组中所处的优先级。经查 TINT0 是第 1 组第 7 个中断,因此先通过 PIE 级指令 “PieCtrlRegs.PIEIER1.bit.INTx7 =1;” 使能 PIE 第 1 组第 7 个 TINT0 中断 , (INTx7 由头文件定义为 PIE 中断使能寄存器 (PIEIER) 的第 7 位) 。

通过 CPU 级的赋值指令“IER |= M_INT1;”,使能第 1 组(M_INT1 由头文件定义为 0x0001,指向第 1 组),即把 TINT0 中断汇集到 CPU 级的 INT1 中 断线上。

通过“EINT;”指令使能全局中断,实际指令为:

1. 2. 3.

PieCtrlRegs.PIEIER1.bit.INTx7 = 1; //使能 PIE 中的 TINT0,1 组第 7 个中断 IER |= M_INT1; //使能第 1 组中断 EINT; //使能 INTM 全局中断

这里用了按位或复合运算符“|=”,其用意是不破坏 IER 原有结构。如果程序仅此一个中断,可以用 “IER = 0x0001;”指令,否则,会破坏 IER 原 有结构。

使能 PIE 向量表,由下面一条指令完成。

1.

PieCtrlRegs.PIECRTL.bit.ENPIE = 1;

实际上这条指令包含在初始化 PIE 向量表 InitPieVectTable()函数中,主程序对这个函数已经调用。因此可省略。

4)中断服务程序

中断服务程序是以关键字 interrupt 开头的一个程序。通常在中断服务程序中有两条必须的指令:一条是中断应答,另一条是将中断标志位清 0。

定时器 0 中断应答指令为:

1.

PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //PIEACK_GROUP1=0x0001

PIE 应答寄存器 PIEACK 是中断从 PIE 级进入 CPU 级的门禁。 一个中断在进入 CPU 级之前, 其对应的 PIEACK[x.1]必须通过软件清 0, 打开后续 INTx 的 PIE 级到 CPU 的通道。而当这个中断进入 CPU 级 INTx 中断线时,硬件将 PIEACK[x.1]位置 1,关闭后续 INTx 的 PIE 级到 CPU 的通道。这条指令通 过向 PIEACK[0]写 1,将 PIEACK[0]位清 0,从而打开后续 INT1 的 PIE 级到 CPU 级的中断。注意:PIEACK[x.1]对 INTx 中断线(1 x 12)。

源码的中断服务程序中没有将中断标志位清 0 的指令。当程序开始运行并执行到指令“CpuTimer0Regs.TCR.bit.TSS = 0;”时,定时器中断标志位 TIF(TCR[15])即从 0 变成 1。这意味着一旦启动定时器即触发定时器中断之后,即使通过软件将该位置 1,也不能将其清 0。

5)中断服务程序及中断初始化函数声明

如果中断服务程序及中断初始化函数放在主函数的下面,则在主函数头部要对中断服务程序及中断初始化函数进行声明:

1.

interrupt void cpu_timer0_isr();

如果中断服务函数放在主函数的上面,则不必进行声明。


相关文章:
如何学习DSP
如何学习 DSP 在上完一学期的 DSP 应用与技术之后,我对于 DSP 这个名词 依旧似懂非懂,为了彻底了解其含义,我只好从网上搜了些资料,原来,DSP 就是数字信号处理...
DSP学习总结
DSP学习总结_计算机硬件及网络_IT/计算机_专业资料。DSP 学习总结摘要:本总结介绍了数字信号技术(DSP)的基本结构,特点,发展及应用现状。通过分析与观察,寄予了 DSP...
dsp_学习心得
dsp_学习心得_信息与通信_工程科技_专业资料。dsp学习心得 如果说前几年 DSP 作为一个器件,一个处理器或一个事物是相对比较新的东西,那么现在 DSP 已经在我们...
dsp学习心得
dsp学习心得_教学反思/汇报_教学研究_教育专区。一. 我是已经从事 DSP 开发有几年了,看到许多朋友对 DSP 的开发非常感兴取,我结合这 几年对 DSP 的开发写一...
DSP学习笔记
DSP 学习笔记引言:学习 DSP 的时间有两个多月了,收获很多新知识,我们要每天都有进步才行,以下 内容没有特别的顺序,跟具自己的学习情况写的,如果有不对的地方...
DSP原理及应用的学习体会
DSP原理及应用的学习体会_计算机软件及应用_IT/计算机_专业资料。这个学期通过《对 DSP 芯片的原理与开发应用》课程的学习,对 DSP 芯片的 概念、基本结构、开发工具...
DSP该怎么学习
4页 免费 DSP 入门教程 29页 免费如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 DSP该怎么学习 DSP学习DSP学习隐藏>>...
如何 开始学习 DSP2812 的个人 观点,自己的总结
如何 开始学习 DSP2812 的个人 观点,自己的总结_IT/计算机_专业资料。如何 开始学习 DSP2812 的个人 观点,自己的总结likyo 的观点:如何开始学习 DSP 的观点: ...
PVDM和DSP的学习总结
PVDM和DSP学习总结_学习总结_总结/汇报_实用文档。PVDM(全称是 packet voice dsp module)代表分组话音 DSP 模块;它是思科为一种可以向系统提供数字信 号处理资...
DSP学习心得笔记
DSP学习心得笔记_电子/电路_工程科技_专业资料。DSP 学习心得笔记 --- 白建成.baijc.icekoor 引言:学习 DSP 的时间有两个多月了,收获很多新知识,我们要每天都...
更多相关标签: