21ic电子技术开发论坛

标题: 为什么无法关闭JTAG功能 [打印本页]

作者: gdszzyq    时间: 2015-5-23 17:45
标题: 为什么无法关闭JTAG功能
我想使用PA13\PA14\PB3\PB4端口,无论用库函数还是寄存器方式都无法关闭SWJ功能,还有哪里需要设置吗?
库函数代码:
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//SWJ完全关闭  
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_14;        //LED0-->PA.14 端口配置
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz
   GPIO_Init(GPIOA, &GPIO_InitStructure);        //根据设定参数初始化GPIOA

寄存器方式:
void JTAG_Set(u8 mode)   //mode设置为0x4(完全关闭SWJ)
{
u32 temp;
temp=mode;
temp<<=25;
RCC->APB2ENR|=1<<0;     //开启辅助时钟            
AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]
AFIO->MAPR|=temp;       //设置jtag模式

   JTAG_Set(0x4);       
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_13;                 //LED0-->PA.13 端口配置
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
   GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA.8


作者: 戈卫东    时间: 2015-5-23 19:40
AFIO->MAPR|=temp;    /* 这里有问题 */
AFIO->MAPR的SWJ配置位是只写的,读的值未定义

作者: 戈卫东    时间: 2015-5-23 19:46
AFIO->MAPR = AFIO->MAPR & SWJ_MASK | SWJ_SETTING; 所有位一次写完---- 如果用寄存器,程序其他地方写这个寄存器也要注意这个问题,否则如果用了“读-修改-写”操作这个寄存器它的SWJ位可能是被破坏了的

作者: 戈卫东    时间: 2015-5-23 20:03
或者你保证SWJ配置最后做,用库也一样。

作者: gdszzyq    时间: 2015-5-23 20:10
戈卫东 发表于 2015-5-23 19:40
AFIO->MAPR|=temp;    /* 这里有问题 */
AFIO->MAPR的SWJ配置位是只写的,读的值未定义 ...

我没有读这个寄存器啊。而且官方的库函数版也是这样。

作者: gdszzyq    时间: 2015-5-23 20:11
戈卫东 发表于 2015-5-23 19:46
AFIO->MAPR = AFIO->MAPR & SWJ_MASK | SWJ_SETTING; 所有位一次写完---- 如果用寄存器,程序其他地方写这 ...

AFIO->MAPR|=temp;这句不也是一次写完的吗,与你的AFIO->MAPR = AFIO->MAPR & SWJ_MASK | SWJ_SETTING; 有什么区别呢

作者: 戈卫东    时间: 2015-5-23 20:13
gdszzyq 发表于 2015-5-23 20:11
AFIO->MAPR|=temp;这句不也是一次写完的吗,与你的AFIO->MAPR = AFIO->MAPR & SWJ_MASK | SWJ_SETTING;  ...

区别就是,SWJ那些位,我的不会含有从寄存器读来的值,你的有

作者: 戈卫东    时间: 2015-5-23 20:15
用库吧,SWJ的最后做,应该没有问题。

作者: gdszzyq    时间: 2015-5-23 20:26
戈卫东 发表于 2015-5-23 20:15
用库吧,SWJ的最后做,应该没有问题。

我用的就是库函数啊,搞不定才用寄存器的,SWJ的最后做是什么意思,请明示,是不是把关闭SWJ的语句放到最后?

作者: 戈卫东    时间: 2015-5-23 20:28
如果还有其他有关AFIO->MAPR的操作,要把SWJ配置放最后

评论

作者: gdszzyq 时间:2015-5-23 20:57
为什么我直接赋值就行了,AFIO->MAPR=0x04000000;能不能给讲解下什么原因,谢谢了 

作者: gdszzyq    时间: 2015-5-23 20:33
没有其它有关AFIO->MAPR的操作,只有这个关闭SWJ的操作,我用CUBE生成的代码也不能关闭SWJ,会是硬件问题吗

作者: gdszzyq    时间: 2015-5-23 20:38
我刚才试过对寄存器直接赋值也不行:AFIO->MAPR=0x04000000;

作者: gdszzyq    时间: 2015-5-23 20:48
不好意思,直接赋值是可以的,刚才赋值语句这句忘记屏蔽了AFIO->MAPR|=temp;       //设置jtag模式

作者: 戈卫东    时间: 2015-5-23 21:57
AFIO->MAPR|=temp;
这个语句是把寄存器读过来,做一个或运算,再写回去,它保留了寄存器原来的部分信息,而问题就出在这里,因为这个寄存器的SWJ域是只写的,读到的数据不知道是什么,因此保留它后果不可预知

作者: 戈卫东    时间: 2015-5-23 21:58
直接赋值就完全不考虑原来的信息,所以不会出问题。

作者: gdszzyq    时间: 2015-5-23 22:34
戈卫东 发表于 2015-5-23 21:58
直接赋值就完全不考虑原来的信息,所以不会出问题。

谢谢你,我查了半天发现原来是temp<<=24;这句出问题了,原来是移位25,从别人的例程里复制来的,而他的例程是赋值0x10,而我是按手册要求赋值为0x40导致出现这样的问题,但我还是不明白库函数为什么不行,这是官方的啊。

作者: 戈卫东    时间: 2015-5-23 22:35
gdszzyq 发表于 2015-5-23 22:34
谢谢你,我查了半天发现原来是temp

库函数应该可以。难道你没有使能AFIO时钟?

作者: gdszzyq    时间: 2015-5-23 22:53
戈卫东 发表于 2015-5-23 22:35
库函数应该可以。难道你没有使能AFIO时钟?

哦没想到这一层。都是复制别人的代码搞来的,忘记这回事了。总想着外设才要使能时钟,没想到寄存器也要。非常感谢。

作者: xyz549040622    时间: 2015-5-24 11:18
没有全部的代码,各种猜

作者: yjmwxwx    时间: 2015-5-24 12:48
位带直接往这三个位写0

ldr r0, = 0x422000E0
mov r1, # 0
str r1, [r0]
str r1, [r0, # 4]
str r1, [r0, # 8]

作者: 加油吧小鱼儿    时间: 2015-5-24 13:24
xyz549040622 发表于 2015-5-24 11:18
没有全部的代码,各种猜

各种猜,我猜我猜我猜猜猜





欢迎光临 21ic电子技术开发论坛 (https://bbs.21ic.com/)