打印
[STM32F1]

为什么无法关闭JTAG功能

[复制链接]
2202|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gdszzyq|  楼主 | 2015-5-23 17:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想使用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配置最后做,用库也一样。

使用特权

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

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

使用特权

评论回复
6
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; 有什么区别呢

使用特权

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

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

使用特权

评论回复
8
戈卫东| | 2015-5-23 20:15 | 只看该作者
用库吧,SWJ的最后做,应该没有问题。

使用特权

评论回复
9
gdszzyq|  楼主 | 2015-5-23 20:26 | 只看该作者
戈卫东 发表于 2015-5-23 20:15
用库吧,SWJ的最后做,应该没有问题。

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

使用特权

评论回复
10
戈卫东| | 2015-5-23 20:28 | 只看该作者
如果还有其他有关AFIO->MAPR的操作,要把SWJ配置放最后

使用特权

评论回复
评论
gdszzyq 2015-5-23 20:57 回复TA
为什么我直接赋值就行了,AFIO->MAPR=0x04000000;能不能给讲解下什么原因,谢谢了 
11
gdszzyq|  楼主 | 2015-5-23 20:33 | 只看该作者
没有其它有关AFIO->MAPR的操作,只有这个关闭SWJ的操作,我用CUBE生成的代码也不能关闭SWJ,会是硬件问题吗

使用特权

评论回复
12
gdszzyq|  楼主 | 2015-5-23 20:38 | 只看该作者
我刚才试过对寄存器直接赋值也不行:AFIO->MAPR=0x04000000;

使用特权

评论回复
13
gdszzyq|  楼主 | 2015-5-23 20:48 | 只看该作者
不好意思,直接赋值是可以的,刚才赋值语句这句忘记屏蔽了AFIO->MAPR|=temp;       //设置jtag模式

使用特权

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

使用特权

评论回复
15
戈卫东| | 2015-5-23 21:58 | 只看该作者
直接赋值就完全不考虑原来的信息,所以不会出问题。

使用特权

评论回复
16
gdszzyq|  楼主 | 2015-5-23 22:34 | 只看该作者
戈卫东 发表于 2015-5-23 21:58
直接赋值就完全不考虑原来的信息,所以不会出问题。

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

使用特权

评论回复
17
戈卫东| | 2015-5-23 22:35 | 只看该作者
gdszzyq 发表于 2015-5-23 22:34
谢谢你,我查了半天发现原来是temp

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

使用特权

评论回复
18
gdszzyq|  楼主 | 2015-5-23 22:53 | 只看该作者
戈卫东 发表于 2015-5-23 22:35
库函数应该可以。难道你没有使能AFIO时钟?

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

使用特权

评论回复
19
xyz549040622| | 2015-5-24 11:18 | 只看该作者
没有全部的代码,各种猜

使用特权

评论回复
20
yjmwxwx| | 2015-5-24 12:48 | 只看该作者
位带直接往这三个位写0

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

320

帖子

3

粉丝