1. 程式人生 > 實用技巧 >4- stm32 gpio重對映

4- stm32 gpio重對映

stm32 的PA15, PB3, PB4管腳做普通管腳的解決辦法:

使用的是SWD方式進行下載程式,僅僅使用到SWDIO(PA13) 和SWCLK(PA14)兩個管腳。我將PA15(JTDI)和PB3(JTDO)管腳用於他用(用於點LED使用),發現無法將這兩個管腳拉低:

我在網上搜到PA15,PB3,PB4這幾個管腳預設功能不是普通管腳,需要進行重對映後,才能普通使用

解決辦法:

    GPIO_InitTypeDef GPIO_InitStructus;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//RCC_APB2Periph_AFIO必須開啟
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//改變對映(失能JTAG) 
    
    GPIO_InitStructus.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructus.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructus.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructus);
    
    
    GPIO_InitStructus.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructus.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructus.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructus);
    GPIO_SetBits(GPIOB,LED2);

其中:GPIO_Remap_SWJ_JTAGDisable 改變管腳對映(失能JTAG功能)

GPIO_Remap_SWJ_NoJTRST : Full SWJ Enabled (JTAG-DP + SW-DP) but without JTRST

GPIO_Remap_SWJ_Disable : Full SWJ Disabled (JTAG-DP + SW-DP)

什麼時候需要開復用時鐘,RCC_APB2Periph_AFIO:

(1)使用EXTI

(2)重對映(用到外設的重對映功能時才需要使能AFIO的時鐘)

舉例:重對映USART2

USART2的TX/RX在PA.2/3.但是,PA.2已經被Timer2的channel3使用.這時,如果還想使用USART2,但又不想影響Timer2的使用,這就需要把USART2的TX/RX重對映到PD.5/6。

對映庫函式的呼叫過程

(1)使能被重新對映到的I/O埠時鐘

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);

(2)使能被重新對映的外設時鐘

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

(3)使能AFIO功能的時鐘(勿忘!)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

(4)進行重對映

GPIO_PinRemapConfig(GPIO_Remap_USART2,ENABLE);