日本男女做受網(wǎng)站手機(jī)百度如何發(fā)布廣告
STM32之GPIO
GPIO在輸出模式時(shí)可以控制端口輸出高低電平,用以驅(qū)動(dòng)Led蜂鳴器等外設(shè),以及模擬通信協(xié)議輸出時(shí)序等。
輸入模式時(shí)可以讀取端口的高低電平或電壓,用于讀取按鍵輸入,外接模塊電平信號(hào)輸入,ADC電壓采集燈
GPIO的位模式圖如下所示:
這個(gè)模式圖接了一個(gè)上拉電阻和一個(gè)下拉電阻,上拉表示的是高電平的輸入模式,下拉表示的是低電平的輸入模式。
施密特觸發(fā)器 的功能作用以及原理
施密特觸發(fā)器對(duì)輸入的電壓進(jìn)行整型,如果輸入的電壓大于某一個(gè)閾值,輸出會(huì)瞬間升為高電平,如果輸入電壓小于某一個(gè)閾值,輸出就會(huì)小于某一個(gè)閾值
輸入數(shù)據(jù)寄存器存儲(chǔ)施密特觸發(fā)器整形的波形進(jìn)入輸入寄存器,讀取輸入寄存器得到輸入的電平,
?相關(guān)外設(shè)介紹:led外設(shè)以及蜂鳴器外設(shè)
面包板介紹:
接線:連接STM32和最小系統(tǒng)班,接線圖
此處:默認(rèn)led項(xiàng)目創(chuàng)建完成
GPIO所包含的庫(kù)函數(shù)如下所示
?? ??? ??? ?調(diào)用GPIO_DeInit這個(gè)函數(shù)后指定的gpio外設(shè)會(huì)被復(fù)位,這是這個(gè)函數(shù)用途
?? ??? ??? ?void GPIO_DeInit(GPIO_TypeDef* GPIOx);
?? ??? ??? ?復(fù)位AFIO外設(shè)
?? ??? ??? ?void GPIO_AFIODeInit(void);
?? ??? ??? ?用結(jié)構(gòu)體的參數(shù)初始化gpio口
?? ??? ??? ?void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
?? ??? ??? ?把結(jié)構(gòu)體變量賦一個(gè)默認(rèn)的值
?? ??? ??? ?void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
?? ??? ??? ?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);
?? ??? ??? ? 以上是GPIO的讀取函數(shù)
?? ??? ??? ?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);
?? ??? ??? ?以上是GPIO的寫(xiě)入函數(shù)
?? ??? ??? ?void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
?? ??? ??? ?void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t?? GPIO_PinSource);
?? ??? ??? ?void GPIO_EventOutputCmd(FunctionalState NewState);
?? ??? ??? ?void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
?? ??? ??? ?void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
typedef enum
{ GPIO_Mode_AIN = 0x0,?? // 模擬輸入
? GPIO_Mode_IN_FLOATING = 0x04, // 浮空輸入
? GPIO_Mode_IPD = 0x28,// 下拉輸入
? GPIO_Mode_IPU = 0x48, //上拉輸入
? GPIO_Mode_Out_OD = 0x14, // 開(kāi)漏輸出
? GPIO_Mode_Out_PP = 0x10, // 推挽輸出
? GPIO_Mode_AF_OD = 0x1C, // 復(fù)用開(kāi)漏
? GPIO_Mode_AF_PP = 0x18? // 復(fù)用推挽
}GPIOMode_TypeDef;
點(diǎn)亮led燈使用的是推挽輸出
使用GPIO ResetBits來(lái)點(diǎn)亮LED燈
#include "stm32f10x.h" // Device header// 操作GPIO 1: 使用rcc開(kāi)啟gpio時(shí)鐘// 使用GPIO_Init函數(shù)初始化GPIO// 使用輸入或輸出函數(shù)控制GPIO口
int main(void){// 開(kāi)啟時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// GPIO的結(jié)構(gòu)體GPIO_InitTypeDef GPIO_InitStructure;// 選擇輸出模式為推挽輸出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// 選擇輸出的引腳GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;// 輸出速度GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;// GPIO初始化結(jié)構(gòu)體的地址放到GPIO——Init的第二個(gè)參數(shù)GPIO_Init(GPIOA,&GPIO_InitStructure);// GPIO設(shè)置A0口的燈亮GPIO_ResetBits(GPIOA,GPIO_Pin_0);// 設(shè)置LED燈熄滅GPIO_SetBits(GPIOA,GPIO_Pin_0);while(1){}}
查看函數(shù)的定義了解函數(shù)的功能以及如何使用函數(shù)
#include "stm32f10x.h"????????????????? // Device header
?? ??? ? // 操作GPIO 1: 使用rcc開(kāi)啟gpio時(shí)鐘
?? ??? ??? // 使用GPIO_Init函數(shù)初始化GPIO
?? ??? ??? ? // 使用輸入或輸出函數(shù)控制GPIO口
int main(void){
?? ?? // 開(kāi)啟時(shí)鐘
?? ?? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
?? ?? // GPIO的結(jié)構(gòu)體
?? ?? GPIO_InitTypeDef GPIO_InitStructure;
?? ?? // 選擇輸出模式為推挽輸出
?? ?? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
?? ?? // 選擇輸出的引腳
?? ?? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
?? ?? // 輸出速度
?? ?? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
?? ?? // GPIO初始化結(jié)構(gòu)體的地址放到GPIO——Init的第二個(gè)參數(shù)
?? ?? GPIO_Init(GPIOA,&GPIO_InitStructure);
?? ?? // GPIO設(shè)置A0口的燈亮,最后一個(gè)參數(shù)Bit_RESET表示的是清除端口的值為0,清除端口的值為1
?? ?? GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);// Bit_RESET時(shí)LED燈是點(diǎn)亮狀態(tài),當(dāng)為Bit_SET時(shí)LED燈是熄滅狀態(tài)
??? while(1){?? ??? ?}
}
STM32實(shí)現(xiàn)LED燈的亮滅
#include "stm32f10x.h" // Device header
#include "Delay.h"// 操作GPIO 1: 使用rcc開(kāi)啟gpio時(shí)鐘// 使用GPIO_Init函數(shù)初始化GPIO// 使用輸入或輸出函數(shù)控制GPIO口
int main(void){// 開(kāi)啟時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// GPIO的結(jié)構(gòu)體GPIO_InitTypeDef GPIO_InitStructure;// 選擇輸出模式為推挽輸出// 選擇輸出模式為推挽輸出PP表示的是推挽輸出模式,OD表示開(kāi)漏輸出模式// 推挽輸出高電平和低電平均有輸出能力,開(kāi)漏輸出自由在低電平的情況下才有驅(qū)動(dòng)能力GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// 選擇輸出的引腳GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;// 輸出速度GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;// GPIO初始化結(jié)構(gòu)體的地址放到GPIO——Init的第二個(gè)參數(shù)GPIO_Init(GPIOA,&GPIO_InitStructure);// GPIO設(shè)置A0口的燈亮,最后一個(gè)參數(shù)Bit_RESET表示的是清除端口的值為0,清除端口的值為1GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);// Bit_RESET時(shí)LED燈是點(diǎn)亮狀態(tài),當(dāng)為Bit_SET時(shí)LED燈是熄滅狀態(tài)while(1){// 實(shí)現(xiàn)led燈光閃爍的功能需要在主循環(huán)中寫(xiě)上點(diǎn)亮led燈熄滅led燈光的操作并在while中循環(huán)GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);Delay_ms(500);// 添加延時(shí)函數(shù)進(jìn)行延時(shí)GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);Delay_ms(500);/* 使用GPIO點(diǎn)亮led燈GPIO_ResetBits(GPIOA,GPIO_Pin_0);Delay_ms(500);GPIO_SetBits(GPIOA,GPIO_Pin_0);Delay_ms(500);*/}}
延時(shí)函數(shù)從文件中引入
使用STM32實(shí)現(xiàn)LED流水燈
1:接線
2:編寫(xiě)流水燈功能代碼,在單片機(jī)中是無(wú)法使用二進(jìn)制直接進(jìn)行控制的因此我們需要使用16進(jìn)制的方式控制單片機(jī)進(jìn)行工作。
#include "stm32f10x.h" // Device header
#include "Delay.h"/*1: 操作GPIO 1: 使用rcc開(kāi)啟gpio時(shí)鐘2: 使用GPIO_Init函數(shù)初始化GPIO3: 使用輸入或輸出函數(shù)控制GPIO口*/
int main(void){// 開(kāi)啟GPIOA時(shí)鐘,該程序連接的是GPIOA的端口RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);// GPIO的結(jié)構(gòu)體GPIO_InitTypeDef GPIO_InitStructure;// 選擇輸出模式為推挽輸出PP表示的是推挽輸出模式,OD表示開(kāi)漏輸出模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// 選擇輸出的引腳,GPIO_Pin_All將16個(gè)端口都設(shè)置為推挽輸出模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;// 輸出速度GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;// GPIO初始化結(jié)構(gòu)體的地址放到GPIO——Init的第二個(gè)參數(shù)GPIO_Init(GPIOA,&GPIO_InitStructure); while(1){//控制A號(hào)引腳GPIO_Write(GPIOA,~0x0001); // 0000 0000 0000 0001 二進(jìn)制轉(zhuǎn)換為16進(jìn)制的寫(xiě)法Delay_ms(500);GPIO_Write(GPIOA,~0x0002); // 0000 0000 0000 0010 二進(jìn)制轉(zhuǎn)換為16進(jìn)制的寫(xiě)法Delay_ms(500);GPIO_Write(GPIOA,~0x0004); // 0000 0000 0000 0100 二進(jìn)制轉(zhuǎn)換為16進(jìn)制的寫(xiě)法Delay_ms(500);GPIO_Write(GPIOA,~0x0008); // 0000 0000 0000 1000 二進(jìn)制轉(zhuǎn)換為16進(jìn)制的寫(xiě)法Delay_ms(500);GPIO_Write(GPIOA,~0x0010); // 0000 0000 0001 0000 二進(jìn)制轉(zhuǎn)換為16進(jìn)制的寫(xiě)法Delay_ms(500);GPIO_Write(GPIOA,~0x0020); // 0000 0000 0010 0000 二進(jìn)制轉(zhuǎn)換為16進(jìn)制的寫(xiě)法Delay_ms(500);GPIO_Write(GPIOA,~0x0040); // 0000 0000 0100 0000 二進(jìn)制轉(zhuǎn)換為16進(jìn)制的寫(xiě)法Delay_ms(500);GPIO_Write(GPIOA,~0x0080); // 0000 0000 1000 0000 二進(jìn)制轉(zhuǎn)換為16進(jìn)制的寫(xiě)法Delay_ms(500);}}
實(shí)現(xiàn)蜂鳴器功能:
蜂鳴器接線,使用最小系統(tǒng)班3根公對(duì)母的杜邦線完成蜂鳴器的接線工作
#include "stm32f10x.h" // Device header
#include "Delay.h"/*1: 操作GPIO 1: 使用rcc開(kāi)啟gpio時(shí)鐘2: 使用GPIO_Init函數(shù)初始化GPIO3: 使用輸入或輸出函數(shù)控制GPIO口*/
int main(void){// 開(kāi)啟GPIOA時(shí)鐘,該程序連接的是GPIOA的端口RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);// GPIO的結(jié)構(gòu)體GPIO_InitTypeDef GPIO_InitStructure;// 選擇輸出模式為推挽輸出PP表示的是推挽輸出模式,OD表示開(kāi)漏輸出模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;// 選擇輸出的引腳,GPIO_Pin_All將16個(gè)端口都設(shè)置為推挽輸出模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;// 輸出速度GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;// GPIO初始化結(jié)構(gòu)體的地址放到GPIO——Init的第二個(gè)參數(shù)GPIO_Init(GPIOB,&GPIO_InitStructure); while(1){GPIO_ResetBits(GPIOB,GPIO_Pin_12);Delay_ms(100);GPIO_SetBits(GPIOB,GPIO_Pin_12);Delay_ms(100);GPIO_ResetBits(GPIOB,GPIO_Pin_12);Delay_ms(100);GPIO_SetBits(GPIOB,GPIO_Pin_12);Delay_ms(700);}}
將程序運(yùn)行并下載進(jìn)STM32系統(tǒng)班中完成蜂鳴器發(fā)聲功能。
庫(kù)函數(shù)使用方式
第一種方式,打開(kāi)頭文件,拉到最下面,查看有哪些函數(shù),然后查看函數(shù)的定義函數(shù)的使用方法,<建議使用這種方式>
第二種方式,查看庫(kù)函數(shù)用戶手冊(cè),所有函數(shù)的介紹個(gè)使用方法
第三種方式,最后一種方式是百度,借助別人的代碼進(jìn)行使用