專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> STM32 >> 瀏覽文章

STM32流水燈實(shí)驗(yàn)

作者:未知   來源:不詳   點(diǎn)擊數(shù):  更新時(shí)間:2014年06月17日   【字體:

流水燈實(shí)驗(yàn)是所有硬件編程的“”Hello world!“程序,成功下載運(yùn)行一個(gè)流水燈說明你已經(jīng)走進(jìn)了STM32的世界。下面我們一步一步的來做實(shí)驗(yàn)。

首先,在上一節(jié)的模板基礎(chǔ)上建立一個(gè)新的Keil工程,取名為L(zhǎng)ED。打開main.c函數(shù),可以直接在這里寫代碼,當(dāng)然也可以重新建立.c文件,這里我們直接在main文件中寫程序。第一步,也是最重要的一步就是配置作為輸出的IO口,代碼如下:
GPIO_InitTypeDef GPIO_Structure; //定義GPIO結(jié)構(gòu)體
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //使能PEIO口的時(shí)鐘

GPIO_Structure.GPIO_Pin = GPIO_Pin_9; //結(jié)構(gòu)體引腳為PE9
GPIO_Structure.GPIO_Mode = GPIO_Mode_Out_PP; //設(shè)置為推挽輸出
GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz; //IO口翻轉(zhuǎn)速度設(shè)置為50MHz
GPIO_Init(GPIOE,&GPIO_Structure); //初始化PE9引腳
這里只設(shè)置了一個(gè)PE9引腳,其他引腳的設(shè)置類似,只需改變GPIO_Pin_x然后初始化即可,如下:
GPIO_Structure.GPIO_Pin = GPIO_Pin_11;
 GPIO_Init(GPIOE,&GPIO_Structure);
GPIO_Structure.GPIO_Pin = GPIO_Pin_13; 
GPIO_Init(GPIOE,&GPIO_Structure);
 GPIO_Structure.GPIO_Pin = GPIO_Pin_15; 
 GPIO_Init(GPIOE,&GPIO_Structure);
將以上初始化IO口的代碼封裝成一個(gè)函數(shù)命名為L(zhǎng)ED_init():
void Led_init(void)
{
GPIO_InitTypeDef GPIO_Structure; //定義GPIO結(jié)構(gòu)體
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE); //使能PEIO口的時(shí)鐘

GPIO_Structure.GPIO_Pin = GPIO_Pin_9; //結(jié)構(gòu)體引腳為PE9
GPIO_Structure.GPIO_Mode = GPIO_Mode_Out_PP; //設(shè)置為推挽輸出
GPIO_Structure.GPIO_Speed = GPIO_Speed_50MHz; //IO口翻轉(zhuǎn)速度設(shè)置為50MHz
GPIO_Init(GPIOE,&GPIO_Structure); //初始化PE9引腳

GPIO_Structure.GPIO_Pin = GPIO_Pin_11;
GPIO_Init(GPIOE,&GPIO_Structure);

GPIO_Structure.GPIO_Pin = GPIO_Pin_13;
GPIO_Init(GPIOE,&GPIO_Structure);

GPIO_Structure.GPIO_Pin = GPIO_Pin_15;
GPIO_Init(GPIOE,&GPIO_Structure);
}
然后需要一個(gè)延時(shí)函數(shù),控制LED等亮與滅的時(shí)間間隔:
void Delay(int n)
{
while(n--)
; //學(xué)過51的人都明白
}
至此,驅(qū)動(dòng)LED的程序代碼基本已經(jīng)完成,為了更方便的調(diào)用,我們定義一些宏:
#define LED1_ON() GPIO_SetBits(GPIOE,GPIO_Pin_13)   //LED1置位
#define LED1_OFF() GPIO_ResetBits(GPIOE,GPIO_Pin_13)   //LED1復(fù)位

#define LED2_ON() GPIO_SetBits(GPIOE,GPIO_Pin_9)
#define LED2_OFF() GPIO_ResetBits(GPIOE,GPIO_Pin_9)

#define LED3_ON() GPIO_SetBits(GPIOE,GPIO_Pin_15)
#define LED3_OFF() GPIO_ResetBits(GPIOE,GPIO_Pin_15)

#define LED4_ON() GPIO_SetBits(GPIOE,GPIO_Pin_11)
#define LED4_OFF() GPIO_ResetBits(GPIOE,GPIO_Pin_11)
好了,要LED等怎么閃爍就看你怎么調(diào)用這些宏了,實(shí)現(xiàn)流水燈的調(diào)用如下:
int main()
{
//SystemInit();
Led_init(); //初始化LED等所用的IO口
while(1)
{
LED1_ON();LED2_OFF();LED3_OFF();LED4_OFF();
Delay(0x8ffff);
LED1_OFF();LED2_ON();LED3_OFF();LED4_OFF();
Delay(0x8ffff);
LED1_OFF();LED2_OFF();LED3_ON();LED4_OFF();
Delay(0x8ffff);
LED1_OFF();LED2_OFF();LED3_OFF();LED4_ON();
Delay(0x8ffff);
}
}
對(duì)于SystemInit()函數(shù),在啟動(dòng)代碼中已經(jīng)調(diào)用過,那么在main函數(shù)中無需再調(diào)用,如果使用的固件庫版本比較低,啟動(dòng)代碼中沒有調(diào)用,那么main函數(shù)中就需要調(diào)用了。好了,我們看一下運(yùn)行的效果怎么樣:
關(guān)閉窗口

相關(guān)文章