目錄
GPIO基礎知識
?編輯IO八種工作模式
固件庫實現LED點燈
蜂鳴器
按鍵基礎知識
?編輯繼電器
震動傳感器?
433M無線模塊?
GPIO基礎知識
GPIO(General-Purpose input/output,通用輸入/輸出接口)
用于感知外部信號(輸入模式)和控制外部設備(輸出模式)
?簡單模塊:LED,按鍵,蜂鳴器,溫度傳感器,使用一個GPIO就可以完成數據的傳輸/ 控制
復雜一點的模塊OLED,FLASH,六軸傳感器需要多個引腳組成“協議”傳輸數據, USART,IIC,SPI等協議 ?
?MCU單片機大都采用引腳復用模式也就是一個GPIO,可以直接控制它輸出高低電平,也可以設置為某個協議的引腳之一。此外,一些MCU的引腳,還能設置為ADC模式讀取模擬信號,或者設置為DAC模式輸出模擬信號
系統架構
IO八種工作模式
?引腳電平:0V~3.3V(數據1就是高電平就是3.3V,數據0就是低電平就是0V),部分引腳可忍受5V?
STM32 IO工作模式
輸出模式有四種:推挽輸出,開漏輸出,復用開漏,復用推挽
輸入模式有四種:上拉輸入,下拉輸入,浮空輸入,模擬輸入
輸出模式:
1.推挽輸出(Push-Pull,pp)
讓輸出控制變成了VDD/VSS輸出,使得輸出電流增大 提高了輸出引腳的驅動能力,提高了電路的負載能力和開關的動作速度
數據寄存器為1時,下管斷開,上管導通,輸出直接接到VDD,輸出高電平
數據寄存器為0時,上管斷開,下管導通,輸出直接接到VSS,輸出低電平
?2.開漏輸出(Open-Drain,OD)
推挽輸出模式可以直接輸出高電平,開漏輸出需要外接上拉電阻才能輸出高電平(5v)
數據寄存器為1時,下管斷開,上管斷開,高阻模式
數據寄存器為0時,上管斷開,下管導通,輸出直接接到VSS,輸出低電平
這種模式下只有低電平有驅動能力,高電平是沒有驅動能力的
可以作為通信協議的驅動方式,在多機通信的情況下,這個模式可以避免各個設備的相互干擾
?開漏輸出的特性
????????利用外部電路驅動能力
????????實現電平轉換
????????方便實現“邏輯與” 功能
3.復用推挽/開漏輸出(Alternate Funtion,AF)
GPIO除了作為通用輸入輸出引腳使用以外,還可以作為片上外設(USART,IIC,SPI) 專用引腳(和其他輸出輸入的區別),既可以利用片上外設輸入也可以用來輸出,即一個引腳可以有多種用途,但是同一時刻一個引腳只能使用復用功能中 的一個
當引腳設置為復用功能的時候,可選擇推挽復用模式或者復用開漏模式,在設置為復用開 漏模式時,需要外接上拉電阻。
輸入模式:
1.上拉輸入(Input Pull-up)
如果接入上拉電阻,當引腳懸空時,還有上拉電阻來保證引腳的高電平? ?
VDD經過開關、上拉電阻,連接外部I/O引腳。當開關閉合時,外部I/O輸入信號時,默認 輸入高電平。 ?
2.下拉輸入(Input Pull-down)
VSS經過開關,下拉電阻,連接外部I/O引腳,當開關閉合時,外部I/O無輸入信號 時,默認輸入低電平?
?3.浮空輸入(Floating Input)
兩個上下拉電阻開關均斷開,沒有上拉也沒有下拉,I/O引腳直接連接TTL肖特基觸發器(對輸入電壓進行整形,如果輸入電壓大于某一閾值,輸出就會瞬間升為高電平,如果輸入電壓小于某一閾值,輸出就會瞬間降為低電平?)
此時,I/O引腳浮空,讀取的電平是不確定的,外部信號是什么電平,MCU引腳就輸 入什么電平
MCU復位上電后,默認為浮空輸入模式 ?
4.模擬輸入(Analoge mode) ?
兩個上下拉電阻開關均斷開,同事TTL肖特基觸發器也斷開,引腳信號直接連接模擬輸入,實現對外部信號的采集。 ?
?在輸入模式下輸出是無效的,在輸出模式下輸入都是有效的,因為一個端口只能有一個輸出,但可以有多個輸入
當使用外設配置GPIO時可以參考手冊給配置
固件庫實現LED點燈
1.LED燈
LED燈,是一種能夠將電能轉化為可見光的半導體器件
原理:當給P極施加正向電壓時,空穴和自由電子在P-N結復合,輻射出光子而發 光。?
2.控制LED燈
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
LED燈的正極接到了3.3V,LED燈的負極接到了PA1,也就是GPIOA1引腳 只需要控制PA1為相對應的低電平,即可點亮對飲的LED燈,輸出高電平則熄滅對應的LED 燈。 ?
(在這種電路連接中,當 LED 燈的正極接到 3.3V 電源時,它為 LED 提供了正向的電壓偏置,使得 LED 具備了導通發光的條件之一。而 LED 的負極連接到 PA1(GPIOA1 引腳),GPIOA1 引腳可以通過軟件編程來控制其輸出電平。
當 PA1 引腳輸出低電平時,此時 LED 燈的正負極之間形成了足夠的電壓差(3.3V - 低電平電壓,通常低電平電壓接近 0V),有電流從 3.3V 電源經過 LED 流向 PA1 引腳,從而使 LED 燈導通發光。
當 PA1 引腳輸出高電平時,假設高電平為 3.3V,那么 LED 燈正負極之間的電壓差為 0(或非常小),無法滿足 LED 導通所需的電壓條件,LED 燈中沒有電流通過,所以 LED 燈熄滅。
這種通過控制 GPIO 引腳電平來控制 LED 燈亮滅的方式是一種常見的數字邏輯控制方法,方便且易于通過軟件進行靈活的控制和管理,廣泛應用于各種電子設備和電路設計中。)
軟件設計流程
?初始化系統
????????初始化GPIO外設時鐘
????????初始化LED引腳(對于單片機來說是輸出)
(首先得定義這個變量才能用這個變量,用函數把它們裝起來)
輸出電平
首先在User中建立LED文件,LED:中新建led.h和led.c文件
從project中打開keil5,雙擊User將led.c添加進去,點擊魔術棒led.h文件加進去,雙擊led.c文件輸入#include "led.h",因為我們要用庫函數要包含庫函數頭文件#include "stm32f10x.h"
1.初始化LED燈的函數(先將函數寫進led.h文件中)命名函數時用駝峰命名發
1.1初始化LED引腳GPIOA1,要用初始化的GPIO結構體,通過配置結構體我們可以初始化引腳
先在FWLIB中找到giop.c文件再找到giop.h庫在里面找到GIOP結構體GPIO_InitTypeDef,在led.c中重新定義GIOP結構體,在重新配置引腳,因為LED燈連接到板子上PA1所以引腳配置的是pin_1,要想LED燈點亮需要輸出低電平,所以配置的模式是推挽輸出
再從giop.c文件再找到giop.h中找到GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);函數,這個函數的作用是初始化GIOP的結構體,把上面函數真正初始化到結構體里面去,第一個參數是GPIOA,第二個參數是&led_initstruct(右鍵參數,上面是跳轉定義.c,下面是跳轉聲明.h)
1.2初始化時鐘APB2下的GPIOA
FWLIB中找到rcc.c文件再找到rcc.h找到RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);函數,第一個參數是APB2下的哪一個外設,第二個參數是枚舉類型兩種狀態,失能和使能
最后總代碼要做main文件中運行,在main文件中寫入#include "led.h"就包含了上面的所有函數
在main函數中首先輸入初始化LED燈的函數,然后讓LED燈輸出低電平
?while(1)
? ? {
?? ?GPIO_ResetBits(GPIOA,GPIO_Pin_1);//這個函數是輸出低電平
? ? //右鍵查看函數聲明,第一個參數是GPIOA,第二個參數引腳1
????GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//這個函數是輸出高電平
?? ? }
如何控制LED燈的閃爍??(亮一秒關一秒:延時)
//軟件延時主要是讓CPU“空轉”,通過計算不同指令周期的時間,參考CPU主頻大小,大概算出延時時間,這種方法從表面看起來就不精確,但它是比較好實現; void delay(uint16_t time)//延時1ms {uint16_t i = 0;while(time --){i - 12000;while(i --);}}
蜂鳴器
1.蜂鳴器的種類
蜂鳴器是一種常用的電子發聲元器件,采用直流電壓供電。廣泛應用于計算機,打印 機,報警器,電子玩具,汽車電子設備燈等產品中常見的蜂鳴器可分為有源蜂鳴器和 無源蜂鳴器。
?2.蜂鳴器的控制方式
有源蜂鳴器:內部有震蕩源,只要通電即可自動發出固定頻率的聲音。(頻率固定無 法控制音色)
無源蜂鳴器:內部無震蕩源,需要外部脈沖信號驅動發聲,聲音頻率可變。(可改變 頻率來改變音色)
3.區分蜂鳴器
從外觀上來看兩種蜂鳴器形狀相似,有源蜂鳴器底部有黑膠密封。
無源蜂鳴器底部可以看到電路板,兩種蜂鳴器都標注有正負極。 ?
GPIO控制蜂鳴器?
VCC通過杜邦線接到板子3.3V,GND接到板子GND,I/O口接到普通單片機I/O口即可,當I/O口往蜂鳴器輸出低電平時,蜂鳴器就會叫,如果輸出高電平就會關掉
軟件設計流程(和LED燈類似)
????????初始化系統
????????????????初始化GPIO外設時鐘GPIOA
????????????????初始化蜂鳴器的引腳A3
????????輸出電平控制蜂鳴器 ?
初始化和LED燈一樣
?輸出電平控制蜂鳴器 ?
按鍵基礎知識
GPIO的特點: 具有內部上拉或下拉的功能 可以使用外部下拉或上拉
按鍵連接示意圖:
沒按下開關的時候PC13和PA0都是沒有連接外部電平的(默認電平),當按鍵按下的時候會出入GND低電平,所有我們可以判斷如果檢測PA0是低電平說明按鍵按下則我們控制燈亮,如果PC13引腳檢測到的電平是低電平,我們就可以判斷這個按鍵按下,則就把燈關掉
按鍵控制LED燈
軟件設計流程
? ? ? ? 初始化系統
? ? ? ? ? ? ? ? 初始化GPIO時鐘
? ? ? ? ? ? ? ? 初始化按鍵和LED引腳
? ? ? ? 檢測按鍵輸入電平來控制LED燈
? ? ? ? ? ? ? ? SW2控制燈開(PA0)
? ? ? ? ? ? ? ? SW3控制燈關(PC13)
初始化系統
?檢測按鍵輸入電平來控制LED燈
繼電器
1.繼電器的工作原理
繼電器是一個電控開關,工作原理基于電磁感應,繼電器包括一個電磁線圈和一組觸點。常用于控制高電流或高電壓的電路,例如自動控制原理,電力系統和自動化設備中,由于可靠性和電氣隔離的特性可以實現小電流實現大電流,繼電器在各種應用中都有廣泛的用途。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
2.繼電器的引腳說明
1.VCC(+):供電正極,連接此引腳到電源,以提供繼電器所需的電流
2.GND(-): 地,連接此引腳到電源的負極或者地。
3.IN:控制輸入信號,通常用于連接控制信號,當該信號變化,繼電器切換狀態。
(IN如果接了低電平,這個繼電器是連接的狀態(閉合)IN如果接了高電平,就是斷開的狀態)
IN不管是高電平還是低電平,控制的是NO端和NC端
4.COM(common):公共端,通常是中間的觸點,與常開或常閉觸點相連
5.NO(Normally Open):常開接口,繼電器吸合前懸空,吸合后于COM連接
6.NC(Normally Closed):常閉接口,繼電器吸合前與COM連接,吸合后懸空
(測試手中繼電器是5v還是3.3v:首先用杜邦線連接VCC和GND另一端接到板子上的5V和GND此時紅燈亮了,如果IN口接到低電平(3.3v高電平)綠燈會亮,說明繼電器不是5V不是他的工作電壓,再重新用杜邦線連接VCC和GND另一端接到板子上的3.3V和GND此時紅燈亮了,如果IN口接到低電平綠燈會亮,再重新接到3.3v說明繼電器是3.3V是他的工作電壓,并且是低電平導通)
初始化系統
????????初始化繼電器IN引腳對應的GPIO外設時鐘
????????初始化繼電器IN的引腳輸出模式(IN獲得低電平就打開,IN獲得高電平就斷開,所以IN連接單片機,單片機要輸出引腳高或者低,所以是輸出模式)
輸出電平控制繼電器開和關
?輸出電平控制繼電器開和關
震動傳感器?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
1.震動傳感器工作原理
震動傳感器黑色震動檢測傳感器,工作時電源LED燈常量(說明這個模塊左右兩邊都有LED燈,
左邊是電源指示燈,另外的信號燈只有在震動的瞬間才會亮),震動信號檢測LED燈發生震動的
時候會
保持亮的過程。正常工作模塊DO口輸出高電平,震動瞬間DO口輸出低電平,用于各種震動觸發作
用,防盜報警,智能小車,電子積木燈等。
中間有個旋鈕是控制震動傳感器的靈敏度
2.震動傳感器硬件引腳接線
1.VCC:接到板子電源的5V或者3.3V。
2.GND:地,連接到板子電源的負極或者GND.
3.DO: 數字信號輸出口,可以與單片機相連檢測環境是否發生震動。(如果這個震動傳感器震動了,它就會把這個信號通過DO口發生給單片機,對于單片機來說它是輸入的,所以再編程是要以輸入IO的狀態)
3震動傳感器軟件開發流程
? ? ? ? 初始化系統
? ? ? ? ? ? ? ? 初始化震動傳感器DO相連的單片機引腳時鐘
? ? ? ? ? ? ? ? 初始化震動傳感器DO相連的單片機引腳輸入配置
? ? ? ? 檢測震動控制LED燈
#include "stm32f10x.h"
#include "shake.h"void Shake_Init()
{GPIO_InitTypeDef GPIOInitstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIOInitstruct.GPIO_Pin = GPIO_Pin_0;GPIOInitstruct.GPIO_Mode = GPIO_Mode_IPD;
//上拉輸入還是下拉輸入都不影響,最終還是以輸入電平為主
//配置上拉相當于 int a = 1,下拉相反GPIO_Init(GPIOA, &GPIOInitstruct);}
正常沒有震動時輸出高電平,有震動的時候輸出低電平,如果DO口接受到低電平就控制板子上A1這個燈亮
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"void delay(uint16_t time){uint16_t i = 0;while(time --){i = 12000;while(i--);}}int main()
{Shake_Init();Led_Init();while(1){if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0)
//如果單片機引腳PA0接受到低電平(震動傳感器震動),就會控制A1燈亮一秒滅一秒{ GPIO_ResetBits(GPIOA, GPIO_Pin_1);delay(1000);GPIO_SetBits(GPIOA, GPIO_Pin_1);delay(1000);}else
//如果沒有接受到低電平,就會熄滅{GPIO_SetBits(GPIOA, GPIO_Pin_1);}}}
小項目:震動感應燈
?繼電器的作用是,如果開的情況下就會把COM和NO端連接在一起,就相當于LED燈直接和單片機的VCC相連接的,這時燈就會亮,如果是關的情況下COM和NO就不會連接在一起,LED燈就是滅的狀態
如果震動器震動則控制繼電器開?,繼電器開就表示COM和NO連接在一起,LED就會亮
?
#include "relay.h"
#include "stm32f10x.h"void Relay_Init()
{GPIO_InitTypeDef GPIOInitstruct;//初始化引腳的位置取決于IN引腳的接線,這時我們接到板子上PA0引腳
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIOInitstruct.GPIO_Pin = GPIO_Pin_0;GPIOInitstruct.GPIO_Speed = GPIO_Speed_10MHz;GPIOInitstruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &GPIOInitstruct);}
#include "stm32f10x.h"
#include "shake.h"void Shake_Init()
{GPIO_InitTypeDef GPIOInitstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIOInitstruct.GPIO_Pin = GPIO_Pin_1;GPIOInitstruct.GPIO_Mode = GPIO_Mode_IPD;GPIO_Init(GPIOA, &GPIOInitstruct);}
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"void delay(uint16_t time){uint16_t i = 0;while(time --){i = 12000;while(i--);}}int main()
{Relay_Init();Shake_Init();GPIO_SetBits(GPIOA, GPIO_Pin_0);
//這個函數的作用是讓我們每次上電時繼電器先關上while(1){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) == 0)//如果單片機從震動器得到低電平{
//則繼電器亮一下,說明IN口得到低電平使繼電器工作,COM和NO閉合使單片機上的低電平輸出小燈,使小燈亮GPIO_ResetBits(GPIOA, GPIO_Pin_0);delay(1000);GPIO_SetBits(GPIOA, GPIO_Pin_0);delay(1000);}else{GPIO_SetBits(GPIOA, GPIO_Pin_0);} }}
433M無線模塊
1.433M無線模塊工作原理
數據發射模塊的工作頻率為315M,采用聲表諧振器SAW穩頻,頻率穩定度極高,當環境溫度
在-25~+85度之間變化時,頻飄僅為3ppm。
接收到信號,接收模塊對應針腳輸出高電平,有D0 D1 D2 D3,可能對遙控器的A/B/C/D。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?2.引腳接線
1.供電正極,連接此引腳到電源,以提供433M無線模塊所需的電流
2.GND(-):地,連接此引腳到電源的負極或者地。
3.D0-D4:連接控制輸入信號通常用于連接控制信號,當按鍵變換控制外設信號
3.433M控制燈軟件開發流程
????????初始化系
????????????????初始化433M D0-D4引腳對應的GPIO外設時鐘
????????????????初始化433M D0-D4引腳配置
????????433M按鍵控制外設
小項目:433M無線遙控燈 (一個按鍵控制燈開,一個按鍵控制燈關)
?正常按下A按鍵,D0會輸出高電平發送給A0,B按鍵按下,D1會輸出高電平發送給A2,我們要實現D0按下燈開,D1按下燈關,板子是輸入模式
首先要初始化A0和A2兩個引腳,同時我們要控制板子上的LED燈 還要初始化A1的引腳
#include "stm32f10x.h"
#include "shake.h"void Shake_Init()
{GPIO_InitTypeDef GPIOInitstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIOInitstruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;
//這里同時初始化兩個引腳GPIOInitstruct.GPIO_Mode = GPIO_Mode_IPD;
//板子是輸入模式GPIO_Init(GPIOA, &GPIOInitstruct);}#include "led.h"
#include "stm32f10x.h"
void Led_Init()
{GPIO_InitTypeDef led_initstruct;led_initstruct.GPIO_Pin = GPIO_Pin_1;led_initstruct.GPIO_Speed = GPIO_Speed_2MHz;led_initstruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOA, &led_initstruct);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
}
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"int main()
{Shake_Init();Led_Init();while(1){if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1)//如果A0引腳檢測到了高電平,說明按鍵A按下,無線模塊接受到信號并輸出給板子,要控制燈亮{GPIO_ResetBits(GPIOA,GPIO_Pin_1);//就輸出低電平讓燈亮}else if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2) == 1)//如果A2引腳檢測到了高點哦,說明按鍵B按下,無線模塊接受到信號并輸出給板子,要控制燈滅{GPIO_SetBits(GPIOA,GPIO_Pin_1);//就輸出高電平讓燈滅}}}