GPIO 引腳號定義 #define GPIO_Pin_0 ((uint16_t)0x0001) /*!< 選擇Pin0 */ //(00000000 00000001)b #define GPIO_Pin_1 ((uint16_t)0x0002) /*!< 選擇Pin1 */ //(0000000 ...
GPIO 引腳號定義
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< 選擇Pin0 */ //(00000000 00000001)b
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< 選擇Pin1 */ //(00000000 00000010)b
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< 選擇Pin2 */ //(00000000 00000100)b
#define GPIO_Pin_3 ((uint16_t)0x0008) /*!< 選擇Pin3 */ //(00000000 00001000)b
#define GPIO_Pin_4 ((uint16_t)0x0010) /*!< 選擇Pin4 */ //(00000000 00010000)b
#define GPIO_Pin_5 ((uint16_t)0x0020) /*!< 選擇Pin5 */ //(00000000 00100000)b
#define GPIO_Pin_6 ((uint16_t)0x0040) /*!< 選擇Pin6 */ //(00000000 01000000)b
#define GPIO_Pin_7 ((uint16_t)0x0080) /*!< 選擇Pin7 */ //(00000000 10000000)b
#define GPIO_Pin_8 ((uint16_t)0x0100) /*!< 選擇Pin8 */ //(00000001 00000000)b
#define GPIO_Pin_9 ((uint16_t)0x0200) /*!< 選擇Pin9 */ //(00000010 00000000)b
#define GPIO_Pin_10 ((uint16_t)0x0400) /*!< 選擇Pin10 */ //(00000100 00000000)b
#define GPIO_Pin_11 ((uint16_t)0x0800) /*!< 選擇Pin11 */ //(00001000 00000000)b
#define GPIO_Pin_12 ((uint16_t)0x1000) /*!< 選擇Pin12 */ //(00010000 00000000)b
#define GPIO_Pin_13 ((uint16_t)0x2000) /*!< 選擇Pin13 */ //(00100000 00000000)b
#define GPIO_Pin_14 ((uint16_t)0x4000) /*!< 選擇Pin14 */ //(01000000 00000000)b
#define GPIO_Pin_15 ((uint16_t)0x8000) /*!< 選擇Pin15 */ //(10000000 00000000)b
#define GPIO_Pin_All ((uint16_t)0xFFFF) /*!< 選擇全部引腳*/ //(11111111 11111111)b
定義 GPIO 初始化結構體
typedef struct {
uint16_t GPIO_Pin; /*!< 選擇要配置的 GPIO 引腳 */
uint16_t GPIO_Speed; /*!< 選擇 GPIO 引腳的速率 */
uint16_t GPIO_Mode; /*!< 選擇 GPIO 引腳的工作模式 */
} GPIO_InitTypeDef;
GPIO 枚舉類型定義
typedef enum
{ GPIO_Mode_AIN = 0x0, // 模擬輸入 (0000 0000)b
GPIO_Mode_IN_FLOATING = 0x04, // 浮空輸入 (0000 0100)b
GPIO_Mode_IPD = 0x28, // 下拉輸入 (0010 1000)b
GPIO_Mode_IPU = 0x48, // 上拉輸入 (0100 1000)b
GPIO_Mode_Out_OD = 0x14, // 開漏輸出 (0001 0100)b
GPIO_Mode_Out_PP = 0x10, // 推輓輸出 (0001 0000)b
GPIO_Mode_AF_OD = 0x1C, // 復用開漏輸出 (0001 1100)b
GPIO_Mode_AF_PP = 0x18 // 復用推輓輸出 (0001 1000)b
}GPIOMode_TypeDef;
給 GPIO_InitTypeDef 初始化結構體賦值範例
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIO 埠初始化 */
/*選擇要控制的 GPIO 引腳*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
/*設置引腳模式為輸出模式*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*設置引腳的輸出類型為推輓輸出*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO 初始化函數
GPIO_InitTypeDef GPIO_InitStructure;
/* GPIO 埠初始化 */
/*選擇要控制的 GPIO 引腳*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
/*設置引腳模式為輸出模式*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*設置引腳的輸出類型為推輓輸出*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
{
uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
uint32_t tmpreg = 0x00, pinmask = 0x00;
/*---------------------- GPIO 模式配置 --------------------------*/
// 把輸入參數GPIO_Mode的低四位暫存在currentmode
currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
// bit4是1表示輸出,bit4是0則是輸入
// 判斷bit4是1還是0,即首選判斷是輸入還是輸出模式
if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
{
// 輸出模式則要設置輸出速度
currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
}
/*-------------GPIO CRL 寄存器配置 CRL寄存器控制著低8位IO- -------*/
// 配置埠低8位,即Pin0~Pin7
if (((uint32_t)GPIO_InitStruct->GPIO_Pin & ((uint32_t)0x00FF)) != 0x00)
{
// 先備份CRL寄存器的值
tmpreg = GPIOx->CRL;
// 迴圈,從Pin0開始配對,找出具體的Pin
for (pinpos = 0x00; pinpos < 0x08; pinpos++)
{
// pos的值為1左移pinpos位
pos = ((uint32_t)0x01) << pinpos;
// 令pos與輸入參數GPIO_PIN作位與運算,為下麵的判斷作准備
currentpin = (GPIO_InitStruct->GPIO_Pin) & pos;
//若currentpin=pos,則找到使用的引腳
if (currentpin == pos)
{
// pinpos的值左移兩位(乘以4),因為寄存器中4個寄存器位配置一個引腳
pos = pinpos << 2;
//把控制這個引腳的4個寄存器位清零,其它寄存器位不變
pinmask = ((uint32_t)0x0F) << pos;
tmpreg &= ~pinmask;
// 向寄存器寫入將要配置的引腳的模式
tmpreg |= (currentmode << pos);
// 判斷是否為下拉輸入模式
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
{
// 下拉輸入模式,引腳預設置0,對BRR寄存器寫1可對引腳置0
GPIOx->BRR = (((uint32_t)0x01) << pinpos);
}
else
{
// 判斷是否為上拉輸入模式
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
{
// 上拉輸入模式,引腳預設值為1,對BSRR寄存器寫1可對引腳置1
GPIOx->BSRR = (((uint32_t)0x01) << pinpos);
}
}
}
}
// 把前面處理後的暫存值寫入到CRL寄存器之中
GPIOx->CRL = tmpreg;
}
/*-------------GPIO CRH 寄存器配置 CRH寄存器控制著高8位IO- -----------*/
// 配置埠高8位,即Pin8~Pin15
if (GPIO_InitStruct->GPIO_Pin 0x00FF)
{
// // 先備份CRH寄存器的值
tmpreg = GPIOx->CRH;
// 迴圈,從Pin8開始配對,找出具體的Pin
for (pinpos = 0x00; pinpos < 0x08; pinpos++)
{
pos = (((uint32_t)0x01) << (pinpos + 0x08));
// pos與輸入參數GPIO_PIN作位與運算
currentpin = ((GPIO_InitStruct->GPIO_Pin) & pos);
//若currentpin=pos,則找到使用的引腳
if (currentpin == pos)
{
//pinpos的值左移兩位(乘以4),因為寄存器中4個寄存器位配置一個引腳
pos = pinpos << 2;
//把控制這個引腳的4個寄存器位清零,其它寄存器位不變
pinmask = ((uint32_t)0x0F) << pos;
tmpreg &= ~pinmask;
// 向寄存器寫入將要配置的引腳的模式
tmpreg |= (currentmode << pos);
// 判斷是否為下拉輸入模式
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPD)
{
// 下拉輸入模式,引腳預設置0,對BRR寄存器寫1可對引腳置0
GPIOx->BRR = (((uint32_t)0x01) << (pinpos + 0x08));
}
// 判斷是否為上拉輸入模式
if (GPIO_InitStruct->GPIO_Mode == GPIO_Mode_IPU)
{
// 上拉輸入模式,引腳預設值為1,對BSRR寄存器寫1可對引腳置1
GPIOx->BSRR = (((uint32_t)0x01) << (pinpos + 0x08));
}
}
}
// 把前面處理後的暫存值寫入到CRH寄存器之中
GPIOx->CRH = tmpreg;
}
}