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