F28335第五篇——EALLOW和EDIS

本文深入探讨了DSP中EALLOW保护机制的作用和使用方法,解释了如何通过EALLOW和EDIS指令控制对受保护寄存器的写入操作,详细列出了不同外围设备帧(PF)中受保护和不受保护的寄存器,并提供了官方文档的最新信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在DSP中,为了防止重要寄存器被误写入,设置EALLOW保护。EALLOW 和 EDIS 配套使用,分表表示写入申请(Edit allow)和禁止写入(Edit disable)。举例:

   EALLOW;	// This is needed to write to EALLOW protected registers
   PieVectTable.WAKEINT = &wakeint_isr;
   EDIS;   // This is needed to disable write to EALLOW protected registers

这是将中断服务程序地址写入到中断向量表中。由于中断向量表受到了保护,所以,在写入之前需要进行写入申请,写完之后要禁止写入,保护寄存器。
EALLOW保护主要是针对DSP存储空间外设帧(Peripheral Frame)而言的。关于外设帧的更多信息,可以参考博客(F28335第四篇——存储器及CMD文件)。外设帧又简称PF。在DSP中,外设帧总共分成四个区域,为PF0-PF3。其中,PF1-PF3中所有寄存器都受到EALLOW保护,而在PF0中有些寄存器是不受EALLOW保护的。换言之,所有不受保护的寄存器都在PF0中,他们分别为:

  • ADC寄存器
  • XINTF寄存器(存疑。。。)
  • 计时器0/1/2
  • PIE寄存器

附上TI官方说明:
在这里插入图片描述
在这里插入图片描述

更新

由于上文中引用的TI官方文档比较老旧,所以有些数据并不相同,下面给出最新的官方文档中的说明。
不受保护的寄存器只有三个,如下:

  • ADC寄存器
  • 计时器0/1/2
  • PIE寄存器

在这里插入图片描述

更新2

通过阅读官方文档,我发现之前的书本上的说法是错误的。PF1-PF3并非所有寄存器都受到EALLOW保护。总结所有不受保护的寄存器如下:

  • PF0
    • ADC寄存器
    • 计时器0/1/2
    • PIE寄存器
  • PF1
    • 部分eCAN寄存器
    • eCANB Mailbox RAM
    • eCAP 寄存器
    • GPIO Data 寄存器
  • PF2
    • SPI 寄存器
    • SCI 寄存器
    • ADC寄存器
    • 外部中断寄存器
    • I2C寄存器
  • PF3
    • McBSP寄存器

EALLOW保护就是禁止CPU对于DSP寄存器的写操作,如下表

EALLOW位CPU写操作CPU读操作JTAG写操作JTAG读操作
0禁止允许允许允许
1允许允许允许允许

使用保护的寄存器包括:

  • 器件仿真寄存器
  • Flash寄存器
  • CSM寄存器
  • PIE向量寄存器
  • DMA寄存器
  • 系统控制寄存器
  • GPIO控制寄存器(包括GPIO中断寄存器)
  • 部分eCAN寄存器
  • Xintf寄存器
  • ePWM寄存器
注意:

以上是参考TI官方文档TMS320x2833x, 2823x System Control and Interrupts Reference Guide(2010年3月)。但是,官方文档自身也有矛盾的地方。例如:XINTF寄存器,DMA寄存器等。下面附上所有文档内容,如有纰漏,敬请批评,谢谢!
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

### DSP28335EALLOWEDIS的功能及使用方法 #### 1. 基本概念 在DSP28335中,某些配置寄存器受到保护机制的约束,以防止意外写入导致系统不稳定或错误行为。这种保护通过 `EALLOW` `EDIS` 指令实现。具体来说: - **EALLOW (Edit ALLOW)** 是一种指令,用于请求对受保护寄存器的写权限。执行此指令后,程序可以访问并修改那些原本受限的寄存器[^1]。 - **EDIS (Edit DISABLE)** 则是对上述权限的一种撤销操作。它重新启用对特定寄存器的保护功能,从而阻止未经授权的操作[^2]。 #### 2. 使用场景 当需要更改受保护的寄存器时,必须遵循以下模式来确保安全性稳定性: ```assembly EALLOW; // 修改受保护的寄存器内容 PieVectTable.WAKEINT = &wakeint_isr; EDIS; ``` 在此过程中,`EALLOW` 解除保护状态以便允许必要的写入动作发生;而随后紧跟的 `EDIS` 又迅速恢复原有的防护措施,避免其他部分代码可能带来的风险。 #### 3. 实际应用中的注意事项 对于实际开发而言,在涉及任何敏感区域前都需要确认是否已经适当处理好了这些控制命令。例如如果要初始化EPWM模块,则除了考虑其本身参数设定外还需要注意关联到GPIO端口映射等问题。这里给出一个简单的例子展示如何正确运用它们完成任务: 假设我们要设置某个中断向量表项指向自定义的服务例程地址,并且该过程涉及到受控资源调整: ```c #include "DSP2833x_Device.h" void initCustomInterrupt(void){ EALLOW; // Enable access to protected registers. PieVectTable.INTCUST = &custom_ISR; EDIS; // Disable further accesses after setup complete. } ``` 另外值得注意的是,在一些情况下还可能存在额外的要求比如调用专门提供的库函数来进行外围设备接口(PERIPHERAL I/O)分配如上文中提到过的 `InitEPwm6Gpio()` 函数就是这样一个典型代表[^4]。 #### 结论 综上所述,合理利用好这两个简单却极其重要的工具可以帮助开发者构建更加健壮可靠的嵌入式解决方案同时减少潜在隐患的发生几率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值