welcom ! Handel home

2014年6月17日 星期二

  以下是STM32F10x晶片GPIO/AFIO埠配置詳細介紹
1介紹
STM32F10x晶片的GPIO/AFIO配置主要包括以下幾方面知識:在時鐘控制模組中配置好相應匯流排時鐘,並在匯流排上使能對應的GPIO口(AFIO口,需要的話)時鐘後:根據需求配置相應GPIO埠為對應的輸入/輸出模式,按需求更改/讀取埠的資料;埠功能重映射;若用外部中斷,則將中斷線與對應引腳連結起來。
STM32F10x晶片的每個GPIO埠都有7個相關的寄存器:232位元配置寄存器(GPIOx_CRL,GPIOx_CRH),兩個32位元資料寄存器(GPIOx_IDR,GPIOx_ODR),一個32位置位/復位寄存器(GPIOx_BSRR),一個16位復位寄存器(GPIOx_BRR)和一個32位鎖定寄存器(GPIOx_LCKR)。每個I/O埠都可以設置成如下模式:
?         輸入浮空 GPIO_Mode_IN_FLOATING
?         輸入上拉 GPIO_Mode_IPU
?         輸入下拉 GPIO_Mode_IPD
?         模擬輸入 GPIO_Mode_AIN
?         開漏輸出 GPIO_Mode_Out_OD
?         推免式輸出 GPIO_Mode_Out_PP
?         推免式複用功能 GPIO_Mode_AF_PP
?         開漏複用功能 GPIO_Mode_AF_OD

2GPIO寄存器描述
l         埠配置低寄存器(GPIOx_CRL(x=A…E)
l         埠配置高寄存器(GPIOx_CRH(x=A…E)
l         埠輸入資料寄存器(GPIOx_IDR(x=A…E)
l         埠輸出資料寄存器(GPIOx_ODR(x=A…E)
l         埠位設置/清除寄存器(GPIOx_BSRR(x=A…E)
l         埠位清除寄存器(GPIOx_BRR(x=A…E)
l         埠配置鎖定寄存器(GPIOx_LCKR(x=A…E)

3AFIO寄存器描述
l         事件控制寄存器(AFIO_EVCR):控制內部時間輸出到相應引腳
l         複用重映射和調試I/O配置寄存器(AFIO_MAPR
l         外部中斷配置寄存器(AFIO_EXTICRx(x=1…4):設置埠為中斷線(將埠與中端線連接)
       注意:對寄存器AFIO_EVCRAFIO_MAPRAFIO_EXTICRX進行讀寫操作前,應當首先打開AFIO的時鐘。

4GPIO操作流程
l         首先定義GPIO_InitTypeDef類型變數;
l         然後調用RCC_APB2PeriphClockCmd()函數使能相應的GPIOx埠(所有GPIO埠都掛載到APB2匯流排上的)時鐘。注意使能GPIOx埠時鐘的函數必須在GPIO埠配置函數之前調用,否則GPIO埠會初始化不成功:;
l         調用GPIO_DeInit()初始化要使用的GPIOx埠對應寄存器為預設值;
l         調用GPIO_StructInit()函數初始化前面定義的GPIO_InitTypeDef類型變數到缺省值;
l         按需求初始化GPIO_InitTypeDef類型變數,然後調用GPIO_Init()函數實現初始化;
l         然後就可以對相應的埠進行操作了:讀/寫,或配置為複用功能(相應函數查看固件庫)。
注意:
1、系統重定和剛重定後,複用功能未開啟,I/O埠被配置成浮空輸入模式(CNFx[1:0]=01b,MODEx[1:0]=00b)。復位後,JTAG引腳被置於輸入上拉或下拉模式:
         PA15:JTDI置於上拉模式;
         PA14:JTCK置於下拉模式;
         PA13:JTMS置於上拉模式;
         PB4:JNTRST置於上拉模式;
因此要使用JTAG調試介面作為通用GPIO口使用,則必須遮罩JTAG複用功能。具體實現為先調用RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE)使能AFIO時鐘,然後調用GPIO_PinRemapConfig(GPIO_Remap_SWJ_XXXX,ENABLE)關閉JTAG的調試複用功能;
2、當把埠配置成複用輸出功能時,則引腳和輸出寄存器斷開,並和片上外設的輸出信號連接;但如果沒有啟動對應外設,則其輸出將不確定;
3當使用外部中斷或事件事,首先按照上面幾步配置GPIO埠(輸入),然後調用函數:GPIO_EXTILineConfig()將引腳與對應的中斷線連結起來,然後在配置NVIC使能對應的中斷通道,最後編寫中斷處理函數。

5GPIO操作例子
[ext1:]
u16 Val = 1;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_Configuration();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
GPIO_Write(GPIOB,0xffff);
while(1)
{
    GPIO_Write(GPIOB, ~Val);
    Delay(0x2FFFFF);
    if(Val == 0x8000) Val = 1;
    else Val<<=1;
}


沒有留言: