我想用一个按键中断来改变程序里面的采样率,但是ADC里面有一个定时器中断,原始例程里面的按键GPIO中断和定时器中断映射到了同一个可屏蔽中断,
GPIO的引脚中断初始化为:
IntRegister(C674X_MASK_INT4, USER0KEYIsr); //注册中断服务函数
IntEventMap(C674X_MASK_INT4, SYS_INT_GPIO_B0INT); // 映射中断到 DSP 可屏蔽中断
实验结果是按键无效,所以我想将GPIO的中断映射到其它可屏蔽中断去,就将上面的改为
IntRegister(C674X_MASK_INT7, USER0KEYIsr); //注册中断服务函数
IntEventMap(C674X_MASK_INT7, SYS_INT_GPIO_B0INT); // 映射中断到 DSP 可屏蔽中断
{
// 软件断点 方便调试
//SW_BREAKPOINT;
GPIOBankIntDisable(SOC_GPIO_0_REGS, 0);
IntEventClear(SYS_INT_GPIO_B0INT);
// unsigned int i;
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, 7) == GPIO_INT_PEND)
{
// 清除 GPIO0[6] 中断状态
GPIOPinIntClear(SOC_GPIO_0_REGS, 7);
Flag_gpio_key=1;
Fs=Fs*2;
}
// 使能 GPIO BANK 0 中断
GPIOBankIntEnable(SOC_GPIO_0_REGS, 0);
}
调试的时候发现按键有效了,但是从调试的变量观察力读到的采样率Fs和主程序里面读到的Fs不一样(通过显示在LCD屏幕上),调试器观察到的Fs减半而LCD显示的不变。请问除了在注册中断服务函数的时候改变C674X_MASK_INT7,还要改变其它的东西吗。
{
int i;
CacheEnableMAR((unsigned int)0xC0000000, (unsigned int)0x8000000);
CacheEnable(L1DCFG_L1DMODE_32K | L1PCFG_L1PMODE_32K | L2CFG_L2MODE_256K);
//初始化的顺序有讲究
// 外设使能配置
PSCInit();
GPIOBankPinMuxSet();
GPIOBankPinInit();
InterruptInit();
GPIOBankPinInterruptInit();
LcdInit();
TouchInit();
// AD8568 初始化 采样率510K
//AD8568Init(Fs); ////若GPIO的配置放在采样之后则AD模块失效,显示屏不显示,但是按键中断有效。若放在前面则当按加键进入按键中断是,Fs=0,LCD横坐标显示88888,右下角还显示个p'num.其他正常显示;这中情况可能和内存配置有关
while(1)
{
if(Flag_gpio_key==1||Flag_gpio_key==2) //循环点亮LED灯
{
// 核心板 LED
for(i=0x00FFFFFF;i>0;i--);
GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_LOW); //
GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_HIGH);//
GPIOPinWrite(SOC_GPIO_0_REGS, 3, GPIO_PIN_HIGH);//
GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW);//
}
AD8568Init(Fs);
if(display_count >= Tn)
{
flag_parm_display++;
Grline(1,1,10);
if(!(flag_parm_display%1)) //参数变化的显示刷新频率降低30倍
{
//sprintf(freq_max_display,"freq_max= %d Hz",getF.key);
//sprintf(p_num_display,"p_num= %d ",getF.p_num); //标准化输出,不能习惯性用%d
//sprintf(freq_base_display,"freq_base= %d Hz",getF.freq_base/*/(getF.p_num-1)*/);
sprintf(SMI_amp_display,"mainFreq=%d Hz",getF.key); //SMI_amp
sprintf(Cmo_max_display,"Fs=%d V",Fs); //getF.value
}