Other Parts Discussed in Thread:SYSBIOS
本人最近在使用C6657跑sysbios系统来写一个GPIO22和GPIO23的中断,在裸机上已经能够进入中断,但是现在要使用sysbios,发现怎么都不能够进入中断,下面我贴出我的代码,请问是什么问题?
/****************************************************************************************** * *GPIO硬件中断线程创建函数 * *******************************************************************************************/ void GPIO_Hwi_thread_create(xdc_Int CPU_INTn1, xdc_Int CPU_INTn2, xdc_Int CPU_INTn3) {// 动态创建硬件中断Hwi_Handle hwi0;Hwi_Params hwiParams0;Error_Block eb0;// 初始化错误块Error_init(&eb0);// 使用默认值初始化参数Hwi_Params_init(&hwiParams0); hwiParams0.eventId = 91;// 中断事件hwiParams0.arg = 0;// 传递到中断服务函数的参数hwiParams0.maskSetting = Hwi_MaskingOption_SELF;// 不允许该中断自身嵌套hwiParams0.enableInt = TRUE;// 使能中断hwi0 = Hwi_create(CPU_INTn1, GPIO0_Isr, &hwiParams0, &eb0);if(hwi0 == NULL){ printf("GPIO Hwi create failed !\n");}// 动态创建硬件中断 Int eventId1; Hwi_Handle hwi1; Hwi_Params params1; Error_Block eb1; Error_init(&eb1); CpIntc_mapSysIntToHostInt(0, CSL_INTC0_GPINT22, 0);// 中断控制器 0 映射系统中断 6 到主机中断 0 CpIntc_dispatchPlug(CSL_INTC0_GPINT22, &GPIO22_Isr, CSL_INTC0_GPINT22, TRUE);// 配置系统中断 6中断服务函数并使能 CpIntc_enableHostInt(0, 0);// 中断控制器 0 使能主机中断 0 eventId1 = CpIntc_getEventId(0);// 取得主机中断 6 相应的事件号 Hwi_Params_init(¶ms1);// 初始化参数 params1.eventId = eventId1;// 设置关联主机中断的事件 ID params1.arg = 0;// 参数必须为主机中断号 params1.maskSetting = Hwi_MaskingOption_SELF;// 不允许该中断自身嵌套 params1.enableInt = TRUE;// 使能中断 hwi1 = Hwi_create(CPU_INTn2, &CpIntc_dispatch, ¶ms1, &eb1); if(hwi1 == NULL) { printf("GPIO22(SYN_SAMPLE) Hwi create failed !\n"); } // 动态创建硬件中断 Int eventId2; Hwi_Handle hwi2; Hwi_Params params2; Error_Block eb2; Error_init(&eb2); CpIntc_mapSysIntToHostInt(0, CSL_INTC0_GPINT23, 1);// 中断控制器 0 映射系统中断 7 到主机中断 1 CpIntc_dispatchPlug(CSL_INTC0_GPINT23, &GPIO23_Isr, CSL_INTC0_GPINT23, TRUE);// 配置系统中断 7 中断服务函数并使能 CpIntc_enableHostInt(0, 1);// 中断控制器 0 使能主机中断 1 eventId2 = CpIntc_getEventId(1);// 取得主机中断 1 相应的事件号 Hwi_Params_init(¶ms2);// 初始化参数 params2.eventId = eventId2;// 设置关联主机中断的事件 ID params2.arg = 1;// 参数必须为主机中断号 params2.maskSetting = Hwi_MaskingOption_SELF;// 不允许该中断自身嵌套 params2.enableInt = TRUE;// 使能中断 hwi2 = Hwi_create(CPU_INTn3, &CpIntc_dispatch, ¶ms2, &eb2); if(hwi2 == NULL) { printf("GPIO23(SYN) Hwi create failed !\n"); } Hwi_enable(); } /****************************************************************************************** * *同步信号初始化函数 * *******************************************************************************************/ void SYN_init(xdc_Int CPU_INTn1, xdc_Int CPU_INTn2, xdc_Int CPU_INTn3) { KickUnlock();// 解锁关键寄存器 // GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO00_LENDIAN, GPIO_NORMAL_ENABLED);// 底板按键 // GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO22_UARTCTS0, GPIO_NORMAL_ENABLED);//SYN_SAMPLE // GPIOPinMuxSet(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0, GPIO23_UARTRTS0, GPIO_NORMAL_ENABLED);//SYN (*((volatile unsigned int *)(SOC_DSC_BASE_REGS + SOC_DSC_PIN_CONTROL_0))) |= ((1<<GPIO00_LENDIAN) | (1<<GPIO22_UARTCTS0) | (1<<GPIO23_UARTRTS0)); KickLock();// 锁定关键寄存器 // GPIODirModeSet(SOC_GPIO_0_REGS, GPIO00_LENDIAN, GPIO_DIR_INPUT);// 底板按键 // GPIODirModeSet(SOC_GPIO_0_REGS, GPIO22_UARTCTS0, GPIO_DIR_INPUT);//SYN_SAMPLE // GPIODirModeSet(SOC_GPIO_0_REGS, GPIO23_UARTRTS0, GPIO_DIR_INPUT);//SYN gpGPIO_regs->BANK_REGISTERS[0].DIR |= ((1<<GPIO00_LENDIAN) | (1<<GPIO22_UARTCTS0) | (1<<GPIO23_UARTRTS0));//1为输入 // GPIOIntTypeSet(SOC_GPIO_0_REGS, GPIO00_LENDIAN, GPIO_INT_TYPE_FALLEDGE);// 配置为下降沿触发 // GPIOIntTypeSet(SOC_GPIO_0_REGS, GPIO22_UARTCTS0, GPIO_INT_TYPE_FALLEDGE);// 配置为下降沿触发 // GPIOIntTypeSet(SOC_GPIO_0_REGS, GPIO23_UARTRTS0, GPIO_INT_TYPE_FALLEDGE);// 配置为下降沿触发 /*trigger interrupt on both rising and falling edge*/ gpGPIO_regs->BANK_REGISTERS[0].CLR_FAL_TRIG= 0xFFFFFFFF; gpGPIO_regs->BANK_REGISTERS[0].CLR_RIS_TRIG= 0xFFFFFFFF; gpGPIO_regs->BANK_REGISTERS[0].SET_RIS_TRIG= 0; gpGPIO_regs->BANK_REGISTERS[0].SET_FAL_TRIG= ((1<<GPIO00_LENDIAN) | (1<<GPIO22_UARTCTS0) | (1<<GPIO23_UARTRTS0)); //设置下降沿触发 GPIO_Hwi_thread_create(CPU_INTn1,CPU_INTn2,CPU_INTn3); //GPIOBankIntEnable(SOC_GPIO_0_REGS);// 使能 GPIO BANK 中断 gpGPIO_regs->BINTEN= 3; }
因为GPIO0的中断不是由CIC0路由的,所以是能够进入中断;但是GPIO22和GPIO23的中断需要CIC0路由一下,这个操作流程我是参考的我之前写的好使的串口0的中断写的,但是就是不能进中断。但是如果是裸机程序的话是可以进入中断的这说明硬件是没有问题的,所以我怀疑是sysbios软件的问题。但是不知道怎么查问题。
Shine:
代码没有使能system interrupt,试试用CpIntc_enableSysInt函数。
http://processors.wiki.ti.com/index.php/Configuring_Interrupts_on_Keystone_Devices#CpIntc
,
jie huang3:
我试了还是不行。
,
jie huang4:
请问还有可能是什么原因呢?
,
Shine:
如果之前写的好使的串口0的中断也是基于sys/bios的,那流程应该没问题,最多是事件号和映射的中断号不一样。
看一下中断标志位有没有置1?总中断有没有使能?
另外,CSL和SYS/BIOS不要同时使用。
,
bo xiao3:
大神,问题最后怎么解决的,我现在的问题跟你一样?
,
user3693478:
您好,我也遇到这个问题了,C6655 sysbios下26号管脚收不到中断,能不能指导一下。
,
user3693478:
请问问题解决了吗?
,
bo xiao3:
成功了,注意两点一个是系统堆栈,第二个是系统优化等级
,
skysteed:
你好 我也遇到同样的问题了 你是怎么解决的?
系统堆栈,第二个是系统优化等级 什么意思了愿闻其详啊!
,
skysteed:
你好 我也遇到同样的问题了 请问你解决没有???怎么解决的?