ADSP21489之CCES开发笔记(二)

33 篇文章 23 订阅

21489控制中断以及用于配置和控制可编程的寄存器的完整列表中断。有关IRPTL、LIRPTL和IMASK的信息寄存器,请参阅SHARC处理器编程参考。

链路端口规格表如下图
链路端口规格
特征
功能包括:
•连接两个系统中断控制器(DAI SIC、DPI SIC)到核心中断控制器。
•DAI SIC允许高或低中断优先级配置选项。
•DAI中断控制器提供多达32个独立配置通道。
•DPI中断控制器提供多达12个独立配置通道。
•两个控制器都允许上升沿或下降沿波形触发。
•与核心触发中断相同的中断触发机制。

时钟
系统中断控制器的基准时钟为fPCLK/4(外围时钟/4)。所有中断请求都得到确认响应速度高达fPCLK/4。

寄存器概述
可编程中断控制寄存器(PICR3–0):19个可单独分配优先级的外围通道可以路由到可编程中断输入。
DAI中断掩码寄存器(DAI_IMASK_RE/FE):掩码中断用于上升和/或下降沿波形事件。
DAI中断掩码优先级寄存器(DAI_IMASK_PRI):掩码中断用于DAI高或DAI低中断优先级。
DAI中断锁存寄存器(DAI_IRPTL_L/H):闩锁中断DAI高或DAI低中断。
DPI中断掩码寄存器(DPI_IMASK_RE/FE):屏蔽中断,用于上升和/或下降沿波形事件。
DPI中断锁存寄存器(DPI_IRPTL):DPI的闩锁中断

功能描述
以下章节提供了有关中断控制器功能的信息
可编程中断优先级控制处理器核心支持19个可编程优先中断,如图2-1中的路由示例所示。最高优先级中断为P0I,而最低优先级为P18I。任何外围设备中断输出可以连接到任何可编程优先级中断输入。所有外围中断输出信号都被视为源信号。考虑核心的19个优先外围中断(P0I–P18I)目标中断。PICR寄存器控制连接在源和目标之间。每个外围设备的中断输出可编程为连接
19个外围中断中的任何一个。此外,外围设备是分为两大类DAI或DPI,每类都有自己的中断控制器。这些中断控制器对极性、优先级进行编程以及每个外围中断输出的目的地。因此,所有外围中断也可以作为DAI或DPI连接到核心中断。
在这里插入图片描述
外围设备中断
A-14页表A-6中的所有输入字段编码都分配一个外围设备触发中断,如下例所示。
ustat1=dm(PICR2);
bitset ustat1 P17I4|P17I3;
bitclr ustat1 P17I2|P17I1|P17I0;
dm(PICR2)=ustat1; /* write 11000 to route ACC1I to P17I */

软件中断
使用第A-14页表A-6中的选择代码11111(高)允许使用基于软件的中断的程序(参见下面的示例)。与核心(四个软件中断)这些软件中断可以在
优先事项
ustat1=dm(PICR0);
bitset ustat1 P2I4|P2I3|P2I2|P2I1|P2I0;
dm(PICR0)=ustat1; /* write 11111 to route SWI to P2I /

P2I_ISR:
ustat1=dm(PICR0);
bitclr ustat1 P2I4|P2I3|P2I2|P2I1|P2I0;
dm(PICR0)=ustat1; /
clear 00000 for P2I acknowledge */
rti;
具有多个中断请求信号的外围设备
TWI和UART有单独的中断输出。两个外围设备默认情况下已通P14I(DPI)连接。然而,两者都是外围设备允许单独连接到未路由的PICR默认情况下。这为跨DAI/DPI中断,DAI和DPI模块均包含一个系统中断控制器(SIC)连接到核心中断控制器,如中所示图2-2。
在这里插入图片描述
DAI/DPI包含自己的系统中断控制器,用于指示当发生DAI/DPI音频外围设备相关事件时,发送至核心。因为相对于SHARC,音频事件通常很少发生核心,DAI/DPI中断控制器将其所有中断减少到核心主中断系统中的三个中断信号一个用DAI低优先级映射,一个用DAI高优先级映射第三个映射到DPI中断。这使得项目能够广泛地表示优先级。这样,DAI SIC提供32个和DPI SIC12个可独立配置的源/通道。输出总线中断信号在逻辑上与一条中断线进行“或”运算,并馈送至核心中断控制器逻辑。DAI/DPI中断控制器具有相同的中断延迟,作为核心中断控制器,或响应6个延迟周期异步中断。三个寄存器用于配置DAI中断控制器。每个32个中断源可以独立配置为在输入信号的上升沿、下降沿、两边或两边都没有。两个寄存器用于配置DPI中断控制器。每个12个中断源可以独立配置为在输入信号的上升沿、下降沿、两边或两边都没有。注意,所有DAI/DPI中断控制寄存器都是内存映射的当核心中断时,通过外围总线访问寄存器和寄存器是系统寄存器。有关核心中断的更多信息,请参阅处理器编程参考手册。

DAI/DPI中断源
DAI的五个外围源被多路复用为32个中断源和标记为DAI_INT31–0。DPI的三个外围源多路传输到12个中断源中,并标记为DPI_INT13–0(表2-2)。有两种命名约定。DAI/DPI中断控制器寄存器位标记为DAI_31-0_INT/DPI_13-0_INT(def214xx.h文件)。它们对应的SRU路由信号是标记为DAI_INT_31-0_I/DPI_INT_13-0_I(sru214xx.h文件)
在这里插入图片描述
DAI中断锁存优先级选项
DAI系统中断控制器寄存器对(DAI_IRPTL_H和DAI_IRPTL_L)替换通常由核心中断执行的功能控制器的IRPTL寄存器。单个寄存器(DAI_IRPTL_PRI)指定映射这些中断的锁存器。当DAI中断配置为低优先级(DAI_IMASK_PRI位清除,默认设置),它锁定在DAI_IRPTL_L寄存器中。低优先级DAI中断DAILI通过以下方式连接到P12I核心中断违约PICR寄存器可以更改此连接。每当DAI较低时设置优先级中断,LIRPTL寄存器中的编程DAILI位设置,以及低优先级中断的核心服务。当DAI中断配置为高优先级(DAI_IMASK_PRI位
设置),它被锁定在DAI_IRPTL_H寄存器中。高优先级DAI中断,默认情况下,DAIHI连接到P0I核心中断。PICR公司寄存器可以更改此连接。每当DAI高优先级中断时设置,LIRPTL寄存器集中已编程的DAIHI位,以及核心服务
具有高优先级的中断。
注:DAI在IVT中触发两个中断,一个用于低或高优先级。当需要处理DAI的任何中断时,两个核心ISR中的一个必须询问DAI中断控制器以确定源。

DPI中断锁存
DPI SIC寄存器(DPI_IRPTL)替换通常执行的功能通过核心中断控制器的IRPTL寄存器。配置DPI中断时,它被锁定在DPI_IRPTL寄存器中。默认情况下,DPI中断连接至P14I核心中断。PICR寄存器可以更改此连接。每当DPI中断LIRPTL寄存器集中的已编程DPI位和核心服务以编程优先级中断。

DAI/DPI波形中断掩码
两个寄存器(DAI_IMASK_RE和DAI_MASK_FE)替换核心中断IMASK寄存器的控制器版本。与IMASK寄存器一样DAI寄存器提供了一种指定要确认哪些中断的方法和句柄,并中断以忽略。这些双寄存器功能与IMASK一样,但具有更高的粒度。DAI_IMASK_RE/DAI_IMASK_FE寄存器与DPI_IMACK_RE的使用/DPI_IMASK_FE寄存器允许程序确认并响应上升边缘、下降边缘、上升边缘和下降边缘,或两者都不上升也不会掉落边缘,因此可以单独遮盖。来自SRU的信号可用于生成中断。例如当DAI_IMASK_FE寄存器的DAI_30_INT位设置为1时,任何下降来自外部通道的边缘信号在核心中生成中断并设置中断锁存器。读取MASK寄存器不会清除IRPTL寄存器。

DAI/DPI中断掩码
系统中断控制器需要有关外围设备的信息与事件信号相对应的中断源(参考
第2-8页)。因此,上升沿仅用作中断源。对于标记为事件的DAI/DPI外围设备,程序可能会取消屏蔽中断源仅位于上升沿DAI/DPI中断服务,当多个通道时,中断确认操作不同被多路复用成一个中断输出信号。当中断来自必须为DAI/DPI提供服务,三个中断服务例程中的任何一个(DAILI、DAIHI和DPII)必须查询RIC以确定个源。源可以是任何一个或多个DAI通道
(DAI_INT31-0)或DPI通道(DPI_INT13-0)。
.读取DAI_IRPTL_H时,高优先级锁定中断为变明朗。
•读取DAI_IRPTL_L时,低优先级锁定中断为变明朗。
•读取DPI_IRPTL时,锁定中断被清除。
•IDP_FIFO_GTN_INT中断在
读取DAI_IRPTL_H/L寄存器。此中断自动清除
当引起中断的情况消失时。
•为主寄存器提供阴影寄存器DPI_IRPTL_SH\DPI_IRPTL公司。此寄存器的读取返回DPI_IRPTL寄存器,但不清除寄存器的内容。如果在锁存器寄存器被清除的同一周期内发生中断,则clear机制具有较低的优先级,并注册了新的中断。
TWII和UARTRXI中断不遵循此规则。
确认发生在这些外围设备的锁存器寄存器中。读取中断闩锁寄存器(DAI_IRPTL_x/DPI_IRPTL)清除中断(只读以清除位类型)。因此ISR必须为它发现的所有中断源提供服务。也就是说,如果多个中断被锁定在多个掩码寄存器中在执行RTI指令之前,必须对它们进行服务。否则条件未清除。有关详细信息,请参阅打开“可编程中断优先级控制寄存器”第A-14页。
中断服务

本节描述了中断服务例程如何清除中断请求正确。中断驱动I/O是有利的,因为内核不需要轮询输入信号。(有关详细信息,请参阅中的“中断”部分
每个外围章节。)当触发中断时,序列器通常完成当前指令并跳转到IVT(中
向量表)。从IVT,地址通常矢量到ISR常规序列器跳入这个例程,执行程序执行然后通过执行RTI退出例程(从中断)指令。然而,该规则并不适用于所有情况下面讨论。ISR例程中使用了三种中断确认机制并且它们依赖于外围设备:

•RTI指令

•只读清除(ROC)状态位+RTI指令

•写入-1-清除(W1C)状态位+RTI指令

DAI/DPI中断控制器的设计应确保正确地说,必须读取锁存寄存器以识别源。
请注意,此读取操作会在退出前自动确认请求中断例程。对于W1C机制,程序必须写入锁存寄存器的特定位,用于终止中断正确地如果没有正确遵守确认机制规则,将发生不需要的和偶发的中断。核心缓冲区服务请求(I/O模式)如果数据流外围设备访问其各自DMA的数据缓冲区通过FIFO内核,缓冲区状态在确认中断。例如,如果接收缓冲区已满,则自动生成中断并在ISR中读取缓冲区清除请求(ROC+RTI)。同样,如果传输缓冲区为空,生成中断,写入清除请求(WOC+RTI)。DMA访问如果外围设备通过DMA访问缓冲区,则逻辑操作不同。在DMA中,缓冲区状态对中断没有影响。相反,DMA计数寄存器在达到零时生成中断。这个确认机制可能因所使用的外围设备而异。
ISR_SPI_Routine:
R0 = dm(i0,m0);
dm(TXSPI) = R0; /* write to SPI data buffer /
R0 = dm(SPICTL); /
this dummy read forces the previous write
to complete /
rti;
ISR_PWM_Routine:
r1=PWM_STAT3;
dm(PWMGSTAT)=r1; /
W1C to PWM status reg /
r0=dm(PWMGSTAT); /
this dummy read forces the previous write
to complete */
rti;

DMA完成类型
在SHARC处理器上,中断在内部传输后生成完成(DMA计数寄存器过期时)。然而,在一些转移可能尚未完成的情况(由于渠道优先级不同)而有效数据仍驻留在外围设备的缓冲区中,等待已传输。为了克服这个问题,中断访问完成介绍了模式。在该模式下,当数据已离开缓冲区。此选项可用于SPORT、SPI、链接端口和外部端口DMA。有关详细信息,请参阅特定外围设备.

软中断说明
清除中断:int clear_interrupt(int _iid);
触发中断: int raise_interrupt(int _iid);
中断使能:void enable_interrupts(void);
举例中断注册: adi_int_InstallHandler(ADI_CID_SFT1I,User1_ISR_Process,0, true);

堆可用空间监测(引用stdlib_21xxx.h):
for循环时,调用堆剩余空间接口:space_unused()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是ADSP21489核心定时器中断的CCES代码示例: ``` #include <stdio.h> #include <adi_int.h> #include <sys/platform.h> #include <cdefBF561.h> // 定义中断向量号和优先级 #define TIMER0_IVG 5 #define TIMER0_PRIORITY 10 // 定义定时器参数 #define TIMER_PERIOD 1000 // 定时器周期,单位为微秒 #define TIMER_COUNT (TIMER_PERIOD * 200) // 定义中断处理函数 void Timer0_ISR(void *pArg) { // 清除中断标志 *pTCNTL &= ~BITM_TCTL_OVF; // 处理中断事件 printf("Timer0 ISR triggered\n"); } int main(int argc, char *argv[]) { // 初始化定时器 *pTCNTL = BITM_TCTL_CLK | BITM_TCTL_EN | BITM_TCTL_PRE(0); // 选择时钟源,并启用定时器 *pTPERIOD = TIMER_COUNT; // 设置定时器计数器的上限 // 注册中断处理函数 adi_int_InstallHandler(TIMER0_IVG, Timer0_ISR, NULL, true); // 配置中断优先级 adi_int_SetPriority(TIMER0_IVG, TIMER0_PRIORITY); // 启用定时器中断 *pTCTL |= BITM_TCTL_OVF_IEN; // 等待定时器中断 while(1); return 0; } ``` 在这个例子中,我们使用ADSP21489核心定时器来实现一个简单的定时器中断功能。首先,我们定义了一个中断向量号和优先级,然后定义了定时器的周期和计数器上限。接着,我们实现了一个中断处理函数,用于处理定时器中断事件。在主函数中,我们初始化了定时器,并注册了中断处理函数。然后,我们配置了中断优先级并启用了定时器中断。最后,我们使用一个无限循环语句来保持程序一直运行,直到定时器中断触发。当定时器中断触发时,中断处理函数将被调用,并输出一条消息。 注意,此示例仅用于说明如何使用ADSP21489核心定时器中断。在实际应用中,您需要根据自己的需求进行修改和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值