您好,FAE,最近我在使用TMS570LC4357官方的Hercules官方Demo板时,需要用到外部中断触发这个功能,我配置的是PA6(H3)引脚为外部上升沿触发中断(低优先级),使用的是HalCoGen软件生成的代码。一下是我的配置源码:
void gioInit(void)
{
/* USER CODE BEGIN (2) */
/* USER CODE END */
/** bring GIO module out of reset */
gioREG->GCR0 = 1U;
gioREG->ENACLR = 0xFFU;
gioREG->LVLCLR = 0xFFU;
/** @b initialize @b Port @b A */
/** – Port A output values */
gioPORTA->DOUT = (uint32)((uint32)0U << 0U) /* Bit 0 */
| (uint32)((uint32)0U << 1U) /* Bit 1 */
| (uint32)((uint32)0U << 2U) /* Bit 2 */
| (uint32)((uint32)0U << 3U) /* Bit 3 */
| (uint32)((uint32)0U << 4U) /* Bit 4 */
| (uint32)((uint32)0U << 5U) /* Bit 5 */
| (uint32)((uint32)0U << 6U) /* Bit 6 */
| (uint32)((uint32)0U << 7U); /* Bit 7 */
/** – Port A direction */
gioPORTA->DIR = (uint32)((uint32)1U << 0U) /* Bit 0 */
| (uint32)((uint32)1U << 1U) /* Bit 1 */
| (uint32)((uint32)1U << 2U) /* Bit 2 */
| (uint32)((uint32)0U << 3U) /* Bit 3 */
| (uint32)((uint32)0U << 4U) /* Bit 4 */
| (uint32)((uint32)0U << 5U) /* Bit 5 */
| (uint32)((uint32)0U << 6U) /* Bit 6 */
| (uint32)((uint32)0U << 7U); /* Bit 7 */
/** – Port A open drain enable */
gioPORTA->PDR = (uint32)((uint32)0U << 0U) /* Bit 0 */
| (uint32)((uint32)0U << 1U) /* Bit 1 */
| (uint32)((uint32)0U << 2U) /* Bit 2 */
| (uint32)((uint32)0U << 3U) /* Bit 3 */
| (uint32)((uint32)0U << 4U) /* Bit 4 */
| (uint32)((uint32)0U << 5U) /* Bit 5 */
| (uint32)((uint32)0U << 6U) /* Bit 6 */
| (uint32)((uint32)0U << 7U); /* Bit 7 */
/** – Port A pullup / pulldown selection */
gioPORTA->PSL = (uint32)((uint32)1U << 0U) /* Bit 0 */
| (uint32)((uint32)1U << 1U) /* Bit 1 */
| (uint32)((uint32)1U << 2U) /* Bit 2 */
| (uint32)((uint32)0U << 3U) /* Bit 3 */
| (uint32)((uint32)0U << 4U) /* Bit 4 */
| (uint32)((uint32)1U << 5U) /* Bit 5 */
| (uint32)((uint32)0U << 6U) /* Bit 6 */
| (uint32)((uint32)0U << 7U); /* Bit 7 */
/** – Port A pullup / pulldown enable*/
gioPORTA->PULDIS = (uint32)((uint32)0U << 0U) /* Bit 0 */
| (uint32)((uint32)0U << 1U) /* Bit 1 */
| (uint32)((uint32)0U << 2U) /* Bit 2 */
| (uint32)((uint32)0U << 3U) /* Bit 3 */
| (uint32)((uint32)0U << 4U) /* Bit 4 */
| (uint32)((uint32)0U << 5U) /* Bit 5 */
| (uint32)((uint32)0U << 6U) /* Bit 6 */
| (uint32)((uint32)0U << 7U); /* Bit 7 */
/** @b initialize @b Port @b B */
/** – Port B output values */
gioPORTB->DOUT = (uint32)((uint32)0U << 0U) /* Bit 0 */
| (uint32)((uint32)0U << 1U) /* Bit 1 */
| (uint32)((uint32)0U << 2U) /* Bit 2 */
| (uint32)((uint32)0U << 3U) /* Bit 3 */
| (uint32)((uint32)0U << 4U) /* Bit 4 */
| (uint32)((uint32)0U << 5U) /* Bit 5 */
| (uint32)((uint32)0U << 6U) /* Bit 6 */
| (uint32)((uint32)0U << 7U); /* Bit 7 */
/** – Port B direction */
gioPORTB->DIR = (uint32)((uint32)0U << 0U) /* Bit 0 */
| (uint32)((uint32)0U << 1U) /* Bit 1 */
| (uint32)((uint32)0U << 2U) /* Bit 2 */
| (uint32)((uint32)0U << 3U) /* Bit 3 */
| (uint32)((uint32)0U << 4U) /* Bit 4 */
| (uint32)((uint32)0U << 5U) /* Bit 5 */
| (uint32)((uint32)0U << 6U) /* Bit 6 */
| (uint32)((uint32)0U << 7U); /* Bit 7 */
/** – Port B open drain enable */
gioPORTB->PDR = (uint32)((uint32)0U << 0U) /* Bit 0 */
| (uint32)((uint32)0U << 1U) /* Bit 1 */
| (uint32)((uint32)0U << 2U) /* Bit 2 */
| (uint32)((uint32)0U << 3U) /* Bit 3 */
| (uint32)((uint32)0U << 4U) /* Bit 4 */
| (uint32)((uint32)0U << 5U) /* Bit 5 */
| (uint32)((uint32)0U << 6U) /* Bit 6 */
| (uint32)((uint32)0U << 7U); /* Bit 7 */
/** – Port B pullup / pulldown selection */
gioPORTB->PSL = (uint32)((uint32)0U << 0U) /* Bit 0 */
| (uint32)((uint32)0U << 1U) /* Bit 1 */
| (uint32)((uint32)0U << 2U) /* Bit 2 */
| (uint32)((uint32)0U << 3U) /* Bit 3 */
| (uint32)((uint32)0U << 4U) /* Bit 4 */
| (uint32)((uint32)0U << 5U) /* Bit 5 */
| (uint32)((uint32)0U << 6U) /* Bit 6 */
| (uint32)((uint32)0U << 7U); /* Bit 7 */
/** – Port B pullup / pulldown enable*/
gioPORTB->PULDIS = (uint32)((uint32)0U << 0U) /* Bit 0 */
| (uint32)((uint32)0U << 1U) /* Bit 1 */
| (uint32)((uint32)0U << 2U) /* Bit 2 */
| (uint32)((uint32)0U << 3U) /* Bit 3 */
| (uint32)((uint32)0U << 4U) /* Bit 4 */
| (uint32)((uint32)0U << 5U) /* Bit 5 */
| (uint32)((uint32)0U << 6U) /* Bit 6 */
| (uint32)((uint32)0U << 7U); /* Bit 7 */
/* USER CODE BEGIN (3) */
/* USER CODE END */
/** @b initialize @b interrupts */
/** – interrupt polarity */
gioREG->POL = (uint32)((uint32)0U << 0U) /* Bit 0 */
| (uint32)((uint32)0U << 1U) /* Bit 1 */
| (uint32)((uint32)0U << 2U) /* Bit 2 */
| (uint32)((uint32)0U << 3U) /* Bit 3 */
| (uint32)((uint32)0U << 4U) /* Bit 4 */
| (uint32)((uint32)0U << 5U) /* Bit 5 */
| (uint32)((uint32)1U << 6U) /* Bit 6 */
| (uint32)((uint32)1U << 7U) /* Bit 7 */
| (uint32)((uint32)0U << 8U) /* Bit 8 */
| (uint32)((uint32)0U << 9U) /* Bit 9 */
| (uint32)((uint32)0U << 10U) /* Bit 10 */
| (uint32)((uint32)0U << 11U) /* Bit 11 */
| (uint32)((uint32)0U << 12U) /* Bit 12 */
| (uint32)((uint32)0U << 13U) /* Bit 13 */
| (uint32)((uint32)0U << 14U) /* Bit 14 */
| (uint32)((uint32)0U << 15U); /* Bit 15 */
/** – interrupt level */
gioREG->LVLSET = (uint32)((uint32)0U << 0U) /* Bit 0 */
| (uint32)((uint32)0U << 1U) /* Bit 1 */
| (uint32)((uint32)0U << 2U) /* Bit 2 */
| (uint32)((uint32)0U << 3U) /* Bit 3 */
| (uint32)((uint32)0U << 4U) /* Bit 4 */
| (uint32)((uint32)0U << 5U) /* Bit 5 */
| (uint32)((uint32)0U << 6U) /* Bit 6 */
| (uint32)((uint32)1U << 7U) /* Bit 7 */
| (uint32)((uint32)0U << 8U) /* Bit 8 */
| (uint32)((uint32)0U << 9U) /* Bit 9 */
| (uint32)((uint32)0U << 10U) /* Bit 10 */
| (uint32)((uint32)0U << 11U) /* Bit 11 */
| (uint32)((uint32)0U << 12U) /* Bit 12 */
| (uint32)((uint32)0U << 13U) /* Bit 13 */
| (uint32)((uint32)0U << 14U) /* Bit 14 */
| (uint32)((uint32)0U << 15U); /* Bit 15 */
/** – clear all pending interrupts */
gioREG->FLG = 0xFFU;
/** – enable interrupts */
gioREG->ENASET = (uint32)((uint32)0U << 0U) /* Bit 0 */
| (uint32)((uint32)0U << 1U) /* Bit 1 */
| (uint32)((uint32)0U << 2U) /* Bit 2 */
| (uint32)((uint32)0U << 3U) /* Bit 3 */
| (uint32)((uint32)0U << 4U) /* Bit 4 */
| (uint32)((uint32)0U << 5U) /* Bit 5 */
| (uint32)((uint32)1U << 6U) /* Bit 6 */
| (uint32)((uint32)1U << 7U) /* Bit 7 */
| (uint32)((uint32)0U << 8U) /* Bit 8 */
| (uint32)((uint32)0U << 9U) /* Bit 9 */
| (uint32)((uint32)0U << 10U) /* Bit 10 */
| (uint32)((uint32)0U << 11U) /* Bit 11 */
| (uint32)((uint32)0U << 12U) /* Bit 12 */
| (uint32)((uint32)0U << 13U) /* Bit 13 */
| (uint32)((uint32)0U << 14U) /* Bit 14 */
| (uint32)((uint32)0U << 15U); /* Bit 15 */
/* USER CODE BEGIN (4) */
/* USER CODE END */
}
#pragma CODE_STATE(gioLowLevelInterrupt, 32)
#pragma INTERRUPT(gioLowLevelInterrupt, IRQ)
/* SourceId : GIO_SourceId_012 */
/* DesignId : GIO_DesignId_011 */
/* Requirements : HL_CONQ_GIO_SR13 */
void gioLowLevelInterrupt(void)
{
uint32 offset = gioREG->OFF2;
/* USER CODE BEGIN (17) */
/* USER CODE END */
if (offset != 0U)
{
offset = offset – 1U;
if (offset >= 8U)
{
gioNotification(gioPORTB, offset – 8U);
}
else
{
gioNotification(gioPORTA, offset);
}
}
/* USER CODE BEGIN (18) */
/* USER CODE END */
}
当然,HL_system_vim.c和HL_system_vim.h我也都配置好了,我用外部高电平尝试触发Demo板的PA6引脚启动外部中断,但是仿真的时候发现并没有进入外部中断,请问这个是怎么回事?应该如何解决呢?谢谢
gaoyang9992006:
楼主解决了没,看你这一堆代码的,除了你说的那个管脚,貌似你对并列的几个端口都设置进去了。你配置时候仔细看一下,那个结构图,是不是有什么使能没有启用,另外你的IO模式设置的应该也不对。