搜索
bottom↓
回复: 8

求助,STM32用RT-THREAD实时操作系统的时候,不能享用void EXTI9_5_IRQHandler(void)的

[复制链接]

出0入0汤圆

发表于 2010-9-7 22:01:45 | 显示全部楼层 |阅读模式
我要在一个现成中驱动触屏,使用了
void rt_hw_touch_init(void)
{
        RCC->APB2ENR |= 0X107C;
        tp_GPIO_Config();//初始化触屏的管脚
        TP_NVIC_Configuration();//初始化中断
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);//初始化PB.6触屏的INT脚,当按下触屏时会有下降沿

  /* Configure Key Button EXTI Line to generate an interrupt on falling edge */  
    EXTI_InitStructure.EXTI_Line = EXTI_Line6;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
}
线程入口程序为char thread_touch_stack[512];
struct rt_thread thread_touch;
void rt_thread_entry_touch(void* parameter)
{       
        rt_hw_touch_init();
       
        /* disable interrupt first */
    while (1)
    {
           Touch_Adjust();
    }
}
Touch_Adjust();这个程序时让程序一直检测是否在中断函数中设置的信号量变成低电平的,如果有下降沿,会进入程序,开始校正触屏
中断函数:
void EXTI9_5_IRQHandler(void)
{          
        rt_interrupt_enter();   
        if(EXTI_GetITStatus(EXTI_Line6) != RESET)
        {       
                Pen_Point.Key_Sta=Key_Down;//按键按下 ,Pen_Point.Key_Sta为信号量,当有按下,会改变此值                                                                                                         
                EXTI_ClearITPendingBit(EXTI_Line6);
        }
        rt_interrupt_leave();
}
现在的问题是根本进不了EXTI9_5_IRQHandler(void)中断啊,我没有在其他函数中设置任何东西,而且在调用第一个现成的时候,        CPSIE   I ;PRIMASK=0, 开中断了,但是不管我把触屏程序放哪,始终进步了这个中断啊。十万火急啊,等着交东西,就差这个了,请求帮助,哪位大哥帮下忙啊!!!谢谢了
下面是校准程序,我不用实时系统的时候,是可以进的,现在只是会停在下面的while(1),这里
void Touch_Adjust(void)
{                                                                 
        u16 pos_temp[4][2];//坐标缓存值
        u8  cnt=0;       
        u16 d1,d2;
        u32 tem1,tem2;
        float fac;           
        cnt=0;
                       
        POINT_COLOR=BLUE;
        BACK_COLOR =WHITE;
        LCD_Clear(WHITE);//清屏   
        POINT_COLOR=RED;//红色
        LCD_Clear(WHITE);//清屏
        Drow_Touch_Point(20,20);//画点1
        Pen_Point.Key_Sta=Key_Up;//消除触发信号
        Pen_Point.xfac=0;//xfac用来标记是否校准过,所以校准之前必须清掉!以免错误         
        while(1)
        {       
                Pen_Point.Key_Sta=TFT_TP_INT;
                if(Pen_Point.Key_Sta==Key_Down)//按键按下了
                {
                        if(Read_TP_Once())//得到单次按键值
                        {                                                                    
                                pos_temp[cnt][0]=Pen_Point.X;
                                pos_temp[cnt][1]=Pen_Point.Y;
                                cnt++;
                                Pen_Point.Key_Sta=Key_Up;
                        }                         
                        switch(cnt)
                        {                          
                                case 1:
                                        LCD_Clear(WHITE);//清屏
                                        Drow_Touch_Point(220,20);//画点2
                                        break;
                                case 2:
                                        LCD_Clear(WHITE);//清屏
                                        Drow_Touch_Point(20,300);//画点3
                                        break;
                                case 3:
                                        LCD_Clear(WHITE);//清屏
                                        Drow_Touch_Point(220,300);//画点4
                                        break;
                                case 4:         //全部四个点已经得到
                                //对边相等
                                        tem1=abs(pos_temp[0][0]-pos_temp[1][0]);//x1-x2
                                        tem2=abs(pos_temp[0][1]-pos_temp[1][1]);//y1-y2
                                        tem1*=tem1;
                                        tem2*=tem2;
                                        d1=sqrt(tem1+tem2);//得到1,2的距离
                                       
                                        tem1=abs(pos_temp[2][0]-pos_temp[3][0]);//x3-x4
                                        tem2=abs(pos_temp[2][1]-pos_temp[3][1]);//y3-y4
                                        tem1*=tem1;
                                        tem2*=tem2;
                                        d2=sqrt(tem1+tem2);//得到3,4的距离
                                        fac=(float)d1/d2;
                                        if(fac<0.95||fac>1.05||d1==0||d2==0)//不合格
                                        {
                                                cnt=0;
                                                LCD_Clear(WHITE);//清屏
                                                Drow_Touch_Point(20,20);
                                                continue;
                                        }
                                        tem1=abs(pos_temp[0][0]-pos_temp[2][0]);//x1-x3
                                        tem2=abs(pos_temp[0][1]-pos_temp[2][1]);//y1-y3
                                        tem1*=tem1;
                                        tem2*=tem2;
                                        d1=sqrt(tem1+tem2);//得到1,3的距离
                                       
                                        tem1=abs(pos_temp[1][0]-pos_temp[3][0]);//x2-x4
                                        tem2=abs(pos_temp[1][1]-pos_temp[3][1]);//y2-y4
                                        tem1*=tem1;
                                        tem2*=tem2;
                                        d2=sqrt(tem1+tem2);//得到2,4的距离
                                        fac=(float)d1/d2;
                                        if(fac<0.95||fac>1.05)//不合格
                                        {
                                                cnt=0;
                                                LCD_Clear(WHITE);//清屏
                                                Drow_Touch_Point(20,20);
                                                continue;
                                        }//正确了
                                                                  
                                        //对角线相等
                                        tem1=abs(pos_temp[1][0]-pos_temp[2][0]);//x1-x3
                                        tem2=abs(pos_temp[1][1]-pos_temp[2][1]);//y1-y3
                                        tem1*=tem1;
                                        tem2*=tem2;
                                        d1=sqrt(tem1+tem2);//得到1,4的距离
       
                                        tem1=abs(pos_temp[0][0]-pos_temp[3][0]);//x2-x4
                                        tem2=abs(pos_temp[0][1]-pos_temp[3][1]);//y2-y4
                                        tem1*=tem1;
                                        tem2*=tem2;
                                        d2=sqrt(tem1+tem2);//得到2,3的距离
                                        fac=(float)d1/d2;
                                        if(fac<0.95||fac>1.05)//不合格
                                        {
                                                cnt=0;
                                                LCD_Clear(WHITE);//清屏
                                                Drow_Touch_Point(20,20);
                                                continue;
                                        }//正确了
                                        //计算结果
                                        Pen_Point.xfac=(float)200/(pos_temp[1][0]-pos_temp[0][0]);//得到xfac                 
                                        Pen_Point.xoff=(240-Pen_Point.xfac*(pos_temp[1][0]+pos_temp[0][0]))/2;//得到xoff
                                                  
                                        Pen_Point.yfac=(float)280/(pos_temp[2][1]-pos_temp[0][1]);//得到yfac
                                        Pen_Point.yoff=(320-Pen_Point.yfac*(pos_temp[2][1]+pos_temp[0][1]))/2;//得到yoff  
                                        POINT_COLOR=BLUE;
                                        LCD_Clear(WHITE);//清屏
                                        LCD_ShowString(35,110,"Touch Screen Adjust OK!");//校正完成
                                        delay_ms(1000);
                                        LCD_Clear(WHITE);//清屏   
                                        return;//校正完成                                 
                        }
                }
        }
}

出0入0汤圆

发表于 2010-9-7 22:20:35 | 显示全部楼层
再检查下GPIO是否配置正确,调试的时候通过Keil的外设,中断控制器,GPIO看下是否正确

从程序上说,你的设计:
void rt_thread_entry_touch(void* parameter)
{
rt_hw_touch_init();

/* disable interrupt first */
    while (1)
    {
   Touch_Adjust();
    }
}

基本上是错误的。因为while(1)...的缘故,系统会持续的运行这个线程,其他比这个线程优先级低的线程将永远失去运行的机会。

至于你说的中断问题,首先你是如何判断不能进入中断函数?另外就是最开始的提及的,请保证你的GPIO配置是正确的。

出0入0汤圆

 楼主| 发表于 2010-9-8 10:28:59 | 显示全部楼层
不能进入中断函数就是我打的断点在
void EXTI9_5_IRQHandler(void)
{           
rt_interrupt_enter();    《-这里打的断点
if(EXTI_GetITStatus(EXTI_Line6) != RESET)
{       
Pen_Point.Key_Sta=Key_Down;//按键按下 ,Pen_Point.Key_Sta为信号量,当有按下,会改变此值                                           
EXTI_ClearITPendingBit(EXTI_Line6);
}
rt_interrupt_leave();
}
我的初始化中断和IO口试在没有操作系统的地方做好的,没有问题的,但是加上RT-THREAD,就不能响应了,我按下触屏,应该会有中断变化响应,但程序中并没有跳到中断函数中。。

出0入14汤圆

发表于 2010-9-8 14:07:20 | 显示全部楼层
//外部中断,要打开AFIO时钟

检查你这个

出0入0汤圆

 楼主| 发表于 2010-9-8 21:31:03 | 显示全部楼层
已经解决,非常感谢,用了原子的库,在GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);//初始化PB.6触屏的INT脚,当按下触屏时会有下降沿

  /* Configure Key Button EXTI Line to generate an interrupt on falling edge */   
    EXTI_InitStructure.EXTI_Line = EXTI_Line6;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
换了原子的库,中断可以用了,小失误

出0入0汤圆

发表于 2011-1-10 13:30:17 | 显示全部楼层
留个记号。昨天也碰到类似问题。

出0入0汤圆

发表于 2011-12-6 08:36:10 | 显示全部楼层
我也是中断在不用操作系统的时候可以,用了操作系统进不去,试试楼主的办法先

出0入0汤圆

发表于 2011-12-6 09:57:15 | 显示全部楼层
回复【4楼】1300961082
-----------------------------------------------------------------------

楼主,换了原子的库什么意思?

出0入10汤圆

发表于 2016-8-29 11:12:16 | 显示全部楼层
学习了,感谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 01:54

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表