-
看看,谢谢
-
看看了,谢谢楼主分享!
-
因为key1的次优先级比key2高,我是先按key2,led5开始闪灯,未等到闪到100次,按下key1,led4就开始闪了。
-
楼上理解有误,我是这个疑问。GPIOA 和 GPIOB 优先圾在同一个组,A 的次优先级比 B 要高,当处理b中断时,产生a中断,理论上应该是实现末尾连锁功能,但是实际上a中断却可以抢占了b中断,不知道为何原因?我是在lm3s811上调试的,单步运行正常,但是全速运行就出现这种怪现象。
[ 本帖最后由 uhhznb 于 2011-10-1 18:01 编辑 ]
-
程序中key1和key2应该实现末尾连锁功能,但是实际中key1中断却可以抢占key2的中断,这是为什么呀?
GPIOPinIntEnable(GPIO_PORTA_BASE, KEY1); /* 使能KEY1中断 */
GPIOPinIntEnable(GPIO_PORTB_BASE, KEY2); /* 使能KEY2中断 */
GPIOPinIntEnable(GPIO_PORTC_BASE, KEY3); /* 使能KEY3中断 */
IntEnable(INT_GPIOA); /* 使能GPIOA中断 */
IntEnable(INT_GPIOB); /* 使能GPIOB中断 */
IntEnable(INT_GPIOC); /* 使能GPIOC中断 */
IntPrioritySet(INT_GPIOA, 2
-
但是我调试周立功程序单步运行末尾连锁正常,直接运行就出现a(key1)会抢断b(key2)的怪现象,谁能帮我解释下:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: IntDome1.c
** Latest modified Date: 2007.11.23
** Latest Version: V1.0
** Descriptions: 中断优先级实验
**
**--------------------------------------------------------------------------------------------------------
** Created by: Kang qinhua
** Created date: 2007.11.23
** Version: V1.0
** Descriptions: The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
*********************************************************************************************************/
#include "hw_types.h"
#include "hw_memmap.h"
#include "hw_ints.h"
#include "hw_nvic.h"
#include "interrupt.h"
#include "sysctl.h"
#include "gpio.h"
#define KEY1 GPIO_PIN_4 /* 设置PA4口为KEY1 */
#define KEY2 GPIO_PIN_4 /* 设置PB4口为KEY2 */
#define KEY3 GPIO_PIN_4 /* 设置PC4口为KEY3 */
#define LED3 GPIO_PIN_6 /* 设置PB6口为LED3 */
#define LED4 GPIO_PIN_5 /* 设置PA5口为LED4 */
#define LED5 GPIO_PIN_5 /* 设置PB5口为LED5 */
#define LED6 GPIO_PIN_5 /* 设置PC5口为LED6 */
/*********************************************************************************************************
** Function name: delay
** Descriptions: 延时函数
** input parameters: t,延时时间常数
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void delay (int t)
{
for ( ; t; --t);
}
/*********************************************************************************************************
** Function name: GPIO_Port_A_ISR
** Descriptions: GPIOA中断函数
** 用KEIL软件时,在Startup.S中添加该中断函数名
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void GPIO_Port_A_ISR (void)
{
unsigned long i = 0;
GPIOPinIntClear(GPIO_PORTA_BASE, KEY1); /* 清除中断标志 */
for ( i = 100; i > 0; i--) {
GPIOPinWrite(GPIO_PORTA_BASE, LED4, ~GPIOPinRead(GPIO_PORTA_BASE, LED4));
delay(200000);
}
}
/*********************************************************************************************************
** Function name: GPIO_Port_B_ISR
** Descriptions: GPIOB中断函数
** 用KEIL软件时,在Startup.S中添加该中断函数名
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void GPIO_Port_B_ISR (void)
{
unsigned long i = 0;
GPIOPinIntClear(GPIO_PORTB_BASE, KEY2); /* 清除中断标志 */
for ( i = 100; i > 0; i--) {
GPIOPinWrite(GPIO_PORTB_BASE, LED5, ~GPIOPinRead(GPIO_PORTB_BASE, LED5));
delay(200000);
}
}
/*********************************************************************************************************
** Function name: GPIO_Port_C_ISR
** Descriptions: GPIOC中断函数
** 用KEIL软件时,在Startup.S中添加该中断函数名
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void GPIO_Port_C_ISR (void)
{
unsigned long i = 0;
GPIOPinIntClear(GPIO_PORTC_BASE, KEY3); /* 清除中断标志 */
for ( i = 100; i > 0; i--) {
GPIOPinWrite(GPIO_PORTC_BASE, LED6, ~GPIOPinRead(GPIO_PORTC_BASE, LED6));
delay(200000);
}
}
/*********************************************************************************************************
** Function name: main
** Descriptions: 主函数
** 运行时LED3闪烁
** KEY1--GPIOA中断 ,对应于LED4,设置成组优先级为2,次优先级为0
** KEY2--GPIOB中断 ,对应于LED5,设置成组优先级为2,次优先级为1
** KEY3--GPIOC中断 ,对应于LED6,设置成组优先级为1,次优先级为1
** 按下KEY1,LED4闪烁;按下KEY2,LED5闪烁;按下KEY3,LED6闪烁;
** KEY1与KEY2产生末尾连锁,KEY3可抢断KEY1、KEY2,通过LED可以观测结果
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
int main (void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); /* 使能GPIO PA口 */
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); /* 使能GPIO PB口 */
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); /* 使能GPIO PC口 */
/*********************************************************************************************************
设置KEY1、KEY2、KEY3为输入
*********************************************************************************************************/
/* GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, KEY1);
GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, KEY2);
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, KEY3); */
GPIODirModeSet(GPIO_PORTA_BASE, KEY1, GPIO_DIR_MODE_IN);
GPIODirModeSet(GPIO_PORTB_BASE, KEY2, GPIO_DIR_MODE_IN);
GPIODirModeSet(GPIO_PORTC_BASE, KEY3, GPIO_DIR_MODE_IN);
/*********************************************************************************************************
设置LED3、LED4、LED5、LED6为输出
*********************************************************************************************************/
/* GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, LED3);
GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, LED4);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, LED5);
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, LED6); */
GPIODirModeSet(GPIO_PORTB_BASE, LED3, GPIO_DIR_MODE_OUT);
GPIODirModeSet(GPIO_PORTA_BASE, LED4, GPIO_DIR_MODE_OUT);
GPIODirModeSet(GPIO_PORTB_BASE, LED5, GPIO_DIR_MODE_OUT);
GPIODirModeSet(GPIO_PORTC_BASE, LED6, GPIO_DIR_MODE_OUT);
GPIOPadConfigSet(GPIO_PORTA_BASE, KEY1 | LED4, /* 设置KEY1的驱动强度和类型 */
GPIO_STRENGTH_4MA, /* 4mA的输出驱动强度 */
GPIO_PIN_TYPE_STD); /* 设置为推挽管脚 */
GPIOPadConfigSet(GPIO_PORTB_BASE, KEY2 | LED5 | LED3, /* 设置KEY2的驱动强度和类型 */
GPIO_STRENGTH_4MA, /* 4mA的输出驱动强度 */
GPIO_PIN_TYPE_STD); /* 设置为推挽管脚 */
GPIOPadConfigSet(GPIO_PORTC_BASE, KEY3 | LED6, /* 设置KEY3的驱动强度和类型 */
GPIO_STRENGTH_4MA, /* 4mA的输出驱动强度 */
GPIO_PIN_TYPE_STD); /* 设置为推挽管脚 */
GPIOIntTypeSet(GPIO_PORTA_BASE, KEY1, GPIO_RISING_EDGE); /* 设置KEY1中断的触发方式为
上升沿触发 */
GPIOIntTypeSet(GPIO_PORTB_BASE, KEY2, GPIO_RISING_EDGE); /* 设置KEY2中断的触发方式为
上升沿触发 */
GPIOIntTypeSet(GPIO_PORTC_BASE, KEY3, GPIO_RISING_EDGE); /* 设置KEY3中断的触发方式为
上升沿触发 */
IntMasterEnable(); /* 使能总中断 */
GPIOPinIntEnable(GPIO_PORTA_BASE, KEY1); /* 使能KEY1中断 */
GPIOPinIntEnable(GPIO_PORTB_BASE, KEY2); /* 使能KEY2中断 */
GPIOPinIntEnable(GPIO_PORTC_BASE, KEY3); /* 使能KEY3中断 */
IntEnable(INT_GPIOA); /* 使能GPIOA中断 */
IntEnable(INT_GPIOB); /* 使能GPIOB中断 */
IntEnable(INT_GPIOC); /* 使能GPIOC中断 */
IntPrioritySet(INT_GPIOA, 2
-
就是不要从51单片机角度看问题,认为弱上拉开漏输入就是高电平,其实刚开始我也没弄明白,不过现在明白了。
我就是用
GPIODirModeSet(GPIO_PORTE_BASE,GPIO_PIN_0,GPIO_DIR_MODE_IN);GPIOPadConfigSet(GPIO_PORTE_BASE,GPIO_PIN_0,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPD);
配置的。
[ 本帖最后由 uhhznb 于 2011-9-24 10:59 编辑 ]
-
我的理解是推挽输入是高电平,开漏输入是低电平,我的4*4键盘矩阵程序中,单步运行调试得出的结论,那个程序我已调试成功了。
-
程序已经贴出来了, 有谁能帮我看看问题出在哪里吗?
-
#ifndef KEYBOARD_H#define KEYBOARD_H//定义长标识符成较短的形式#define SysCtlPeriEnable SysCtlPeripheralEnable#define SysCtlPeriDisable SysCtlPeripheralDisable#define GPIOPinTypeIn GPIOPinTypeGPIOInput#define GPIOPinTypeOutOD GPIOPinTypeGPIOOutputOD
//行线使用GPIOB(0-3)1111#define KEYBOARD_LIN_PERIPH SYSCTL_PERIPH_GPIOB#define KEYBOARD_LIN_BASE GPIO_PORTB_BASE#define KEYBOARD_LIN_PIN 0x0F //列线使用GPIOC(4-7)1111#define KEYBOARD_COL_PERIPH SYSCTL_PERIPH_GPIOC#define KEYBOARD_COL_BASE GPIO_PORTC_BASE#define KEYBOARD_COL_PIN 0xF0
#endif
uchar scanKeyboard(void){
ulong scanValue[20]={0xEE,0xDE,0xBE,0x7E, 0xED,0xDD,0xBD,0x7D, 0xEB,0xDB,0xBB,0x7B, 0xE7,0xD7,0xB7,0x77, };
const ulong keyASC[20]={'1','2','3','4', '5','6','7','8', '9','10','11','12', '13','14','15','16', };
//定义变量及使能GPIOC和GPIOB ulong key,temp,temp1,temp2,temp3;SysCtlPeripheralEnable(KEYBOARD_LIN_PERIPH);SysCtlPeripheralEnable(KEYBOARD_COL_PERIPH);//9个引脚全部上拉电阻有效GPIOPadConfigSet(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);GPIOPadConfigSet(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);GPIOPinTypeOutOD(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN); GPIOPinTypeIn(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN); GPIOPinWrite(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,0x00); temp1=GPIOPinRead(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN)& KEYBOARD_COL_PIN;
GPIOPadConfigSet(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);GPIOPadConfigSet(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU);GPIOPinTypeIn(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN); GPIOPinTypeOutOD(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN); GPIOPinWrite(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,0x00); temp2=GPIOPinRead(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN)& KEYBOARD_LIN_PIN; temp=temp1 | temp2;
if(temp!=0xFF) { SysCtlDelay(13*(SysCtlClockGet()/3000)); GPIOPadConfigSet(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU); GPIOPadConfigSet(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU); GPIOPinTypeOutOD(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN); GPIOPinTypeIn(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN); GPIOPinWrite(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,0x00); temp1=GPIOPinRead(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN)& KEYBOARD_COL_PIN; GPIOPadConfigSet(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU); GPIOPadConfigSet(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_OD_WPU); GPIOPinTypeIn(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN); GPIOPinTypeOutOD(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN); GPIOPinWrite(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN,0x00); temp2=GPIOPinRead(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN)& KEYBOARD_LIN_PIN; temp3=temp1 | temp2; if(temp3==temp) { for(key=0;key<20;key++) if(temp==scanValue[key]) { GPIOPinTypeIn(KEYBOARD_LIN_BASE,KEYBOARD_LIN_PIN); GPIOPinTypeIn(KEYBOARD_COL_BASE,KEYBOARD_COL_PIN); return(keyASC[key]); } }
else
{
return('E');
}}return ('N');}
-
我延时过了呀,还是不对,真晕呀,管脚通过上拉电阻连到了3.3v,有些引脚就是拉不到高电平
-
谢谢了!
-
楼主辛苦了,谢谢分享!
-
借鉴一下,谢谢了
-
我要用,只好回了,谢谢了。
-
为了芯币,为了有好资料可以下载,我顶