野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13801|回复: 5

库函数GPIO_PinRemapConfig 不能关闭JTAG口【已解决】

[复制链接]
发表于 2015-12-24 12:33:19 | 显示全部楼层 |阅读模式
本帖最后由 wxyz 于 2015-12-28 12:41 编辑

先开启PA口和PB口的时钟,用库函数GPIO_PinRemapConfig ( GPIO_Remap_SWJ_JTAGDisable, ENABLE )关闭JTAG功能,保留SWD功能。但PA15,PB3和PB4还是不能配置为普通I/O口。

用下面原子论坛的代码,寄存器操作, JTAG模式配置正确。关闭JTAG功能,保留SWD功能,操作成功。
// JTAG_Set: 用于设置JTAG模式
// JTAG_mode: jtag/swd模式设置: 00,全使能; 01,使能SWD; 10,全关闭;   
// #define JTAG_SWD_DISABLE   0X02          // 10,全关闭;   
// #define SWD_ENABLE         0X01          // 01,使能SWD
// #define JTAG_SWD_ENABLE    0X00          // 00,全使能
void JTAG_Set(uint8_t JTAG_mode)
{
  uint32_t temp_mode;
  temp_mode = JTAG_mode;
  temp_mode<<=25;           // 左移25位
  RCC->APB2ENR|=1<<0;      // 开启辅助时钟   
  AFIO->MAPR&=0XF8FFFFFF;  // 清除MAPR的[26:24] ( = SWJ_CFG[2:0] )
  AFIO->MAPR|=temp_mode;        // 设置jtag模式
}
调用 JTAG_Set(SWD_ENABLE);   //  PA15,PB3和PB4成功配置为普通I/O口。PA13,PA14为SWD口。
不明白库函数GPIO_PinRemapConfig ( GPIO_Remap_SWJ_JTAGDisable, ENABLE )关闭JTAG功能,保留SWD功能,为什么无效?
------------------------

不用开启PA口和PB口时钟,只开启AFIO时钟,经过实际测试,设置成功。
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE);               //  开启复用时钟,才能执行重映射功能,设置JTAG模式操作        
     GPIO_PinRemapConfig ( GPIO_Remap_SWJ_JTAGDisable, ENABLE );  //  PA13和PA14设置为SWD接口专用,释放PA15,PB3和PB4,作为普通IO口。


回复

使用道具 举报

发表于 2015-12-24 12:48:23 | 显示全部楼层
没搞过  帮顶                  
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-25 12:39:20 | 显示全部楼层
可能是原因是:
在操作JTAG的I/O时,操作AFIO_MAPR寄存器[26:24]位,可以禁止JTAG功能。 辅助时钟只有开启才能使用复用功能。使用AFIO的重映射功能,需要开启AFIO的时钟。关闭JTAG其实是执行重映射,所以需要开启AFIO辅助时钟,即开启 RCC_APB2Periph_AFIO复用时钟。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-28 12:38:16 | 显示全部楼层
不用开启PA口和PB口时钟,只开启AFIO时钟,经过实际测试,设置成功。
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE);               //  开启复用时钟,才能执行重映射功能,设置JTAG模式操作       
    GPIO_PinRemapConfig ( GPIO_Remap_SWJ_JTAGDisable, ENABLE );  //  PA13和PA14设置为SWD接口专用,释放PA15,PB3和PB4,作为普通IO口。
回复 支持 反对

使用道具 举报

发表于 2016-1-8 12:06:19 | 显示全部楼层
wxyz 发表于 2015-12-28 12:38
不用开启PA口和PB口时钟,只开启AFIO时钟,经过实际测试,设置成功。
    RCC_APB2PeriphClockCmd( RCC_ ...

我现在用的就是这个,但是换个程序就出现问题了
int main(void)
{       
         GPIO_LED_Configuration();         
   RCC_Configuration();

        while (1)
        {
                LED1_ON;
                 LED3_ON;       
                LED4_ON;               
                LED5_ON;                         
                LED6_ON;                          
                LED7_ON;                         
                delay_ms(100);
                LED1_OFF;                  
                LED3_OFF;                  
                LED4_OFF;                        
                LED5_OFF;                        
                LED6_OFF;                          
                LED7_OFF;                        
                delay_ms(100);

        }

}
#define PORT_LED1  GPIOA  
#define PIN_LED1   GPIO_Pin_0

#define PORT_LED3  GPIOB  
#define PIN_LED3   GPIO_Pin_0

#define PORT_LED4  GPIOC  
#define PIN_LED4   GPIO_Pin_13

#define PORT_LED5  GPIOC
#define PIN_LED5   GPIO_Pin_14

#define PORT_LED6  GPIOC  
#define PIN_LED6   GPIO_Pin_15

#define PORT_LED7  GPIOA  
#define PIN_LED7   GPIO_Pin_15

#define LED1_ON    GPIO_SetBits(PORT_LED1, PIN_LED1)
#define LED1_OFF   GPIO_ResetBits(PORT_LED1, PIN_LED1)

#define LED3_ON    GPIO_SetBits(PORT_LED3, PIN_LED3)
#define LED3_OFF   GPIO_ResetBits(PORT_LED3, PIN_LED3)

#define LED4_ON    GPIO_SetBits(PORT_LED4, PIN_LED4)
#define LED4_OFF   GPIO_ResetBits(PORT_LED4, PIN_LED4)

#define LED5_ON    GPIO_SetBits(PORT_LED5, PIN_LED5)
#define LED5_OFF   GPIO_ResetBits(PORT_LED5, PIN_LED5)

#define LED6_ON    GPIO_SetBits(PORT_LED6, PIN_LED6)
#define LED6_OFF   GPIO_ResetBits(PORT_LED6, PIN_LED6)

#define LED7_ON    GPIO_SetBits(PORT_LED7, PIN_LED7)
#define LED7_OFF   GPIO_ResetBits(PORT_LED7, PIN_LED7)


void GPIO_LED_Configuration(void);
void RCC_Configuration(void);

void GPIO_LED_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);  
  RCC_Configuration();

        GPIO_InitStructure.GPIO_Pin = PIN_LED1 ;                  
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(PORT_LED1, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = PIN_LED3 ;
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(PORT_LED3, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = PIN_LED4 ;
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(PORT_LED4, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = PIN_LED5 ;
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(PORT_LED5, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = PIN_LED6 ;
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(PORT_LED6, &GPIO_InitStructure);
       
       
        GPIO_InitStructure.GPIO_Pin = PIN_LED7 ;
  GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(PORT_LED7, &GPIO_InitStructure);
}
void RCC_Configuration(void)
{
        SystemInit();       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA
                           |RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC
                           |RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE
                                                               |RCC_APB2Periph_ADC1  | RCC_APB2Periph_AFIO
                           |RCC_APB2Periph_SPI1, ENABLE );
  // RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL ,ENABLE );
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4
                           |RCC_APB1Periph_USART3|RCC_APB1Periph_TIM2                                  
                           , ENABLE );
         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-11 12:22:05 | 显示全部楼层
本帖最后由 wxyz 于 2016-1-11 12:25 编辑

我现在用的就是这个,但是换个程序就出现问题了
int main(void)
{        
          GPIO_LED_Configuration();         
    RCC_Configuration();

         while (1)

.........



void GPIO_LED_Configuration(void)
{
         GPIO_InitTypeDef GPIO_InitStructure;
   GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);  
   RCC_Configuration();

。。。。。。



================
把RCC配置和GPIO配置的顺序调换试试。
     
    RCC_Configuration();
    GPIO_LED_Configuration();

   
   RCC_Configuration();
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);  
   
先配置RCC,后配置GPIO




回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 06:23 , Processed in 0.056205 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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