OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4930|回复: 8

JTAG是不是有什么问题

[复制链接]

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2014-2-13
在线时间
98 小时
发表于 2014-8-24 08:31:26 | 显示全部楼层 |阅读模式
5金钱
用J_link在旗舰版上调试程序,发现单步运行时,开始正常,但单步的时间一长,就自动退出调试状态,返回的编译串口。这是什么问题?

最佳答案

查看完整内容[请看2#楼]

回复【5楼】正点原子: ---------------------------------好像快行了。应该是代码的问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2014-2-13
在线时间
98 小时
 楼主| 发表于 2014-8-24 08:31:27 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------好像快行了。应该是代码的问题
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-8-24 23:17:59 | 显示全部楼层
估计是你代码问题吧,我调试很长都没出现过这种情况哦.
你调试哪个代码?
试试跑马灯.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2014-2-13
在线时间
98 小时
 楼主| 发表于 2014-8-28 22:09:18 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------跑马灯程序没问题,应该是我的代码的问题,我看了好几天了,也没找到问题。请帮我指点下
u8 check_Key(void)
{    
u16 cord_h,cord_l;//行列值中间变量  高位为行 ,低位为列;
u8 Val = 0xFF;
u8 i=5,j=5;
u8 const Key_Tab[4][4]= //键盘编码表  4x4
{

  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOG,ENABLE);//使能PORTB,G功能时钟
//RCC->APB2ENR|=1<<3;                //使能PORTB时钟
JTAG_Set(SWD_ENABLE);  //开启SWD
GPIOG->CRH&= 0x0FFFFFFF;    //将G口的CRH的28-31脚置零,其余都保持原样 
GPIOG->CRH|=0x80000000;  //G口的15脚上拉输入
GPIOB->CRL&= 0x00000FFF;    //0000 0000 0000 0000 0000 1111 1111 1111 pin0-2都保持原样 
GPIOB->CRL|= 0x33888000;    //0011 0011 1000 1000 1000 0000 0000 0000除了PIN3-5脚上啦输入,pin6-7脚推挽输出,pin0-2都保持原样 
GPIOB->CRH&= 0xFFFFFF00;    //除了PIN8-9脚推挽输出,其余都保持原样 
GPIOB->CRH|= 0x00000033;    //除了PIN8-9脚推挽输出,其余都保持原样 

GPIOG->ODR&= 0x7FFF;            //GPIOG15为1
    GPIOG->ODR|= 0x8000;            //GPIOG15为1

GPIOB->ODR&= 0xFB03;            //列线pin6-9脚输出全为0  //1111 1100 0000 0111
GPIOB->ODR|= 0x0038;            //列线pin6-9脚输出全为0 ,3-5脚为1 //0000 0000 0011 1000
    //GPIOG->ODR = 0xFC3F;            //行线输出全为0  //1111 1100 0011 1000

cord_h = (GPIOG->IDR & 0x8000)>>15;     //读入行线G口PIN15值   //1000 0000 0000 0000
cord_h = cord_h + ((GPIOB->IDR & 0x0038)>>2);     //读入行线B口PIN3-5值   //0000 0000 0011 1000
if(cord_h != 0x000F)    //先检测有无按键按下     //1000 0000 0011 1000  GPIOG15....GPIOB3-5  
{
       delay_ms(10);//去抖动 
     cord_h = (GPIOG->IDR & 0x8000)>>15;     //读入行线G口PIN15值   //1000 0000 0000 0000
     cord_h = cord_h & ((GPIOB->IDR & 0x0038)>>2);     //读入行线B口PIN3-5值   //0000 0000 0011 1000
if(cord_h != 0x000F)  // 1000 0000 0011 1000
{    

   switch(cord_h)
       {
         case 0x000e:i=0;break;   //0x0e  0000_1110
         case 0x000d:i=1;break; //0x0d  0000_1101
         case 0x000b:i=2;break; //0xb0  0000_1011
         case 0x0007:i=3;break;    //0x70  0000-0111 
         default:break;
       }                                          

        GPIOG->CRH&= 0x0FFFFFFF;    //将G口的CRH的28-31脚置零,其余都保持原样 
            GPIOG->CRH|= 0x80000000;    //除了G口的PIN15脚外(推挽输出),其余都保持原样 
GPIOB->CRL&=0x00000FFF;  //除了PIN3-5脚(推挽输出),pin6-7脚上啦输入,pin0-2都保持原样 
GPIOB->CRL|=0x88333000;  //除了PIN3-5脚(推挽输出),pin6-7脚上啦输入,pin0-2都保持原样 
GPIOB->CRH&=0xFFFFFF00;   //除了PIN8-9脚上拉输入,其余都保持原样 
GPIOB->CRH|=0x00000088;   //除了PIN8-9脚上拉输入,其余都保持原样 
delay_us(1);
GPIOG->ODR&= 0x7FFF;  //0xxx xxxx xxxx xxxx G口PIN15输出0,其余保持原样
GPIOG->ODR|= 0x0000;  //0xxx xxxx xxxx xxxx G口PIN15输出0,其余保持原样
            GPIOB->ODR&= 0xFc07;  //1111 1100 0000 0111 B口PIN3-5清0,6-9清0其余保持原样
GPIOB->ODR|= 0x03c;  //0000 0011 1100 0000 B口PIN3-5输出0,6-9输出1,其余保持原样
delay_ms(2);
cord_l = GPIOB->IDR&0x03C0;  //读入列线值    0000 0011 1100 0000
delay_us(1);
cord_l>>=2;
  switch(cord_l)
  {
     case 0x00e0:j=0;break;
     case 0x00d0:j=1;break;
     case 0x00b0:j=2;break;
     case 0x0070:j=3;break;
     default:break;
  }
            return (Key_Tab[j]);
}
}
return 0xFF;     //返回该值
}
回复

使用道具 举报

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2014-2-13
在线时间
98 小时
 楼主| 发表于 2014-8-28 22:11:09 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
网上的几篇帖子看了,没分析出是哪个问题,返回的键盘纸也不对
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-8-28 22:39:54 | 显示全部楼层
你用的我们的mini板?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2014-2-13
在线时间
98 小时
 楼主| 发表于 2014-8-29 11:31:03 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------用的旗舰版,搞了2个多月了,还是不入门啊
回复

使用道具 举报

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2014-2-13
在线时间
98 小时
 楼主| 发表于 2014-8-29 11:33:37 | 显示全部楼层
回复【6楼】bjtmh:
---------------------------------
想单步调试,可是J_link停不住,也不知怎么弄了
回复

使用道具 举报

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2014-2-13
在线时间
98 小时
 楼主| 发表于 2014-9-2 21:56:18 | 显示全部楼层
原来的问题基本解决,主要是不能用PB8脚,板子上的PB8是已被蜂鸣器的使用。修改后发现新问题:
板子直接运行程序,1,5,9键就不输出,其他键可以。但单步调试后,一切正常。而后再直接跑程序,也正常。关机后,板子上直接跑程序,问题就又出来了。
我猜测是哪块设的不对,但有不知如何查。代码如下,求高人指点
u8 check_Key(void)
{    
    u16 cord_h,cord_l;//行列值中间变量  高位为行 ,低位为列;
    u8 Val = 0xFF;
    u8 i=5,j=5;
    u8 const Key_Tab[4][4]= //键盘编码表  4x4
    {
    
      {'3','7','+','#'},
      {'2','6','.','*'},
      {'1','5','9','!'},
      {'0','4','8','-'}
    };
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOG,ENABLE);//使能PORTB,G功能时
    JTAG_Set(SWD_ENABLE);  //开启SWD
    GPIOG->CRH&= 0x0FFFFFFF;    //将G口的CRH的28-31脚置零,其余都保持原样
    GPIOG->CRH|= 0x80000000;         //G口的15脚上拉输入
    GPIOB->CRL&= 0x00000FFF;    //0000 0000 0000 0000 0000 1111 1111 1111 pin0-2都保持原样
    GPIOB->CRL|= 0x33888000;    //0011 0011 1000 1000 1000 0000 0000 0000除了PIN3-5脚上啦输入,pin6-7脚推挽输出,pin0-2都保持原样
    GPIOB->CRH&= 0xFFFFF00F;    //除了PIN9-10脚推挽输出,其余都保持原样     
    GPIOB->CRH|= 0x00000330;    //0000 0000 0000 0000 00000 0011 0011 0000 除了PIN9-10脚推挽输出,其余都保持原样    
    GPIOG->ODR&= 0x7FFF;            //GPIOG15为1
    GPIOG->ODR|= 0x8000;            //GPIOG15为1

    GPIOB->ODR&= 0xF907;            //1111 1001 0000 0111列线pin6-7,9-10脚输出全为0  
    GPIOB->ODR|= 0x0038;            //0000 0000 0011 1000列线pin6-7,9-10脚输出全为0 ,3-5脚为1

    cord_h = (GPIOG->IDR & 0x8000)>>15;     //读入行线G口PIN15值   //1000 0000 0000 0000
    cord_h = cord_h + ((GPIOB->IDR & 0x0038)>>2);     //读入行线B口PIN3-5值   //0000 0000 0011 1000
    if(cord_h != 0x000F)    //先检测有无按键按下     //1000 0000 0011 1000     GPIOG15....GPIOB3-5  
    {
        //Delay_Nms(100);        //去抖
          delay_ms(10);//去抖动
        cord_h = (GPIOG->IDR & 0x8000)>>15;     //读入行线G口PIN15值   //1000 0000 0000 0000
        cord_h = cord_h + ((GPIOB->IDR & 0x0038)>>2);     //读入行线B口PIN3-5值   //0000 0000 0011 1000
        if(cord_h != 0x000F)  // 1000 0000 0011 1000
        {    
        
           switch(cord_h)
           {
             case 0x000e:i=0;break;   //0x0e  0000_1110
             case 0x000d:i=1;break; //0x0d  0000_1101
             case 0x000b:i=2;break; //0xb0  0000_1011
             case 0x0007:i=3;break;    //0x70  0000-0111
             default:break;
           }                                         
            GPIOG->CRH&= 0x0FFFFFFF;    //将G口的CRH的28-31脚置零,其余都保持原样
            GPIOG->CRH|= 0x30000000;    //除了G口的PIN15脚外(推挽输出),其余都保持原样
            GPIOB->CRL&= 0x00000FFF;  //除了PIN3-5脚(推挽输出),pin6-7脚上啦输入,pin0-2都保持原样
            GPIOB->CRL|= 0x88333000;  //除了PIN3-5脚(推挽输出),pin6-7脚上啦输入,pin0-2都保持原样
            GPIOB->CRH&= 0xFFFFF00F;   //除了PIN9-10脚上拉输入,其余都保持原样
            GPIOB->CRH|= 0x00000880;   //除了PIN9-10脚上拉输入,其余都保持原样
            GPIOG->ODR&= 0x7FFF;  //0xxx xxxx xxxx xxxx G口PIN15输出0,其余保持原样
            GPIOG->ODR|= 0x0000;  //0xxx xxxx xxxx xxxx G口PIN15输出0,其余保持原样
            GPIOB->ODR&= 0xF907;  //1111 1001 0000 0111 B口PIN3-5清0,6-7,9-10清0其余保持原样
            GPIOB->ODR|= 0x06c0;  //0000 0110 1100 0000  B口PIN3-5输出0,6-7,9-10输出1,其余保持原样
            delay_ms(2);// 此延时比不可少;
            cord_l = (GPIOB->IDR&0x0600)>>3;  //读入列线值 取出GPIOB的9-10   0000 0110 1100 0000
            cord_l=cord_l|((GPIOB->IDR&0x00C0)>>2);        // 取出GPIOB的6-7
              switch(cord_l)
              {
                 case 0x00e0:j=0;break;
                 case 0x00d0:j=1;break;
                 case 0x00b0:j=2;break;
                 case 0x0070:j=3;break;
                 default:break;
              }
            return (Key_Tab[j]);

        }
    }
    return 0xFF;     //返回该值
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-2 14:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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