1. 程式人生 > >STM32實驗一:GPIO之流水燈

STM32實驗一:GPIO之流水燈

前面寫過一篇關於STM32微控制器的GPIO的文章,本來是打著從實用角度來做的實驗,但是發現不積跬步無以至千里啊,咱們從頭開始,先做一個最簡單的,入門級的,微控制器系統中的hello world,流水燈實驗!

我手中有一個神舟3的開發板,我就用這個板子來做實驗,板子中的實驗一共用到4個LED燈來做流水燈的實驗,這裡我們也用這4個燈,他們分別是GPIOF中的6、7、8、9這4個。

1、首先我們複製我們之前做過的模板工程到一個新建資料夾中,(如,你可以取個名字叫流水燈實驗的資料夾)神舟開發板的例程中在專案中添加了兩個檔案,分別是led.c和led.h,這是一種習慣,每做一個專案的時候都在其中新增一個.c和對應的.h檔案,這樣可以是工程看起來更加規整!本來我是不想新增這個的,這裡為了良好的程式設計習慣,我們也新增一個!並且我更改了模板檔案中的一些名字,在下圖中我將標誌出來



2、接下來我們來看一下程式,程式一共分為兩部分,一個main.c,一個led.c,因為程式比較簡單,所以在led.h中我們就不做任何定義了,這也省去了一些麻煩!按照習慣,我們先從main程式看起!

#include "stm32f10x.h"
#include "led.h"
void LED_config(void);//使用函式前先進行函式宣告

/*******************************************************
                                                      
* 函式名稱: delay
*     輸入: 無
*     輸出: 無
* 功能描述: 延時函式                          
                                                      
*******************************************************/

void delay(vu32 nCount)
{
  for(; nCount != 0; nCount--);
}

/*******************************************************
                                                      
* 函式名稱: main
*     輸入: 無
*     輸出: 無
* 功能描述: 主函式                         
                                                      
*******************************************************/

int main(void)
{
 	LED_config();	 //呼叫4個LED燈初始化函式

  	while(1)
  	{	
		GPIO_ResetBits(GPIOF,GPIO_Pin_6);//第一燈亮

		delay(800000); //延時

		GPIO_SetBits(GPIOF,GPIO_Pin_6);	//第一燈滅

		delay(800000); //延時

		GPIO_ResetBits(GPIOF,GPIO_Pin_7); //第二燈亮

		delay(800000); //延時

		GPIO_SetBits(GPIOF,GPIO_Pin_7);	 //第二燈滅

		delay(800000); //延時

		GPIO_ResetBits(GPIOF,GPIO_Pin_8); //第三燈亮

		delay(800000); //延時

		GPIO_SetBits(GPIOF,GPIO_Pin_8);	 //第三燈滅
		delay(800000); //延時

		GPIO_ResetBits(GPIOF,GPIO_Pin_9); //第四燈亮

		delay(800000); //延時

		GPIO_SetBits(GPIOF,GPIO_Pin_9);	 //第四燈滅

		delay(800000); //延時
  	}
}

分析一下程式,LED_config();這個函式是呼叫了led.c中的函式,一會會貼出led.c檔案,GPIO_ResetBits、

GPIO_SetBits這兩個函式是庫檔案為我們提供的GPIO操作函式,我們貼出來看一下

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  
  GPIOx->BRR = GPIO_Pin;
}
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  assert_param(IS_GPIO_PIN(GPIO_Pin));
  
  GPIOx->BSRR = GPIO_Pin;
}
這兩個函式的作用就是將埠置1或者清0

我們再來看一下led.c檔案

void LED_config(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;

	/* 配置神舟III號LED燈使用的GPIO管腳模式*/

  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); /*使能LED燈使用的GPIO時鐘*/

  	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; 

  	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推輓輸出模式

  	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  
  	GPIO_Init(GPIOF, &GPIO_InitStructure);  /*神州III號使用的LED燈相關的GPIO口初始化*/
}
這裡主要就是GPIO的配置,前面我們也說過,一共3個步奏,

1)、使能GPIOD的時鐘

2)、填充GPIO的屬性結構體

3)、傳遞引數至初始化函式

這裡要注意,我們將管腳模式配置為推輓輸出模式,這個需要注意一下,因為之後的實驗中我們還會給關鍵配置成其他的模式

程式編寫完畢,編譯下載到實驗板中完成實驗!