一、硬件電路
這里我們還是以stm32f103c8t6為例,并且我們以最小系統(tǒng)板的電路為例。以下是2種類型的最小系統(tǒng)板,區(qū)別在于一個是4pin的燒寫,一個是20pin的燒寫,但是電路基本一樣。
為了方便,我們使用板子上的LED為實驗對象。我們先來看板子上LED的電路,由于手頭上剛好有20pin燒寫的板,我就以這個為例吧。
(圖四)
學過電路的都會知道,LED燈亮的條件是什么,即只要我們在LED的兩端施加一個電壓差,使得LED兩端有了電壓差他就能亮。(記得區(qū)分正負哈)
由電路圖上,我們可以知道LED的正極已經(jīng)接上了3.3V,負極接上了stm32的PC13的IO口上。由以上原理可得,只要我們將PC13輸出一個低電平,LED兩端就會有了電壓差,即LED就亮了。
而要制作跑馬燈,便是要讓燈閃爍起來,一亮一滅。由亮燈的原理可得我們只要在PC13輸出一個高電平那么LED便不會亮了。
然后在每一次的亮和滅之間我們加上一個固定時間的延時,就能實現(xiàn)出點燈的效果啦
二、軟件編程
原理以及現(xiàn)象講述完畢,接下來我們進入編程階段。首先我們先來了解stm32 IO口的編程的流程:
01
Num
使能時鐘: 時鐘就對于stm32就像心臟對于人類,所以編程的第一步自然是賦予stm32一顆跳動“心臟”;
02
Num
IO口初始化: stm32的IO有多個輸入和輸出的模式,有不同的速度,以及多個IO口所以這一步我們要對這些進行初始化;
03
Num
操作IO口: IO是輸出高電平還是低電平便是我們在這里要做的操作;
第1步:使能時鐘:
在這個工程中我們使用的PC13是掛載在APB2上的,我們要使能的時鐘便是對應的APB2;我們先來看看RCC函數(shù)庫中有什么函數(shù)
(圖二十一)
這里我們要調(diào)用的庫函數(shù)是:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
這個函數(shù)有兩個入口的參數(shù):RCC_APB2Periph、NewState;我們來看看這兩個參數(shù)是什么
(圖八)
(圖九)
從圖八可以看到的是,第一個參數(shù)的值是在圖上定義的那些,我們從中找到GPIOC,將RCC_APB2Periph_GPIOC復制下來作為要設置的參數(shù);從圖九可以看到的是,第二個的參數(shù)只有兩個情況,一個是失能DISABLE,一個是使能ENABLE,這里我們要的是使能ENABLE;
綜上我們的時鐘使能函數(shù)的調(diào)用是這樣寫的:
void RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIOC
第2步:IO口初始化:
首先STM32的IO口可以由軟件配置成如下8種模式:
1、輸入浮空 2、輸入上拉 3、輸入下拉
4、模擬輸入 5、開漏輸出 6、推挽輸出
7、推挽式復用功能 8、開漏復用功能
有3種速度:2MHz;10MHz;50MHz;
還是一樣我們先來看GPIO的函數(shù)庫:
(圖十)
這里我們需要用到的函數(shù)是:
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
這個函數(shù)包含有兩個參數(shù)分別是GPIOx、GPIO_InitStruct。第一個參數(shù)是用來指定GPIO,取值范圍為GPIOA—GPIOG
(圖十一)
這里我們要使用的是GPIOC;第二個參數(shù)是初始化參數(shù)結(jié)構(gòu)體指針;
(圖十二)
這個結(jié)構(gòu)體包含了3個成員變量,GPIO_Pin、GPIO_Speed、GPIO_Mode對應我們要設置的GPIO引腳、速度、模式,其中各個的取值范圍為:
(圖十三)
(圖十四)
(圖十五)
這里我們要用的是:
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13; //13引腳
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //速度為50MHz
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//模式為推挽輸出
綜上我們的GPIO初始化函數(shù)是這樣寫的:
GPIO_InitTypeDef GPIO_InitStruct ; //定義結(jié)構(gòu)體變量
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13; //13引腳
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //速度為50MHz
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //模式為推挽輸出
GPIO_Init(GPIOC, &GPIO_InitStruct); //初始化GPIOC
第3步:操作IO:
這里我們要用到的函數(shù)已經(jīng)在圖11中標注出來了;
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); //將GPIO引腳置高電平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); //將GPIO引腳置低電平
圖中寫的注釋我們可以簡單理解為是將GPIO口輸出高和低的函數(shù);
這兩個的函數(shù)的參數(shù)都是一樣的,我們在上邊已經(jīng)說過了,就不再復述了,我們這里要使用的是GPIOC以及GPIO_PIN_13;
綜上我們的GPIO操作函數(shù)是這樣寫的:
GPIO_SetBits(GPIOC,GPIO_Pin_13); //將GPIOC 13引腳輸出高電平
GPIO_ResetBits(GPIOC,GPIO_Pin_13); //將GPIOC 13引腳輸出低電平
(圖十六)
我們的延時函數(shù)是這樣寫的(使用正點原子制作好的函數(shù))
delay_ms(600);//延時600ms
三、實操
以上一篇新建的工程為模版(任意門:STM32新建工程(固件庫版))我們在那個工程的基礎上進行實操;
首先我們打開那個TEST文件,在HARDWARE文件夾中建立一個文件夾命名為LED。進入USER文件夾,打開 TEST.uvprojx(關注后綴名,工程名稱是自己命名的)的工程文件進入KEIL5;我們先編譯一遍(這里的圖忘了截,就放上一次的圖吧)
(圖一)
然后我們新建兩個文件,保存在剛剛新建的LED文件夾內(nèi),并分別命名為 LED.c以及LED.h,對應的是LED的函數(shù)和頭文件,并且分別添加到HARDWARE分組,以及頭文件中,操作跟新建工程時新建main函數(shù)文件和導入頭文件是一樣的,更加具體操作在新建工程篇已經(jīng)講過了,就不復述了,完成后如圖
(圖十七)
然后我們打開LED.h編寫以下內(nèi)容:
#ifndef __LED_H //頭文件定義
#define __LED_H
void LED_Init(void); //聲明LED初始化函數(shù)
#endif
(圖十八)
打開LED.c編寫LED初始化函數(shù)如下:
#include "LED.h"
#include "stm32f10x.h"
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //時鐘使能GPIOC
//初始化GPIO PC.13
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13; //PIN13引腳
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; //速度50mhz
GPIO_Init(GPIOC,&GPIO_InitStruct); //初始化GPIOC
GPIO_SetBits(GPIOC,GPIO_Pin_13); //PC13設置為高電平
}
這里我們LED初始化函數(shù)中多了一個將PC13設為高電平的操作,是為了讓程序燒寫進去后,LED的第一狀態(tài)是滅的,以便后續(xù)的操作;以及導入了庫函數(shù)的頭文件和LED的頭文件
(圖十九)
接著我們編寫主函數(shù),如下:
#include "stm32f10x.h"
#include "LED.h"
#include "delay.h"
int main(void)
{
delay_init(); //延時初始化
LED_Init(); //LED初始化
while(1)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13); // PC13設置為高電平(亮)
delay_ms(600); //延時600ms
GPIO_ResetBits(GPIOC,GPIO_Pin_13); // PC13設置為低電平(滅)
delay_ms(600); //延時600ms
}
}
(圖二十)
在主函數(shù)我們要引入3個頭文件,固件庫的頭文件以及自己編寫的LED.h和延時函數(shù)的頭文件,之后我們才能調(diào)用需要的函數(shù)。我們在初始化之后用一個死循環(huán)將GPIO的電平設置不斷的循環(huán),通過延時函數(shù)將亮和滅之間有一個固定時間差,實現(xiàn)呼吸燈的效果。通過編譯之后,燒寫進stm32,就可以看如圖的呼吸燈的效果了。
-
led燈
+關注
關注
22文章
1592瀏覽量
108201 -
RCC
+關注
關注
0文章
93瀏覽量
26980 -
推挽電路
+關注
關注
18文章
113瀏覽量
38020 -
GPIO
+關注
關注
16文章
1216瀏覽量
52239 -
STM32F103C8T6
+關注
關注
109文章
162瀏覽量
83777
發(fā)布評論請先 登錄
相關推薦
評論