作为控制器,我希望TM4C123G可以接收来自其他传感器的高电位中断信号。所以我设置了PD7作为中断接收点。可是在运行过程中似乎并没有实现。
并且我也有在startup里注册中断程序 并且我的UART中断是可以正常工作的,所谓的高电位中断,端口要接受到的电压超过多少才算高电位呢?在D7口与传感器管脚之间,还需要增加电阻之类的东西吗?
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); //使能PORT D
GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_7, GPIO_DIR_MODE_IN); //设置D7为中断输入
GPIOIntRegister(GPIO_PORTD_BASE, PortDIntHandler); //注册中断程序
GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_7); //设置D7为中断输入
GPIOIntTypeSet(GPIO_PORTD_BASE, GPIO_PIN_7 , GPIO_HIGH_LEVEL); //设置D7高电位时中断
GPIOIntEnable(GPIO_PORTD_BASE, GPIO_PIN_7); //使能D7的中断
IntEnable(INT_GPIOD);
IntMasterEnable();
是不是还少了什么? 望各位前辈斧正!
xyz549040622:
初始化部分的顺序调整下,这里给你个例程看看
M4C123G 所有的外设接口都可以设置成外部中断源。下面以一个例子来说明。下面这个例程PD6和PD7作为中断源,分别接按钮;PF1和PF3分别驱动一个LED灯;当按下其中一个按钮时,可以驱动一个LED灯点亮。首先设置时钟,使用LED驱动端全能输出:// 设置系统主频SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN| SYSCTL_XTAL_16MHZ);// Enable and configure the GPIO port for the LED operation.SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);(似乎用的外设,都必须先使能,这个印象中看到过说明,这些外设默认是不能用,要想用到这些外设,必须先使能)下面这个代码是使相应LED驱动端为输出。GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,RED_LED|BLUE_LED|GREEN_LED);下面介绍如何设置外部中断:void Init_Int_Key() {// Make PD6/7 an output.使能外部中断源外设:SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);按钮接入端设置为输入:GPIODirModeSet(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7, GPIO_DIR_MODE_IN);端口设置功率和弱上拉:GPIOPadConfigSet(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7, GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU);中断设置为低电平触发:GPIOIntTypeSet(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7, GPIO_LOW_LEVEL);使能相应端口中断GPIOIntEnable(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7);使能中断:IntEnable(INT_GPIOD);这个应该是使能全局中断:IntMasterEnable();(不理解为什么要设置这么多中断)下面是清除相应端口中断标志:GPIOIntClear(GPIO_PORTD_BASE, GPIO_PIN_6 | GPIO_PIN_7);}下面这一段是中断响应程序,比较易理解,这里只是贴出。void Int_GPIO_D_Handler(void){unsigned long ulStatus;// 读取中断状态ulStatus = GPIOIntStatus(GPIO_PORTD_BASE, true);// 清除中断状态GPIOIntClear(GPIO_PORTD_BASE, ulStatus);// 如果KEY的中断状态有效if (ulStatus & GPIO_PIN_7){// 延时约10ms,消除按键抖动SysCtlDelay(10 * (SysCtlClockGet() / 3000));// 等待KEY抬起while (GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_7) == 0x00);// 延时约10ms,消除松键抖动SysCtlDelay(10 * (SysCtlClockGet()/ 3000));//TODO 逻辑处理//if(cur_Col < (NUM_CHAR - 1))//cur_Col++;GPIOPinWrite(GPIO_PORTF_BASE,RED_LED|BLUE_LED|GREEN_LED, RED_LED);// Delay for a bitSysCtlDelay(200000);}if (ulStatus & GPIO_PIN_6)// 如果KEY的中断状态有效{// 延时约10ms,消除按键抖动SysCtlDelay(10 * (SysCtlClockGet() / 3000));// 等待KEY抬起while (GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_6) == 0x00);// 延时约10ms,消除松键抖动SysCtlDelay(10 * (SysCtlClockGet()/ 3000));//TODO 逻辑处理//if(cur_Col > 0)//cur_Col--;// Turn on the Green LEDGPIOPinWrite(GPIO_PORTF_BASE,RED_LED|BLUE_LED|GREEN_LED, GREEN_LED);// Delay for a bitSysCtlDelay(200000);}}下面是主程序代码:int main(void) {// 设置系统主频SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN| SYSCTL_XTAL_16MHZ);// Enable and configure the GPIO port for the LED operation.SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,RED_LED|BLUE_LED|GREEN_LED);Init_Int_Key();while(1){}}注意:1)包含头文件路径必须要添加,这个在前面已经说明;2)必须在工程中添加文件:startup_ccs.c(目前还没有完全理解这个文件工作过程,这里只是提示一下,不做解释);3)必须添加一个宏定义:右键工程文件名→Properties→Build→ARMCompiler→Advance Options→Predefined Symbols,在Pre-definge NAME中添加变量:PART_TM4C123GH6PM和TARGET_IS_BLIZZARD_RA1,具体原因我现在还没有完全理解。
xyz549040622:
回复 Detian Shang:
你这也太诡异了吧,不科学。还是建议你按照上面的例程配置来。