STM32F4開發板快速入門—-GPIO篇
GPIO
設置輸入/出總共8種模式
* 輸入浮空,輸入上拉,輸入下拉,模擬輸入。
* 開漏輸出,推挽輸出,推挽復用共功能,開漏復用功能
模式選擇的話,一般得看具體電路了,具體看輸入的信號,比如接低電平信號,上拉成高電平,接高電平信號下拉成低電平。
初始化參數
/**
* @brief GPIO Init structure definition
*/
typedef struct
{
uint32_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOOType_TypeDef GPIO_OType; /*!< Specifies the operating output type for the selected pins.
This parameter can be a value of @ref GPIOOType_TypeDef */
GPIOPuPd_TypeDef GPIO_PuPd; /*!< Specifies the operating Pull-up/Pull down for the selected pins.
This parameter can be a value of @ref GPIOPuPd_TypeDef */
}GPIO_InitTypeDef;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
初始化實例,設置GPIOF.9|10普通輸出模式
推挽輸出,速度為100MHz,上拉,同時引腳置高
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//ê使能GPIOF時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通輸出模式1
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10引腳置高
1
2
3
4
5
6
7
8
9
10
11
12
13
相關所有的庫函數
/* Function used to set the GPIO configuration to the default reset state ****/
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
/* Initialization and Configuration functions *********************************/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
/* GPIO Read and Write functions **********************************************/
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
/* GPIO Alternate functions configuration function ****************************/
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);
設置高低電平語句
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
GPIO_SetBits(GPIOA, GPIO_Pin_5); //GPIOA.5=1,置位高電平·;
void GPIO_ResetBits(GPIOA, GPIO_Pin_5); //GPIOA.5=0,置位低電平;
或者按照這種模式
//IO操作,只對單一IO口
//確保n的值小于16
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //輸出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //輸入
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //輸出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //輸出
設置實例對比
/*下面方式是直接操作庫函數方式讀取IO*/
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //PE4
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) //PE3
#define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) //PE2
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) //PA0
下面是直接同為位帶操作讀取IO
/*
#define KEY0 PEin(4) //PE4
#define KEY1 PEin(3) //PE3
#define KEY2 PEin(2) //P32
#define WK_UP PAin(0) //PA0
*/
按鍵處理,矩陣鍵盤
對于按鍵,使用讀函數
邏輯分析
//支持連續按下
void key_scan(){
if(key按下){
return 按鍵按下
}else
return 按鍵沒有按下
}
//不支持連續按下
void key_scan(){
static u8 key_up=1;//記錄上次狀態,初始化松開
if(key按下){
if(key_up=1)//松開了,按鍵有效
return 按鍵按下
else
return 按鍵松開
key_up=0
}else
key_up=1;//松開
}
實例對比
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按鍵松開標志
if(mode)key_up=1; //支持連按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);//去抖動
key_up=0;
if(KEY0==0)return 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(WK_UP==1)return 4;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0;// 無按鍵按下
}
矩陣鍵盤的話
u8 KEY_Scan(u8 mode) //mode=0 ????? mode=1
{
if(mode)key_up=1;
GPIO_SetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
if(key_up && GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15)==1)
{
delay_ms(10);//去抖動
key_up=0;
GPIO_SetBits(GPIOD,GPIO_Pin_8);
GPIO_ResetBits(GPIOD,GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 1;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 2;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 3;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 4;
GPIO_SetBits(GPIOD,GPIO_Pin_9);
GPIO_ResetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_11);
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 5;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 6;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 7;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 8;
GPIO_SetBits(GPIOD,GPIO_Pin_10);
GPIO_ResetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_11);
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 9;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 10;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 11;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 12;
GPIO_SetBits(GPIOD,GPIO_Pin_11);
GPIO_ResetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10);
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 13;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 14;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 15;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 16;
}
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==0&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==0&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==0&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==0)
key_up=1;
return 0;
}
上一篇:STM32F4開發板----串口(002)
下一篇:HAL庫教程14:查表法測量NTC熱敏電阻
推薦閱讀
史海拾趣
千志電子一直注重技術研發和創新,不斷推動產業升級。公司擁有一支專業的研發團隊和先進的研發設備,致力于電阻技術的研發和創新。通過與高校和科研機構的合作,千志電子不斷引進新技術、新工藝和新材料,提高產品的技術含量和附加值。同時,千志電子還注重知識產權的保護和管理,積極申請專利和注冊商標,維護了自身的合法權益。
千志電子一直注重技術研發和創新,不斷推動產業升級。公司擁有一支專業的研發團隊和先進的研發設備,致力于電阻技術的研發和創新。通過與高校和科研機構的合作,千志電子不斷引進新技術、新工藝和新材料,提高產品的技術含量和附加值。同時,千志電子還注重知識產權的保護和管理,積極申請專利和注冊商標,維護了自身的合法權益。
千志電子一直注重技術研發和創新,不斷推動產業升級。公司擁有一支專業的研發團隊和先進的研發設備,致力于電阻技術的研發和創新。通過與高校和科研機構的合作,千志電子不斷引進新技術、新工藝和新材料,提高產品的技術含量和附加值。同時,千志電子還注重知識產權的保護和管理,積極申請專利和注冊商標,維護了自身的合法權益。
隨著公司規模的擴大,Baton Lock意識到單一市場已無法滿足其增長需求。于是,公司開始在全球范圍內尋找合作伙伴和設立生產基地。通過在歐洲、亞洲等地建立分支機構,Baton Lock成功打開了多個新市場,進一步提升了其品牌影響力。
在追求商業成功的同時,Codeco也積極履行企業社會責任。他們注重環保和可持續發展,在生產過程中采用環保材料和技術,減少對環境的影響。此外,Codeco還積極參與公益事業,為社會做出貢獻。這些舉措不僅提升了公司的社會形象,也贏得了員工和消費者的尊重與認可。
您可以根據這個框架,結合您對電子行業和Codeco Corporation Of Vermont的了解,撰寫具體的故事內容。請注意,這些故事應基于事實或合理的推測,避免涉及未經證實的信息或夸大其詞的描述。
本帖最后由 jameswangsynnex 于 2015-3-3 19:59 編輯 據iSuppli公司,消費電子(CE)產業正在進入連接無處不在的新時代,刺激裝備高帶寬無線視頻接口解決方案的視頻導向CE設備蓬勃發展?! Suppli公司預測,2014年具有高帶寬無線視頻接口的支持視 ...… 查看全部問答∨ |
|
我是學國際經濟與貿易的的,以前沒學過電子,由于工作中的需要,想了解CCL和FR-4方面的知識,請問在網上哪里能夠找到這方面的知識???另外有哪些書或資料有講解啊? 我是學國際經濟與貿易的的,以前沒學過電子,由于工作中的需要,想了解CCL和FR-4方面的知識,請問在網上哪里能夠找到這方面的知識???另外有哪些書或資料有講解?。俊? 查看全部問答∨ |
|