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;
初始化實例,設置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引腳置高
相關所有的庫函數
/* 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)
下一篇:關于STM32精準采頻率的實現
推薦閱讀
史海拾趣
經過多年的發展,Holy Stone成為國內少數涵蓋主、被動雙通路并擁有制造工廠的多元化公司。公司不僅代理多家國際知名半導體零組件,還通過自主研發和生產,為客戶提供完整的解決方案及多樣性零組件。這一雙通路戰略使得Holy Stone能夠在激烈的市場競爭中保持領先地位,并成功實現全球布局。公司的產品廣泛應用于消費電子、汽車電子等多個領域,滿足了全球客戶的多樣化需求。
進入21世紀,電子行業的競爭日益激烈,鈺創科技意識到必須不斷進行技術創新才能保持競爭優勢。公司加大了研發投入,成功開發出了一系列先進的內存芯片和系統芯片技術。這些技術突破不僅提升了產品的性能和質量,也幫助公司贏得了更多國際客戶的認可和信任。
隨著環保意識的不斷提高,綠色環保已經成為電子行業的發展趨勢。EHC公司積極響應這一趨勢,致力于研發和生產綠色環保的電子產品。公司采用環保材料和工藝,減少生產過程中的污染排放。同時,EHC公司還積極推動廢舊電子產品的回收和再利用工作,為環保事業做出了積極貢獻。這種對環保的關注和行動讓EHC公司在行業中樹立了良好的形象。
中微股份(Cmsemicon)的起點可以追溯到2004年,當時公司以刻蝕設備為核心業務,致力于引領中國刻蝕技術水平的提升。經過幾年的不懈努力,2007年,中微成功研制出首臺CCP刻蝕設備,這一里程碑標志著公司在刻蝕設備領域取得了重大突破。此后,公司不斷突破技術壁壘,2011年刻蝕設備達到45nm工藝節點,2013年達到22nm,2016年更是達到了14nm,并當前已量產5nm工藝節點設備。這些技術成果不僅證明了中微在刻蝕設備領域的實力,也為公司的后續發展奠定了堅實基礎。
在XXXX年,Exel Microsystems Inc公司成功進入國際市場。公司憑借優質的產品和服務,贏得了國外客戶的認可和信任。為了更好地服務國際市場,Exel還在多個國家和地區設立了分支機構和研發中心。這一市場拓展的成功不僅為公司帶來了更多的商業機會,也提升了公司的國際知名度和影響力。
1984年,臺灣的電子行業正迎來蓬勃發展的黃金時期。在這一年的10月,Bytesonic Corporation在臺灣臺北正式成立,標志著這家電子公司正式踏入競爭激烈的電子市場。初創時期,公司面臨著資金短缺、技術匱乏等多重挑戰,但憑借著創始人的遠見卓識和團隊的拼搏精神,公司逐漸在市場中站穩了腳跟。
我是想從手機的耳機孔取信號,來推動一個單穩態電路 從左往右把門電路分別稱為門1、門2、門3、門4. 門3、門4.組成的單穩態電路,很成功 ,用手指碰門2的輸入端可使單穩態翻轉。 門1組成的放大器,把手機的耳機信號放大后送到后面 ...… 查看全部問答∨ |
|
各位高手,請指教。這個程序檢測傳感器信息for(i=0; i<8; i++) {flagSensor[i] = sensorDat...看不懂?。?/a> / 檢測傳感器信息 if(g_enSensor) {   ...… 查看全部問答∨ |
現在我寫了一個類似于ping的程序在pc機上運行,只是該程序不是一秒發一次,而是如果收到對方的應答就立即發送另一個ping的包.也就是只是ping得更快. ping一段時間之后就出現網絡斷開. 我想問下是不是因為底下bsp的原因造成的? 又該怎么解決? 謝謝 ...… 查看全部問答∨ |
調試RTC例程時發現每次仿真到printf函數就死機。于是上網搜索解決方案,看到一個最簡單有效的方法就是要在KEIL上的microLIB要打勾勾,但是我試了,還是死機。這是怎么回事呢?難道還有什么要注意的地方?… 查看全部問答∨ |
|