DSP中的 EALLOW 和 EDIS / DSP指令中 EALLOW、EDIS 都是什么意思?

文章介绍了C2000系列DSP,特别是TMS320F28335中,EALLOW和EDIS指令的作用,它们用于解除和恢复受保护寄存器的访问权限,以及在中断管理和调试控制中的应用。

  看一些讲DSP28335的书:

《手把手教你学DSP ——基于TMS320F28335》或是《普中DSP28335开发攻略》,

  书里会给出一些函数代码、初始化代码。有时我们会看到例如这种:

void DC_Motor_Init(void)
{
    EALLOW;
    
    ... //DC_Motor 第1路端口配置

    ... //DC_Motor 第2路端口配置
    
    EDIS;

    ...

}

   EALLOW、EDIS都是什么意思?为什么总感觉它们成对出现在代码中?  # 参考链接

   答:EALLOW(Edit allow)一般和 EDIS(Edit disable)配套使用,

     F2812中有⼀些配置寄存器是受保护的,⽆法直接操作(任意写)。在对这些寄存器进⾏修改之前,需要先去掉保护功能。EALLOW指令用于允许对寄存器进行操作,即解除寄存器保护功能。在对受保护的寄存器操作之后,⽤EDIS指令恢复寄存器的被保护状态,禁止再操作被保护的寄存器。(C2000系列DSP以2812和28335应用最广,F28335性能优于F2812)

EALLOW;(Edit  ALLOW),允许操作被保护的寄存器
EDIS;(Edit  disable), 禁止操作被保护的寄存器 | 开起写保护
INTM全局中断屏蔽位
EINT给INTM置0,使能全局中断
DINT给INTM置1,禁止全局中断
DBGM调试启用屏蔽位
ERTM使能调试事件,允许仿真器调试和实时访问内存
DRTM禁止调试事件
EALLOW允许操作被保护的寄存器
EDIS禁止操作被保护的寄存器
ESTOP0当用仿真器连接时如果ESTOP0置位(ESTOP0=1),那么整个DSP停止运行

# EALLOW和EDIS指令的使用

void EXTI1_Init(void) { EALLOW; SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clock EDIS; EALLOW; //KEY端口配置 GpioCtrlRegs.GPAMUX1.bit.GPIO12=0; GpioCtrlRegs.GPADIR.bit.GPIO12=0; GpioCtrlRegs.GPAPUD.bit.GPIO12=0; GpioCtrlRegs.GPAQSEL1.bit.GPIO12 = 0; // 外部中断1(XINT1)与系统时钟SYSCLKOUT同步 GpioCtrlRegs.GPBMUX2.bit.GPIO48=0; GpioCtrlRegs.GPBDIR.bit.GPIO48=1; GpioCtrlRegs.GPBPUD.bit.GPIO48=0; GpioDataRegs.GPBCLEAR.bit.GPIO48=1; EDIS; EALLOW; GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 12; // XINT1是GPIO12 EDIS; EALLOW; // 修改被保护的寄存器,修改前应添加EALLOW语句 PieVectTable.XINT1 = &EXTI1_IRQn; EDIS; // EDIS意思是不允许修改被保护的寄存器 PieCtrlRegs.PIEIER1.bit.INTx4 = 1; // 使能PIE组1的INT4 XIntruptRegs.XINT1CR.bit.POLARITY = 0; // 下降沿触发中断 XIntruptRegs.XINT1CR.bit.ENABLE= 1; // 使能XINT1 IER |= M_INT1; // 使能CPU中断1(INT1) EINT; // 开全局中断 ERTM; } interrupt void EXTI1_IRQn(void) { Uint32 i; for(i=0;i<10000;i++); //键盘消抖动 while(!KEY_H1); LED2_TOGGLE; PieCtrlRegs.PIEACK.bit.ACK1=1; } void EXTI2_Init(void) { EALLOW; SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // GPIO input clock EDIS; EALLOW; //KEY端口配置 GpioCtrlRegs.GPAMUX1.bit.GPIO13=0; GpioCtrlRegs.GPADIR.bit.GPIO13=0; GpioCtrlRegs.GPAPUD.bit.GPIO13=0; GpioCtrlRegs.GPAQSEL1.bit.GPIO13 = 2; // 外部中断2(XINT2)输入限定6个采样窗口 GpioCtrlRegs.GPACTRL.bit.QUALPRD1 = 0xFF; // 每个采样窗口的周期为510*SYSCLKOUT GpioCtrlRegs.GPBMUX2.bit.GPIO48=0; GpioCtrlRegs.GPBDIR.bit.GPIO48=1; GpioCtrlRegs.GPBPUD.bit.GPIO48=0; GpioDataRegs.GPBCLEAR.bit.GPIO48=1; EDIS; EALLOW; GpioIntRegs.GPIOXINT2SEL.bit.GPIOSEL = 13; // XINT2是GPIO13 EDIS; EALLOW; // 修改被保护的寄存器,修改前应添加EALLOW语句 PieVectTable.XINT2 = &EXTI2_IRQn; EDIS; // EDIS意思是不允许修改被保护的寄存器 PieCtrlRegs.PIEIER1.bit.INTx5 = 1; // 使能PIE组1的INT5 XIntruptRegs.XINT2CR.bit.POLARITY = 0; // 下降沿触发中断 XIntruptRegs.XINT2CR.bit.ENABLE = 1; // 使能XINT2 IER |= M_INT1; // 使能CPU中断1(INT1) EINT; // 开全局中断 ERTM; } interrupt void EXTI2_IRQn(void) { Uint32 i; for(i=0;i<10000;i++); //键盘消抖动 while(!KEY_H2); LED3_TOGGLE; PieCtrlRegs.PIEACK.bit.ACK1=1; }这是dsp28335的部分函数,尽量详细解释每一句代码的作用
最新发布
10-21
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值